‌
‌
‌
‌
‌
區塊鏈

GCSA 洞察: 鏈上協議資金安全, 基於 21 億筆歷史交易重放的任意外部調用漏洞剖析

金色財經

前言

本報告由 GCSA Web3 Labs ZkSec 發布:任意外部調用漏洞——合約將調用目標與數據完全交給調用者填寫——是鏈上授權資金面臨的一類核心風險。本文基於歸檔節點數據,重放 21 億筆歷史交易,掃描出超過一百個存在相關風險的合約,涉及多個代碼族。文章系統介紹檢測方法(歷史交易重放、調用參數溯源與變異驗證),分析漏洞構成與以太坊/BSC 鏈間差異,並以已知攻擊與掃描檢出案例進行交叉驗證,最終給出防禦建議。

1.1 任意外部調用漏洞

存在任意外部調用漏洞的合約,提供一個公開入口:調用的目標地址和數據由任何提交者填寫,合約以自己的身份執行。正常合約不是這樣——要調用誰、傳什麼數據,寫在代碼里或限定在白名單內。

這種入口有時是刻意的設計取捨(批量工具、跨鏈橋為了通用故意開放),有時是設計缺陷(本想限制調用範圍,卻漏了校驗)。無論是刻意開放還是校驗遺漏,只要合約持有用戶授權或滯留資金,缺少調用者限制的入口就可能被非預期調用者利用。

‌

1.2 一個目標限制不足的案例

BSC 上的 MetaAggregatorSwapContract(0xc17b234fad8e40642662f1d2a6cbd1d609e7b9b5)存在目標限制不足的任意外部調用風險。它的功能是代用戶執行兌換:接收代幣,調用外部聚合器完成交易。

// 入口:任何人可調用,全部參數來自 calldata function swapERC20(SwapERC20Params calldata params) external nonReentrant {     (uint256 amountOut, uint256 fee) = _swapERC20(params);     // …… emit TokenSwapped(……) } function _swapERC20(SwapERC20Params memory params) internal returns (uint256, uint256) {     address aggregator = params.aggregator;   // 任意地址     bytes memory swapData = params.swapData;  // 任意字節     // ……     uint256 balanceBefore = tokenOut.balanceOf(address(this));     _executeAggregatorCall(swapData, isDelegate, aggregator, 0);     uint256 amountOut = tokenOut.balanceOf(address(this)) - balanceBefore;     if (amountOut 

暢行幣圈交易全攻略,專家駐群實戰交流

▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群)
不管是新手發問,還是老手交流,只要你想參與加密貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!

▶ 前往鉅亨買幣找交易所優惠

‌
section icon

鉅亨講座

看更多
  • 講座
  • 公告
    ‌
    Empty
    Empty
    ‌