ssh-keysign-pwn:ptrace の論理バグにより一般ユーザーが root 所有ファイルを読み取り可能に
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 チェックを完全にスキップする。
悪用可能なコードパス:
- プロセスが
do_exit()を呼び出して終了 do_exit()が先にexit_mm()を実行 — メモリ記述子(mm)を破棄- 次に
exit_files()を実行 — しかしファイル記述子はまだ生きている task->mm == NULLだが fd が開いたまま →pidfd_getfd(2)が呼び出し元の uid と一致すれば fd を奪取可能
通常、ptrace アクセスチェックは低権限プロセスが root プロセスの開いているファイルハンドルに触れるのを防ぐ。しかし mm == NULL バイパスが dumpable チェックを無効にし、pidfd_getfd(2) が残りの処理を行う。
古典的な TOCTOU 競合状態だが、ウィンドウは十分に広い — PoC は 100–2000 回の試行で成功する。
エクスプロイトの標的
2つのツールが公開された:
sshkeysign_pwn — ssh-keysign を標的とする。このヘルパーバイナリはホスト認証チャレンジに署名する。permanently_set_uid() で権限を落とす前に SSH ホスト鍵ファイル(/etc/ssh/ssh_host_{ecdsa,ed25519,rsa}_key、モード0600)を開く。その後 sshd_config で EnableSSHKeysign が設定されているかを確認 — 設定されていなければ鍵の fd を開いたまま終了する。この設計は 2002年 から OpenSSH にある。
chage_pwn — chage -l <user> を標的とする。spw_open(O_RDONLY) で /etc/shadow を開き、その後 setreuid(ruid, ruid) を呼び出す — 両方の引数が実 uid なので完全に権限を落とす。権限低下とファイルクローズの間のウィンドウで fd が盗まれる。
タイムライン
| 日付 | イベント |
|---|---|
| ~2020年 | Jann Horn が FD 窃取パターンを特定、パッチを提案(マージされず) |
| 2026-05-14 | Qualys が脆弱性を報告;Linus Torvalds が修正をコミット(31e62c2ebbfd) |
| 2026-05-14 | Brad Spengler が分析を公開 |
| 2026-05-14 | _SiCk が GitHub で PoC を公開 |
| 2026-05-15 | Qualys が 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つの点が印象的だ:
-
報告当日に修正された。 Linus が数時間で対応した。カーネル修正としては異例の速さで、バグを理解すれば修正は直接的だったことを示している。
-
Jann Horn が2020年に発見していた。 コミュニティは5年間もメーリングリストにパッチ提案を放置していた。FD 窃取パターンは既知だったが、誰もマージを推進しなかった。
-
標的は古代の設計。
ssh-keysignの fd リークパターンは2002年にまで遡る。chageのspw_open+setreuidシーケンスも同様に長い歴史を持つ。これは SSH や shadow-utils のバグではない — 特権バイナリの既存の fd 処理パターンを武器化したカーネルのバグだ。
これは2026年5月、Copy Fail と Dirty Frag に続く3つ目の主要な Linux カーネル脆弱性である。開示のペースは加速している — AI 支援監査ツールが古いバグをより速く見つけていることと、開示エコシステムが断片化していること(embargo が破られ、パッチ前に PoC が公開される)が理由だ。
参考文献
- カーネル修正コミット:31e62c2ebbfd
- Phoronix:Linux’s Latest Vulnerability Allows Reading Root-Owned Files
- GitHub PoC:0xdeadbeefnetwork/ssh-keysign-pwn
- 9to5Linux:6年間の Linux カーネル欠陥
- Qualys oss-security:__ptrace_may_access() の論理バグ
- Jann Horn 2020年のパッチ:lore.kernel.org