DeFiプロトコルがイーサリアムエコシステム内で熱くなり続けるにつれて、CipherTraceはますます多くのエクスプロイトと攻撃ベクトルが明らかになるのを見ています。 先週、28年2020月4.4日に、CoverProtocolのシールドマイニング契約であるBlacksmithが悪用されました。 ハッカーは、マイニング契約のバグを使用して、無限の量のCOVERトークンを作成し、プロジェクトからXNUMX万ドル以上を流出させました。
カバープロトコル リリース 彼らの事後分析は昨日、開発者には知られていないが、鍛冶屋契約の最初の展開以来バグが存在していたことを述べ、徹底的なセキュリティ監査とペネトレーションテストの重要性を強調しました スマート契約スマートコントラクトとは何ですか? スマートコントラクトはコンピュータープロです… その他.
無限のミンティングのタイムライン
最初の攻撃者のタイムライン
- 新しいバランサーの流動性プールは 追加されました Blacksmith.sol契約に。
- アタッカー 預金 Blacksmith.solコントラクトへの1,326,879.99BPTトークン。
- 同じ攻撃者はその後 実行 契約から資金を引き出すことによるエクスプロイト。
- 攻撃者は次のことができました 続ける 報酬の鋳造と約4.4万ドルの資金の引き出し。
興味深い出来事の中で、Grap Financeにリンクされているとされる「ホワイトハッカー」もこのバグを悪用して、約4万ドル相当のCOVERトークンを作成しました。 Grap Financeは、最終的に資金をCoverProtocolに戻しました。
Grap Finance Deployerの外部所有アカウント(EOA)のタイムライン
- 新しい流動性プールは 承認された 流動性マイニング用。
- Grap Finance Deployer EOA 寄託 Blacksmith.sol契約を介してカバーのプールに15,255.55BPT(DAI / Basis)。
- 約XNUMX分後、資金は 撤回 Grap FinanceDeployerのEOA残高に1Weiを残してカバーに。
- 別の外部ユーザー 撤退した 同じ時期にBlacksmith.sol契約からの残高のほとんどが、Blacksmith.sol契約のDAI / Basisプールのすべての流動性でGrapFinanceを導きました。
- Grap Finance デプロイヤー 寄託 15,255.55 BPT(DAI / Basis)をプールに戻します。
- 次に、Grap Finance Deployer クレーム 報酬と、エクスプロイトにより、ミント40,796,131,214,802,500,000.21カバー。
- ミントされたトークンをいくらか燃やした後、Grap Finance Deployer 送る エーテルをカバーに戻す 「次回は、あなた自身のたわごとの世話をします。」
無限トークンを作成する方法—テクニカル分析
経歴
このエクスプロイトは、イーサリアム内でスマートコントラクトを実装するために使用されるSolidityプログラミング言語の基本に戻ります。 これらのコントラクトがコンパイルされると、Ethereum仮想マシン(EVM)は、さまざまな機能を実行し、メモリとストレージを操作するために使用される命令(つまり、オペコード)を理解できるようになります。 EVMには、データを保存できるXNUMXつの異なる領域があります。 メモリ、ストレージ、およびスタック。 これらの領域を理解することは、バグがどのように悪用されたかを理解するために重要です。
コンピューティングデバイスのランダムアクセスメモリ(RAM)と同様に、「メモリSolidity内の「」キーワードは、特定の変数にメモリを割り当てます。 この場合、その変数は特定の関数にスコープされます。 関数が実行されるとメモリはクリアされますが、関数が戻る前にそのメモリの内容がストレージにプッシュされると、メモリが残る可能性があります。
「ストレージ利用料Solidity内の「」キーワードを使用すると、変数をマッピングまたはデータ構造内のデータのストレージへのポインターとして機能させることができます。 ストレージデータは、関数呼び出しとトランザクションの間で永続的です。 内部的には、ストレージは基本的に256ビットワードを256ビットワードにマップするKey-Valueストアです。
EVMはレジスタマシンではなくスタックマシンであることに注意してください。したがって、すべての計算は、と呼ばれるデータ領域で実行されます。 スタック。 スタックの最大容量は1024アイテムですが、簡単にアクセスできるのは上位16個のみであり、最上位の要素をその下の16個の要素のXNUMXつなどと交換するために使用できます。
バグ
ハッカーは、Cover ProtocolのBlacksmith.solを悪用しました。これは、Cover Protocol内のCLAIMトークンやNOCLAIMトークンなど、特定のプロジェクトまたはプールのトークンでスタッカーに報酬を与えることを可能にするシールドマイニング契約です。
バグをよりよく理解するために、まず、一般の人々を見てみましょう プール マッピング(つまりデータの保存)である変数:
At ライン118、コントラクトが「memory」キーワードを介してプールデータをメモリにキャッシュしていることがわかります。
それから ライン121、コントラクトはストレージ内のプールを次のように更新します updatePool(アドレス_lpToken) function 使用する プールストレージプール 変数に保存します.
ただし、さらに下を見ると デポジット(アドレス_lpToken、uint256 _amount) 機能、それは同じを使用します プール の計算のために関数内のメモリにキャッシュされた118行目の変数 pool.accRewardsPerToken。 この時点で、 プール 変数はからコピーされました プール マッピングし、メモリに保存されました。
その結果、 プール 内の変数 デポジット(アドレス_lpToken、uint256 _amount) 関数は変更しません プール 「memory」キーワードを使用する変数は関数自体のスコープ内でのみスコープされるため、コントラクトのオンチェーンストレージでのマッピング。 そこから、契約は更新します pool.accRewardsPerToken 中で updatePool(アドレス_lpToken) ストレージを使用する関数。 だから今、 updatePool(アドレス_lpToken) 機能 pool.accRewardsPerToken 技術的には新しいプールであり、に関連付けられていないため、更新される量は大幅に増加します。 プール メモリ内。
この脆弱性とメモリとストレージ間の誤用に続いて、 miner.rewardWriteoff 中で デポジット(アドレス_lpToken、uint256 _amount) 関数が誤って計算されているだけでなく、誤ったものを使用している pool.accRewardsPerToken、 のメモリキャッシュインスタンスを処理しているデポジット関数内にまだいるので プール.
デポジット機能に加えて、Grap Financeなどの誰もが、実行時に非常に多くのミントトークンを取得できます。 claimRewards(アドレス_lpToken) 関数。 報酬を取得するために使用されるこの関数は、最終的に呼び出します _claimCoverRewards(プールメモリプール、マイナーメモリマイナー) これは miner.rewardWriteoff 上で強調したこと。 その変数は実際よりもはるかに小さいので pool.accRewardsPerToken、契約により、大量のトークンが作成されます。
主要な取り組み
CipherTraceは、悪用されたバグのこの背景が、徹底的なセキュリティ監査とスマートコントラクトの侵入テストの重要性を明らかにすることを望んでいます。 ブロックチェーンブロックチェーン—ビットコインやその他のcの基盤となるテクノロジー… その他 に展開することを選択します。 Grap Financeはエクスプロイトを通じて受け取った資金を返しましたが、元のハッカーはDeFiプロトコルから4万ドル以上を稼ぐことができ、COVERトークンの価値はその後99%近く急落しました。
ソース:https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/