智能合約審計怎麼看?版本、權限與升級風險

智能合約有審計,不代表它現在或未來一定安全。智能合約審計是對指定版本的合約程式與設計進行安全檢查,有明確範圍、日期與限制:它能提高發現問題的機會,卻不能證明所有漏洞都已消失,也不能自動涵蓋審計後的升級、管理員操作、預言機失效、外部協議或使用者錢包操作。

真正有用的問題不是「有沒有 Audited 標章」,而是:審了哪一版?目前鏈上跑的是不是同一版?誰能改合約?價格資料從哪裡來?依賴的元件出事時能不能退出?如果這幾題答不出來,審計只能算一項訊號,不能當安全保證。

如果你還不熟悉基本概念,可先看站內的智能合約入門。本篇不要求你閱讀完整 Solidity 程式碼,而是教你用公開證據把風險拆開。


智能合約有審計就安全嗎?先分清楚審計的邊界

Ethereum.org 的智能合約安全指南直接提醒:審計不是萬靈丹,也不會抓到每一個錯誤。它的價值是增加一輪獨立檢查,幫忙找出開發與測試階段遺漏的問題。換句話說,「通過審計」比較接近特定材料接受過特定方法的檢查,不是對所有情境開永久保固。

  • 它可能證明:某個 commit、某組合約、某段期間,依報告列出的測試方法接受過檢查。
  • 它不必然證明:目前部署的 bytecode 就是受審版本。
  • 它不必然涵蓋:前端、管理金鑰、第三方 token、橋、預言機、keeper、治理程序與日後升級。
  • 它也不能保證:沒有未知漏洞、經濟設計不會失衡、攻擊者不會組合多個弱點。

所以第一步不是看審計公司的 Logo 有多大,而是打開完整報告,找到範圍、版本與排除項。只放「Audited」圖片、沒有報告連結或找不到受審程式版本,本身就是需要停下來追問的訊號。


用六層框架拆開「安全」:別把一張報告當成全部

層級要找的證據常見紅旗使用者動作
審計範圍報告日期、commit、scope、排除項只有標章,沒有完整報告先找原報告,不用截圖代替
目前部署鏈別、合約地址、proxy、implementation、原始碼驗證狀態報告版本對不上鏈上實作不要把舊報告外推到新版本
管理權限owner、roles、多簽門檻、timelock單一 EOA 可提款、暫停或改參數把控制權當作對手方風險
升級機制proxy 類型、upgrade admin、變更紀錄可立即換邏輯,沒有延遲或通知核對目前 implementation
資料來源oracle 來源、更新頻率、staleness、fallback單一低流動性價格源確認驗證、斷路器與替代來源
依賴與應變外部 token/橋/keeper、監控、pause、退出步驟依賴未揭露、出事無公告與退出路徑小額測試並保留 gas 與撤回路徑

這六層不是在替合約打「安全分數」,而是避免把不同問題混成一題。即使第一層做得很好,只要第二層部署已更新、第三層管理員過強,整體風險仍可能完全不同。


審計報告怎麼看?先找這七個欄位

1. 報告日期與受審期間

日期告訴你檢查發生在什麼時間。協議在報告後若經過重大升級、換 oracle、增加新市場或改治理,風險邊界就已改變。報告越舊不一定越差,但你必須知道後來發生了什麼。

2. commit、版本或 bytecode 是什麼?

先找報告列出的 Git commit(某次程式版本的識別碼)、release tag(版本標籤)、受審檔案清單;若列有 bytecode(鏈上執行的位元組碼),也一併記下。這些資料描述受審程式,不等於部署地址。Ethereum Foundation 的Treasury Policy也在基金會自身的協議評估條件中,要求追蹤受審 commit 與最後部署內容是否一致。這可作為讀者核對的參考,不是所有專案都已遵循的認證。沒有這個對照,就很難證明報告和你要互動的地址是同一件事。

3. 鏈別與合約地址

同一協議可能部署在多條鏈,也可能有多個版本。不要只核對品牌名稱;要核對鏈、proxy 地址、implementation 地址與區塊瀏覽器驗證狀態。跨鏈部署使用相似名稱,不代表程式與管理架構完全相同。

4. Scope 與 exclusions

