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/fstab
nosuid
多くのシステムが使用一時ファイルシステムfor /tmp
: 内容がメモリに残り、再起動後も持続しないファイルシステムです。 (tmpfsファイルシステムはデータの一貫性を気にする必要がないため、ディスクキャッシュに依存するよりも高速になる可能性があります)nosuid
。の一部になります。ベクトル(setuidファイル自体は/tmp
セキュリティ上のリスクではありませんが、無効にすると一部の脆弱性によるダメージを制限する可能性があります)。
まず、ディレクトリを含むマウントポイントを見つけて、ディレクトリのマウントオプションを確認できますdf
。
df /tmp/somefile
次に、出力からマウントポイントを検索するか、mount
Linuxでマウントポイントを見つけます/proc/mounts
。
mount | awk '$3 == "/tmp"'