前言
慢霧安全團隊開源– Web3 項目安全實踐要求,提供了詳細的實踐要求和建議來幫助Web3 項目研發團隊識別和防範這些潛在的安全風險。 Web3 項目方可以參考本文提供的安全實踐要求,掌握相應的安全技能,提高Web3 項目的安全性,以便更好地保護項目和用戶的資產安全。
Web3 項目安全實踐要求包含如下的內容:
0x00 背景概述
現今針對Web3 項目的攻擊手法層出不窮,且項目之間的交互也越發複雜,在各個項目之間的交互經常會引入新的安全問題,而大部分Web3 項目研發團隊普遍缺少的一線的安全攻防經驗,並且在進行Web3 項目研發的時候重點關注的是項目整體的商業論證以及業務功能的實現,而沒有更多的精力完成安全體系的建設,因此在缺失安全體系的情況下很難保證Web3 項目在整個生命週期的安全性。
通常項目方團隊為了確保Web3 項目的安全會聘請優秀的區塊鏈安全團隊對其代碼進行安全審計,在進行安全審計的時候,才能夠更好地實現各種安全實踐要求,但是區塊鏈安全團隊的審計僅僅是短期的引導,並不能讓項目方團隊建立屬於自己的安全體系。
因此慢霧安全團隊開源了Web3 項目安全實踐要求來持續性幫助區塊鏈生態中的項目方團隊掌握相應的Web3 項目的安全技能,希望項目方團隊能夠基於Web3 項目安全實踐要求建立和完善屬於自己的安全體系,在審計之後也能具備一定的安全能力。
0x01 開發準備
-
需求分析文檔要求
1. 確保包含項目的詳盡描述
2. 確保包含項目解決的問題
3. 確保包含安全/隱私風險評估
-
開發設計文檔要求
1. 確保包含項目的架構設計圖
2. 確保包含代碼中函數的功能描述
3. 確保包含代碼中合約之間的關聯關係描述
4. 確保安全/隱私的要求被正確實施
-
業務流程文檔要求
1. 確保包含項目中每個業務流程的描述
2. 確保包含詳盡的業務流程圖
3. 確保包含詳盡的資金鍊路圖
0x02 開發過程
-
智能合約安全編碼要求
1. 確保包含盡可能基於OpenZeppelin 等知名library 進行開發
2. 確保包含使用SafeMath 或0.8.x 的編譯器來避免絕大部分溢出問題
3. 確保遵循函數命名規範,參考:solidity style guide
(https://docs.soliditylang.org/en/v0.8.14/style-guide.html)
4. 確保函數和變量可見性採用顯性聲明
5. 確保函數返回值被顯性賦值
6. 確保函數功能和參數註釋完備
7. 確保外部調用正確檢查返回值,包含:transfer,transferFrom,send,call,delegatecall 等
8. 確保interface 的參數類型返回值等實現是正確的
9. 確保設置合約關鍵參數時有進行鑑權並使用事件進行記錄
10. 確保可升級模型的新的實現合約的數據結構與舊的實現合約的數據結構是兼容的
11. 確保代碼中涉及算數運算的邏輯充分考慮到精度問題,避免先除後乘導致可能的精度丟失的問題
12. 確保call 等low level 調用的目標地址和函數是預期內的
13. 使用call 等low level 調用的時候要根據業務需要限制Gas
14. 編碼規范進行約束,遵循:先判斷,後寫入變量,再進行外部調用(Checks-Effects-Interactions)
15. 確保業務上交互的外部合約是互相兼容的,如:通縮/通脹型代幣, ERC-777, ERC-677, ERC-721 等可重入的代幣,參考:重入漏洞案例
(https://medium.com/amber-group/preventing-re-entrancy-attacks-lessons-from-history-c2d96480fac3)
16. 確保外部調用充分考慮了重入的風險
17. 避免使用大量循環對合約的storage 變量進行賦值/讀取
18. 盡可能避免權限過度集中的問題,特別是修改合約關鍵參數部分的權限,要做權限分離,並儘可能採用治理,timelock 合約或多簽合約進行管理
19. 合約的繼承關係要保持線性繼承,並確保繼承的合約業務上確實需要
20. 避免使用鏈上的區塊數據作為隨機數的種子來源
21. 確保隨機數的獲取和使用充分考慮回滾攻擊的可能
22. 盡量使用Chainlink 的VRF 來獲取可靠的隨機數,參考:Chainlink VRF
(https://docs.chain.link/vrf/v2/introduction)
23. 避免使用第三方合約的token 數量直接計算LP Token 價格,參考:如何正確獲取LP 的價
(https://blog.alphaventuredao.io/fair-lp-token-pricing/)
24. 通過第三方合約獲取價格的時候避免單一的價格來源,建議採用至少3 個價格來源
25. 盡可能在關鍵的業務流程中使用事件記錄執行的狀態用於對項目運行時的數據分析
26. 預留全局與核心業務緊急暫停的開關,便於發生黑天鵝事件的時候及時止損
-
測試用例代碼要求
1. 確保包含業務流程/函數功能可用性測試
2. 確保包含單元測試覆蓋率95% 以上,核心代碼覆蓋率要達到100%
-
基礎安全配置要求
1. 確保官方郵箱使用知名服務商,如Gmail
2. 確保官方郵箱賬號強制開啟MFA 功能
3. 確保使用知名域名服務商,如GoDaddy
4. 確保域名服務商平台的賬號開啟MFA 安全配置
5. 確保使用優秀的CDN 服務提供商,如Akamai、Cloudflare
6. 確保DNS 配置開啟了DNSSec,在域名服務管理平台上為管理賬號設置強口令並開啟MFA 認證
7. 確保全員的手機和電腦設備使用殺毒軟件,如卡巴斯基、AVG 等
-
Web 前端安全配置要求
1. 確保全站的HTTP 通訊採用HTTPS
2. 確保配置了HSTS,以防止中間人攻擊,如:DNS hijacking,BGP hijacking,參考:HSTS 配置介紹
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security)
3. 確保配置了X-FRAME-OPTIONS,以防止Clickjacking 攻擊,參考:X-FRAME-OPTIONS 配置介紹
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options)
4. 確保配置了X-Content-Type-Options,以對抗瀏覽器sniff ⾏為導致的⻛險,參考:X-Content-Type-Options 配置介紹
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options)
5. 確保配置了CSP 策略,以防止XSS 攻擊,參考:CSP 內容安全策略介紹
(https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)
6. 確保與權限和用戶憑證相關的Cookie 配置了HttpOnly, Secure, Expires, SameSite 標誌,參考:Cookie 配置介紹
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies)
7. 確保不同業務的子域嚴格劃分開,避免子域的XSS 問題互相影響
8. 確保引用的第三方資源使用了integrity 屬性進行限制,避免第三方被黑導致項目方的站點受到影響,參考:SRI 配置介紹
(https://developer.mozilla.org/zh-CN/docs/Web/Security/Subresource_Integrity)
9. 確保正確配置CORS,僅允許指定origin 域,協議和端口訪問項目的資源,參考:CORS 配置介紹
(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS)
10. 確保業務中實現的addEventListener/postMessage 有檢查消息的origin 和target,參考:postMessage 安全介紹
(https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage)
-
後端環境安全配置要求
1. 確保選用優秀的雲服務器提供商,如:AWS、Google 雲等
2. 確保項目使用到的雲平台管理賬號使用強口令並開啟MFA 認證
3. 確保項目代碼部署到服務器前對服務器進行安全加固,如:安裝HIDS,採用SSH Key 進行登錄,設置SSH 登錄alert,設置SSH 登錄google-auth 等
4. 確保使用專業軟件監控服務、服務器可用性,如APM、Zabbix
5. 確保使用專業的機構定期測試項目安全性,如SlowMist、Trail of Bits 等
0x03 發布過程
需要有完備的安全上線發布流程,可以參考如下的內容進行細化:
-
代碼凍結要求
在預計的上線時間倒推2 天,即上線2 天前必須凍結代碼不再做任何代碼改動
-
單元測試要求
1. 確保單元測試覆蓋率95% 以上,核心代碼覆蓋率100%
2. 確保輸出單元測試的覆蓋率報告
-
回歸測試要求
在上線1 天前執行單元測試並進行回歸測試
-
測試報告要求
上線前0.5 天由開發及測試共同完成測試報告,如果不通過(含單元測試、回歸測試),則推遲上線時間,開發完成修改後重新進入代碼凍結階段(即推遲至少2 天)
-
安全審計要求
1. 安全審計人員在代碼凍結後進入整體安全回歸,如發現任一漏洞或安全隱患(嚴重、高危、中危),則推遲上線時間,開發完成修改後重新進入代碼凍結(即推遲至少2 天)
2. 安全審計需要至少三個團隊進行獨立的審計,可以採用1 個內部團隊+ 2 個外部團隊
0x04 運行期間
-
運行時安全監控
盡可能的通過關鍵業務流程中觸發的事件來發現項目運行時的安全問題,如:
1. 合約關鍵權限/參數變更:監控管理角色發生變更的事件,管理角色修改合約關鍵參數的事件,及時發現私鑰可能被盜的情況
2. 合約資金變化:監控價格變動及合約資金變動的情況,及時發現可能的閃電貸等攻擊
3. 週期性對賬:週期性對鏈上的事件與交易進行對賬,及時發現可能的業務邏輯上的問題
-
運行環境安全加固
1. 確保實施前端代碼所在服務器的安全加固,如:安裝HIDS (https://www.aliyun.com/product/aegis),採用SSH Key 進行登錄,設置SSH 登錄alert (https://medium.com/@alessandrocuda/ssh-login-alerts-with-sendmail-and-pam-3ef53aca1381),設置SSH 登錄google-auth (https://goteleport.com/blog/ssh-2fa-tutorial/) 等
2. 確保DNS 配置開啟了DNS Sec,在域名服務管理平台上為管理賬號設置強口令並開啟2 次認證
3. 確保項目使用到的雲平台管理賬號使用了強口令並開啟了2 次認證
-
發布漏洞賞金計劃
發布漏洞賞金計劃或入駐知名的漏洞賞金平台, 吸引社區白帽子為項目保駕護航;可以選擇 BugRap (https://bugrap.io/), code4rena (https://code4rena.com/), immunefi (https://immunefi.com/)
-
成立名義應急小組
成立名義應急小組並對外提供聯繫方式,由應急小組負責處理白帽子發現的問題或在黑天鵝事件爆發時主導團隊成員進行應急處置
0x05 應急處置
-
完備的應急處置流程
盡可能地制定完備地應急處置流程,有條不紊地根據應急處置流程來處置黑天鵝事件
-
止損處置要求
1. 根據問題影響的範圍和危害程度,及時通過緊急暫停開關進行止損
2. 通知社區成員發生黑天鵝事件,避免用戶繼續與項目進行交互導致虧損
-
黑客追踪要求
1. 迅速分析黑客的獲利地址,並留存PC/Web/服務器的訪問日誌(如果有木馬請留存木馬文件)
2. 對服務器進行快照,及時保留被黑現場
3. 聯繫專業的安全團隊協助進行追踪,如: MistTrack 追踪分析平台 (https://misttrack.io/), Chainalysis (https://www.chainalysis.com/)
-
修復問題要求
1. 與專業安全團隊討論問題的最佳修復方案
2. 正確實施修復方案並請專業的安全團隊進行驗證
-
安全發布要求
執行發布過程要求,確保一切代碼的變更均有經過測試和安全審計
-
复盤分析要求
1. 披露驗屍報告並與社區成員同步修復方案及補救措施
2. 驗屍報告需要同步問題的本質原因,問題的影響範圍,具體的損失,問題的修復情況,黑客的追踪等相關進展
總結
安全是動態管理的過程,僅依賴於第三方安全團隊的短期審計並不能真正保障項目長期安全穩定地運行。因此,建立和完善Web3 項目的安全體係是至關重要的,項目方團隊自身俱備一定的安全能力才能更好的保障Web3 項目安全穩定地運行。
除此之外,我們建議項目方團隊還應該積極參與安全社區,學習最新的安全攻防技術和經驗,與其他項目方團隊和安全專家進行交流和合作,共同提高整個生態的安全性。同時,加強內部安全培訓和知識普及,提高全員的安全意識和能力,也是建立和完善安全體系的重要步驟。
最後,Web3 項目安全實踐要求目前屬於v0.1 版本,並且還在持續的完善,如果你有更好的建議,歡迎提交反饋。