apache 用户无法从 CGI 中获取路径,但可以从 shell 中获取

apache 用户无法从 CGI 中获取路径,但可以从 shell 中获取

这是一个脚本来演示:

#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_thttpd_sys_script_t这是设计使然。您可能要采取的操作取决于您尝试执行 stat() 的内容(不仅仅是 /dev/shm)。

如果您chcon在标签中运行程序httpd_unconfined_script_exec_t,这将避免 SELinux 的限制,但代价是运行的脚本根本不受 SELinux 保护。

相关内容