needhelp
← ブログに戻る

ssh-keysign-pwn:ptrace の論理バグにより一般ユーザーが root 所有ファイルを読み取り可能に

著者 xingwangzhe
Linux
Kernel
Security
Qualys
ptrace
CVE

ssh-keysign-pwn:カーネルの __ptrace_may_access() に存在した6年間の論理バグ。Qualys が報告し、Linus Torvalds が2026年5月14日に修正。非特権ユーザーが SSH ホスト秘密鍵や /etc/shadow などの root 所有ファイルを読み取れる。31e62c2ebbfd より前の全カーネルが影響を受ける。


また一つ

2026年5月は Linux カーネルにとって厳しい月だ。Dirty Frag、Fragnesia、そして今回の ssh-keysign-pwn — Qualys が5月14日に開示し、Linus Torvalds が同日中に修正した。

これは「ページキャッシュに何かをコピーする」系統の脆弱性とは異なる。__ptrace_may_access() の純粋な論理バグだ。この関数は、あるプロセスが別のプロセスの状態を検査できるかどうかを判断するゲートキーパーである。

指標
報告者Qualys Security Advisory
修正者Linus Torvalds
修正コミット31e62c2ebbfd
潜伏期間~6年
最初の発見Jann Horn(Google)、2020年10月
PoC公開者_SiCk
影響非特権ユーザーが root 所有ファイルを読み取り
難易度100–2000回の試行で1回の steals 成功

仕組み

バグは __ptrace_may_access() にある。この関数はプロセスイントロスペクションの gatekeeper であり、あるプロセスが別のプロセスの状態を覗き見できるかをチェックする。

特殊なケースがある:task->mm == NULL の場合(対象プロセスにメモリ記述子がない — スレッドが終了処理中のとき、またはカーネルスレッドの場合)、関数は dumpable チェックを完全にスキップする

悪用可能なコードパス:

  1. プロセスが do_exit() を呼び出して終了
  2. do_exit() が先に exit_mm() を実行 — メモリ記述子(mm)を破棄
  3. 次に exit_files() を実行 — しかしファイル記述子はまだ生きている
  4. task->mm == NULL だが fd が開いたまま → pidfd_getfd(2) が呼び出し元の uid と一致すれば fd を奪取可能

通常、ptrace アクセスチェックは低権限プロセスが root プロセスの開いているファイルハンドルに触れるのを防ぐ。しかし mm == NULL バイパスが dumpable チェックを無効にし、pidfd_getfd(2) が残りの処理を行う。

古典的な TOCTOU 競合状態だが、ウィンドウは十分に広い — PoC は 100–2000 回の試行で成功する。

エクスプロイトの標的

2つのツールが公開された:

sshkeysign_pwnssh-keysign を標的とする。このヘルパーバイナリはホスト認証チャレンジに署名する。permanently_set_uid() で権限を落とす前に SSH ホスト鍵ファイル(/etc/ssh/ssh_host_{ecdsa,ed25519,rsa}_key、モード0600)を開く。その後 sshd_config で EnableSSHKeysign が設定されているかを確認 — 設定されていなければ鍵の fd を開いたまま終了する。この設計は 2002年 から OpenSSH にある。

chage_pwnchage -l <user> を標的とする。spw_open(O_RDONLY)/etc/shadow を開き、その後 setreuid(ruid, ruid) を呼び出す — 両方の引数が実 uid なので完全に権限を落とす。権限低下とファイルクローズの間のウィンドウで fd が盗まれる。


タイムライン

日付イベント
~2020年Jann Horn が FD 窃取パターンを特定、パッチを提案(マージされず)
2026-05-14Qualys が脆弱性を報告;Linus Torvalds が修正をコミット(31e62c2ebbfd
2026-05-14Brad Spengler が分析を公開
2026-05-14_SiCk が GitHub で PoC を公開
2026-05-15Qualys が oss-security に開示メールを送信

2020年の Jann Horn のパッチ提案から2026年の Qualys 報告までのギャップは注目に値する。修正は5年前に書かれていたが、アップストリームにマージされることはなかった。


修正

Linus はコミット 31e62c2ebbfd で修正を適用した。コミットメッセージで次のように述べている:

「我々には奇妙な特殊ケースがある:ptrace_may_access() は ‘dumpable’ を MM とは完全に独立した様々なチェックに使用している(典型的には PTRACE_MODE_READ_FSCREDS のようなフラグを使用)、これは VM を持たなくなったスレッド(あるいは最初から持っていなかったスレッド、ほとんどのカーネルスレッドのように)を含む。このフラグが設計された用途ではないが、現状そうなっている。」

パッチは mm == NULL のケースを適切に処理するよう ptrace の動作を調整し、バイパスウィンドウを事実上閉じる。

カーネルを確認

uname -r
# 修正済みカーネルは commit 31e62c2ebbfd を含む
# 2026-05-14 より前の全カーネルが脆弱

注目すべき点

3つの点が印象的だ:

  1. 報告当日に修正された。 Linus が数時間で対応した。カーネル修正としては異例の速さで、バグを理解すれば修正は直接的だったことを示している。

  2. Jann Horn が2020年に発見していた。 コミュニティは5年間もメーリングリストにパッチ提案を放置していた。FD 窃取パターンは既知だったが、誰もマージを推進しなかった。

  3. 標的は古代の設計。 ssh-keysign の fd リークパターンは2002年にまで遡る。chagespw_open + setreuid シーケンスも同様に長い歴史を持つ。これは SSH や shadow-utils のバグではない — 特権バイナリの既存の fd 処理パターンを武器化したカーネルのバグだ。

これは2026年5月、Copy FailDirty Frag に続く3つ目の主要な Linux カーネル脆弱性である。開示のペースは加速している — AI 支援監査ツールが古いバグをより速く見つけていることと、開示エコシステムが断片化していること(embargo が破られ、パッチ前に PoC が公開される)が理由だ。


参考文献

このページをシェア