o usuário do apache não pode indicar um caminho do CGI, mas pode partir do shell

1

Aqui está um script para demonstrar:

#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;
}

Quando executo esse script em um sudo su -s /bin/bash apache shell, ele produz:

Content-Type: text/plain

UID, EUID = 48, 48
GID, EGID = 48, 48
stat() succeeded

Mas quando executado como um script CGI pelo Apache / 2.2, a página responde:

UID, EUID = 48, 48
GID, EGID = 48, 48
stat() failed: Permission denied

Como isso é possível? A localização em questão (/ dev / shm) nesta máquina estas permissões:

drwxrwxrwt.  2 root   root       260 Mar 29 06:52 .
drwxr-xr-x. 20 root   root      4300 Mar 28 10:31 ..
    
por Peter Woo 29.03.2013 / 19:00

1 resposta

2

Isto é devido ao selinux.

Seu script não tem permissão para fazer uma estatística em tmpfs_t como o tipo httpd_sys_script_t . Isso é por design. Dependendo do que você está tentando stat () (não apenas / dev / shm) pode depender de qual ação você pode tomar.

Se você chcon o programa executar no rótulo httpd_unconfined_script_exec_t , isso evitará as restrições do SELinux, ao custo de nenhuma proteção do SELinux para o script que está sendo executado.

    
por 29.03.2013 / 19:21