これは この質問 に関連しています。
スクリプトがあります(fix-permissions.sh
)いくつかのファイルパーミッションを修正します:
#! /bin/bash
Sudo chown -R person:group /path/
Sudo chmod -R g+rw /path/
そしてこれを実行するための小さなcプログラムはsetuid
edです:
#include "sys/types.h"
#include "unistd.h"
int main(){
setuid(geteuid());
return system("/path/fix-permissions.sh");
}
ディレクトリ:
-rwsr-xr-x 1 root root 7228 Feb 19 17:33 fix-permissions
-rwx--x--x 1 root root 112 Feb 19 13:38 fix-permissions.sh
これを行うと、すべてが正常に見え、アクセス許可は正しく修正されます。
james $ Sudo su someone-else
someone-else $ ./fix-permissions
しかし、straceを使用すると、次のようになります。
someone-else $ strace ./fix-permissions
/bin/bash: /path/fix-permissions.sh: Permission denied
identicalセットアップ(permissions、cプログラム)で同じアクセス許可拒否エラーが発生しますが、使用していない場合でもスクリプトが異なることに注意してください。 strace。これは、私が明らかにしているsetuidでのある種のheureustic魔法の振る舞いですか?
何が起こっているのかをどのように理解する必要がありますか?
システムはUbuntu10.04.2 LTS、Linux 2.6.32.26-kvm-i386-20101122#1SMPです
Linuxは、strace
または同様のプログラムでプロセスを実行するときに、setuidビットを無視します。
Linux-カーネルメーリングリスト、 Re:2.4.16 + strace 4.4 + setuidプログラム :
差出人:Manfred Spraul
日付:2001年12月6日木曜日-12:25:53 ESTSetuidのものをstraceし、setuidビットを尊重する場合は、-uオプションを指定してstraceをrootとして実行する必要があります。
いいえ、それでももう不可能です。 rootがptracingしている場合でも、プロセスがptraceされている場合、setuidは常に無視されるようになりました。これは、最新のptraceルートエクスプロイト(2.4.1x)の修正です。
これはおそらく話している: