「スマートコントラクト」のセキュリティ上の欠陥を特定し、 修正方法まで説明するAIを開発 ―安全なデジタル決済・金融サービスの実現に向けて―
「スマートコントラクト」のセキュリティ上の欠陥を特定し、
修正方法まで説明するAIを開発
―安全なデジタル決済・金融サービスの実現に向けて―
【ポイント】
- スマートコントラクトのセキュリティ上の欠陥を関数ごとに特定し、内容と修正方法まで説明するAIを開発しました。
- 従来の「全体として危険か」の判定にとどまらず、欠陥の場所・原因・直し方まで提示できることを示しました。
- 実際に使われている242個のスマートコントラクトで、従来手法を上回る検出精度を確認しました。
【概要】
| 北陸先端科学技術大学院大学コンピューティング科学研究領域のグェン・ミン・レ教授、グエン・ミン・ゴック大学院生(博士後期課程2年)らの研究グループは、ブロックチェーン*1上で取引などを自動で実行する「スマートコントラクト」*2のセキュリティ上の欠陥(脆弱性*3)を、プログラムを構成する関数*4単位で特定し、その内容や修正方法まで説明するAIシステムを開発しました。 スマートコントラクトは、暗号資産の支払いや送金、貸し借りなどに利用されていますが、一度公開されると容易に修正できないため、脆弱性が資金流出などの被害につながるおそれがあります。従来手法の多くはプログラム全体が危険かどうかを判定するにとどまっていました。本研究では、関数同士のつながりと各関数の内部の両方を分析するAI(HCA-SGNN)を開発し、実際に使われている242個のスマートコントラクトで評価したところ、「危険」と判定した際に実際に脆弱性があった割合は約80%となり、比較した手法の中でもっとも高い結果を示しました。さらに、大規模言語モデル*5を用いて、脆弱性の場所や想定される被害、修正方法を説明する仕組みも実現しました。 グェン・ミン・レ教授は、「AIがセキュリティ分野で本当に役立つためには、なぜ警告したのかを人が理解できることが重要です。私たちのシステムは危険な部分を正確に示し、リスクをわかりやすく説明します。こうした説明可能なAIが、信頼できるソフトウェアづくりの鍵になると考えています」と述べています。本研究成果は、2026年9月15日に国際学術誌「ACM Transactions on Software Engineering and Methodology」にオンライン掲載されました。 |
1.研究の背景
ブロックチェーンは、多くのコンピュータが同じ記録を共有して管理する仕組みで、記録の改ざんが非常に難しいという特徴があります。スマートコントラクトは、このブロックチェーン上に置かれたプログラムで、例えば「Aさんから代金が届いたら、自動でデジタル商品をAさんに送る」といった処理を、銀行などの仲介者なしで実行します(図1)。そのため、暗号資産による支払いや送金、インターネット上の貸し借りや両替のサービス、デジタルアートやゲームのアイテム、会員管理や投票の仕組みなど、さまざまなサービスで使われています。
一方で、スマートコントラクトは公開後に修正することができず、多くの場合、資金を直接管理しています。プログラムに脆弱性があると、世界中の攻撃者にすぐに悪用される可能性があり、盗まれた資金はほとんどの場合戻りません。2016年には「The DAO」と呼ばれるスマートコントラクトの脆弱性が突かれ、数千万米ドル相当の暗号資産が流出する事件が起きました。そのため、公開する前に脆弱性を見つけることが非常に重要です。
しかし、これまでの自動点検ツールには三つの課題がありました。一つ目は、多くがプログラム全体として危険かどうかを判定するだけで、どの部分に問題があるかは専門家が手作業で探す必要があったことです。二つ目は、短い警告を出すだけで、なぜ危険なのか、どう直せばよいのかを説明しなかったことです。三つ目は、AIに脆弱性の場所を正確に学習させるための、関数ごとに詳しく記録された大量の例が存在しなかったことです。本研究は、これら三つの課題を同時に解決することを目指しました。

| 図1 スマートコントラクトのしくみ 買い手が代金を送ると(①)、スマートコントラクトがあらかじめ決められた条件を確認し、商品を買い手に(②)、代金を売り手に(③)自動で渡します。銀行や店員などの仲介者は必要ありません。取引はすべてブロックチェーンに記録され、後から書き換えることが非常に困難です。一方で、プログラムは公開後に修正できないため、脆弱性があると攻撃者に悪用されるおそれがあり、公開前に脆弱性を見つけることが重要です。 |
2.研究内容
開発したシステムは、次の三つの部分からなります。
(1)学習用データの作成
脆弱性が見つかっていない実際のプログラムに、現実的な脆弱性を自動で一つずつ埋め込むツールを開発しました(図2)。このツールは、文章を主語や述語に分けるように、まずプログラムの構造を読み取り、脆弱性を入れるのに適した場所を探してコードを書き換えます。書き換え後に正しく動かなくなったプログラムは取り除き、自然な例だけを残します。
こうして、8種類の代表的な脆弱性を含む4,208個のプログラム、118,126個の関数からなるデータを作成し、公開しました。

