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