-

スマートコントラクトの基本処理イメージ。買い手が送金すると(1)、スマートコントラクトが設定された条件を確認し、商品を買い手に(2)、代金を売り手に(3)自動で転送する。銀行や店舗などの仲介者は必要ない。取引は全てブロックチェーンに記録され、後から改ざんすることがきわめて困難となる。その一方で、公開後のプログラム修正が原則不可能なため、脆弱性があると攻撃者に悪用されるリスクがあり、公開前に脆弱性の有無の検証が欠かせない (出所:JAIST Webサイト)
暗号資産の支払いや送金、貸借などに利用されているブロックチェーン上のプログラム「スマートコントラクト」は、一度公開されると容易に修正できないため、セキュリティ上の欠陥(脆弱性)があった場合に資金流出などの被害に直結するリスクがある。しかし、従来の自動点検ツールの多くは、プログラム全体が危険かどうかを判定するにとどまり、問題箇所の特定が困難な点などが課題だった。
こうしたなか、北陸先端科学技術大学院大学(JAIST)は、スマートコントラクトの脆弱性をプログラムを構成する関数レベルで特定し、その内容や修正方法まで提示するAIシステムを開発したと、10月26日に発表した。
同成果は、JAISTコンピューティング科学研究領域のグエン・ミン・レ教授、同・グエン・ミン・ゴック大学院生らの研究チームによるもの。詳細は、国際計算機学会が刊行する、ソフトウェア工学と開発手法を扱う専門論文誌「ACM Transactions on Software Engineering and Methodology」に掲載された。
スマートコントラクトの役割と課題
ブロックチェーンは、多数のコンピュータが同じ記録を分散共有して管理するため、記録の改ざんがきわめて困難だ。その上で動作するスマートコントラクトは、たとえば「Aさんから代金が届いたら、自動でデジタル商品をAさんに送る」といった処理を、銀行などの仲介者なしで実行する。そのため、暗号資産決済や送金、分散型金融(DeFi)サービス、NFTアイテム、会員管理や電子投票など、さまざまなサービスで活用されている。
しかし、スマートコントラクトは直接資金を管理しているケースが多いにもかかわらず、公開後のコード修正が原則不可能という弱点も抱える。プログラムに脆弱性がある場合、世界中の攻撃者に悪用される危険性があり、流出した資金はほぼ戻らない。そのため、公開前に脆弱性を網羅的に検出・修正することが不可欠だ。しかし、従来の自動点検ツールには、以下の3つの課題があった。
- プログラム全体レベルでの危険度判定にとどまり、具体的な問題箇所の特定は専門家が手作業で確認する必要がある
- ツールは簡素な警告を出すだけで、危険の理由や修正方法は説明されない
- AIに脆弱性の位置を正確に学習させるための、関数単位で精査された大量の例が存在しない
そこで研究チームは今回、この3つの課題の同時解決をめざすことにした。
今回の研究成果
開発されたシステムは主に3つの要素で構成される。
まず、脆弱性が未検出の実際のプログラムに、現実的な脆弱性を自動で1つずつ注入するツールだ。文章の構文解析のようにプログラムの構造を読み取り、脆弱性を挿入するのに適した領域を探索してコードの書き換えを行う。書き換え後、正常に動作しなくなったプログラムは排除され、正常動作する例のみが抽出される。こうして、8種類の代表的な脆弱性を含む4208個のプログラム(11万8,126個の関数)からなるデータセットが作成され、一般公開された。
-

