AI Discovers Multiple OpenSSL Zero-Day Vulnerabilities

eyecatch AI関連

「OpenSSLのゼロデイ、また?」
……と思ったら、今度見つけたのは人間じゃなくてAIでした。しかも12個。そのうちには20年以上眠っていた脆弱性も含まれる。

正直、長年Cでネットワークや暗号系を書いてきたエンジニアとしては、ちょっと背筋が寒くなりました。「あのOpenSSLでさえ、AIにこうやって“棚卸し”される時代になったか」と。


「人間+静的解析+ファジングで頑張ってきた」時代の終わり方

「人間+静的解析+ファジングで頑張ってきた」時代の終わり方

OpenSSLみたいなライブラリに関わったことがある人なら分かると思いますが、

  • 長年メンテされている
  • 何度もコードレビューされている
  • OSS-Fuzzなどでファジングも回されている
  • セキュリティ企業がこぞって監査している

そんなコードに20年以上生き残るバグがあること自体、結構ショックです。

でも、今回のポイントは
「OpenSSLに脆弱性があった」
ことじゃないんですよね。

「人間と従来ツールで見つけられなかったものを、LLMが見つけてしまった」
ここが一番のニュースだと思います。

記事で紹介されているワークフローは、ざっくり言うと:

  1. LLMにOpenSSLのCコード(ASN.1 / X.509 / TLS周りなど)を読ませる
  2. 「ここ危なくない?」という疑わしいパスを挙げさせる
  3. そのパスを踏みそうな入力データ(証明書、TLSメッセージなど)をLLMに作らせる
  4. 実際にOpenSSLに食わせてクラッシュ・ASanログを回収
  5. ログをまたLLMに渡して「もっといいペイロード」を作らせる

つまり、
「コードレビュー → テストケース生成 → 実行 → 解析 → ペイロード洗練」
のサイクルを、ほぼAIが回している。

これは、昔AFLが登場したときに「え、そこまで機械に任せられるの?」と思った瞬間に近いですが、今回はそれをコードの意味レベルまで持ち上げてきた感じです。


これはセキュリティ界の「Docker登場」みたいなもの

記事中にも出てくる比喩ですが、個人的にもかなりしっくり来たのがこれです:

「AIによる脆弱性探索」は、
伝統的なファジングにとっての Docker みたいな存在 になりうる

Dockerが出る前にもコンテナ(LXC)はありましたが、

  • 使うにはそれなりの知識が必要
  • 環境構築も運用も職人芸
  • その割に周辺ツールのエコシステムも貧弱

そんな世界を、Dockerは「パッケージ+ワークフロー+ツールのまとめかた」でひっくり返した。

今、セキュリティの世界で起きているのはそれに似ていて、

  • 静的解析ツール
  • カバレッジベースファジング
  • 手作業のコードレビュー

みたいなものは前から全部あった
でも、それらを

  • コードを読んで
  • 危なそうなパスを推理して
  • それを踏む入力を構造的に作って
  • 結果ログを解釈して
  • もう一段深いパスを狙う

という“ストーリー”として繋げて実行してくれる存在がいなかった。

そこに、LLMが「司令塔」役として入り込んできたのが今回のOpenSSLの件だと感じています。


なぜこれが「ただの面白ニュース」で終わらないのか

なぜこれが「ただの面白ニュース」で終わらないのか

「よく監査されているCのコアライブラリ」が一気に“狩場”になる

OpenSSLって、ある意味「最も防御が厚い側」のコードです。
それでも、

  • メモリ安全性の罠(バッファオーバーフロー、UAF、二重解放)
  • ASN.1 / X.509 / TLSという複雑フォーマットのパースロジック
  • ネストしたエラーハンドリングの分岐

こういった人間が追うにはしんどいパスに、LLMが突っ込んでいってゼロデイを引っ張り出した。

ぶっちゃけ、これを見た攻撃者側の発想はシンプルです。

  • 「なら、他のCで書かれた有名ライブラリもAIに投げれば?」
  • HTTPサーバ
  • JSON/XML/Protobufパーサ
  • VPN / Gateway製品
  • 独自バイナリプロトコルのSDK
  • 「コンパイラやカーネルの周辺もいけるんじゃない?」

