
ショートアドレス攻撃という言葉をご存知ですか?これはイーサリアムスマートコントラクトにおける注目すべき脆弱性で、攻撃者は異なる長さのアドレスの扱いの違いを悪用することができます。
より深く理解していただくために、この記事ではショートアドレス攻撃の仕組み、その影響、そして主要な予防戦略について解説します。誤解を解き、これらの攻撃を軽減するための知見を提供することで、一般ユーザーと専門家の両方にとって包括的な概要を提供することを目指します。
また、 最も安全な暗号通貨は何ですか?
主要なポイント(要点)
- ショートアドレス攻撃は、短くて似たようなアドレスに資金を送信し、ユーザーを騙してエラーを起こさせることで、暗号通貨ウォレットのスマートコントラクトの脆弱性を悪用します。
- 一部のウォレット インターフェースのチェックが不十分なため、ユーザーが誤ってこれらの誤解を招くアドレスに暗号通貨を送信した場合、資金を失う可能性があります。
- 緩和戦略としては、アドレス検証ツールの使用やウォレット ソフトウェアが最新であることを確認することなどが挙げられます。
ショートアドレス攻撃とは何ですか?
分散型プラットフォームであるイーサリアムは、 スマート契約 Solidityプログラミング言語を通じて。同様に、Solidityは厳格なアドレス長を強制し、アドレスは正確に20バイト(16進数で40文字)である必要があります。
これにより、スマートコントラクトトランザクションにおけるアドレス処理の一貫性とセキュリティが確保されます。ただし、ショートアドレス攻撃とは、攻撃者がエンコードされた文字列の末尾の文字を無視することでアドレスエンコードアルゴリズムを悪用する脆弱性です。
攻撃者は、正当なアドレスのプレフィックスと一致するエンコードされた文字列を作成し、ユーザーを騙して攻撃者が管理するアドレスを使用して資金を送金したり操作を実行したりさせます。
Ethereum アドレスは通常 20 バイトですが、攻撃者が 20 バイト未満のアドレスを使用した場合、Solidity は自動的に右側の残りのバイトをゼロで埋めて、正しいアドレスの長さを維持します。
例えば、関数がアドレスとトークン量のような2つの引数を必要とする場合、この自動パディングにより、コントラクトは2つ目の引数(トークン量)の一部を1つ目の引数(アドレス)の一部と誤って解釈する可能性があります。この誤解釈により、攻撃者は当初意図していたよりも多くのトークンを送信できるようになります。
本質的に、この種の攻撃は多くの場合、人為的なミスを悪用します。ウォレットアドレスは複雑なため、ユーザーはすべての文字を二重に確認しない可能性があります。そのため、攻撃者は実際のアドレスとほぼ同じように見えるアドレスを、わずかに短縮または変更した形で作成することで、このミスを悪用します。
ショートアドレス攻撃の例
送信者のアカウントから別のアカウントにトークンを転送するために使用される以下の Solidity コードを検討してください。
関数 transfer(アドレス _to, uint256 _value) パブリック {
_to.length == 20 が必要です。
_to.transfer(_value);
}
このコントラクト関数は、指定された金額を指定されたアドレスに送金するように設計されています。指定されたアドレスが有効な20バイトの値であることを確認するために、コントラクトは「length」プロパティを使用してアドレスの長さをチェックします。
しかし、「length」プロパティはビット数ではなくバイト数を返すため、アドレス検証の信頼できる方法とは言えません。これにより、ショートアドレス攻撃に対する脆弱性が生じます。ショートアドレス攻撃では、攻撃者は20バイト未満のアドレスを指定しても、長さが20バイト以上であるため、有効なアドレスと誤認されてしまう可能性があります。
ショートアドレス攻撃がどのように発生するかを示すために、次の Solidity コードを検討してください。
関数 transfer(アドレス _to, uint256 _value) パブリック {
_to.length == 20 が必要です。
_to.transfer(_value);
}
関数testAttack() public {
アドレス shortAddress = 0x01;
uint256 値 = 100;
転送(shortAddress, 値);
}
この場合、転送関数は前の例で使用した関数と同一です。ただし、コントラクトには「testAttack」関数も含まれており、この関数はショートアドレスと値100を使用して転送関数を呼び出します。
転送関数は「length」プロパティを使用してアドレスを検証するため、指定されたアドレスが有効な20バイトのアドレスであると誤って想定し、転送操作を続行します。しかし、実際にはアドレスが20バイト未満であるため、転送は失敗し、値は転送されません。
ショートアドレス攻撃はどのように機能するのか?
ERC20規格では、「transfer」関数には2つのパラメータ、つまり受信者のアドレスと、転送するトークン数を表す「uint256」値が必要であると規定されています。ショートアドレス攻撃では、攻撃者はコントラクトが想定するよりも短い入力値を提供します。
これにより、受信側のコントラクトはフィールドの配置がずれる可能性があり、データを誤って解釈することになります。トランザクションデータをエンコードする一部のサードパーティ製アプリケーションは、パディングを正しく処理しなかったり、適切な長さの検証を行わなかったりする可能性があるため、コントラクトは不適切にフォーマットされたトランザクションを処理し、意図しない動作を引き起こす可能性があります。
プロセスの簡略化した内訳は次のとおりです。
アドレスの操作
攻撃者は、正規のウォレットアドレスを短縮したアドレスを提供します。場合によっては、ツールやマルウェアを使用して、取引プロセス中に誤ったアドレスを自動入力したり表示したりすることもあります。
例えば、攻撃者は短いアドレスで転送関数にトランザクションを送信します 0x123456 そして金額1000
パディング
Ethereumクライアントは、ショートアドレスにゼロを追加して、必要な20バイトに拡張します。このパディングにより、トランザクション内の後続パラメータの整合性が崩れ、スマートコントラクトがトランザクションデータを誤って解釈することになります。
例えば、イーサリアムクライアントパッド 0x123456 〜へ 0x1234560000000000000000000000000000000000これにより、意図した 1000 の金額パラメータがシフトされ、契約がデータを誤って解釈することになります。
ヒューマンエラー
取引を開始するユーザーは、ウォレットアドレスが不完全または不正確であることに気づきません。これは、アドレスが長く、ユーザーがコピー&ペーストすれば必ず正確だと思い込んでしまうためによく起こります。
口座振替え
ユーザーは短縮されたアドレス、または誤ったアドレスに暗号通貨を送信します。ブロックチェーン取引は不可逆であるため、資金は失われるか、攻撃者のアドレスに送金されます。
最もの一つ 注目すべき事例 2022年半ば、著名な暗号資産インフルエンサーが250ETH(当時の価値で約500,000万ドル)の送金計画を公表した際に、ショートアドレス攻撃が発生しました。攻撃者はインフルエンサーの取引を監視し、受信者のウォレットアドレスの短縮版をトランザクションフィールドに代入しました。
インフルエンサーはアドレスが正確だと思い込み、知らず知らずのうちに攻撃者のアドレスに資金を送金してしまいました。取引の取り消しを迅速に試みたものの、ブロックチェーンの不可逆性により永久的な損失が発生しました。
この事件は、特に多額の金銭を扱う場合や公開取引を行う場合にウォレットアドレスを検証することの重要性を浮き彫りにしました。
ただし、 Solidity バージョン 0.5.0コンパイラは、呼び出しデータのサイズが静的にサイズ指定された引数の想定される長さと一致しているか、または動的にサイズ指定された引数の最小サイズ以上であるかを確認するための実行時チェックを導入しました。これらのチェックは、攻撃者がデータ長の不一致を悪用しようとするショートアドレス攻撃などの操作手法に対する保護に役立ちます。
さらに、契約実行中のデータの一貫性も確保します。
「ブロックチェーンは非常に興味深い技術であり、今後数年間で社会に非常に大きな影響を与えるだろう。」—ケネス・C・グリフィン
ショートアドレス攻撃の影響
短縮アドレス攻撃はフィッシングや 敷物を引っ張るしかし、特に高額取引の場合、その影響は大きくなります。
さらに、短縮アドレス攻撃は微妙な操作に依存するため、標準的なセキュリティ チェックを回避できることが多く、トランザクションの詳細をすべて検証することに慣れていないユーザーにとっては特に危険です。
ショートアドレス攻撃の大半は、 分散型ファイナンス 厳格な検証措置が欠如しているDeFi(分散型金融)プラットフォームおよびウォレットサービス。これらのプラットフォームは、ピアツーピア取引の性質上、ウォレットアドレスの正確性を検証できる仲介者が存在しないため、特に脆弱です。
Hubspot 鎖分析2022年第1四半期に、ハッカーは取引所、プラットフォーム、民間企業から1.3億ドルを盗み、その損失の大部分がDeFiセクターに不均衡な影響を与えました。

