「SQLite」のゼロデイ脆弱性、GoogleのAIエージェントが見つける AIは脆弱性調査の課題をどう解決したのか?:テストケース、クラッシュレポートを自動生成
Googleの脆弱性調査専門チームは、Google DeepMindと共に研究開発を進めているAIエージェント「Big Sleep」がSQLiteにおけるスタックバッファーアンダーフローの脆弱性を見つけた事例を公式ブログで解説した。
Googleの脆弱(ぜいじゃく)性調査専門チーム「Project Zero」は2024年11月1日(米国時間)、Google DeepMindと共に研究開発を進めているAIエージェント「Big Sleep」が、オープンソースのデータベースエンジン「SQLite」におけるスタックバッファーアンダーフローのゼロデイ脆弱性を発見したと公式ブログで明らかにした。
Project Zeroチームによると、Big SleepはSQLiteの開発ブランチ上のソースコードにおけるゼロデイ脆弱性を2024年10月初旬に発見した。Project ZeroチームはSQLiteの開発者に問題を報告し、脆弱性は修正された。公式リリース前にこのゼロデイ脆弱性が修正されたため、SQLiteのユーザーに影響はないとしている。
Project Zeroチームは「ソフトウェアがリリースされる前に脆弱性を発見できれば、攻撃者が対抗する余地はなく、防御面で可能性を大きく広げることになる。広範に利用されているソフトウェアにおける悪用可能なメモリ安全性の問題をAIエージェントが発見した初の公開事例だろう」と述べている。
ファジングでは限界がある? 脆弱性調査の課題
ソフトウェア開発において脆弱性を未然に防ぐ手法として、ファジングが広く採用されている。Project Zeroチームは、ファジングが脆弱性対策として大きな効果を発揮する一方で、ファジングで見つけるのが難しい(または不可能な)脆弱性を防御者が発見できる新たなアプローチが必要だと指摘する。
「修正済みの脆弱性と類似する亜種のゼロデイ脆弱性が野放しで悪用され続けている現状がある。この傾向が続く中で、ファジングでは亜種のゼロデイ脆弱性の捕捉が難しく、攻撃者にとっては、手作業で亜種の脆弱性を探索することが効果のあるアプローチとなっている状況だ」(Project Zeroチーム)
そこで、新たなアプローチとして、大規模言語モデル(LLM)を活用した研究を開始し、修正済みの脆弱性と類似する亜種のゼロデイ脆弱性を発見することが可能かどうかをSQLiteの直近のコミットデータを基にテストしたという。
Big Sleepはどのような脆弱性を見つけたのか
Big Sleepが見つけた脆弱性は、sqlite3_index_constraintという構造体にあるiColumnにまつわるものだ。iColumnは列番号を示すフィールドだが、特定の条件下ではセンチネル値(sentinel value)として「-1」が使用されていた。このパターンの場合、このフィールドを利用するコード全てがエッジケースを正しく処理する必要がある。
7476: struct sqlite3_index_constraint { 7477: int iColumn; /* Column constrained. -1 for ROWID */ 7478: unsigned char op; /* Constraint operator */ 7479: unsigned char usable; /* True if this constraint is usable */ 7480: int iTermOffset; /* Used internally - xBestIndex should ignore */ 7481: } *aConstraint; /* Table of WHERE clause constraints */
しかし、seriesBestIndex関数はiColumnのエッジケースを正しく処理できず、スタックバッファーアンダーフローの問題を引き起こした。
619 static int seriesBestIndex( 620 sqlite3_vtab *pVTab, 621 sqlite3_index_info *pIdxInfo 622 ){ ... 630 int aIdx[7]; /* Constraints on start, stop, step, LIMIT, OFFSET, 631 ** and value. aIdx[5] covers value=, value>=, and 632 ** value>, aIdx[6] covers value<= and value< */ 633 const struct sqlite3_index_constraint *pConstraint; ... 642 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 643 int iCol; /* 0 for start, 1 for stop, 2 for step */ 644 int iMask; /* bitmask for those column */ 645 int op = pConstraint->op; ... 705 iCol = pConstraint->iColumn - SERIES_COLUMN_START; 706 assert( iCol>=0 && iCol<=2 ); 707 iMask = 1 << iCol; ... 713 if( pConstraint->usable==0 ){ 714 unusableMask |= iMask; 715 continue; 716 }else if( op==SQLITE_INDEX_CONSTRAINT_EQ ){ 717 idxNum |= iMask; 718 aIdx[iCol] = i; 719 } 720 }
Project Zeroチームによると、Big Sleepは脆弱性を見つける人間のように具体的な仮説を立てながら、バグを再現するテストケースやクラッシュレポートの生成を繰り返し、特定のエッジケースをトリガーさせる明確なテストケースを構築していったという。
「このゼロデイ脆弱性を従来のファジングで簡単に見つけることができるのかどうかを検証するため、SQLiteのドキュメントに記載された手順に従いファジングを実行したが、150CPU時間(1台のCPUで150時間の計算量)を費やしても見つけられなかった。現時点では、ターゲットに特化したファジングツールが特定の脆弱性の発見に有効な一方で、AI(人工知能)は、クラッシュを引き起こすテストケースの発見だけでなく、高品質な原因分析や優先順位付け、脆弱性修正の迅速化に寄与できる可能性がある」とProject Zeroチームは述べている。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
増える標的型ランサムウェア被害、現場支援から見えてきた実態と、脆弱性対応が「限界」の理由
ランサムウェア感染をはじめとするサイバー攻撃に日頃からどう備えておくべきなのか。年間数百件の相談に対応してきたYONAの三国貴正氏や、セキュリティブログ「piyolog」で知られるpiyokango氏が、現実的で実効性のあるインシデント対応をどう進めるべきか、語り合った。複数フェーズで成り立つ「Active Directoryの脆弱性対策」とは――その意図は? 詳細は?
脆弱性に対しセキュリティ強化を一気に進めると「認証拒否」が発生し、結果、情報システムの利用不可といった障害につながる場合があります。そのため、セキュリティ強化を複数のフェーズに分けて、段階的に進めることが重要になります。本稿では、複数のフェーズを持つActive Directoryの脆弱性対策を紹介します。AIエージェント(AI Agent)とは?
用語「AIエージェント」について解説。特定の目標を達成するために、必要なタスクを自律的に作成し、計画的に各タスクを実行するAIシステムのこと。これにより、人間の作業を大幅に自動化できる可能性がある。また、複数のAIエージェントを組み合わせることで、より高度な自動化が期待されるAIマルチエージェントも登場している。