setuid
TinyCore Linux Live CDを使用してプログラムの脆弱性を実証したいと思います。つまり、実行ユーザーではなくファイル所有者として実行する特別な権限を持つ特別なプログラムを作成しました。私のステップは次のとおりです。
セキュリティの脆弱性を持つプログラムを作成し(下記参照)、マイホームシステム(Ubuntu)でコンパイルします。
Ubuntuでまだプログラムを作成して
setuid
ファイル所有者を設定するTiny Core Live CDを解凍し、脆弱なプログラムをコピーしてください
chroot
。
問題は、プログラムが環境や完成したリマスター画像setuid
の両方で動作しないようです。chroot
Ubuntuでは動作しますが、Tiny Coreで動作するために必要です。プログラムはTiny Coreで実行されますが、所有者としては実行されませんsetuid
。
プログラムソースコード:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
printf("Current time: ");
fflush(stdout);
system("date");
return 0;
}
ビルドコマンド:
gcc -o prog prog.c
setuidで作る:
sudo chown 1200.1200 prog
sudo chmod 4755 prog
date
脆弱性を示すスクリプトを作成してください。
#!/bin/sh
echo hello > /tmp/test.txt
ls -l /tmp/test.txt
操作されたdate
スクリプトを実行可能にし、脆弱性を公開します。
chmod +x date
PATH=.:$PATH ./prog
Ubuntuは期待どおりに/tmp/test.txt
所有者1200を作成します。ただし、chroot
ライブ CD 環境に入ると、動作せず実行ファイルが実行されますが、ファイル所有者としては実行されません。リマスターを完了し、ライブCDを作成して起動すると、ファイルに正しい所有者、グループ、および権限があっても機能しません4755
。私は何を見逃していますか?
環境を作成するには、次のchroot
8MBライブCDをダウンロードしてください。http://distro.ibiblio.org/tinycorelinux/downloads.html次の手順に従ってください。
sudo mount Core-current.iso /mnt
mkdir /tmp/extract
cd /tmp/extract
zcat /mnt/boot/core.gz | sudo cpio -i -H newc -d
chroot
次のコマンドを使用して、脆弱なプログラムを環境にコピーします。
sudo cp -a /path/to/prog /tmp/extract/tmp
sudo cp /path/to/date /tmp/extract/tmp
chroot
そこで脆弱性をテストします。
sudo chroot /tmp/extract /bin/sh
su - tc
cd /tmp
PATH=.:$PATH ./prog
私の究極の目標はもちろん、ライブCDで実行することです。で動作しなくても大丈夫ですchroot
。これは、イメージを再パッケージ化して起動しなくても、適切な最初のテストのように見えます。
答え1
setuid
TinyCoreには問題ありません。しかし、問題の簡単なプログラムは、TinyCoreで利用するのはそれほど簡単ではありません。
呼び出しsystem
は、呼び出しで指定されたコマンドを使用します/bin/sh -c
。 TinyCoreは/bin/sh
シンボリックリンクに対する権限をbusybox ash
放棄しますsetuid
。したがって、シェルスクリプトや悪意のある操作を実行するバイナリを作成し、脆弱なプログラムが実行されるように欺くためにdate
名前を付けても、元のsetuid
プログラムsetuid
は実行されませんsystem
。
しかし、バージョン2以降、標準はbash
呼び出し時に権限も削除します。ただし、質問に記載されている脆弱性はDebianおよびその派生製品で証明される可能性があります。明らかに、Debianのバージョンは権限を削除しないからです。 (明らかにそのような理由があるようですが、研究したことはありません。)setuid
/bin/sh
bash
最後に、プログラムを次のように変更して権限の放棄を避けることができました。
int main(int argc, char **argv)
{
// circumvent busybox ash dropping privileges
uid_t uid = geteuid();
setreuid(uid, uid);
printf("Current time: ");
fflush(stdout);
system("date");
return 0;
}
答え2
一部のセキュリティポリシー(SELinux、AppArmorなど)が適用され、リストにない実行可能ファイルのSUIDを許可しないのでしょうか。それとも(純粋な精神のために)/tmp
nosuidをインストールしましたか?