Back to Blog

Solanaエコシステムの保護 (7) — 型の混同

April 29, 2022
4 min read

0. レビュー

1. 概要

前回のブログでは、一般的なマルチシグの実装について紹介しました。本稿では、もう一つのセキュリティ問題である「型推論」について議論します。

2. デシリアライゼーション/シリアライゼーション

Solanaでは、プログラムの状態はアカウントに保存されます。型推論の問題は、アカウントのデシリアライゼーション/シリアライゼーション中に発生します。プログラムのロジックは通常、データ構造に依存します。しかし、プログラムはデシリアライゼーション/シリアライゼーションプロセス中にアカウントの型を適切にチェックしない場合があります。これは攻撃者によって悪用され、予期せぬ損失につながる可能性があります。

3. コードレビュー(型推論)

以下では、単純なプログラムで型推論の問題を説明します。テストコードはこちらで見つけることができます。

テストプログラムでは、UserMetadataという2つのデータ構造を実装しています。どちらも別のアカウントの公開鍵を記録しています。

プログラムには3つの異なる命令があります。InitializeUser命令は、Userアカウントを作成し、承認済みアカウント(authority)を設定するように設計されています。同様に、InitializeMeta命令は、MetaDataアカウントを作成し、通常のアカウント(account)を設定するために呼び出されます。Test命令は、攻撃者がプログラムの検証ロジックをバイパスし、制御されたMetaDataで攻撃を実行できることを示しています。

Test()命令を詳しく見てみましょう。プログラムは、渡されたUserアカウントの所有者がプログラム自体であることを保証します(86行目〜89行目)。デシリアライゼーション後(92行目)、プログラムは渡されたauthorityアカウントの公開鍵とUserアカウントに保存されている公開鍵を比較します。それらが等しくない場合、プログラムはロールバックします(93行目〜96行目)。最後のチェックは、authorityアカウントがトランザクションに署名したことを確認することです。しかし、攻撃者が制御されたMetadataアカウントを渡した場合、すべてのチェックはバイパスされる可能性があります。その理由は、プログラムがアカウントの型をチェックしないためです。プログラムはバイト配列を受け取り、プログラムに定義されたさまざまな型の構造体に直接デシリアライズします。

さらなるテストのためにテストプログラムをデプロイしました。リンクはこちらで見つけることができます。

3.1 トランザクションの送信

プログラムをデプロイした後、プログラムで提供されている3つの命令を順に呼び出すスクリプトを作成しました。

まず、InitializeUserInitializeMetaを呼び出します。Metadataアカウントに保存されているaccountアカウントとして、私たち自身の公開鍵を設定することに注意してください。

test()関数では、MetadataアカウントをUserアカウントとして、私たち自身の(検証済みの)アカウントをauthority_infoとして渡します(347行目〜348行目)。プログラムはMetadataUser構造体でデシリアライズし、すべてのチェックはバイパスされます。

トランザクションを送信した結果はこちらで見ることができます。プログラムは成功を返しました。これは、チェックされていないアカウント型でチェックを正常にバイパスできたことを意味します。

4. まとめ

本稿では、Solanaにおける型推論の問題を紹介しました。この問題を回避する方法は数多くあります。例えば、構造体にアカウントの型を記録する属性を追加し、プログラムは渡されたアカウントの読み書きを行う前に必ず型属性をチェックするようにすることができます。引き続き、今後の投稿でさらに共有していきます。

このシリーズの他の記事を読む:


BlockSecについて

BlockSecは、世界的に著名なセキュリティ専門家グループによって2021年に設立された、先駆的なブロックチェーンセキュリティ企業です。同社は、進化するWeb3の世界のセキュリティと使いやすさを向上させ、その大規模な採用を促進することに専念しています。この目的のために、BlockSecはスマートコントラクトおよびEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そしてWeb3ビルダーが仮想通貨の世界を効率的にサーフィンするためのMetaSuites拡張機能を提供しています。

現在までに、同社はMetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300社を超える著名なクライアントにサービスを提供しており、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達ラウンドで数千万米ドルを獲得しています。

公式ウェブサイト:https://blocksec.com/

公式Twitterアカウント:https://twitter.com/BlockSecTeam

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万ドル)による。

HKDAPステーブルコインのセキュリティレビュー:稼働中、ライセンス取得済み、しかし準備不足

HKDAPステーブルコインのセキュリティレビュー:稼働中、ライセンス取得済み、しかし準備不足

BlockSecによる香港初の規制対象ステーブルコインHKDAPの審査で、機能しないKYC取り消し機能、単一鍵によるミント権限、HKMAガイドラインとの矛盾が判明した。

約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配当を複数回取得した。