使用 PHP posix_setuid() 在同一组中时无法写入文件

使用 PHP posix_setuid() 在同一组中时无法写入文件

我正在从 root 运行一个 PHP 进程,该进程调用posix_setuid(1500);然后尝试打开文件 output.log

显示ls -l output.log了这个输出:

-rwxrwxr-x 1 www-data www-data 2294376 3 月 19 日 12:05 输出.log

我的用户帐户(jonny)的命令id显示以下输出:

uid=1500(jonny) gid=1500(jonny) groups=1500(jonny),27(sudo),33(www-data)

即使将 uid 更改为 jonny 后,为什么 PHP 进程仍无法写入 output.log 文件?

答案1

posix_setuid(1500)仅将 UID 更改为 1500。这并不授予您访问该文件的权限。您以常规用户身份登录时可以访问该文件的原因是,您不仅拥有 UID 1500,还拥有组 1500 以及补充组 27 和 33。拥有补充组 33 ( www-data) 将使您能够访问该文件。文件。

你可能应该这样做:

posix_initgroups("jonny", 1500);
posix_setuid(1500);

该顺序很重要:在您通过调用放弃 root 权限后,posix_setuid您将无法再设置您的凭据,因此它不会以其他顺序工作。

请注意,的文档posix_initgroups可能是错误的(就像 PHP 世界中的许多事情一样)。它说它“计算组访问列表”,但我猜它实际上的行为类似于它引用的 POSIX 函数,如果为真,则意味着它不仅计算它,而且实际上设置它。

相关内容