powered by TechFeed
表示モード
Deep Dive

Claudeがコードの「攻撃される範囲そのもの」を削減 — 世界最高水準のOpenSSHですら未認証コードを5分の1に圧縮

10月20日、Chris Rohlfが「Using Claude to reduce the attack surface of code」と題した記事を公開した。この記事では、ClaudeをオープンソースプロジェクトのAttack Surface(攻撃対象領域)分析・削減に活用した実証研究について詳しく紹介されている。以下に、その内容を紹介する。

10月20日、Chris Rohlfが「Using Claude to reduce the attack surface of code」と題した記事を公開した。この記事では、ClaudeをオープンソースプロジェクトのAttack Surface(攻撃対象領域)分析・削減に活用した実証研究について詳しく紹介されている。以下に、その内容を紹介する。


「脆弱性を1つ直しても、残りはわからない」という根本問題

ソフトウェアのセキュリティ対策として、脆弱性を1件ずつ発見・修正するアプローチには根本的な限界がある。致命的な脆弱性を1つ直しても、残っている未知の脆弱性については何もわからない。

Chris Rohlfが提案するアプローチは発想が異なる。「攻撃者が到達できるコードの範囲そのものを削減する」という考え方だ。個々の脆弱性を塞ぐのではなく、そもそも到達不能なコードは攻撃されようがない、という論理である。

これをClaudeで自動化した実証実験が今回の記事の主題だ。


何を調べたか

Claudeを用いて25のオープンソースプロジェクト(計500万行超)を分析。対象言語はC、C++、Java、PHP、Pythonと多岐にわたる。分析では主に以下の3つの観点に絞った。

  • デフォルト設定での到達可能性:デフォルト設定で到達できるが、本来そこに到達する必要がないコード
  • 設定の組み合わせ問題:個々には問題なく見える設定オプションの組み合わせが、セキュリティ上の問題を引き起こすケース
  • 認証前の早期到達性:認証などのセキュリティ制御が走る前に実行されるべきでないコードへのアクセス

Claudeは17,000以上の設定オプションの目録を作成し、そのうち3,842件がセキュリティ関連と判定された。最終的に493件の問題を発見した。


最も注目すべき発見:OpenSSH

記事で最も読み応えがあるのが、OpenSSHへの適用事例だ。

OpenSSHはおそらく世界で最も厳密にセキュリティ監査されているCコードの一つである。それでも問題が見つかった。

Claudeはバージョン10.4のSSHデーモンの入力経路を解析し、ML-DSA-44(ポスト量子署名アルゴリズム)の実験的実装コード、約4,500行が、未認証クライアントからデフォルト設定で到達可能であることを発見した。ML-DSA-44はデフォルトで無効化されているにもかかわらず、管理者が明示的にそのアルゴリズムを除外設定しても、コードは到達可能な状態だった。

根本的な問題はチェックの順序にある。デーモンはクライアントが送ってきた鍵タイプを先に解析(パース)し、その後で設定上でそのアルゴリズムが許可されているかを確認していた。本来はその逆——設定確認を先に行い、許可された鍵タイプのみパースする——べきだ。

この4,500行は、**デフォルト設定のsshdにおける認証前コード全体の約16%**に相当する。Anthropicはこれを開発チームに報告し、パッチを提供。バージョン10.5で修正された。

しかし話はここで終わらない。Claudeは10.5の修正にも2つの抜け穴を発見した。

1つ目は、クライアントが広告するアルゴリズム名と、鍵ブロブ内のタイプ文字列の不一致。チェックは広告された名前を見るが、実際のパーサーは埋め込まれたタイプ文字列によって選ばれる。つまりクライアントがssh-ed25519を申告しながら、内部にML-DSA鍵を忍ばせてパースさせることができた。

2つ目は証明書経路の問題。証明書のCA署名を検証するコードが、設定確認よりも前に動作していた。攻撃者が細工した証明書を送れば、サポートされているすべての公開鍵署名検証ロジックが未認証状態で動作してしまう。研究チームはPoC(概念実証コード)を作成し、メンテナーと複数回にわたって修正を議論。最終的にバージョン10.6でチェックがパーサー内部に組み込まれ、デシリアライズや署名検証の前にアルゴリズム確認が行われるようになった。

この修正により、未認証クライアントが到達可能だったOpenSSHコードのおよそ5分の1が到達不能になった。


設定の組み合わせ問題が生む「21年間の欠陥」

設定の組み合わせ問題では、162件のセキュリティ上問題のある設定ペアが発見された。そのうち94件は、組み合わせることでセキュリティ制御がサイレントに無効化されるケースだった。

特に印象的なのは、あるプロジェクトで発見された事例だ。管理者が「全クライアントにクライアント証明書を要求する」と設定できるオプションと、「証明書チェックを必要になるまで遅らせる」オプションを組み合わせると、実際にはチェックが完全に無効化され、誰でも接続できてしまう状態になっていた。警告は出ず、ドキュメントにも記載がなかった。この矛盾した設定の組み合わせは、21年間にわたってコードに存在していた。

また、4つの無関係なプロジェクトで独立して同じパターンが発見された。管理者がIPアドレスではなくホスト名やワイルドカードでアクセス制御ルールを書いた場合、逆引きDNS(多くのプロジェクトでデフォルト無効)が行われないと、サーバーはIPアドレスとホスト名パターンを文字列比較してしまう。ホスト名パターンはIPアドレスとは決してマッチしないため、拒否ルールが発動せずアクセスが素通りする。


再利用可能なClaudeスキルとして実装

これらの手法はClaudeの再利用可能な「スキル」として一本化され、現在OSS-Scannerへの統合が進められている。スキルはコードベースを3パスで解析する設計で、各パスは空のコンテキストウィンドウからスタートし、前のパスから受け取った短いコンテキストのみを引き継ぐ。

個別の脆弱性修正ではなく「到達可能なコードの範囲を削減する」というアプローチは、未知の脆弱性すべてに対して同時にリスクを下げる。OpenSSHのような極めて高品質なコードベースですら効果があったという事実は、この手法の汎用性を示している。

詳細はUsing Claude to reduce the attack surface of codeを参照していただきたい。