Solana: The Bugs You're Missing | DeFi Security Summit 2025
三句話摘要
Solana 智能合約中六種「帳戶生命週期漏洞」的成因、攻擊手法與防禦策略。 Solana 帳戶地址可被重複使用這一設計,讓「懸空指標」成為比帳戶驗證錯誤更隱蔽、更致命的一類漏洞,審計時必須系統性追問每個關閉操作是否留下孤兒引用。 帳戶關閉 ≠ 引用消失:Solana 帳戶關閉後其地址仍可重新分配給任意程序,但若其他帳戶仍儲存該地址,程式邏輯會繼續信任它,形成懸空指標,導致 DoS 或資金損失。
重點整理
重點- 1
帳戶關閉 ≠ 引用消失:Solana 帳戶關閉後其地址仍可重新分配給任意程序,但若其他帳戶仍儲存該地址,程式邏輯會繼續信任它,形成懸空指標,導致 DoS 或資金損失。
- 2
零 lamport 帳戶被垃圾回收器靜默重置:交易結束時,lamport 為零的帳戶由 runtime 將所有者重置為系統程序,攻擊者可藉此製造外觀合法(屬於 token program、大小正確、可反序列化)但實際已被重置的偽造 mint 帳戶。
- 3
帳戶關閉後原地址重建是高頻攻擊向量:同一 PDA 地址關閉後以不同配置重建,可使舊的關聯帳戶(如 bug report)指向新帳戶,在審計競賽場景中直接導致資金被盜取。
- 4
過度約束反而製造漏洞:開發者出於謹慎而要求帳戶必須是「系統帳戶」作為驗證條件,但系統帳戶本身可被重新分配,反而讓攻擊者輕易繞過該約束。
實用技巧與重點
乾貨- Solana 系統程序地址:全零,Base58 顯示為 `111...1`
- 關閉帳戶的兩種方式:(1)清零數據 + 重置所有者為系統程序;(2)lamport 歸零,由垃圾回收器在交易結束時自動清除
- Token-22 擴展:Closeable Mint Extension — 供應量為零時允許關閉 mint 帳戶
- 租金押金(rent deposit)約 $0.30 / 帳戶;1,000 個帳戶 = $300,10,000 個帳戶 = $3,000
- 審計競賽攻擊流程:創建 0 存款比賽 → 建立 100 份免費 bug report → 關閉比賽帳戶 → 原地址重建 $100 存款比賽 → 提取舊報告退款 → 每筆獲利 $100
- mint 帳戶序列化所需大小:82 bytes
- 防禦方案一:不關閉仍被引用的帳戶,或保留「墓碑記錄(tombstone)」
- 防禦方案二:PDA 派生路徑加入單調遞增數字,確保同地址無法重建
- 防禦方案三:使用引用計數器(reference counter),有引用時禁止刪除
- 講者公司:Accretian,專注 Solana 審計,正在招募
結論
結論“Solana 帳戶地址可被重複使用這一設計,讓「懸空指標」成為比帳戶驗證錯誤更隱蔽、更致命的一類漏洞,審計時必須系統性追問每個關閉操作是否留下孤兒引用。”
完整解析
詳細Solana 的帳戶模型決定了其狀態管理方式:所有鏈上狀態都儲存在帳戶中,每個帳戶都有地址與所有者程序,只有所有者程序才能寫入資料。帳戶的生命週期從屬於系統程序開始,可被分配給特定程序(如 token program),使用後可被關閉並回到原始狀態,地址甚至可以再次被新帳戶佔用。正是這個「同一地址可多次輪迴」的特性,催生了一整類被 Robert 稱為「帳戶生命週期漏洞」的攻擊面。
第一類最直觀:AMM 程式將用戶的 token 帳戶地址儲存在池子帳戶中。一旦用戶關閉該 token 帳戶,所有嘗試向該地址轉帳的 AMM 指令都會失敗,形成低成本的拒絕服務攻擊。類似地,在 Launchpad 場景中,若項目方代替用戶支付帳戶租金(約每帳戶 $0.30),攻擊者可大量關閉 token 帳戶,迫使 Crank 執行者反覆付租,帳戶創建後隨即被攻擊者關閉取回押金,形成持續的租金榨取。
第三類涉及 Token-22 的 Closeable Mint 擴展:若 mint 供應量歸零,mint 帳戶可被關閉並在同地址重建為攻擊者控制的偽 mint,若有程式未嚴格驗證 mint 歸屬,就可能被欺騙。第四類是演講中最精彩的案例:審計競賽平台管理員先以 0 入場費創建比賽並批量建立 bug report,關閉帳戶後在同地址以 $100 入場費重建,等真實研究員存入款項後,用之前免費建立的舊報告申請退款,每筆套取 $100,直接造成資金損失。
第五類是反直覺的「過度約束」:開發者要求 order book PDA 的 creator 種子必須是系統帳戶,本意是加強安全性,卻因為系統帳戶本身可被重新分配而使該約束形同虛設。第六類最為底層:攻擊者創建一個屬於 token program、大小為 82 bytes 的空帳戶,使其通過 mint 驗證檢查,但由於 lamport 為零,交易結束後垃圾回收器將其所有者重置為系統程序,池子帳戶從此持有一個指向隨機系統帳戶的懸空指標。
防禦這類漏洞的核心思路是:追蹤帳戶關閉時是否仍有其他帳戶持有其引用;若必須支持關閉,則保留墓碑記錄、使用帶單調遞增編號的 PDA 路徑確保地址不可重用,或引入引用計數機制在引用存在時禁止刪除。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

