2023年12月25日、当社の監視システムは、Telcoinを標的とした一連の悪意のあるアクティビティを検出しました。当社はTelcoinチームと協力し、ウォレットの実際のインプリメンテーションとその対応するプロキシとの間の不整合から生じた、ウォレットコントラクトの不適切な初期化を根本原因として特定しました。本レポートは、インシデントを完全に理解するための詳細な分析を提供することを目的としています。
0x0: 基本設計
脆弱性を調査する前に、関係するスマートコントラクト間の関係をまず理解することが重要です。本質的に、これらはCloneFactory、Cloneable Proxy、およびBeacon Proxyパターンを組み合わせたものとして抽象化でき、以下の図に示されています。

0x1: 脆弱性分析
脆弱性はウォレットコントラクトの不適切な初期化に起因しており、これはウォレットの実際のインプリメンテーションとその対応するプロキシとの間の不一致によるものです。具体的には、初期化プロセス中に、プロキシはストレージ位置の最下位ビットに書き込むことによって、ストレージスロット0をゼロ以外の状態に初期化しました。その後、ウォレットコードもストレージスロット0に書き込み、最下位ビットにあるプロキシの初期値を上書きしました。この問題は、どちらかのスマートコントラクトの本来の脆弱性によるものではなく、両者の相互作用によるものです。
以下に、提供されたトランザクショントレースに基づいた詳細を説明します。

具体的には、CloneableProxy:Proxy.initialize()関数内で、Wallet.initialize()関数を呼び出すdelegatecallがあります。この呼び出しは、CloneableProxy:Implementation.initialize()関数へのdelegatecallを通じて行われます。その結果、Wallet.initialize()関数によって行われたストレージへのあらゆる変更は、CloneableProxy:Proxyコントラクトのストレージに反映されます。
その意味合いを完全に理解するには、CloneableProxy:Proxyコントラクトのストレージレイアウトを調べる必要があります。このコントラクトの定義は以下のとおりです。

ProxyもERC1967Upgradeコントラクトもストレージ変数を持っていないため、スロット0は代わりに、Initializableコントラクトから継承された2つのストレージ変数、_initializedと_initializingによって使用されます。

次に、Walletコントラクトを調べます。Wallet.initialize()関数内では、スロット0xaaが初期化フラグとして機能していることが明らかです。これは、3〜4行目および11〜12行目の以下のコードスニペットで強調されています。

Walletコントラクトの先頭にあるコメントで示されているように、スロット0は_stateに割り当てられており、これは関数セレクタの後のcalldataから次の32バイトを格納します(21行目)。詳細については、Walletコントラクトの先頭にあるコメントを参照してください。

スロット0の使用に関して、明白な不一致があります。CloneableProxy:Proxyコントラクトはそれを初期化フラグとして解釈しますが、Wallet:initialize()関数はそれをウォレットの状態として扱います。
その結果、初期化プロセスの後、スロット0の最下位2バイトはゼロにリセットされます。これにより、_initializedと_initializingの両方がゼロに設定されます。その結果、CloneableProxy:Proxyコントラクトは、initializer修飾子の保護が回避できるため、initialize()関数による再初期化に対して脆弱になります。

明らかに、悪用される可能性はウォレットの状態にかかっています。ゼロ以外の値に更新されると、ウォレットの状態により、このコントラクトのさらなる再初期化が防止されます。初期化後、ウォレットの状態はトランザクションごとに更新されるため、スロット0の最下位2バイトがゼロ以外になる可能性が高まります。これにより、ウォレットは効果的に再初期化から免除されます。これが、脆弱なウォレットの大部分がトランザクション履歴がほとんどないかまったくないため、攻撃にさらされていた理由を説明しています。
0x2: 攻撃分析
攻撃者は、脆弱なCloneableProxy:Proxyコントラクトを再初期化してBeaconコントラクトのアドレスを変更することから始めました。その後、攻撃者は以下に詳述するように、CloneableProxy:Proxyコントラクトに含まれる資産を移送しました。

複数の脆弱なコントラクトが1つのトランザクションで侵害されたことに注意してください。攻撃者はこの戦略を繰り返し実行しました。
0x3: 攻撃の概要
6つの異なるアカウントによって実行された合計4,958件の攻撃が観測されました。

