BlockSec の監視によると、DBXen コントラクトは今朝攻撃を受け、推定損失は約 15 万ドルです。根本的な原因は、ERC2771 メタトランザクションにおける送信者のアイデンティティの不一致です。burnBatch() 関数内で、gasWrapper() 修飾子は _msgSender()(実際のユーザー)を使用して状態を更新しますが、コールバック関数 onTokenBurned() は msg.sender(フォワーダー)を使用します。これにより、accCycleBatchesBurned はユーザーによって記録されますが、lastActiveCycle は誤ってフォワーダーによって更新されます。
この不一致は claimFees() と claimRewards() のロジックを破壊します。ユーザーのために updateStats() を実行すると、コントラクトは未処理の破棄バッチが存在すると誤って考えます。なぜなら、accCycleBatchesBurned は更新されているのに lastActiveCycle は更新されていないため、報酬と手数料が誤って計算され、攻撃者が過剰な資金を引き出して利益を得ることができるからです。