3

私は Linux の機能を試していましたが、passwdプログラムが Set-UID ルートにならずに機能するには、(他の機能に加えて) CAP_CHOWN機能が必要であることに気付きました。論理的には、なぜCAP_CHOWNが必要なのでしょうか?

ちなみに、この機能を削除すると、passwd で「トークン操作エラー」が発生します。

編集: SELinux なしで Ubuntu 11.04 を使用しています。passwdSet-UID ルートにならずに作業を開始しようとしています。

4

2 に答える 2

2

自体にはcap_chownは必要ありませんpasswd。に関連付けられている /etc/shadow ファイルを変更するだけで済みますuserID。/etc/shadow ファイルは、誰でも読めないように設定されています。

/etc/shadow は root のみがアクセスできます。そのため、/etc/passwd が認証モジュールを終了し、新しい (エンコードされた) パスワードを書き込む準備ができると、トークンが作成されます。これは Linux-PAM サービスによってアクセスされ、root に chown され、/etc/shadow に書き込まれます。

編集:

passwd は、ファイル /etc/.pwd.lock、/etc/shadow、/etc/nshadow を使用します。passwd は /etc ディレクトリから読み書きするため、w パーミッションが必要です。/etc/shadow が passwd によって書き込まれることはないことに注意してください。passwd は実際に /etc/nshadow に書き込み、/etc/nshadow の名前を /etc/shadow に変更します。

open('/etc/nshadow',O_WRONLY|O_CREAT)=fd1
open('/etc/shadow', O_RDONLY)=fd2
fchown(fd1, uid=root, gid=shadow)
chmod /etc/shadow to : rw by owner and r by group
read(fd2)
write(fd1)
rename("/etc/nshadow", "/etc/shadow")

さらに、/etc/nshadowこのCプログラムを使用して存在を確認しました。ご参考までに、

#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
if (access("/etc/nshadow",F_OK)!=-1){
    printf("Exists\n");
    break;
    }
return 0;
}
于 2011-10-21T13:10:12.060 に答える
0

setuid本来必要なものはそれだけです。

SELinux ( Security Enhanced )の追加には、プログラム コンテキストが正しいことと、ファイルのパーミッション チェックが必要です。

システムの SE 機能が無効になっている場合は、passwd何もなくても正常に動作しますCAP_...。に「1」を書き込むことでSEを無効にできることをどこかで読みました/selinux/disable。おそらく「0」を書き込むと、再び有効になります。

NSA の説明またはFedoraの説明を参照してください。

于 2011-10-21T05:47:56.077 に答える