さらに、誰でも被害に遭う可能性はありますが、被害者の大多数は仮想通貨初心者または経験の浅いユーザーであることに注意してください。ウォレットアドレスの複雑さや取引プロトコルへの不慣れさが、彼らの被害に遭いやすい要因となっています。
「大手の暗号通貨企業でさえ、ハッカーを出し抜くほど高度なサイバー防御体制を備えていない可能性が高い。暗号通貨業界がこれほど急速に成長している現状では、対応が難しいのも無理はない」――ルーク・ウィルモット氏(暗号通貨ベースの自動車マーケットプレイスAutoCoinCarsの共同創業者兼COO)
ショートアドレス攻撃の脆弱性を検出する方法
ショートアドレス攻撃の脆弱性を検出するには、徹底したコードレビュー、自動化ツール、強化されたセキュリティ対策など、多層的なアプローチが必要です。スマートコントラクトにおけるこれらの脆弱性を検出する方法をいくつかご紹介します。
コード監査と形式検証
ショートアドレスの脆弱性を検出する最も効果的な方法の一つは、手動によるコード監査と形式検証プロセスです。スマートコントラクトのセキュリティに精通した監査担当者は、コントラクトにおけるアドレス処理における潜在的な弱点を特定できます。
形式検証では、数学モデルを使用して、不正な形式または短縮されたアドレスを含むすべてのケースで契約が期待どおりに動作することを証明します。
自動化されたセキュリティツール
スマートコントラクトの脆弱性(ショートアドレス攻撃の脆弱性を含む)を検出するために設計された自動ツールがいくつかあります。人気のあるツールには以下が含まれます。
- 神話X: これは、短いアドレスの問題などの潜在的な脆弱性を特定するのに役立つ Ethereum スマート コントラクト セキュリティ分析ツールです。
- セキュア化: スマート コントラクトのセキュリティ チェックを自動化し、アドレスのフォーマットに関連する問題にフラグを立てる監査ツール。
- Remix IDEプラグイン: Ethereum 開発者は、脆弱なコードに自動的にフラグを立てるセキュリティ プラグインを備えた Remix IDE を使用できます。
これらのツールは、契約のロジックを分析し、短いアドレス攻撃によって悪用される可能性のある安全でない慣行を強調表示します。
コード内の長さ検証
スマートコントラクト開発者は、トランザクションを処理する前に、すべてのアドレスが20バイトの長さであることを確認するために、アドレス長検証を実装する必要があります。これは、アドレスパラメータの長さを明示的にチェックし、短縮されたアドレスや誤った形式のアドレスを持つトランザクションを拒否することで実現できます。
たとえば、Solidity では、開発者は次の関数を使用してアドレスを検証できます。
関数isValidAddress(アドレス_addr) public pure は(bool)を返します{
_addr != address(0) && _addr == address(uint160(_addr)) を返します。
}
この簡単なチェックにより、トランザクションを処理する前にアドレスの長さが正しいことが確認され、潜在的なショートアドレス攻撃が防止されます。
テストネットシミュレーションと侵入テスト
イーサリアムメインネットにスマートコントラクトをデプロイする前に、開発者はテストネットシミュレーションとペネトレーションテストを実施し、潜在的な脆弱性を特定する必要があります。これらのテストは現実世界の攻撃シナリオを模倣しており、開発中には顕在化しない可能性のある問題を明らかにすることができます。
テストネット上でショートアドレス攻撃をシミュレートすることで、開発者は契約がアドレスフォーマットを適切に処理し、安全なトランザクションを保証しているかどうかを評価できます。
ショートアドレス攻撃を防ぐ方法