Scope 是實際檢查的合約與模組;exclusions 是明確沒檢查的部分。前端、治理流程、部署腳本、第三方函式庫、oracle 服務或 token 行為可能被排除。報告越清楚列出不做什麼,反而越容易正確使用。

5. 測試方法與限制

人工審查、靜態分析、動態測試、模糊測試與形式驗證回答的問題不同。看到工具名稱不代表覆蓋完整;要看測試假設、時間限制與哪些情境沒有建立。安全清單如 OWASP Smart Contract Top 10是風險意識參考,不是認證章。

6. 發現、嚴重度與修復狀態

不要只看「沒有 Critical」。中低風險、已接受風險、資訊性發現與未解決項目,可能在特定市場條件下組合成問題。還要分清楚「團隊表示已修」與「審計方已複驗」是否相同。

7. 報告後的變更

查看升級事件、治理提案、release notes 與事故公告。如果報告完成後又改了核心參數或 implementation,就把它視為新版本重新查,不要用舊報告一句帶過。


管理員權限:比「去中心化」標語更值得先看

管理權限本身不必然是惡意。有些權限用來暫停漏洞、升級修復或調整風險參數;但它會把技術風險轉成金鑰、組織與治理風險。Ethereum.org 指出,單一 owner 是中心化與單點失效;角色分離、多簽與 timelock 能降低部分風險,但不能把信任歸零。

  • 資產權限:能否提款、移轉儲備、鑄幣、燒毀或凍結?
  • 市場權限:能否改利率、抵押率、清算門檻、手續費、白名單?
  • 系統權限:能否暫停、恢復、換 oracle、換 implementation?
  • 治理結構:控制者是單一地址、多簽、DAO、guardian,還是多層角色?
  • 時間限制:高影響操作是否有 timelock、鏈上公告與取消機制?

看到「多簽」時,再問門檻是多少、成員是否為獨立實體、能否同時換掉多個角色。三個地址若都由同一團隊或同一裝置控制,形式上的 2-of-3 不等於真正分散。


Proxy 升級:地址沒變,執行邏輯可能已經變了

OpenZeppelin 的 Proxy 說明把代理模式拆成兩部分:使用者和 proxy 互動,proxy 把呼叫轉給 implementation;之後可以替換 implementation,而使用者看到的入口地址仍不變。因此,「我上次核對過這個地址」不足以證明今天仍執行同一套邏輯。

常見模型包括 UUPS、Transparent 與 Beacon。新手不必背程式細節,但要知道誰握有 upgrade 權限、能一次改一個還是多個 proxy、是否有 timelock,以及最近一次 implementation 變更在何時。若升級可以立即發生,審計過的程式也可能在升級後被另一套邏輯取代。

對照時要分開記錄兩個地址:proxy 是使用者互動的入口,implementation 是它目前採用的邏輯合約。若使用 Beacon,還要追到提供邏輯地址的 beacon 合約;OpenZeppelin 的代理合約文件說明,一個 beacon 的變更可能影響多個 proxy。這也代表只抄入口地址,無法完成版本比對。


如何唯讀核對審計報告與目前部署?

以下以 Ethereum 與使用 Etherscan 類型瀏覽器的合約為例。只查看公開文件、程式與鏈上資料,不需要連接錢包、簽署訊息、授權代幣或支付 gas;其他鏈或自訂代理可能有不同查法。任一步缺資料,就留下缺口,不靠名稱相同推定已對上。

第一步:固定報告、受審版本與鏈別

從專案官方文件找到完整報告,再核對審計機構公開頁面或儲存庫中的同一份報告。記下報告日期、原始受審 commit、修復後複驗 commit、受審檔案與未解決項目;兩個 commit 不一定相同。另從官方部署清單記下鏈名與完整合約地址。報告沒有列部署地址不必然是假報告,但此時還缺「程式版本如何對應部署」的證據。

第二步:找到入口背後目前使用的程式

在正確鏈的區塊瀏覽器貼上完整地址,進入 Contract 頁籤,查看原始碼與代理標示。若頁面提供 implementation 連結,另開該地址並記錄;若為 Beacon,還要記錄 beacon 與它目前指向的 implementation。保留查詢時間、可取得的區塊高度和頁面網址。找不到代理資訊,不等於合約不可升級;遇到未支援的架構,先標記未確認。

