私は Linux の機能を試していましたが、passwd
プログラムが Set-UID ルートにならずに機能するには、(他の機能に加えて) CAP_CHOWN機能が必要であることに気付きました。論理的には、なぜCAP_CHOWNが必要なのでしょうか?
ちなみに、この機能を削除すると、passwd で「トークン操作エラー」が発生します。
編集: SELinux なしで Ubuntu 11.04 を使用しています。passwd
Set-UID ルートにならずに作業を開始しようとしています。
私は Linux の機能を試していましたが、passwd
プログラムが Set-UID ルートにならずに機能するには、(他の機能に加えて) CAP_CHOWN機能が必要であることに気付きました。論理的には、なぜCAP_CHOWNが必要なのでしょうか?
ちなみに、この機能を削除すると、passwd で「トークン操作エラー」が発生します。
編集: SELinux なしで Ubuntu 11.04 を使用しています。passwd
Set-UID ルートにならずに作業を開始しようとしています。
自体には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;
}