跳到正文

Permit2 簽章風險

Permit2 將可重複使用的額度與一次性簽章轉帳分開;安全簽署要求精確查核部署、網域、支出者、收款方、金額、交易序號、截止時間、見證資料和執行呼叫資料。

更新於

僅供教育用途,不構成投資建議。投資可能導致損失。

直接答案

Permit2 結合兩套不同的授權系統。AllowanceTransfer 儲存可重複使用的所有者-代幣-支出者額度,包括金額、到期時間和有序交易序號。SignatureTransfer 使用無序位元圖交易序號,耗用一次性簽章上限,不會建立持續存在的下游額度。兩者仍依賴 ERC-20 代幣從所有者至 Permit2 的額度。

無燃料費簽章仍可能在支出者或中繼者支付執行費用時轉移資產。必須查核正確的鏈、已部署 Permit2 程式碼、EIP-712 網域、模組、代幣、支出者、簽章上限、收款呼叫資料、交易序號和時限。合法的 Permit2 合約並不會讓惡意的支出者、收款方、路由器或見證資料變得安全。

Permit2 簽章風險
0 / 5
0 項已核查; 5 項仍未解決

完成核查不代表資產、交易或系統已經安全。

運作機制

  1. 鎖定 chainId、網路、Permit2 verifyingContract、已部署的執行階段程式碼、代幣位址及小數位、所有者錢包類型和預期應用。應使用官方部署記錄;熟悉的位址或標籤並不足夠。
  2. 讀取上游 ERC-20 所有者至 Permit2 的額度和餘額。識別有限或無限核准以及代幣特有的轉帳行為;這套帳本不會因 Permit2 簽章或已儲存下游額度到期而消失。
  3. 識別正確路徑和已簽署的主要類型:AllowanceTransfer 的 PermitSinglePermitBatch,或 SignatureTransfer 的 PermitTransferFrom 及其批次和見證資料變體。不得將 transferFrom 當成簽章類型。
  4. 解碼 EIP-712 網域和每筆訊息。對 AllowanceTransfer,查核代幣、uint160 amountexpiration、有序交易序號、支出者和 sigDeadline。對 SignatureTransfer,查核獲准代幣及金額、無序交易序號、截止時間,以及從呼叫者情境綁定的支出者。
  5. 分別解碼執行呼叫資料。在基本 SignatureTransfer 中,SignatureTransferDetails.torequestedAmount 是執行參數,而不是基本簽章許可中的欄位;請求金額只須不超過簽章上限。查核每個批次索引,以及任何正確的見證雜湊和類型字串。
  6. 查詢目前有序額度交易序號,或無序位元圖的字與位元,再模擬正確的呼叫者、呼叫資料、鏈和狀態。核對收款方、路由器操作、代幣特性、餘額及兩套額度帳本;模擬結果可能隨狀態、排序或重組而改變。
  7. 盡量縮小金額和有效期間。發現可疑情況時,保存類型化資料,並透過可信路徑送出正確的上游核准撤銷、下游額度撤銷或交易序號失效操作;應將其視為記憶體池競態,等待確認後再核對轉帳、餘額、額度和位元圖位元。

AllowanceTransfer 的 sigDeadline 限制簽章許可建立或更新已儲存權限的最晚時間;expiration 限制該權限可被使用的期間。SignatureTransfer 的截止時間限制一次性執行。EIP-712 提供類型化雜湊和網域分隔,而不提供重放保護或意圖安全;Permit2 的交易序號和截止時間規則才劃定這些邊界。

對合約錢包而言,ERC-1271 的有效性取決於錢包目前的 isValidSignature 政策、模組、門檻和程式碼。錢包標籤、硬體錢包被截斷的畫面顯示和成功的模擬只是證據輸入,並非保證。中斷前端連線不會撤銷任何核准或簽章。

範例

  • 兩套額度帳本。 代幣對 Permit2 的有限額度初始為 1,000 USDC;一個 PermitSingle 為支出者 S 儲存 600 USDC。S 轉移 225 USDC 後,已儲存金額為 600 - 225 = 375 USDC,而標準有限上游代幣額度變為 1,000 - 225 = 775 USDC。讓 375 到期或將其撤銷,並不會自動清除 775;非標準代幣可能有所不同。
  • 一次性收款方和金額。 SignatureTransfer 簽署的上限為 250 USDC;呼叫資料請求向商家轉移 180 USDC。在餘額和上游額度充足時,可以執行 180 的轉移。交易序號隨後被耗用,因此未使用的 70 USDC 不可重複使用。如果呼叫資料將攻擊者指定為收款方,基本許可本身無法阻止已綁定支出者進行這種重新導向。
  • 無序交易序號位元圖。 對交易序號 513wordPos = 513 >> 8 = 2bitPos = 513 & 255 = 1,且 mask = 1 << 1 = 2。執行會設定第 2 個字的第 1 位元;重放 513 將失敗,而位於第 0 位元的交易序號 512 保持獨立。
  • 撤銷競態。 已儲存額度為 400 USDC。所有者廣播歸零撤銷,但一筆 300 USDC 轉帳先執行,剩餘 100 USDC;之後的撤銷再將餘額設為 0。最終額度為零並不會撤銷已實現的 300 USDC 損失,因此必須核對交易排序和餘額。

風險

  • 鏈 ID、部署或執行階段程式碼錯誤
  • 假冒或非預期的驗證合約
  • 混淆 AllowanceTransfer 與 SignatureTransfer
  • 惡意或錯誤的支出者和呼叫者
  • 透過執行呼叫資料選擇收款方
  • 請求金額接近簽章上限
  • 代幣位址、符號、小數位或原始單位錯誤
  • 持續或無限的上游 ERC-20 核准
  • 下游金額或到期時間過大
  • 混淆截止時間、簽章截止時間與額度到期時間
  • 有序交易序號陳舊或發生競態
  • 重複使用位元圖位元或失效遮罩範圍過大
  • 見證雜湊或正確類型字串不符
  • 批次項目被隱藏、重複或索引錯誤
  • 前端顯示或呼叫資料與意圖不同
  • 撤銷在記憶體池或 MEV 競態中失敗
  • ERC-1271 模組、簽署者、門檻或升級發生變化
  • 收費轉帳、變基、暫停、封鎖或帶回呼的代幣
  • 模擬狀態漂移、失敗或發生重組
  • 將硬體錢包確認或中斷連線誤認為安全

常見誤解

  • 沒有燃料費提示的簽章無法轉移代幣。 其他參與者可以支付執行燃料費。
  • 官方 Permit2 位址能證明支出者和收款方安全。 Permit2 也可能忠實執行惡意權限。
  • SignatureTransfer 和 AllowanceTransfer 建立相同的持續權限。 前者僅使用一次;後者儲存可重複使用的額度。
  • 中斷連線或撤銷一層會取消所有路徑和待執行簽章。 上游、下游和交易序號狀態彼此獨立,競態仍然存在。
  • EIP-712、硬體錢包或成功模擬能證明意圖和最終性。 它們改善可見性或測試,卻不能取代欄位、呼叫資料和已確認狀態的查核。

相關主題

來源

導覽

搜尋知識庫...