Etherscan 的代理合約說明提醒,代理偵測可能不準確,Read as Proxy/Write as Proxy 顯示的內容也不會自動證明就是實際執行的程式。因此這些欄位只能提供比對線索;本檢查只看公開頁面,不使用 Write Contract 或 Write as Proxy 發送交易。

第三步:把原始碼驗證接回受審 commit

依 Ethereum.org 的原始碼驗證說明,驗證是比對原始碼編譯結果與鏈上位元組碼。Verified 不等於受過審計,也不等於沒有漏洞。要再找專案公開的部署紀錄或驗證資料,看它是否把「這條鏈、這個 implementation、報告的 commit」接起來;光有同名檔案或相同版本名稱還不夠。

如果資料只提供 commit 與地址,卻沒有可追溯的對照依據,就記為「官方宣稱相同,尚未獨立確認」。進一步重現比對通常需要原始檔、編譯器版本、編譯設定、函式庫及部署參數等資料;看不懂這些資料時,可請專案提供可重現的驗證結果,不要自行寫成「已確認程式一致」。即使程式對上,也要另外查管理權限與初始化設定。

第四步:看報告之後有沒有換版本

比對官方升級公告、治理提案與瀏覽器上的相關交易或事件,核對是否換過 implementation、管理角色或預言機。若新版本不在原報告範圍,應找涵蓋新版本的報告或變更審查。沒有找到事件,不代表從未升級;若無法解讀鏈上紀錄,就保留未確認。

例如報告檢查版本 A,但目前 proxy 指向版本 B,正確紀錄是「目前版本尚未由這份報告涵蓋」。這不直接證明 B 有漏洞,也不能把 A 的審查結果套給 B。最後留下報告連結、受審/複驗 commit、鏈別、入口與邏輯地址、對照依據、查詢時間及缺口,之後才有資料可重查。


預言機風險:合約算得對,也可能吃到錯資料

借貸、衍生品與穩定幣常需要鏈外或其他市場的價格。智能合約會忠實依輸入執行;如果輸入已過期、來源太少、低流動性市場被操控或小數位處理錯誤,合約「照規則做」仍可能造成錯誤清算或不合理鑄幣。

OWASP SCWE-028列出的緩解方向包括多來源、驗證輸入與斷路器。使用者可進一步查:資料源如何聚合、多久更新、如何判斷 stale、價格偏離多大會暫停、主來源失效時是否有 fallback,以及管理員能否直接改 oracle。

「使用知名 oracle」也不是句點。還要查協議選用哪個資料源、如何處理過期資料、價格異常與 fallback。資料源本身的更新規則,和協議收到資料後的防護,是不同層次的問題。


外部依賴與可組合性:最容易掉出審計範圍

DeFi 常把 token、借貸池、DEX、橋、keeper、前端與錢包授權組合在一起。Solidity 的安全注意事項提醒,外部合約呼叫也會影響你依賴的狀態。這表示一個元件受審,不代表整條依賴鏈都被同一份報告涵蓋。

  • 抵押品若脫鉤,借貸合約本身沒有程式漏洞也可能大量清算。
  • 橋或 wrapped token 出問題,目標鏈上的資產可能失去可兌回性。
  • keeper 中斷,清算、再平衡或更新作業可能延遲。
  • 前端被入侵,使用者可能簽下與核心合約無關的惡意授權。
  • 第三方 token 有 fee-on-transfer、rebase 或黑名單邏輯,可能破壞整合假設。

因此,把 audit 當成「程式層的證據之一」,再用站內的DeFi 使用前風險清單補查流動性、清算、治理與退出條件,會比只看單一安全標章完整。


新手操作前檢查表

  1. 從官方文件取得地址:不要從廣告、私訊或搜尋結果複製合約地址。
  2. 確認鏈別與版本:同名協議在不同鏈可能有不同部署與風險。
  3. 打開完整 audit:記下日期、commit、scope、exclusions 與未解決發現。
  4. 對照目前部署:確認 proxy、implementation 與受審版本能對上。
  5. 列出高權限角色:誰能 pause、upgrade、換 oracle、提款或改參數?
  6. 查 timelock 與多簽:看門檻、成員獨立性與操作延遲,不只看名稱。
  7. 查資料與依賴:oracle、token、橋、keeper、前端是否在審計範圍?
  8. 看近期變更與事故:治理提案、升級事件、事後報告是否有未解決項?
  9. 先完成唯讀查核:資訊有缺口時先暫停。若之後自行決定使用,才以可承受損失的小額測試存入與撤回,預留 gas;一次成功不代表合約安全。
  10. 定期重查:升級、權限移轉或 oracle 變更後,舊判斷要重新做。

