デキュリティが運営するブロックチェーン監視アカウントのデフィモン・アラーツは3日、暗号資産(仮想通貨)プロジェクトのGoldPesa(ゴールドペサ)がBase(ベース)上で運用するユニスワップv4のフックが2日に攻撃を受け、約11万4,000ドル(約1,795万円)が流出したと報告した。フックの自動リバランスと、ユニスワップの精算処理の組み合わせが悪用された。
ゴールドペサのフック、1時間ごとのリバランスが標的に
ユニスワップv4のフックは、プールごとに独自の処理を組み込める追加のプログラムである。デフィモンによると、狙われたフック(コントラクト名:GPXHooks)は、ゴールドペサが保有するGPX(
goldpesa)とUSDCの流動性を、スワップ実行前の処理の中でリバランスする仕組みだった。原因は論理エラーに分類されている。
前回のリバランスから1時間が過ぎていれば、誰のスワップでもこの処理が動く。
リバランスでは、ユニスワップのポジション管理コントラクトを通じてフックのポジションを解除し、資金を受け取る。このとき使う精算の処理は、同コントラクトにある差し引き後の残高をまとめて受け取るもので、その残高は同じ処理の中のすべての呼び出し元で共有されていた。
ユニスワップの精算処理を悪用、ポジション代金をフックに肩代わりさせる
攻撃は2日22時5分(日本時間)のトランザクションで実行された。攻撃者のコントラクトはまず、レンディングプロトコルのモルフォから17万5,000USDCをフラッシュローン(同じ取引の中で返済する無担保の借り入れ)で調達した。
続いてポジション管理コントラクトを通じてWETHとUSDCのポジションを作ったが、代金は払わず、約11万5,000USDCの未払い分を残した。そのままGPXのプールでスワップし、フックのリバランスを起動している。
フックはポジションを解除し、本来は約14万8,900USDCを受け取るはずだった。しかし精算の処理で攻撃者の未払い分と相殺され、ブロックチェーンエクスプローラーのベーススキャンによると、実際の受取額は約3万3,900USDCにとどまる。フックが攻撃者のポジションの代金を払った形だ。
攻撃者はこのポジションを解除して約11万5,000USDCを受け取り、借入金を返済した。手元に残った約11万4,400USDCは約9万6,400USDTに交換され、交換の過程で約1万8,000ドル分が目減りしている。
デフィモンによると、USDTはその後、ソラナを経由してBSCへブリッジされた。
攻撃のトランザクションにかかった手数料は、約0.15ドル(約24円)だった。
ゴールドペサのGPX、攻撃後に約13%下落
コインゲッコーのデータでは、GPXの価格は攻撃前の約5.91ドル(約931円)から、3日には約5.14ドル(約809円)まで下がった。
ベーススキャン上では、狙われたフックが今も総供給量1億GPXのうち約9,993万GPXを保有している。攻撃のトランザクションでフックが記録したGPXの流通量は、約5万8,000〜5万9,000GPXだった。
ゴールドペサの説明資料によると、GPXは供給量が固定されたトークンだ。所有者のいない改変不可能なスマートコントラクトで管理され、流動性は恒久的にロックされている。
フックのコントラクトは、ベーススキャン上でゴールドペサのデプロイ用アドレスが作成したと表示され、ソースコードも検証済みとなっている。
執筆時点で、今回の攻撃についてゴールドペサからの公式な説明は確認できていない。
関連:NEARの取引基盤で約6億円流出、全額補償へ──ラザルスとの接点も
関連:プライバシー通貨Zanoで不正発行、1カ月気付かず──チェーン巻き戻し
※価格は執筆時点でのレート換算(1ドル=157.45円)