“よく監査されてるから大丈夫” という心理的な安心感は、かなり崩れました。

伝統的ファジングとの比較で見える「質」の変化

従来のAFL / libFuzzer などのカバレッジファジングは、

  • ランダム変異+カバレッジフィードバック
  • 「とにかくたくさん叩けばどこか壊れる」アプローチ

に強みがありましたが、一方で:

  • フォーマットが複雑で、ちょっと壊すとすぐパース前に落ちるようなケース
  • 「ある条件を満たす長さ・構造じゃないと進まない」パス
  • メモリ破壊じゃなくて、ロジックバグ系(認証バイパスなど)

こういったところは苦手です。

今回のLLMは、

  • コードを読んで「こういう長さ・構造じゃないとここに到達しない」と推論する
  • ASN.1 / X.509形式の“それなりに正しい”入力を組み立てる
  • クラッシュしなかったログからでも怪しい挙動を拾いにいく

という動きをしていて、これは完全に「意味ベースのファジング」だと感じました。

SASTベンダーが一番ダメージを受けるかもしれない

静的解析ツール(SAST)は長年、

  • 「C/C++の複雑なバグパターンも自動検出できます」
  • 「データフロー解析で危険なパスを挙げます」

と訴求してきました。

でも、LLMベースのアプローチは、

  • コードを読んで疑わしい点を挙げる(ここまでは似ている)
  • さらにPoC入力まで自分で作る
  • ASanログまで読んで「これは本当に exploitable か」を判断する

というところまで踏み込んでくる。

「警告を山ほど出して、開発者に triage させる」というビジネスモデルは、正直かなり厳しくなっていくと見ています。
“PoC付きで本当に危ないやつだけ持ってくるAI” に、開発者の好感度で勝てる気があまりしません。


とはいえ「AI万能!」と騒ぐには、まだいくつか冷や水もある

ここまで持ち上げておいてなんですが、現時点でこれを「明日から全社導入だ!」と叫ぶのは、だいぶ危ういと思っています。

コストと運用の現実

  • 大規模なCコードベースを、LLMに細かく分割して食わせる
  • 結果を集約して、重複や誤検知を整理する
  • 実行環境(sanitizer付きビルド、ハーネス、ログ連携)を整える

これを継続的に回す仕組みを作ろうとすると、

  • APIコスト(トークン代)
  • 社内インフラ(ログ蓄積、再現性確保、モデル更新への追従)
  • 専門スキル(プロンプト設計+セキュリティ+C言語の三拍子)

が必要です。

ぶっちゃけ、現段階では
「セキュリティ好きなエンジニアが趣味+研究で頑張って回している」
レベルのワークフローに近い。
「GitHub Actionsのボタンひとつで全部やります」という世界では全くないです。

ハルシネーションと「過信リスク」

LLMは平然とそれっぽいが間違った説明をしてきます。

  • 本当は到達しないパスを「危険」と決めつける
  • 既に他の箇所で保証されている不変条件を見落とす
  • ログを都合よく解釈して「メモリ破壊」と言い張る

なので、最終的にはやはり、

  • 人間がPoCを再現して
  • gdbやASanログを見て
  • パッチ案をレビューして

という工程が必要になります。

「AIが言っているから脆弱」
「AIが見てくれたから安全」
このどちらも、かなり危険な思考です。

機密コードをどこまで外に出せるか問題

記事の事例はOpenSSLなのでオープンソースですが、
自社製品のコードを同じノリでクラウドのLLMに食わせると、

  • IP漏洩
  • 法規制(データ越境、輸出管理)
  • 顧客との契約違反

など、別の爆弾が待っています。

  • オンプレ or VPC内で動かせるモデルを使う
  • ベンダーと厳格な契約を結ぶ
  • 機密度の高い部分は別プロセスで扱う

といった現実的な制御を考えずに、「AIセキュリティ監査!」と叫ぶのはさすがに危ないです。

攻撃者も同じツールを持つという現実

そして何よりの「冷や水」はこれです。

  • 私たちが防御にAIを使えるなら、攻撃者も使える
  • むしろオープンソースのライブラリ相手なら、攻撃者側のほうが自由度が高い

