OOq:
私は名前の簡単なプログラムを書きますsuid.c
:
int main(int argc, char* argv[]) {
system(argv[1]);
}
GCCその後、設定SUIDパーミッション(今rootユーザ)でそれをコンパイルします。
# gcc suid.c -o suid
# chmod +s suid
私が実行しようとした./suid id
別の仮想マシン上のWWWデータのユーザーとが、出力は異なります。
- カーリー2019で出力:
id=33(www-data) gid=33(www-data) groups=33(www-data)
- 信頼できるのUbuntuでの出力(古いLinuxの):
uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)
何故ですか?何は、Linuxに変わりましたか?
ジル「SO-ストップ悪さ」:
それはかどうかによって異なり/bin/sh
ディストリビューション上でbashやダッシュです。bashはオプションで呼び出されない限り、常にのsetuid / setgidの権限をドロップ-p
。ダッシュは、権限について何も特別な操作を行うことはありません。
Ubuntuの、上のsystem
関数呼び出すsh
で、/bin/sh
権限を落としていないダッシュ、です。カーリーでは、system
関数呼び出すsh
で、/bin/sh
権限を落としbashのであり、これは、。これは、として配布インストールシェルそのうち問題だsh
ではない分布がどのように最近の、。
バッシュの行動は、セキュリティ対策することができますが、それは非常に効果的なものではありません。それは見当違いの構成やなどの機能への信頼できない入力を彼らが持っているべきではないと権限で実行し、許可ひどく書かれたプログラムに対する防衛の2行目ですsystem
。しかし、このようなプログラムは、通常、潜在的な攻撃者は、このようなファイルへの書き込み機能として、とにかく攻撃することができ、他の穴を持っています。