ショートアドレス攻撃を防ぐには、技術的な解決策とユーザーの意識の両方が必要です。いくつかの効果的な戦略によって、このような攻撃の被害に遭う可能性を減らすことができます。
入力の検証
ユーザーインターフェースまたはオフチェーンコンポーネントに強力な入力検証メカニズムを導入し、アドレスが想定される長さと形式に準拠していることを確認します。例えば、多くの暗号通貨ウォレットでは、トランザクションが行われる前にアドレス全体を自動的に検証するアドレス検証ツールを提供しています。
これらのツールは、ユーザーが短縮されたアドレスや不正確なアドレスに資金を送金できないようにします。例えば、 トークンビュー広く使用されている暗号通貨ウォレット アドレス チェッカー。複数のブロックチェーン間でウォレット アドレスを検証するプロセスを簡素化します。
これにより、ユーザーはアドレスの信頼性を確認できるだけでなく、保有トークン、取引履歴、その他の関連詳細情報も提供できるようになります。
ユーザー教育
多くのショートアドレス攻撃は人為的なミスを悪用するため、ユーザーへの教育が不可欠です。暗号通貨取引所やウォレットプロバイダーは、ユーザーにアドレスの検証方法を教え、送金前に取引を二重に確認するよう促すことで、リスクを軽減できます。
完全なアドレスをメモ帳にコピーして貼り付け、手動で確認するなどの簡単な手順で、多くの攻撃を防ぐことができます。
チェックサムメカニズム
チェックサムとは、元のデータから抽出された数字と文字の文字列で、エラー検出に使用できます。すべてのアドレスが有効なチェックサム付きEthereumアドレスであることを確認してください。
チェックサムを実装すると、Ethereum アドレス形式への準拠を検証できるため、短いアドレスの操作のリスクを最小限に抑えることができます。
監査とテスト
スマートコントラクトの定期的な監査と包括的なテストを実施することで、セキュリティ上の脆弱性を発見することができます。そのため、自動監査ツールと手動のコードレビューを併用することは、このような攻撃を防ぐ上で重要な役割を果たします。
正式な検証
形式検証とは、スマートコントラクトの正しさを数学的に証明することです。この手法を用いることで、入力パラメータが正確に処理されることを保証し、ショートアドレス攻撃を防ぐことができます。
形式検証ツールの例としては、 Solidity SMTチェッカーSolidity コンパイラに統合されると、形式手法を使用して論理エラーを検出します。
安全な数学ライブラリ
安全な数学ライブラリを使用する OpenZeppelinのSafeMath ショートアドレス攻撃に対する防御を強化できます。これらのライブラリは、安全性チェックを組み込んだ数学演算を実行する関数を提供し、オーバーフローまたはアンダーフローが発生した場合にエラーがトリガーされるようにします。
その他の一般的なスマートコントラクトの脆弱性

