Como posso evitar que um processo mude seu bit setuid de volta para RUID dentro do próprio processo?

0

Eu configurei meu bit SETUID para um usuário não-root para que o processo tenha sempre a propriedade desse arquivo executável. Mas eu descobri que bit setuid pode ser alterado de volta para RUID dentro do próprio script.

Existe alguma maneira de evitá-lo para que o bit setuid não possa ser alterado novamente para seu ID de usuário original?

Eu tentei o experimento abaixo.

chown 1000 /usr/local/bin/php
chmod u+s  /usr/local/bin/php

test.php

<?php

echo "RUID: " . posix_getuid() . "\n";
echo "EUID: " . posix_geteuid() . "\n";
echo file_put_contents('/root/euid_root.txt', 'test');
echo "\n\n";


// return EUID to root
// a process can change it's EUID back to RUID/SUID
posix_seteuid(0);

echo "RUID: " . posix_getuid() . "\n";
echo "EUID: " . posix_geteuid() . "\n";
echo file_put_contents('/root/uid_apache.txt', 'test');
echo "\n";

/ usr / local / bin / teste php.php

RUID: 0
EUID: 1000
PHP Warning:  file_put_contents(/root/euid_apache.txt): failed to open stream: Permission denied in /root/test.php on line 17

RUID: 0
EUID: 0
4
    
por SkyRar 01.11.2018 / 15:21

1 resposta

0

Em C, você faria algo como:

egid = getegid();
setresgid(egid, egid, egid);

euid = geteuid();
setresuid(euid, euid, euid);

para definir seu ID real, efetivo e salvar IDs de usuário / grupo para o efetivo, evitando assim futuras alterações. Você poderia escrever um programa wrapper simples que fizesse isso, em seguida, exec 'd PHP, mas na verdade existem várias outras coisas a considerar para programas set-uid seguros e, felizmente, os wrappers já existem ... e eu estou supondo que o você está procurando é o suexec do Apache.

    
por 01.11.2018 / 16:59