背景
2025年6月25日、私たちはSiloFinanceに対するEthereumへの攻撃を監視しました。
https://etherscan.io/address/0xcbee4617abf667830fe3ee7dc8d6f46380829df9
この攻撃により、合計54,600 ドルの損失が発生しました。
攻撃とインシデントの分析
まず、攻撃者はコントラクトのopenLeveragePosition関数を呼び出しました。これはレバレッジポジションを開くための関数です。この関数はフラッシュローンの仕組みを利用してレバレッジ取引を実装します。次に、onFlashLoanコールバックで_openLeverageが実行され、_fillQuoteを介してフラッシュローン資金を担保に変換するなどの操作が完了します。

関連するコードは次のようになります。

このうち、_flashArgs.flashloadTarget は攻撃者が設定した攻撃コントラクトなので、この関数は攻撃コントラクトの flashloan を呼び出します。

次に、攻撃コントラクトは onFlashLoan を呼び出します。関連するコードは次のようになります。

関数 openLeveragePosition で _txAction が LeverageAction.Open に設定されているため、次に _openLerverage が呼び出されます。

次に_fillQuoteが呼び出されます。この関数の機能は、債務トークンを担保トークンに変換することです。問題はここにあります。_fillQuoteの実装を見てみましょう。
struct SwapArgs {
address exchangeProxy; //0x160287e2d3fdcde9e91317982fc1cc01c1f94085
address sellToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address buyToken; //0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
address allowanceTarget;//0x79c5c002410a67ac7a0cde2c2217c3f560859c7e
bytes swapCallData; //0xd516418400000000000000000000000000000000000000000000000c249fdd327780000000000000000000000000000004377cfaf4b4a44bb84042218cdda4cebcf8fd6200000000000000000000000060baf994f44dd10c19c0c47cbfe6048a4ffe4860}
入力データである swapCallData をデコードすると、次の結果が得られます。
0xd5164184 // borrow(uint256,address,address)
0x00000000000000000000000c249fdd3277800000 //uint256 _assets
0x04377cfaf4b4a44bb84042218cdda4cebcf8fd62 //address _recviver
0x60baf994f44dd10c19c0c47cbfe6048a4ffe4860 //address _borrower
これは、攻撃者がborrow関数を呼び出したことを意味します。その後、攻撃者はborrowを通じて224 WETHを取得し、攻撃を完了しました。

要約する
この脆弱性の原因は、Siloコントラクトのフラッシュローンコールバック関数が受信データを検証しなかったため、攻撃者が悪意のあるデータを渡して最終的にSiloへの攻撃を完了させたことです。プロジェクト関係者は、経済モデルとコード操作ロジックの設計時に多者間検証を実施し、コントラクトをオンラインにする前に監査を行う際には、複数の監査会社を選択して相互監査を行うことをお勧めします。