0x4: 修正と推奨事項
当社の調査により、根本的な問題はストレージスロット0の使用方法の一貫性のなさから生じており、脆弱なコントラクトの再初期化の可能性につながることが明らかになりました。明らかに、修正にはストレージ割り当ての慎重な管理が伴います。
このインシデントから、いくつかの重要な洞察を得ました。
-
インラインアセンブリでストレージスロットを操作する際は、最大限の注意を払ってください。エラーは重大な脆弱性につながる可能性があります。
-
コントラクトのステータスを常に監視してください。迅速に対応する能力は、タイムリーなアラートを受け取るかにかかっています。
-
コントラクト内に一時停止メカニズムを実装して、侵害が検出された場合にアクティビティを即座に停止できるようにしてください。
さらに、このインシデントでは異なるウォレットコントラクトを標的とした複数の攻撃トランザクションが関与していたという事実は、Phalconのような脅威監視および攻撃ブロックソリューションの緊急の必要性を強調しています。このようなツールは、将来のリスクを軽減し、潜在的な損失から保護するために不可欠です。
0x5: イベントのタイムライン
太平洋標準時12月25日午前9時23分: 当社のシステムは、Polygonネットワークで最初の悪意のあるトランザクションを検出しました。

太平洋標準時12月25日午前10時28分: Telcoinサポートチームが社内コミュニケーションチャネルでインシデントを報告しました。
太平洋標準時12月25日午前10時32分〜10時37分: TelcoinチームメンバーがTelcoin Discordコミュニティに通知し、関連する主要チームメンバー全員との緊急通話を設定しました。
太平洋標準時12月25日午前10時45分: Telcoinインフラストラクチャへのすべてのアクセスを制限するためにWebアプリケーションファイアウォールルールが実装されました。
太平洋標準時12月25日午前11時02分: TelcoinチームはSeal 911との交渉を開始しました。
太平洋標準時12月25日午前11時11分: Telcoinチームと他のセキュリティメンバーによってウォー・ルームが設置され、根本原因を特定し、攻撃をブロックするための潜在的なソリューションを議論しました。
太平洋標準時12月25日午後1時14分: TelcoinチームはX(Twitter)を通じてユーザーにアラートを公に発行しました。
太平洋標準時12月25日午後3時39分: TelcoinはChainalysis & Slowmistに連絡し、盗難された資金の調査を支援しました。調査を通じて、盗難されたウォレットとアドレスを特定し、この情報を取引所に共有しました。

太平洋標準時12月25日午後10時35分: Telcoinチームからの招待を受け、当社はウォー・ルームに参加し、根本原因を特定するために当社の分析を共有しました。
太平洋標準時12月25日午後11時00分〜太平洋標準時12月26日午前2時06分: 根本原因を特定した後、Telcoinチームは、安全に実装された新しいビーコンと整合させるためにウォレットプロキシを再初期化することによって、緩和戦略を策定しました。このエクスプロイトは一度きりの機会であったため、Telcoinはウォレット構成を事前に更新でき、これにより攻撃者がこれらの脆弱性をさらに悪用する能力を無効化しました。
太平洋標準時12月26日午前2時07分〜太平洋標準時12月26日午前2時14分: Telcoinチームは、まだ侵害されていないすべてのウォレットに緩和プロセスを実装し、包括的なカバレッジを確保しました。迅速かつ効率的な展開のために、プロセスは厳密に定義された時間枠内でバッチで実行されました。Telcoinはその後、影響を受けたすべてのウォレットの完全な復旧と、すべてのウォレットの恒久的な修正のための是正計画の準備と内部テストを開始しました。
太平洋標準時12月26日午後4時52分: Telcoinと当社のチームは、以下のトピックについて議論を開始しました。
-
インシデントの概要
-
イベントのタイムライン: インシデントがどのように展開したかの時系列アカウント。
-
根本原因分析: インシデントの根本原因の詳細な分析。
-
改善のための推奨事項
-
コード監査
太平洋標準時12月29日午後12時27分: 数回の議論の後、当社はTelcoinチームと協力して、事後分析レポートの作成と是正措置の監査を開始しました。
2024年1月3日: 事後分析のドラフトが提供されました。
2024年1月4日: 当社の監査結果、特定された問題と推奨事項が提示されました。
2024年1月4日〜1月10日: 当社はTelcoinチームと協力して、事後分析を最終決定し、修正を確認しました。
また、12月25日から現在に至るまで、Telcoinはインシデントに関してブロックチェーン調査会社および法執行機関と緊密に連携して積極的に取り組んできたことも注目に値します。
BlockSecについて
BlockSecは、世界的に著名なセキュリティ専門家グループによって2021年に設立された、先駆的なブロックチェーンセキュリティ会社です。当社は、Web3の世界のセキュリティとユーザビリティを向上させ、その大量導入を促進することに尽力しています。この目的のために、BlockSecはスマートコントラクトおよびEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そして仮想通貨の世界を効率的にサーフィンするためのWeb3ビルダー向けMetaDock拡張機能を提供しています。
現在までに、同社はMetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300以上の著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの有力な投資家から2回の資金調達ラウンドで数千万米ドルの資金を受け入れています。
ウェブサイト: https://blocksec.com/



