Back to Blog

Solana rBPFでの新たな整数オーバーフローバグ発見

Code Auditing
December 30, 2021
3 min read

最近、当社の脆弱性検出システムは、Solana の rBPF(Solana の dApps がすべて実行される仮想マシンです:https://github.com/solana-labs/rbpf)において、重大な問題を発見しました。慎重な調査の結果、これは整数オーバーフローのバグであり、Solana ネットワーク全体をクラッシュさせるために悪用される可能性があることが判明しました。このバグを Solana セキュリティチームに報告したところ、チームは直ちに確認と修正に着手しました。本稿執筆時点では、ほぼすべてのバリデーターノードがパッチを受け取り最新バージョンにアップグレードしているため、公開開示しても安全であると言えます。

eBPFとrBPF

eBPF(Extended Berkeley Packet Filter)[1] は、当初カーネル内でのパケットフィルタリングのために開発されました。eBPF のセキュリティ、効率性、スケーラビリティから、現在ではネットワーキング、トレーシング、プロファイリングなど、さまざまな分野で使用されています[2]。eBPF の豊富な機能性を考慮し、Solana はスマートコントラクトの実行エンジンとしても採用しました。Solana 上で dApps を開発するためには、開発者は Rust でスマートコントラクトを開発し、それが eBPF バイトコードにコンパイルされます。

Solana の dApps をホストするには、eBPF 用の正確な仮想マシンが必要です。この場合、Solana は Rust で書かれた eBPF 用の仮想マシンである rBPF を使用します。しかし、提案されている仮想マシン(つまり rBPF)が堅牢で安全で正確であるかどうかは不明です。rBPF の内部にセキュリティ上の問題が存在すると、rBPF を含むすべてのバリデーターに影響が及ぶ可能性があり、Solana ネットワーク全体に甚大な損害(例:DDoS 攻撃)をもたらす可能性があります。

バグの根本原因

rBPF のバグを特定するためのツールを開発しました。このツールは現在も開発中です。このプロセス中に、rBPF(バージョン 0.2.16)で、ネットワーク全体をダウンさせる可能性のある深刻な問題が特定されました。

具体的には、「elf.rs」ファイル内の「load」関数は、ELF ファイル(スマートコントラクト)を解析および検証するために使用されます。「load」関数はまず ELF 構造を読み込み、「relocate」関数を呼び出して呼び出し元オフセットを設定します。しかし、「relocate」関数では、「sym.st_value」属性がELF ファイルから直接取得されます。「st_value」が十分に大きい場合、「sym.st_value」と「refd_pa」の合計である「addr」を計算する際に整数オーバーフローが発生する可能性があります。

この場合、攻撃者は悪意のある ELF ファイルをスマートコントラクトとして作成し、整数オーバーフローをトリガーすることができます。その後、すべてのバリデーターがターゲットの ELF ファイルを実行し、rBPF は「add with overflow」というエラーでパニックを起こします。

この時点で、rBPF はハングアップし、後続のトランザクションは実行されなくなるため、DoS 攻撃につながります。以下に示すように、ELF ファイルのロード中に整数オーバーフローが発生したため、ノードが「Finalizing transaction」でハングアップしていることがわかります。

この問題は https://github.com/solana-labs/rbpf/pull/200 で導入されたため、rBPF はバージョン 0.2.14 から脆弱でした。この問題を特定し、2021年12月6日に Solana セキュリティチームに報告しました。Solana は、報告後数時間で safemath 機構を使用して問題を修正しました。修正は https://github.com/solana-labs/rbpf/pull/236 にあります。本稿執筆時点(2021/12/30)で、バリデーターの 86% 以上が最新バージョンにアップグレードしています。

[1] https://en.wikipedia.org/wiki/Berkeley_Packet_Filter [2] https://ebpf.io/

タイムライン

  • 2021/12/06: Solana セキュリティチームに問題が報告されました。
  • 2021/12/06: 脆弱性が修正されました。
  • 2021/12/30: この脆弱性の情報が公開されました。
  • 2022/01/28: CVE-2021–46102 が割り当てられました。
Sign up for the latest updates
HarmonyのクロスシャードONEミント + 約4700万ドルの鍵漏洩による損失 | BlockSec
Security Insights

HarmonyのクロスシャードONEミント + 約4700万ドルの鍵漏洩による損失 | BlockSec

2026年8月10日〜16日の週、注目すべきセキュリティ事件5件を紹介、損失総額は約4700万ドル。詳細分析はHarmony Layer-1の連鎖実装欠陥に注目。Harmonyでは、クロスシャードのレシート再生により、未署名のMerkleProofのShardIDとBlockNumから支出マーカーを導出し、ONEが不正発行された。約3.01兆ONEが偽造されたが、名目価値は市場総額を大幅に超え、実現・確定損失ではないため総額から除外。約4700万ドルは秘密鍵漏洩(Unknown Whale Wallet約2500万ドル、Kite約1400万ドル、Coinsbuy約790万ドル)とFoxのロジック欠陥(約11.7万ドル)による。

約160万ドルの損失:MokeトークンとLpdFiへの攻撃 | BlockSec週次レポート
Security Insights

約160万ドルの損失:MokeトークンとLpdFiへの攻撃 | BlockSec週次レポート

2026年8月3〜9日の週、BNBチェーンで2件の重大なセキュリティインシデントが発生し、いずれも価格操作により総損失は約160万ドルに上った。LpdFi事件(約69.7万ドル)では、注文評価と利息償還の両方に同じ操作可能なPancakeSwapペアのリザーブが使用され、攻撃者がポジションの元本を水増しし過大な利息を請求した。Mokeトークン(約90.6万ドル)では、操作可能なスポット価格とLP配当の重複計上を組み合わせ、MOKEを水増し請求してBNB配当を複数回取得した。

COLDCARDの事件:ウォレットの「ランダム」シードがランダムではなかった時
Security Insights

COLDCARDの事件:ウォレットの「ランダム」シードがランダムではなかった時

COLDCARDファームウェアのビルド・統合バグにより、Bitcoin種生成がソフトウェアRNGフォールバックに誘導され、脆弱な乱数によりウォレットの秘密鍵がオフラインで復元可能となった。欠陥は種自体にあるためファームウェア更新では修正不可。2026年8月7日までに確認された被害は1,405 BTC(約91億円)、非公式推定では最大2,055 BTCに上る。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit
Solana rBPFでの新たな整数オーバーフローバグ発見