プロセス自体内でプロセスがsetuidビットをRUIDに戻すのを防ぐ方法

プロセス自体内でプロセスがsetuidビットをRUIDに戻すのを防ぐ方法

プロセスが常に実行可能ファイルの所有権を持つように、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の場合訴訟実行プログラム

おすすめ記事