スマート コントラクトは、サービス プロバイダーを信頼することなく、基盤となるソフトウェアとその操作を検証できるという重要な利点を提供します。
しかし、スマートコントラクトの存在は、潜在的な脆弱性を悪用しようとする者も惹きつけます。コードの弱点を突く機会を狙う者たちが、舞台裏に潜んでいるのです。
近年、スマートコントラクトの脆弱性により数十億ドル相当の仮想通貨が失われています。例えば、2022年8月には、米国に拠点を置く仮想通貨企業Nomadが ことを報告 ノマドトークンブリッジのハッキングにより1億9000万ドル相当の暗号通貨が盗まれた。
これは、セキュリティ対策の強化が喫緊の課題であることを浮き彫りにしています。次に、注意すべきスマートコントラクトの脆弱性について、いくつか簡単に見ていきましょう。
整数オーバーフロー/アンダーフロー
整数オーバーフローと整数アンダーフローは、Solidityスマートコントラクトにおいて頻繁に発生する問題です。これは、算術演算がデータ型に格納できる最大値または最小値を超えた場合に発生します。これらの問題は「uint」と「int」の両方のデータ型に影響し、予期せぬ動作や資産の損失につながる可能性があります。
例えば、コントラクトが整数ごとに32ビットのメモリを使用する場合、0から2,147,483,647までの範囲の値しか保存できません。算術演算の結果が2,147,483,647を超える場合、変数は自動的に0に戻り、重大な問題が発生する可能性があります。
この例は 弱い手の証明 Coin (PoWHC) 攻撃。PoWHC は、4chan のグループによって作成された、Solidity を使用して Ethereum 上に構築されたポンジスキームです。このケースでは、スマートコントラクトの作成者がアンダーフローとオーバーフローの条件を考慮に入れていなかったため、866 ETH がコントラクトから不正に引き出されました。
おすすめ
SolidityのSafeMathライブラリを使用すると、整数オーバーフローとアンダーフローを防止できます。このライブラリは、これらの条件を自動的に検証し、オーバーフローまたはアンダーフローが検出された場合は例外をスローする算術演算を実行する関数を提供します。
再入攻撃
再入性は、Solidityスマートコントラクトにおけるセキュリティ上の脆弱性であり、攻撃者がコントラクト内の関数を繰り返し呼び出すことを可能にし、資金や資産の盗難につながる可能性があります。この脆弱性は、攻撃者がコントラクト関数の最初の実行が完了する前に複数回呼び出すことに成功した場合に発生し、コントラクトの状態を操作してトークンを不正に取得することを可能にします。
再入攻撃は悪意のあるハッカーがよく使う手法であり、 表します 2023年上半期に発生した60件のハッキングのうち5件は脆弱性が原因で、総額850万ドルの損失につながった。注目すべき事例としては、2016年6月に発生した攻撃が挙げられる。 流出した資金 「DAO」から、イーサリアム開発者にブロックチェーンをフォークするよう促しました。
おすすめ
この脆弱性を軽減するための効果的な解決策の 1 つは、OpenZeppelin の ERC20 実装によって提供される「nonReentrant」修飾子を利用することです。
重要なのは、「nonReentrant」ガードは1つしかないため、この修飾子が付けられた関数は互いに直接呼び出すことができないということです。ただし、これらの関数をプライベートにし、`nonReentrant` としてマークされた外部エントリポイントを提供することで、この制限を回避できます。
再入攻撃を軽減するためのもう一つの効果的な戦略は、「Checks-Effects-Interactions」パターンを実装することです。このアプローチは、入力と条件の検証から始まり、次に状態変数を更新し、最後に外部コントラクトとのやり取りを行います。
このパターンは、外部とのやり取りが行われる前にすべての状態変更が確実に完了するようにすることで、再入脆弱性を効果的に防止します。
データの保存方法が正しくありません
スマートコントラクト開発においてよくあるエラーの一つは、最適化されていないメモリデータストレージの使用です。これはトランザクションガスコストの増加につながる可能性があります。メモリはコントラクト実行中の変数の一時的な保存領域として機能し、関数呼び出しごとにクリアされます。
おすすめ
値の読み取りのみが必要な関数の場合は、代わりにcalldataを使用することをお勧めします。calldataは、コントラクトに渡される関数の引数を保持する読み取り専用のストレージ領域であり、ガスコストの最適化と入力引数の不変性を保証します。
承認の悪用
承認エクスプロイトは、ERC20トークンコントラクトに見られるセキュリティ上の脆弱性です。ユーザーがサードパーティのコントラクトに、自分に代わって無制限の数のトークンを送金する権限を付与することで、承認されたコントラクトは追加の承認を必要とせずに、ユーザーのアカウントから他のアカウントにトークンを移動できるようになります。
この設定の問題点は、ユーザーが承認を取り消した場合やコントラクトが侵害された場合でも、承認されたコントラクトがいつでもトークンを転送できることです。その結果、攻撃者はこの脆弱性を悪用し、承認されたコントラクトを制御し、ユーザーのアカウントから自身のアカウントへの不正なトークン転送を実行できます。
おすすめ
承認エクスプロイトのリスクを軽減するため、ERC20トークンコントラクトでは、承認されたコントラクトがユーザーに代わって譲渡できるトークン数を制限するための許可メカニズムを設計する必要があります。これは、上限許可数を設定するか、一定期間後に失効する期限付き許可数を実装することで実現できます。
さらに、開発者は、トークンの転送ごとにユーザーの確認を要求したり、多要素認証を使用してトークンの転送を検証したりすることで、セキュリティを強化できます。
クロスファンクションの状態依存関係
関数間状態依存性の脆弱性は再入可能性の脆弱性に似ており、2つの関数が同じコントラクト状態に依存している場合に発生します。一方の関数の実行中にもう一方の関数が呼び出されると、意図しない結果が生じる可能性があります。
さらに、両方の関数が同時に呼び出された場合にもこの問題が発生する可能性があり、その結果、スマート コントラクトの整合性を脅かす潜在的な競合状態が発生する可能性があります。
おすすめ
この脆弱性を軽減するには、同様の競合状態に対処するために使用されたのと同じ予防策を実装することをお勧めします。具体的には、Etherの転送が行われる前に、すべての状態変更が確定していることを確認してください。
このアプローチに従うことで、スマート コントラクトは、イーサ トランザクションを開始する前に、必要なすべての状態変更を完了します。
「救済措置はありません。修復不可能です。ブロックチェーンの取引を元に戻すことは不可能です」— 暗号資産起業家、アルクス・フィン
結論:ショートアドレス攻撃防止の将来
ショートアドレス攻撃は、しばしば甚大な損失を伴うため、深刻な懸念事項となっています。暗号通貨とブロックチェーン技術が進化するにつれ、ユーザーとプラットフォームは共に、この種の攻撃に対して警戒を怠らないことが極めて重要になります。
ユーザー教育、技術の向上、そしてプラットフォームの改善を組み合わせることで、こうした攻撃の可能性を大幅に低減することができます。意識を高め、ベストプラクティスを奨励することで、暗号通貨コミュニティはすべてのユーザーにとってより安全な環境を構築することができます。
結局のところ、ショートアドレス攻撃に対する最善の防御策は、入念な対策です。ユーザーはすべての取引を時間をかけて検証する必要があり、プラットフォームは進化する脅威から身を守るために高度なセキュリティ対策を実装する必要があります。
暗号通貨環境が成熟するにつれて、こうした取り組みは信頼を維持し、デジタル資産を不正な攻撃から守るために不可欠となるでしょう。
よくあるご質問
暗号通貨におけるショートアドレス攻撃とは何ですか?
ショートアドレス攻撃は、悪意のある人物が暗号通貨取引における短縮または省略されたアドレスの使用を悪用し、ユーザーが意図しない受取人に資金を送金してしまう場合に発生します。
ショートアドレス攻撃はどのように発生するのでしょうか?
これらの攻撃は、通常、長いアドレスの一部のみを表示するウォレットインターフェースを悪用します。ユーザーが短縮アドレスをコピーして資金を送信すると、類似した文字で始まる別のアドレスに誤って暗号通貨を送信してしまい、資金を失う可能性があります。
短縮アドレス攻撃から身を守るにはどうすればいいですか?
ショートアドレス攻撃を回避するには、暗号通貨を送信する前に必ず完全なアドレスを検証してください。完全なアドレスを表示する信頼できるウォレットを使用し、正確性を確保するためにQRコードやアドレス確認機能の利用を検討してください。
ショートアドレス攻撃は一般的ですか?
他の種類の攻撃ほど蔓延しているわけではありませんが、ショートアドレス攻撃は、特に経験の浅いユーザーの間で発生する可能性があります。こうした攻撃に対する意識を高め、ウォレットを適切に運用することで、被害に遭うリスクを大幅に軽減できます。
