setuidが実行可能ファイルで機能しないのはなぜですか?


9

スクリプトでsetuidを有効にするとセキュリティの問題が発生するため、デフォルトでは無効になっていますが、実行可能ファイルで機能することを期待しています。この投稿で説明されている手順に従って、出力としてuidを示す実行可能ファイルを作成しました。シェルスクリプトでsetuidを許可します

しかし、実行前と実行後の両方で同じuid(1000)を返しますsudo chmod +s ./setuid-test。これは、setuidが実行可能ファイルに影響を与えないことを意味すると思います。なぜ、どのように解決するのですか?

ソースコード:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

構築して実行

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

実行するとls -la、これは私が得るものです:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

2
実行可能ファイルは、実行しているユーザー以外のユーザーが所有していますか?(setuidはrootへの変更を意味するものではありません。実行可能ファイルを所有するユーザーへの変更を意味します。)
cjm

PHPLearner私はあなたがファイルのSUIDを変更するためにグループ/ユーザーを関与させる必要があると思います
ryekayo

@cjm me@me:~$ ls -la setuid-test---- returns -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner

7
/ tmpにマウントされているパラメーターはsetuidプログラムを禁止しているため、プログラムがホームディレクトリにある場合は、Ubuntu 14.04システムで正常に機能しますが、/ tmpにある場合は機能しません。プログラムはどこにありますか?
Mark Plotnick 2014

2
df .ディレクトリを入力してマウントポイントを見つけ、次にmount | grep nameofmountpoint。そこにnosuidリストされているフラグはありますか?
Mark Plotnick

回答:


10

Unix / Linux用に設計されたほとんどのファイルシステムは、nosuid属性を使用してマウントできます。これにより、これらのファイルシステムにあるsetuidまたはsetgidバイナリがプロセスの有効なuidまたはgidを変更するのを防ぎます。管理者以外の管理下にある「信頼できない」ファイルシステムをマウントするときによく使用されます。

あなたの場合、使用しているファイルシステムはタイプecryptfsです。これはaskubuntuによると、暗号化されたホームディレクトリの下でroot setuidを使用してバイナリを実行すると、数年前のバージョンからnosuid(およびnodev)が自動的に適用されます。

https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409からの変更理由の説明は次のとおりです。

Vincent Danen 2012-07-20 11:25:56 EDT
setuid-rootであるプライベートecryptfsマウントヘルパー(/sbin/mount.ecryptfs_private)により、権限のないローカルユーザーがユーザー制御のecryptfs共有をマウントできることが報告されましたローカルシステム上。ecryptfsヘルパーは「nosuid」および「nodev」フラグを使用してファイルシステムをマウントしないため、ユーザーがsetuid-rootバイナリやデバイスファイルを含むファイルシステムをマウントして、権限の昇格につながる可能性があります。これは、ユーザーがシステムに物理的にアクセスできる場合、USBデバイスを介して行うことができます。
...
MS_NOSUIDおよびMS_NODEVマウントフラグの強制がバージョン99に追加されました。


システムがユーザーにsetuidを許可するファイルシステムのマウントを許可した場合、rootになるのは簡単です。1)実行可能ファイルを作成2)他の場所でchown rootchmod +s3)それをマウント4)実行可能ファイルを実行
ctrl-alt-delor

1

実行可能ファイルのSetUIDビットにより、(スーパーユーザーではなく)ファイル所有者で実行可能ファイルを実行できます。rootとして実行可能ファイルを実行できるようにするには、以下を実行します。

sudo chown 0:0 ./setuid-test

確かに、それは問題ではありません。root以外のユーザーにsetuidするプログラムを作成することは可能です。問題のシナリオでは、のUID setuid-testが表示されますnobody
Gilles「SO-悪をやめる」14

@ギレスあなたは正しいです。私はsetuidさ-テストディスプレイを期待しnobody、ないroot
PHP学習者

「実行可能ファイルのSetUIDビットにより、ファイル所有者で実行可能ファイルを実行できます」と私のファイル所有者はなので、見返りnobodyに期待655341000ますが、誰でも所有者であることがわかります!
PHP学習者

2
テストプログラムを実行するファイルシステムのマウントオプションを確認します。でマウントされている場合nosuid、プログラムは動作しない可能性があります。
カウンター

1
@countermode @MarkPlotnick mount | grep /home/meが返されます /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP学習者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.