setuid プログラムが TinyCore Linux で setuid を実行できないようです。

setuid プログラムが TinyCore Linux で setuid を実行できないようです。

setuidTinyCore Linux Live CDを使用してプログラムの脆弱性を実証したいと思います。つまり、実行ユーザーではなくファイル所有者として実行する特別な権限を持つ特別なプログラムを作成しました。私のステップは次のとおりです。

  1. セキュリティの脆弱性を持つプログラムを作成し(下記参照)、マイホームシステム(Ubuntu)でコンパイルします。

  2. Ubuntuでまだプログラムを作成してsetuidファイル所有者を設定する

  3. Tiny Core Live CDを解凍し、脆弱なプログラムをコピーしてくださいchroot

問題は、プログラムが環境や完成したリマスター画像setuidの両方で動作しないようです。chrootUbuntuでは動作しますが、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。私は何を見逃していますか?

環境を作成するには、次のchroot8MBライブ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

setuidTinyCoreには問題ありません。しかし、問題の簡単なプログラムは、TinyCoreで利用するのはそれほど簡単ではありません。

呼び出しsystemは、呼び出しで指定されたコマンドを使用します/bin/sh -c。 TinyCoreは/bin/shシンボリックリンクに対する権限をbusybox ash放棄しますsetuid。したがって、シェルスクリプトや悪意のある操作を実行するバイナリを作成し、脆弱なプログラムが実行されるように欺くためにdate名前を付けても、元のsetuidプログラムsetuidは実行されませんsystem

しかし、バージョン2以降、標準はbash呼び出し時に権限も削除します。ただし、質問に記載されている脆弱性はDebianおよびその派生製品で証明される可能性があります。明らかに、Debianのバージョンは権限を削除しないからです。 (明らかにそのような理由があるようですが、研究したことはありません。)setuid/bin/shbash

最後に、プログラムを次のように変更して権限の放棄を避けることができました。

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;
}

おすすめ記事