| 図2 学習用データの作り方 ①脆弱性が見つかっていない実際のプログラムを用意し、②プログラムの構造を木の形に読み取って、脆弱性を入れるのに適した場所(赤い丸)を探します。③そこに現実的な脆弱性のコード片を埋め込み(色付きの行)、④プログラムとして正しく動くかを確認して、動作するものだけを残します。⑤こうして、4,208個のプログラム、118,126個の関数、8種類の脆弱性からなる学習用データを作成します。各関数には脆弱性の有無・種類・場所が自動で記録されるため、AIは脆弱性の「場所」まで学ぶことができます。 |
(2)脆弱性の場所を突き止めるAI
新たに開発したAI(HCA-SGNN)は、プログラムを、要素(丸)とそのつながり(線)で表した図(グラフ*6)に置き換え、二つの見方を同時に使って調べます。
建物の点検に例えると、廊下やドアで部屋同士がどうつながっているかを調べる見方と、部屋の中を一つずつ細かく調べる見方です。リエントランシー*7のように、複数の関数の連携を悪用する深刻な攻撃は、関数同士のつながりを見なければ気づけません。AIは二つの見方をどの程度重視するかを自動で学習します。
二つの見方を分けずに一つにまとめた場合と比べ、脆弱性を含む関数を特定する精度の指標が23.6ポイント向上することも確認しました。

| 図3 脆弱性を含む関数を見つけるAI(HCA-SGNN)のしくみ ①プログラムを、要素(丸)とそのつながり(線)で表したグラフにします。丸の色は、その要素が属する関数を表します。②二つの見方で調べます。「関数をまたぐ見方」(左)では、関数同士をつなぐ線(濃い線)も含めて情報が伝わり、複数の関数が組み合わさって生じる危険に気づけます。「関数の中を見る見方」(右)では、関数をまたぐ線(点線)は使わず、各関数の中だけを細かく調べます。③二つの結果を組み合わせ、どちらをどの程度重視するかを自動で調整します。②と③は数回繰り返されます。④最後に、各関数を同じプログラム内の他の関数と照らし合わせ、どの関数に脆弱性があるかを判定します(図は、関数Bにリエントランシーの脆弱性が見つかった例)。二つの見方を分けることで、脆弱性を含む関数を特定する精度が23.6ポイント向上しました。 |
(3)脆弱性を説明する
大規模言語モデルを使い、脆弱性ごとに「名前」「場所」「説明」「起こり得る被害」「修正方法」をまとめた報告を作成します。
例えば、リエントランシーの脆弱性に対しては、外部にお金を送る処理が記録の更新より先に行われている箇所を示し、記録の更新を先に行うよう順番を入れ替えるという直し方を提案します。この能力を、一般的なコンピュータでも動く小型のAIに受け継がせました。
3.研究の成果
実際に使われている242個のスマートコントラクトで、従来のAIによる検出手法や、同じ目的のために学習させた汎用の大規模言語モデルと比較しました。
プログラムに脆弱性があるかどうかの判定では、比較したすべての手法の中で最も高い精度を示しました。「危険」と判定したときに実際に脆弱性があった割合は約80%で、最も良い汎用の大規模言語モデルの約56%を大きく上回りました。
また、脆弱性を含む関数を特定する精度の総合的な指標でも、汎用の大規模言語モデルの約2倍となりました。汎用モデルはほとんどの関数を危険と判定してしまい、誤った警告が多くなる傾向がありました。
さらに、学習に含まれていなかった種類の脆弱性もいくつか見つけることができ、例を暗記するのではなく、危険の一般的な兆候を学んでいることが示されました。脆弱性を説明する小型AIは、大型の商用AIの約97~98%の品質の説明を作成できました。
4.今後の展望
本技術は、プログラムを公開する前の点検にかかる時間を短縮し、セキュリティの専門家や開発者を支援することで、決済や金融などのデジタルサービスでの被害の防止に役立つことが期待されます。警告だけでなく、脆弱性の場所と修正方法を示すため、開発者は具体的な対応につなげることができます。
なお、本システムは人の専門家を置き換えるものではなく、専門家や開発者による点検を支援するものです。現在は、イーサリアムで主に使われるSolidityという言語で書かれたプログラムを対象とし、一つずつ点検します。今後は、複数のプログラムにまたがる攻撃への対応、他のブロックチェーンへの拡張、一つの関数に複数の欠陥がある場合への対応などに取り組む予定です。
【用語説明】
多くのコンピュータが同じ記録を共有して管理する仕組み。記録の改ざんが非常に難しい。
ブロックチェーン上で動くプログラムで、支払いなどの約束ごとを、決められた条件が満たされると自動で実行する。
プログラムの弱点で、攻撃者に悪用されるおそれのある欠陥。
プログラムの中で、一つの決まった仕事をする小さな部品。プログラムは多くの関数でできている。
大量の文章で学習し、人の言葉を理解して文章を作れるAI。ChatGPTなどの基盤となる技術。
点(プログラムの要素)と線(要素どうしの関係)でつながりを表したもの。
処理が終わって記録が更新される前に、同じプログラムを繰り返し呼び出させ、お金を何度も引き出す攻撃。
【研究資金】
本研究は、国立研究開発法人科学技術振興機構(JST)先端国際共同研究推進事業(ASPIRE)(課題番号:JPMJAP25B2)の支援を受けて実施されました。
【論文情報】
| 論文タイトル | A Unified Framework for Function-Level Vulnerability Detection and Explanation in Smart Contracts |
| 日本語タイトル | スマートコントラクトにおける関数レベルの脆弱性検出と説明のための統合フレームワーク |
| 著者 | Ngoc-Minh Nguyen, Le-Minh Nguyen* *責任著者 |
| 掲載誌 | ACM Transactions on Software Engineering and Methodology |
| 掲載日 | 2026年9月15日(オンライン掲載) |
| DOI | 10.1145/3840386 |
| コード | https://github.com/nguyenlab/sc-ast-injector |
| データ | https://huggingface.co/datasets/nguyenlab/sc-ast-injected |
令和8年10月26日
