プロセスが常に実行可能ファイルの所有権を持つように、SETUIDビットをroot以外のユーザーに設定しました。しかし、スクリプト自体でsetuidビットをRUIDに戻すことができることがわかりました。
setuidビットが元のユーザーIDに変更されないようにこれを防ぐ方法はありますか?
私は次の実験を試しました。
chown 1000 /usr/local/bin/php
chmod u+s /usr/local/bin/php
テスト.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/php test.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
答え1
Cでは、次のことを行います。
egid = getegid();
setresgid(egid, egid, egid);
euid = geteuid();
setresuid(euid, euid, euid);
将来の変更を防ぐために、実際の有効で保存されたユーザー/グループIDを有効なIDに設定してください。これを行い、PHPを使用するための簡単なラッパーを書くことができますが、exec
実際には安全なset-uidプログラムのために考慮すべき他のことがたくさんあります。 Apacheの場合訴訟実行プログラム。