如果無法確認目前 implementation、管理權限未揭露、報告找不到,或協議把「絕對安全」當宣傳詞,最保守的動作不是猜,而是暫停操作。

把結果分成「已確認、待確認、不可接受」

檢查完不要只留下「看起來安全」的印象,最好把每一層標成三種狀態。已確認只代表該項事實有可追溯證據,例如找到完整報告;若要記成「版本一致」,還須有受審程式與目前部署的對照依據,不能只靠 Verified 標示;待確認代表資訊缺少、來源只有團隊宣稱,或無法判斷權限實際控制者;不可接受則是已知條件超過你的承受範圍,例如單一地址可立即提款、報告與部署明顯不一致,或沒有任何退出路徑。

這個分類的好處是避免「其他地方都不錯」蓋過一個關鍵紅旗。五項已確認加上一項不可接受,不等於平均後仍可操作。安全風險往往由最弱的一層決定,尤其是可以直接控制資產或更換邏輯的權限。

也要替證據加上查核日。今天確認的 admin、implementation 與 oracle,下次治理提案或升級後就可能失效。若要持續使用同一協議,至少在新增資金、重大升級、事故公告、權限移轉與市場異常後重做一次,不要把第一次調查永久沿用。

若你無法獨立驗證某一層,最誠實的紀錄就是「未知」。未知不等於一定有問題,但也不能被包裝成已通過;它應直接影響你願意承擔的金額與是否操作。

五步核對審計報告檢查表

常見錯誤:這些訊號都不能單獨下結論

  • 「大審計公司做過,所以安全」:公司聲譽不能取代版本與範圍比對。
  • 「沒有 Critical,所以沒事」:未修復的中低風險、假設與外部依賴仍要看。
  • 「合約不可竄改,所以不會變」:proxy 的入口可不變,但 implementation 可替換。
  • 「多簽就是去中心化」:門檻、控制人與 timelock 才決定實際集中度。
  • 「TVL 很大,市場已替我驗證」:資金規模不能證明程式、治理與退出機制安全。
  • 「我只授權小額」:無限額 token approval 可能讓未來餘額也暴露;要看實際授權內容。
智能合約審計迷思圖解

審計是查核起點,版本與權限要一起看

先確認報告檢查了什麼,再追到目前執行的程式與管理權限,才能知道報告對眼前部署有多少參考價值。資料無法對上時保留未知;版本一致也不代表管理、預言機與退出風險已消失。


常見問題 FAQ

有兩家以上審計公司就安全嗎?

不一定。多一輪獨立審查通常能增加發現問題的機會,但若各報告審的是舊版本、相同狹窄範圍,或目前 deployment 已升級,數量不能取代對照。

看不懂程式碼,能確認 commit 嗎?

可以核對報告列出的 commit/tag、官方部署地址,以及 proxy 目前指向的 implementation;但這不等於完成程式一致性驗證。還要有能把受審 commit 接到目前部署的可追溯證據。只有名稱相同或 Verified 標示時,仍應記為未確認。

不可升級合約一定比較安全嗎?

不一定。不可升級降低日後被換邏輯的風險,但若原始程式有漏洞,也可能無法直接修補。可升級合約能修復問題,卻增加 admin 與治理信任。兩者是不同取捨。

有 timelock 就可以放心嗎?

timelock(時間鎖)讓受限制操作延後執行,提供觀察與應變時間;但要看延遲多長、哪些操作可繞過、誰能取消或調整延遲,以及事件是否被可靠監控。是否能及時退出,還取決於提款限制與流動性,不能只看有沒有時間鎖。

本篇能判斷某協議是否安全嗎?

不能。本篇提供一般檢查框架,不替任何協議完成即時盡職調查,也不構成投資或技術保證。實際操作前要重新查核最新部署、治理與官方公告。


參考來源

本文為入門教學,非投資、法律或稅務建議,也不替任何實際合約完成安全審計。部署、權限與市場狀況可能變動,操作前請以官方最新文件及鏈上資料確認。

分享此內容: