0. レビュー
- Solanaエコシステムの保護 (1) — Solanaへようこそ
- Solanaエコシステムの保護 (2) — プログラム間の呼び出し
- Solanaエコシステムの保護 (3) — プログラムのアップグレード
- Solanaエコシステムの保護 (4) — アカウント検証
- Solanaエコシステムの保護 (5) — マルチシグ
- Solanaエコシステムの保護 (6) — マルチシグ2
1. 概要
前回のブログでは、一般的なマルチシグの実装について紹介しました。本記事では、もう一つのセキュリティ問題である「型変換の誤り(Type Confusion)」について議論します。
2. デシリアライゼーション/シリアライゼーション
Solanaでは、プログラムの状態はアカウントに格納されます。型変換の誤りは、アカウントのデシリアライゼーション/シリアライゼーション中に発生します。プログラムのロジックは通常、データ構造に依存しますが、デシリアライゼーション/シリアライゼーションのプロセス中に、プログラムがアカウントの型を適切にチェックしない場合があります。これは攻撃者によって悪用され、予期せぬ損失につながる可能性があります。
3. コードレビュー(型変換の誤り)
以下に、簡単なプログラムで型変換の誤りの問題を説明します。テストコードはこちらで見ることができます。

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

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

Test()命令を順に見ていきましょう。プログラムは、渡されたUserアカウントの所有者がプログラム自身であることを保証します(86行目〜89行目)。デシリアライゼーション後(92行目)、プログラムは渡されたauthorityアカウントの公開鍵とUserアカウントに格納されている公開鍵を比較します。それらが等しくない場合、プログラムはロールバックします(93行目〜96行目)。最後のチェックは、authorityアカウントがトランザクションに署名したことを確認することです。しかし、攻撃者が制御されたMetadataアカウントを渡した場合、すべてのチェックがバイパスされる可能性があります。その理由は、プログラムがアカウントの型をチェックしないためです。プログラムはバイト配列を受け取り、プログラムで定義されたさまざまな型の構造体に直接デシリアライズします。
さらなるテストのためにテストプログラムをデプロイしました。デプロイされたプログラムはこのリンクで見ることができます。
3.1 トランザクションの送信
プログラムのデプロイ後、プログラムで提供された3つの命令を順番に呼び出すスクリプトを作成しました。
まず、InitializeUserとInitializeMetaを呼び出します。Metadataアカウントに格納されるaccountアカウントとして、私たち自身の公開鍵を設定していることに注意してください。

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

トランザクションを送信しました。トランザクションはこちらで見つけることができます。プログラムは成功を返しました。これは、チェックされていないアカウント型でチェックを正常にバイパスできたことを意味します。
4. まとめ
本記事では、Solanaにおける型変換の誤りの問題を紹介しました。この問題を回避する方法は数多くあります。例えば、アカウントの型を記録する属性を構造体に1つ追加し、プログラムはアカウントの読み書きを行う前に常に型属性をチェックするようにすることができます。引き続き、今後の投稿でさらに共有していきます。
このシリーズの他の記事を読む:
- Solanaエコシステムの保護 (1) — Solanaへようこそ
- Solanaエコシステムの保護 (2) — プログラム間の呼び出し
- Solanaエコシステムの保護 (3) — プログラムのアップグレード
- Solanaエコシステムの保護 (4) — アカウント検証
- Solanaエコシステムの保護 (5) — マルチシグ
- Solanaエコシステムの保護 (6) — マルチシグ2
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