今回のOpenSSLのようなケースは、
「AIで防御が強くなる話」ではなく、「AIで発見レースが加速する話」
として見ておいたほうが健全だと思います。


それでも結局、Cをどうするのかという話に戻ってくる

それでも結局、Cをどうするのかという話に戻ってくる

今回の事例は、メモリ安全でない言語で書かれたレガシーコードがいかに危ういかを、すごく分かりやすく可視化しました。

  • 20年以上レビューされて
  • 世界中の企業で使われて
  • 何度も大規模監査を受けてきた

そんなコードベースに、AIがまとめて12個ゼロデイを見つける。

これを見せられてもなお、

  • 新規のパーサや暗号ロジックをCで書き続ける
  • RustやGoへの移行を「いつかやりたいTODO」として放置する

というのは、だいぶ強い心臓が要ります。

正直なところ、

  • 「AIで脆弱性探しを頑張る」のは、
    メモリ安全でないコードを大量に抱えた現実世界では、しばらく必要な手段
  • その一方で「メモリ安全な実装に寄せていく」のは、
    中長期的に見て唯一まともな出口

この二本立てで考えないと、AI時代の攻防戦にはついていけないと感じます。


プロダクションで「AI脆弱性ハンター」を回すか?という話

最後に、エンジニア/Techリーダー視点での自分なりの結論です。

いますぐ全社CIに入れるか? → 正直、まだ様子見寄り

  • 大規模プロダクトの全コードを対象に
    「LLMで常時セキュリティ監査」を回すのは、
    コスト・運用・法務のどれをとってもまだ重い
  • モデル依存(特定ベンダーへのロックイン)も無視できない

なので、いきなり本番CIにフルインテグレーションはおすすめしません。

ただし「PoCレベルでの導入」は、むしろ急いだほうがいい

一方で、

  • 自社プロダクトの中で
  • 外部から入力を受け取るC/C++部分
  • プロトコルやバイナリフォーマットのパーサ
  • こういった“危ない匂いがするモジュール” に対して

次のような小さな実験は、今すぐ始めたほうがいいと思います。

  • LLMにコードを読ませて、疑わしいパスを挙げさせる
  • それを狙ったテスト入力を生成させる
  • sanitizer付きビルドで実行&ログ連携のパイプを作る
  • どの程度「実際に役に立つバグ」が出てくるかを計測する

ここで感触を掴んでおかないと、

  • いざ攻撃者視点で使われ始めたときに
    「こっちはまだ徒手空拳」みたいな状態になりかねない

という懸念があります。

開発組織としての「スタンス」を決めるべき段階にきた

個人的に、今回のOpenSSLの件を見て改めて感じたのは、

  • 「AIで攻めも守りも変わる」という前提を、組織として飲み込めるか
  • C/C++で書かれたレガシー資産をどう段階的に“AI耐性”のある状態にしていくか

を、もう「議論だけで先送り」するフェーズは終わったということです。

  • どのレイヤーをRust/Go/他に置き換えるのか
  • どの部分はCのままAI+fuzzで継続的に叩き続けるのか
  • そのためにどのLLM・どのインフラを試すのか

このあたりを、技術戦略の一部として書き下ろしておく必要がある。


まとめ:AIが「監査人」になる前に、「攻撃者の同僚」になる

まとめ:AIが「監査人」になる前に、「攻撃者の同僚」になる

OpenSSLのゼロデイ12個という数字だけ見ると派手ですが、
本質的には、

  • LLMが「実用レベルの脆弱性ハンター」になりつつある
  • しかも、それは防御側専用ツールでは全くない

という現実を突きつけられた事例だと感じています。

プロダクションでフルに使うか?と言われると、
正直、まだ一歩引いた位置から様子を見るのが現実的です。

でも、
「自分たちのコードが、AIにどう見えるのか」
「AIを味方に付けると、どこまで行けるのか」

この2つをPoCレベルで試さずにいるのは、
これから数年を考えると、むしろリスクのほうが大きい。

攻撃者がAIを本格運用し始める前に、
こちら側もAIを扱う“筋肉”をつけておく。
今回のOpenSSLの話は、その必要性をかなり強めに突きつけてきたな、というのが正直な感想です。


関連記事

コメント

タイトルとURLをコピーしました