/note/tech

「ただのファイル属性」がroot権限に化ける Linux ntfs3に潜んだ権限昇格のわな:Linuxカーネルが...

要約:

■ 1. 脆弱性InjectionBunnyの概要

  • ntfs3の権限昇格脆弱性:
    • LinuxカーネルのNTFSドライバー「ntfs3」に報告された脆弱性
    • 細工したNTFSボリュームを使い一般ユーザーがroot権限でプログラムを実行できる
  • 複雑なメモリ破壊は不要:
    • 競合状態やヒープスプレーなどの高度な技術を必要としない
    • 鍵を握るのはカーネルが信頼した「ファイル属性」
  • 報告の経緯:
    • セキュリティ研究者のウラジーミル・トカレフ氏が2026年6月25日にLinuxカーネルのセキュリティ窓口へ報告
    • 対応がなかったため2026年8月7日にntfs3のメンテナーが利用しているとみられるメーリングリストへ転送

■ 2. 原因となる実装上の欠陥

  • 原因箇所:
    • 「fs/ntfs3/xattr.c」の「ntfs_get_wsl_perm()」
  • WSL用拡張属性の反映:
    • ntfs3はNTFS上のWSL用拡張属性から「$LXUID」「$LXGID」「$LXMOD」を読み取る
    • 読み取った値をLinux側のファイル所有者やパーミッションに反映する
  • SUID/SGIDビットの残存:
    • $LXMODの値をinodeのi_modeに反映する際、SUIDやSGIDに関係するビットを除去していなかった

■ 3. 攻撃手法と成立条件

  • 攻撃の手順:
    • 攻撃者は$LXUID=0、$LXGID=0、$LXMOD=0104755を設定したNTFSイメージを作成する
    • Linux側でマウントすると対象ファイルはroot所有のSUID実行ファイルとして認識される
    • 一般ユーザーが実行するとSUIDの仕組みにより実効UIDが0となりroot権限で実行される
  • PoCでの確認:
    • UID、実効UID、GIDがいずれも0になることが確認された
  • 想定される侵入経路:
    • 細工したUSBドライブが経路の一つ
    • ループデバイスを利用できる環境では細工したNTFSイメージから攻撃できる
  • 成立条件:
    • NTFSをマウントしただけでroot権限を奪われるわけではない
    • 細工したボリュームがnosuidオプションなしでマウントされることが条件
    • そのボリューム内のSUID実行ファイルが実行されることが条件

■ 4. 影響範囲

  • 影響を受ける環境:
    • カーネルで「CONFIG_NTFS3_FS」が有効になっている環境
    • NTFSボリュームをnosuidなしでマウントする環境
    • USBドライブなどを自動マウントするLinuxデスクトップも条件に該当する
  • 対象ディストリビューション:
    • 報告では「Ubuntu」「Debian」「Fedora」「RHEL」「SUSE」「Arch Linux」などが挙げられている
  • アーキテクチャ非依存:
    • 問題はCPUアーキテクチャに依存しない
    • PoCはLinux 7.1.0のaarch64環境で確認された

■ 5. 対策

  • 修正案:
    • $LXMODをLinux側へ反映する際にSUID(S_ISUID)とSGID(S_ISGID)のビットを除去する
  • 運用面の回避策:
    • NTFSボリュームをnosuidオプション付きでマウントすることでSUIDを利用した攻撃を防げる
  • カーネル側の追加対応:
    • $LX*属性をユーザー空間から直接書き換えられないようにする修正も進められている

■ 6. 本質的な問題は信頼境界の設計

  • SUIDの消し忘れとして捉えるのは不十分:
    • 今回の問題を「SUIDのビットを消し忘れたバグ」とだけ捉えるべきではない
  • 本質的な原因:
    • 攻撃者が操作できるNTFSの「$LX*」属性を、カーネルがLinuxの権限情報として信頼してしまったこと
  • 開発者が設計すべき境界:
    • 危険な値を受け取ったらどう処理するかだけを考えるのでは足りない
    • その値を誰が変更できるのかを考える必要がある
    • その値をどの時点でOSが信頼する情報へ変換するのかという境界まで設計する必要がある
  • ファイルシステムドライバーに限らない教訓:
    • 外部から取得したファイル属性や設定値、メタデータをUID、GID、パーミッションへ変換する処理が対象
    • 入力値だけでなく、その入力を操作できる経路そのものを検証する必要がある

MEMO: