私はパスワードや確認を必要とせずにラップトップをすばやく終了できるプログラムを書こうとしています。ノートブックはLinux、特にManjaroを実行します。
これを行うには、固定引数で実行され、シェルも生成する実行可能setuid
ファイルを作成しようとしています。私はプログラムを短く保つためにこれを使用しています。セキュリティの観点からは悪い考えです。downnow
shutdown
system
// downnow.c
#include <stdlib.h>
int main() {
system("shutdown --no-wall --halt now");
return 0;
}
その後、 をコンパイルしてdownnow
に移動し、/bin
所有者を変更し、 setuid および setgid 権限を付与しました。
$ sudo chown root /bin/downnow
$ sudo chgrp root /bin/downnow
$ sudo chmod u+s /bin/downnow
$ sudo chmod g+s /bin/downnow
ただし、権限のないユーザーとして実行しようとすると、downnow
systemdと通信できません。
$ downnow
Failed to halt system via logind: Interactive authentication required.
Failed to talk to init daemon.
ingの前後に同じメッセージが表示されますch{own,grp,mod}
。
stat
/bin/downnow
レポートには同じ権限があります/usr/bin/sudo
。
$ stat /bin/downnow
File: /bin/downnow
Size: XXXX Blocks: XX IO Block: XXXX regular file
Device: XXXXX/XXXXX Inode: XXXXXX Links: 1
Access: (6755/-rwsr-sr-x) Uid: ( 0/ root) Gid: ( 0/ root)
$ stat /usr/bin/sudo
File: /usr/bin/sudo
Size: XXXXXX Blocks: XXX IO Block: XXXX regular file
Device: XXXXX/XXXXX Inode: XXXXXXX Links: 1
Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
完璧に動作するのに、なぜdownnow
権限を高めることができないのですか?sudo
ベストアンサー1
許可ビットを設定すると、アプリケーションはその呼び出しを使用setuid
できますが、それ自体は権限を変更しません。これを行うには、を使用してuidを設定する必要がありますsetuid(uid_t uid)
。詳しくはマニュアルページをご覧ください。https://linux.die.net/man/2/setuid
geteuid()
現在有効なuid(つまり、setuid権限を持つファイルの所有者)を取得するために使用できます。マニュアルページを参照してください。https://linux.die.net/man/2/geteuid
例:
// downnow.c
#include <stdlib.h>
#include <unistd.h>
int main() {
setuid(geteuid());
system("shutdown --no-wall --halt now");
return 0;
}