这是一个脚本来演示:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char **argv)
{
printf("Content-Type: text/plain\r\n\r\n");
printf("UID, EUID = %d, %d\n", getuid(), geteuid());
printf("GID, EGID = %d, %d\n", getgid(), getegid());
struct stat stbuf;
if (stat("/dev/shm", &stbuf))
printf("stat() failed: %s\n", strerror(errno));
else
printf("stat() succeeded\n");
return 0;
}
当我在 shell 下运行此脚本时sudo su -s /bin/bash apache
,它会生成:
Content-Type: text/plain
UID, EUID = 48, 48
GID, EGID = 48, 48
stat() succeeded
但是当由 Apache/2.2 作为 CGI 脚本运行时,页面响应:
UID, EUID = 48, 48
GID, EGID = 48, 48
stat() failed: Permission denied
这怎么可能?这台机器上有问题的位置 (/dev/shm) 具有以下权限:
drwxrwxrwt. 2 root root 260 Mar 29 06:52 .
drwxr-xr-x. 20 root root 4300 Mar 28 10:31 ..
答案1
这是由于 selinux 造成的。
您的脚本不允许对类型执行统计tmpfs_t
。httpd_sys_script_t
这是设计使然。您可能要采取的操作取决于您尝试执行 stat() 的内容(不仅仅是 /dev/shm)。
如果您chcon
在标签中运行程序httpd_unconfined_script_exec_t
,这将避免 SELinux 的限制,但代价是运行的脚本根本不受 SELinux 保护。