/ tmpディレクトリの実行可能ファイルにはSUIDビットは適用されません。

/ tmpディレクトリの実行可能ファイルにはSUIDビットは適用されません。

SUIDビットがオン(chmod + s)の実行可能ファイルからgetuid()とgeteuid()の値を印刷すると、所有者IDの代わりに元の呼び出し元IDが取得されるようです。実行可能ファイルが/ tmpディレクトリにある場合

これはまったく同じコードをホームディレクトリにコンパイルするとき(そしてchmod + sを実行するとき)、期待どおりに機能するようです。

たくさん検索しましたが、そのような行動に関する参考資料が見つかりませんでした。

なぜこれが起こるのか知っている人がいますか?

ソースは簡単です:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
    printf("%d\n%d\n", getuid(), geteuid());
    return 0;
}

答え1

Setuid実行可能ファイルは、というファイルシステムマウントオプションで無効にできますnosuid。信頼できないユーザーがマウントできる(自動暗黙的なuserマウントオプション)、または信頼できないユーザーがコンテンツを任意に変更できるファイルシステムの場合は、リムーバブルメディアまたは完全に信頼できないコンピュータのネットワークを介して。これは時々他のファイルシステムでも行われます。/etc/fstabnosuid

多くのシステムが使用一時ファイルシステムfor /tmp: 内容がメモリに残り、再起動後も持続しないファイルシステムです。 (tmpfsファイルシステムはデータの一貫性を気にする必要がないため、ディスクキャッシュに依存するよりも高速になる可能性があります)nosuid。の一部になります。ベクトル(setuidファイル自体は/tmpセキュリティ上のリスクではありませんが、無効にすると一部の脆弱性によるダメージを制限する可能性があります)。

まず、ディレクトリを含むマウントポイントを見つけて、ディレクトリのマウントオプションを確認できますdf

df /tmp/somefile

次に、出力からマウントポイントを検索するか、mountLinuxでマウントポイントを見つけます/proc/mounts

mount | awk '$3 == "/tmp"'

関連情報