学習用データセットの作成方法。(1)脆弱性が未検出の実際のプログラムを用意し、(2)プログラムの構造をツリー状に解析して脆弱性の挿入に適した箇所(赤丸)を探す。(3)そこに現実的な脆弱性のコード片を埋め込み(色付きの行)、(4)プログラムが正常動作するのかを確認し、動作するもののみを抽出。(5)こうして、4208個のプログラム、11万8126個の関数、8種類の脆弱性からなる学習用データセットが作成された。各関数には脆弱性の有無・種類・発生箇所が自動で記録されるため、AIは脆弱性の「位置」まで学ぶ (出所:JAIST Webサイト)
次に、プログラムをノード(丸)とそのつながりであるエッジ(線)で表したグラフ構造に変換し、2つの視点を同時に用いて解析するAI「HCA-SGNN」がある。これは、建物の点検にたとえると、廊下やドアで部屋同士がどうつながっているかを調べる全体視点と、部屋ごとに内部を詳細に調べる個別視点といえる。
「リエントランシー」のように、複数の関数の連携を悪用する深刻な攻撃手法は、関数同士の結合関係を分析しなければ検出できない。HCA-SGNNは、2つの視点をどの程度重視するのかを自動で学習する仕組みだ。その結果、2つの視点を分割せずに1つに統合した場合と比べて、脆弱性を含む関数を特定する精度の指標が23.6ポイント向上したことが確認された。
-

脆弱性検出AI「HCA-SGNN」の仕組み。(1)プログラムを、要素(丸)とその接続(線)で表したグラフ構造にする。丸の色は、その要素が属する関数を表す。(2)2つの視点で調べる。「複数の関数をまたぐ視点」(左)では、関数同士を接続する線(実線)も含めて情報が伝わり、複数の関数が組み合わさって生じる危険に気づける。「関数内部の視点」(右)では、関数をまたぐ線(点線)は使わず、各関数内部のみを詳細に精査する。(3)双方の結果を組み合わせ、どちらをどの程度重視するのかを自動で調整し、(2)と(3)を数回繰り返す。(4)最後に、各関数を同じプログラム内の他の関数と照合し、どの関数に脆弱性があるのかを判定する(画像は、関数Bにリエントランシーの脆弱性が発見された例)。双方の視点を使い分けることで、脆弱性を含む関数を特定する精度が23.6ポイント向上した (出所:JAIST Webサイト)
そして、大規模言語モデルを使い、脆弱性ごとに「名前」「場所」「説明」「起こり得る被害」「修正方法」をまとめたレポートの作成機能もある。たとえば、リエントランシーの脆弱性に対しては、外部に送金する処理が記録の更新より先に実行されている箇所を示し、記録の更新を先に行うよう順番を入れ替える修正案を提案する。この能力が、一般的なコンピュータでも動く小型のAIに移植された。
続いて、実環境で運用されている242個のスマートコントラクトで、従来のAIによる検出手法や、同じ目的のために学習させた汎用の大規模言語モデルとの比較が行われた。プログラムの脆弱性の有無の判定では、比較された全手法中で最も高い精度を示したという。「危険」と判定した際に実際に脆弱性があった割合は約80%で、最も良い汎用の大規模言語モデルの約56%を大きく上回った。
また、脆弱性を含む関数をピンポイントで特定する精度の総合的な指標でも、汎用の大規模言語モデルの約2倍となった。汎用モデルは大半の関数を危険と判定してしまい、誤報が増加する傾向があったという。さらに、学習に含まれていなかった種類の脆弱性も複数検出し、例を暗記するのではなく、危険の一般的な兆候を汎化して学んでいることが示された。脆弱性を説明する小型AIは、大型の商用AIの約97〜98%の品質の説明を作成できたとした。
このシステムは、プログラム公開前のチェックに要する時間を短縮し、セキュリティの専門家や開発者を支援することで、決済や金融などのデジタルサービスでの被害の防止に役立つことが期待される。警告だけでなく、脆弱性の場所と修正方法を示すため、開発者は具体的なコード修正に迅速につなげられる。
なお、このシステムは人に取って代わるものではなく、専門家や開発者による点検を支援するもの。現在は、ブロックチェーンプラットフォームの「イーサリアム」で主に使用される言語「Solidity」で記述されたプログラムを対象としており、個別に点検を行う。
研究チームは今後、複数のプログラムにまたがる攻撃への対応、他のブロックチェーンへの拡張、1つの関数に複数の欠陥がある場合への対応などに取り組む予定としている。