概要
- LinuxのCapabilities は、root権限を細分化し、必要最小限の特権付与を可能にする仕組み。
- setcapコマンド でバイナリ単位に権限を設定可能、攻撃者による悪用リスクも存在。
- getcapやLinPEAS 等のツールで、設定済みCapabilitiesの検出・監査が重要。
- Capabilitiesは SUID/SGIDに代わる新たな権限管理リスク として注目されている。
- 監査・運用時には getcapによる全ファイルのチェック が推奨。
Linux Capabilitiesの基礎
- Capabilities とは、従来のroot(スーパーユーザー)権限を 細かい単位 に分割したアクセス制御方式。
- 各プロセスやバイナリに 必要な権限のみを付与 し、最小権限での運用を実現。
- 例: 特権ポートへのバインド権限だけ を持つプロセスなど、柔軟な権限設計が可能。
Capabilitiesの確認方法
- サポートされているCapabilities数 は
/proc/sys/kernel/cap_last_capで確認。 - capsh --print コマンドで、現在のシェルやプロセスのCapabilitiesセットを一覧表示。
- 各Capabilityは 特定の管理操作 に紐づいている(例:cap_setuid、cap_net_bind_service等)。
setcapによる権限付与と悪用例
- setcapコマンド でバイナリにCapabilitiesを付与可能。
- 例:
setcap cap_setuid+ep /usr/bin/python3.12でPythonにUID操作権限を付与。
- 例:
- e(Effective)/p(Permitted)フラグで 有効/許可 状態を指定。
- 攻撃例: 一般ユーザーがcap_setuid権限付きのPythonでrootシェルを取得 可能。
- SUIDビット変更不要、バイナリ自体の改変も不要なため、 ステルス性の高いバックドア 実現手段。
Capabilities設定ファイル・バイナリの探索
- 従来の SUID/SGID探索 だけでなく、Capabilities付与バイナリの検出も必須。
- getcap -r / で全ファイルシステムを再帰的に調査可能。
- 例:
/usr/bin/python3.12 cap_setuid=ep
- 例:
- /proc/[pid]/status でプロセスごとのCapability状態確認。
- capsh --decode や getpcaps [PID] でCapability値のデコード・表示。
Capabilitiesの削除
- setcap -r [バイナリパス] でCapabilitiesを削除。
- 例:
setcap -r /usr/bin/python3.12
- 例:
LinPEASによる自動監査
- LinPEAS は、Capabilities探索やSUIDファイルチェックを自動化。
- 現在シェル・親プロセスのCapabilities確認
- getcapによる全ファイル調査
Capabilitiesの監査・検知ルール
- Elastic 等のSIEM製品でsetcapコマンド利用の監視ルールを設定可能。
- 例:setcapコマンド実行を検知し、特定パスやプロセス名を除外条件に指定。
Capabilitiesの格納場所と確認方法
- CapabilitiesやACL等の拡張属性 は、ファイルのinode内に格納。
- lsでは表示不可、getcapやgetfattrで確認。
- getfattr -d -m - [ファイルパス] で全拡張属性を一覧表示。
- security.capability属性がCapabilities情報。
まとめ
- SUID/SGIDチェックと同様に、Capabilitiesの監査も現代の必須セキュリティ対策。
- Capabilitiesは 柔軟かつステルス性の高い権限付与手段 であり、悪用リスクも高い。
- getcap等のツールで定期的な全ファイル監査 を推奨。
- /etc/security/capability.confやサービスのAmbientCapabilitiesなど、 ユーザー/サービス単位の設定項目にも注意。
参考資料
- Capabilities – Linux Privilege Escalation
- Linux Capabilities