When the setuid or setgid bits are set on Linux or macOS for an application, this means that the application will run with the privileges of the owning user or group respectively (Citation: setuid man page). Normally an application is run in the current user’s context, regardless of which user or group owns the application. There are instances where programs need to be executed in an elevated context to function properly, but the user running them doesn’t need the elevated privileges. Instead of creating an entry in the sudoers file, which must be done by root, any user can specify the setuid or setgid flag to be set for their own applications. These bits are indicated with an "s" instead of an "x" when viewing a file's attributes via ls -l. The chmod program can set these bits with via bitmasking, chmod 4777 [file] or via shorthand naming, chmod u+s [file].
An adversary can take advantage of this to either do a shell escape or exploit a vulnerability in an application with the setsuid or setgid bits to get code running in a different user’s context. Additionally, adversaries can use this mechanism on their own malware to make sure they're able to execute in elevated contexts in the future (Citation: OSX Keydnap malware).
T1166は、LinuxやmacOSにおける権限昇格・永続化の古典的かつ強力なテクニックです。
Linux/Unix系OS特有のファイル権限システムを逆手に取り、「一般ユーザーがそのファイルを起動しても、自動的に『所有者(通常はroot)』の最高権限でプログラムが実行される」という特殊な設定を悪用する手口です。
この手法で攻撃者は、「いつでも、一般ユーザー権限から一瞬で、パスワードを入力することなくroot(最高権限)のシェルを起動できる『秘密のバックドア(特権昇格の足がかり)』をシステム内に常駐させること」を実現します。
音を立てない特権昇格(パスワード不要):
通常、Linuxで一般ユーザーがroot権限を得るには sudo コマンドを叩いてパスワードを入力する必要があります(ログにも残ります)。しかし、Setuidビットが立ったファイルを実行する場合、OSの仕様としてパスワードの入力なしで、自動的にrootとして実行されます。
強固な永続化:
一度システムに侵入してroot権限を奪取した攻撃者が、システム内の無害そうなプログラム(あるいは自身が隠したカスタムプログラム)にこのSetuidビットを付与しておけば、万が一現在のセッションが切断されて一般ユーザー権限まで落とされたとしても、そのファイルを叩くだけでいつでもroot権限に「出戻り」が可能になります。
攻撃者が一度システムを掌握(root化)した後に、将来の再侵入や権限維持のためにSetuidを仕込む(ポストエクスプロイト)ケースを例に解説します。
初期侵入と一時的な特権強奪:
脆弱性(例: 前述の sudo の脆弱性など)を突き、Linuxサーバー内で一度 root 権限を確保します。
バックドアバイナリの配置:
攻撃者は一般ユーザーのホームディレクトリや、目立たないシステムフォルダ(/tmp/ や /usr/bin/ など)に、シンプルなシェル(/bin/sh)を起動させるための短いプログラム(例: backdoor)を設置します。
Setuidビットの付与(トリガー):
chmod コマンドを悪用し、そのファイルの所有者を root にした上で、「4000」のパーミッション(Setuid)を付与します。
chown root:root /tmp/backdoorchmod 4755 /tmp/backdoor4 がSetuidを意味します。これにより、ファイルの権限表示が -rwxr-xr-x から -rwsr-xr-x に変わり、実行権限(x)の場所が s に変化します)一般ユーザーへの復帰:
攻撃者はログを消し、一旦一般ユーザーに戻るか、あるいは外部から一般ユーザーとして再度ログインします。
一瞬での特権昇格(目的達成):
一般ユーザー権限のまま、手順3で仕込んだ /tmp/backdoor を実行します。OSは「Setuidが有効、かつ所有者がroot」であることを確認し、このプログラムを root権限で実行 します。プログラムが起動したシェル(cmd)はrootの特権を持っているため、攻撃者はパスワードなしでシステムを完全に再掌握します。
システム内に「野良Setuidファイル」が存在しないかを定期的に監査・検知するのが最大の防御となります。
不審なSetuid/Setgidファイルの検索(最重要):
システム管理者側で、以下の find コマンドを定期実行(cronなどで自動化)し、システム内に意図しないSetuidファイル(特に /tmp や /var 配下)が作成されていないかをチェック(監査)します。
監査コマンド:
find / -perm -4000 -o -perm -2000 -type f 2>/dev/null
(※システム全体のSetuid(4000)およびSetgid(2000)を持つファイルを一列挙するコマンド)
マウントオプションの制限(nosuid):
ユーザーが自由にファイルを書き込めるパーティション(/tmp、/var/tmp、/home など)をマウントする際、Linuxの /etc/fstab 設定において nosuid オプション を強制します。これにより、万が一攻撃者がその領域にSetuidファイルを設置しても、OSがSetuid機能を無効化して一般ユーザー権限のまま実行させることができます。
整合性監視(FIM)による /usr/bin 等のロック:
Linuxの標準的なSetuidプログラム(passwd や chsh など、一般ユーザーがパスワード変更するためにOSが公式にSetuidを与えているファイル)が、ハッカーによって改造・すり替えられていないかをファイル整合性監視(FIM)でチェックします。
「正規の必要悪」を突く:
Linuxシステムにおいて、一般ユーザーが自分のパスワードを変更する(/etc/shadow ファイルを書き換える)には、どうしても一時的に root 権限が必要です。そのため、OS標準の passwd コマンドには最初からSetuidが設定されています。攻撃者はこの「OSが稼働するためにどうしても必要な仕組み」を逆手に取って自分用の裏口を作るため、一見しただけではOSの正常な挙動と区別がつきにくいのが特徴です。
GTFOBins(環境寄生)との連動:
OSに最初から入っている正規のプログラム(例: find, nano, less などのテキストエディタやシステムツール)のSetuidビットが管理者の設定ミスなどで誤って立っている場合、攻撃者はマルウェアを一切持ち込むことなく、そのツール内の機能(外部コマンド実行など)を使ってrootを強奪できます。この手口は「GTFOBins」としてデータベース化されており、ペネトレーションテストや実際の攻撃で非常によく狙われます。
CWE-266: Incorrect Privilege Assignment(不適切な特権割り当て)
本来であれば一般ユーザー権限で動作すべきプログラムや、新しく作成された不審なファイルに対して、過剰な実行権限(Setuidによるroot特権)が割り当てられてしまっている問題。
CWE-732: Incorrect Permission Assignment for Critical Resource(重要なリソースに対する不適切なアクセス権限の割り当て)
ファイルシステムの設定において、一般ユーザーが自由に書き込める領域(/tmpなど)でSetuidの実行を許可してしまっている運用の弱点。
Setuidの悪用そのものはOSの機能(パーミッション設定)であるため、これ単体にCVEがあるわけではありません。しかし、「標準でSetuidが立っている正規のLinuxプログラム」にバグ(脆弱性)があった場合、一般ユーザーが一発でrootを奪取できる極めて凶悪なローカル特権昇格(LPE)脆弱性へと発展します。
CVE-2021-4034 (通称: PwnKit - Polkitのpkexecの脆弱性):
大半の主要なLinuxディストリビューションに標準でインストールされており、かつ最初からSetuid(root所有)が設定されていた pkexec というコマンドに、10年以上にわたって存在していたメモリ破損の脆弱性です。このコマンドの引数の処理不備を突くことで、一般ユーザーはたった1行のコマンドを実行するだけで、何の制限もなく100%確実にroot権限を奪取することができました。Setuidプログラムの脆弱性がどれほど危険かを世界に知らしめた代表例です。
CVE-2022-3910 (Linuxカーネル io_uring の脆弱性等と組み合わせた悪用):
カーネル層のバグを突いて一般ユーザーがメモリを書き換え、特定のプログラムに強引にSetuidビットを書き込む(あるいは自分のプロセスのUIDを0/rootに書き換える)など、T1166(Setuidの付与)は高度なエクスプロイトが成功した後の「権限の固定化(永続化)」のフェーズで、これらの脆弱性とセットで確実に実行されます。