同じSUID +システムプログラム、異なるシステム上の異なる出力

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しかし、このようなプログラムは、通常、潜在的な攻撃者は、このようなファイルへの書き込み機能として、とにかく攻撃することができ、他の穴を持っています。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=6803&siteId=1