版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
智能合約安全指南PAGEPAGE10目錄測試標(biāo)準(zhǔn) 6合約平臺(tái)底層安全 6合約設(shè)計(jì)與實(shí)現(xiàn)安全 8合約生態(tài)工具安全 11合約交互與數(shù)據(jù)安全 13典型案例 15重入漏洞 15整數(shù)溢出漏洞 15合約庫安全問題 16復(fù)雜DeFi協(xié)議組合安全 16非標(biāo)準(zhǔn)接口 16管理員權(quán)限過高或較中心化 17業(yè)務(wù)邏輯與區(qū)塊鏈共識(shí)產(chǎn)生沖突 17開發(fā)者應(yīng)持續(xù)關(guān)注更多安全案例 18最佳實(shí)踐 18基本對(duì)策 18社區(qū)最佳實(shí)踐和安全開發(fā)資料 20推薦工具 214:以太坊智能合約審計(jì)CheckList 22編碼規(guī)范問題 23設(shè)計(jì)缺陷問題 26編碼安全問題 32編碼設(shè)計(jì)問題 42編碼問題隱患 495.總結(jié) 57參考資料 58測試標(biāo)準(zhǔn)理、多方游戲等各類去中心化應(yīng)用(dApp)。與傳統(tǒng)程序一樣,智能合約中存在漏洞詳細(xì)具體要求,旨在通過規(guī)范測試標(biāo)準(zhǔn)提升智能合約安全水平。圖1-1下面,我們從合約平臺(tái)底層安全、合約設(shè)計(jì)與實(shí)現(xiàn)安全、合約生態(tài)工具安全、合約交互與數(shù)據(jù)安全四個(gè)方面規(guī)范智能合約安全測試標(biāo)準(zhǔn)。合約平臺(tái)底層安全本部分討論智能合約平臺(tái)相關(guān)的底層安全,包括虛擬機(jī)、區(qū)塊鏈節(jié)點(diǎn)等。虛擬機(jī)安全虛擬機(jī)是智能合約運(yùn)行所需的環(huán)境(EVM),關(guān)系著合能在虛擬機(jī)內(nèi)正確且安全地執(zhí)行。具體要求:1、不同操作符資源定價(jià)合理(如以太坊中對(duì)不同指令收取不同Gas費(fèi)用)2、準(zhǔn)確執(zhí)行操作符,操作符無二義性3、能保證合約程序的終止性4、能夠安全處理異常調(diào)用5、能保證合約對(duì)數(shù)據(jù)段的正確讀取權(quán)限6、不包含存在明顯安全隱患的特性7、不存在虛擬機(jī)逃逸漏洞8、不存在任意代碼執(zhí)行漏洞9、不存在DOS漏洞10、預(yù)編譯合約(內(nèi)建合約、系統(tǒng)合約)調(diào)用與執(zhí)行安全區(qū)塊鏈節(jié)點(diǎn)安全常工作,且不影響節(jié)點(diǎn)間的同步與共識(shí)。具體要求:1、區(qū)塊鏈系統(tǒng)(節(jié)點(diǎn))運(yùn)營者需要做好安全防護(hù),保障主機(jī)安全(節(jié)點(diǎn))需要防止已部署合約代碼被任意篡改(節(jié)點(diǎn))需要防止針對(duì)已部署合約的非法調(diào)用4、提供合約查詢和調(diào)用服務(wù)的節(jié)點(diǎn)需確保自身狀態(tài)正確且保持最新5、防止合約部署或調(diào)用占用節(jié)點(diǎn)過多計(jì)算資源6、防止合約部署或調(diào)用引起節(jié)點(diǎn)崩潰7、能夠正常防范針對(duì)節(jié)點(diǎn)發(fā)起的其他形式的攻擊合約設(shè)計(jì)與實(shí)現(xiàn)安全范標(biāo)準(zhǔn)、權(quán)限安全等。常見合約安全漏洞還尤其要關(guān)注傳統(tǒng)程序與智能合約開發(fā)之間的差異。合約代碼實(shí)現(xiàn)應(yīng)規(guī)避常見安全漏洞。具體要求:正常通過編譯且無警告輸出合約各功能能夠正常執(zhí)行不存在冗余代碼能夠安全進(jìn)行和接受轉(zhuǎn)賬無「數(shù)值溢出」漏洞無「隨機(jī)數(shù)預(yù)測」漏洞依賴的合約代碼庫安全可靠合理校驗(yàn)輸入數(shù)據(jù)嚴(yán)格進(jìn)行權(quán)限校驗(yàn)不存在未知步數(shù)循環(huán)無「重入(Reentrancy)」漏洞充分檢查合約中硬編碼的地址通知事件(Event)與代碼實(shí)際執(zhí)行保持一致關(guān)鍵邏輯判斷不依賴可被礦工操縱的變量(區(qū)塊哈希、時(shí)間戳等)關(guān)鍵邏輯判斷不依賴可被用戶任意操縱的變量(如合約內(nèi)資產(chǎn)數(shù)量等)無嚴(yán)重消耗資源(Gas、EOSRam)的操作合約正式部署上線前應(yīng)該經(jīng)過詳細(xì)測試(95%以上)或第三方安全審計(jì)業(yè)務(wù)邏輯安全務(wù)邏輯設(shè)計(jì)與實(shí)現(xiàn)應(yīng)不存在明顯安全問題。具體要求:合約的機(jī)制設(shè)計(jì)無明顯缺陷合約代碼實(shí)現(xiàn)與業(yè)務(wù)邏輯設(shè)計(jì)相符合,不存在歧義多角色的合約,各角色權(quán)限和優(yōu)先級(jí)劃分明確多角色的合約,各角色之前的公平性有一定保障存在博弈環(huán)節(jié)的合約,博弈過程無明顯漏洞不存在「搶先交易」或「交易順序依賴」的風(fēng)險(xiǎn)不存在「拒絕服務(wù)」(Denial-of-Service,DoS)風(fēng)險(xiǎn)不會(huì)因「薅羊毛」等行為給合約正常運(yùn)行造成不良影響不存在交易參數(shù)簽名重放問題業(yè)務(wù)邏輯不會(huì)與合約所屬區(qū)塊鏈系統(tǒng)共識(shí)機(jī)制產(chǎn)生沖突合約規(guī)范標(biāo)準(zhǔn)特定類型合約應(yīng)符合相應(yīng)標(biāo)準(zhǔn)。具體要求:函數(shù)及變量標(biāo)明可見性,遵循變量聲明和作用域的規(guī)范變量標(biāo)明數(shù)據(jù)類型不使用已過期或即將廢棄的用法代碼風(fēng)格簡潔,命名規(guī)范(ERC20ERC721),保持接口和實(shí)現(xiàn)的兼容性使用經(jīng)過多方充分討論和審計(jì)的合約標(biāo)準(zhǔn)和代碼實(shí)現(xiàn)使用規(guī)范使用內(nèi)置函數(shù)合約權(quán)限安全限等需要?jiǎng)澐智逦?。具體要求:限制管理員的特殊權(quán)限,防止權(quán)限過大,不可危及普通用戶安全合約管理員賬戶應(yīng)該通過多重簽名錢包(合約)的方式來安全管理安全保護(hù)管理員私鑰,防止因管理員身份被盜用對(duì)合約造成致命影響DAO降低風(fēng)險(xiǎn)合約生態(tài)工具安全本部分討論智能合約生態(tài)基礎(chǔ)設(shè)施工具安全,包括合約語言、編譯器、測試工具、代碼掃描工具等。合約語言設(shè)計(jì)安全影響開發(fā)難度、開發(fā)效率以及合約安全性。具體要求:具備完整明確的語義定義不存在容易導(dǎo)致漏洞的非確定語義語言開發(fā)文檔描述完整,文檔定義與語言實(shí)現(xiàn)保持一致不包含存在安全隱患的特性編譯器安全編譯器通過語法、語義分析,將開發(fā)者編寫的源代碼經(jīng)過解析最終轉(zhuǎn)換為目標(biāo)代碼(通常是機(jī)器碼全檢測特性,從而可盡早幫助開發(fā)者發(fā)現(xiàn)源代碼中的常見安全風(fēng)險(xiǎn)。具體要求:能夠正確地將源代碼翻譯成目標(biāo)代碼能夠檢查常見合約漏洞并給出清晰的提示編譯優(yōu)化不應(yīng)引入新的代碼漏洞或改變代碼原始功能編譯器的實(shí)現(xiàn)具備完整的測試框架和測試用例測試工具、代碼掃描工具、測試環(huán)境開發(fā)者測試成本,進(jìn)而提高代碼質(zhì)量。具體要求:備有完善的調(diào)試工具,方便開發(fā)者部署和調(diào)用合約,追蹤狀態(tài)變化技術(shù),供開發(fā)者快速掃描代碼,對(duì)高風(fēng)險(xiǎn)處給出警示備有公開的測試網(wǎng)絡(luò),能夠準(zhǔn)確模擬正式主網(wǎng)提供準(zhǔn)確的測試用例覆蓋率分析報(bào)告支持連接正式主網(wǎng),便于對(duì)已部署程序進(jìn)行檢查測試合約形式化規(guī)范、形式化驗(yàn)證工具采用形式化驗(yàn)證工具對(duì)合約進(jìn)行可靠性驗(yàn)證、采用形式化語言為智能合約編寫規(guī)范。具體要求:開發(fā)者應(yīng)該優(yōu)先選擇經(jīng)過完整形式化證明的模版代碼高價(jià)值的智能合約應(yīng)考慮引入形式化驗(yàn)證技術(shù)來保障安全題定位和修改建議形式化驗(yàn)證工具能夠?qū)νㄟ^檢查的智能合約代碼自動(dòng)出具帶有簽名的驗(yàn)證報(bào)告,作為代碼安全性的證明文件合約交互與數(shù)據(jù)安全本部分討論智能合約與外部應(yīng)用發(fā)生交互的安全性、鏈上數(shù)據(jù)安全以及鏈下“預(yù)言機(jī)”安全。外部應(yīng)用與合約交互安全約,合約也需要對(duì)用戶的輸入做嚴(yán)格檢查。具體要求:外部應(yīng)用或用戶可正常通過接口訪問或調(diào)用智能合約功能合約需要為外部調(diào)用者提供詳細(xì)的接口說明外部應(yīng)用或用戶應(yīng)使用安全的工具與合約交互合約各個(gè)函數(shù)實(shí)現(xiàn)需對(duì)傳入?yún)?shù)做嚴(yán)格校驗(yàn)檢查合約代碼實(shí)現(xiàn)與觸發(fā)的外部事件是否一致,事件是否會(huì)非預(yù)期地觸發(fā)需評(píng)估不同種類的合約經(jīng)過組合使用后的安全風(fēng)險(xiǎn)不調(diào)用未知合約對(duì)接外部合約之前需要有兼容性的安全評(píng)估和測試調(diào)用外部合約需要對(duì)其返回值等進(jìn)行校驗(yàn)數(shù)據(jù)上鏈安全真實(shí)業(yè)務(wù)數(shù)據(jù)上鏈需注意數(shù)據(jù)安全問題。具體要求:防范敏感或隱私數(shù)據(jù)的非預(yù)期泄漏防范敏感或隱私數(shù)據(jù)被非授權(quán)使用或訪問需解決特定應(yīng)用場景下的數(shù)據(jù)可靠性和真實(shí)性問題需考慮特定數(shù)據(jù)上鏈后公開且不可更改與法律法規(guī)的合規(guī)性問題鏈下“預(yù)言機(jī)”安全(Oracle)用場景廣泛。具體要求:資產(chǎn)交易合約應(yīng)優(yōu)先選擇去中心化預(yù)言機(jī)。應(yīng)確保預(yù)言機(jī)所提供的數(shù)據(jù)不被輕易惡意操縱和篡改應(yīng)確保預(yù)言機(jī)能保障數(shù)據(jù)真實(shí)性、時(shí)效性和可用性類情況下合約自身的安全典型案例析經(jīng)典的智能合約安全事件案例,可以更深入地理解智能合約安全。重入漏洞2016618日,針對(duì)DAO合約的攻擊3,600,000個(gè)Ether的損失。DAO整數(shù)溢出漏洞整數(shù)溢出漏洞也是智能合約中常見的安全漏洞。例如,uint256是以太坊智能合約語言Solidity中最常用的無符號(hào)整數(shù)類型,它可表示的整數(shù)范圍為0~2256-1。當(dāng)在智能合約中,整數(shù)通常與賬戶余額或者其他關(guān)鍵程序邏輯相關(guān)。利用整數(shù)溢2018年4月22日,黑客攻擊了美鏈(BEC)的Token合約,通過一個(gè)整數(shù)溢出安全漏洞,將大量Token砸向交易所,導(dǎo)致BEC的價(jià)格幾乎歸零。2018425爆出類似的整數(shù)溢出漏洞文數(shù)字規(guī)模的SMT價(jià)格崩盤。整數(shù)溢出漏洞可能造成以下嚴(yán)重后果:使程序偏離設(shè)計(jì)意圖實(shí)現(xiàn)無限量增發(fā)繞過權(quán)限控制或余額校驗(yàn)完成一些虛假操作被管理員利用,留下作惡空間合約庫安全問題2017年11月06日,Parity多重簽名錢包漏洞導(dǎo)致了超過513,701個(gè)以太幣被鎖死,至今關(guān)于以太坊是否需要通過硬分叉方式升級(jí)(EIP999)爭論還在繼續(xù)。DeFi協(xié)議組合安全2020年2月15日、2月18日,DeFi項(xiàng)目bZx借貸協(xié)議遭遇兩次攻擊,先后損失35萬美元和64“閃電貸縱、搶先交易緊密關(guān)聯(lián),充分利用了多個(gè)DeFi產(chǎn)品間的可組合性來達(dá)到攻擊目的。20204192500萬美元的資產(chǎn)被洗劫一空,直接原因在于產(chǎn)品本身的可重入問題和特殊的ERC-777類imBTCUniswap去中心化交易所。非標(biāo)準(zhǔn)接口以最被廣泛接受的智能合約標(biāo)準(zhǔn)ERC20為例,很多合約未參照ERC20標(biāo)準(zhǔn)實(shí)現(xiàn),這給dApp開發(fā)帶來很大的困擾。數(shù)以千計(jì)的已部署合約曾(OpenZeppelin(52120a8c42[2017321日]~6331dd125d[2017年7月13日])給出的不規(guī)范模版代碼,多個(gè)函數(shù)實(shí)現(xiàn)沒有遵循ERC20規(guī)范,導(dǎo)致Solidity編譯器升級(jí)至0.4.22后出現(xiàn)嚴(yán)重的兼容性問題,無法正常轉(zhuǎn)賬。管理員權(quán)限過高或較中心化2018年7月10Bancor稱遭到攻擊1250Bancor代幣和100Pundix代Bancoranor主要合約包括Smartn和anororrE20BancorConverter合約有關(guān),攻擊者極有可能獲取了合約管理員賬戶的私鑰,對(duì)轉(zhuǎn)換代幣合約BancorConverter擁有極高權(quán)限。owner作為該合約的所有者和管理員,有唯一的權(quán)限通過)方法提走合約中的全部ERC20至任意地址。事件發(fā)生后Bancorowner管理員的超級(jí)權(quán)限,甚至稱之為“后門。業(yè)務(wù)邏輯與區(qū)塊鏈共識(shí)產(chǎn)生沖突曾經(jīng)紅極一時(shí)的類Fomo3D游戲,就曾因「隨機(jī)數(shù)預(yù)測」攻擊和「阻塞交易」攻擊喪失游戲公平性,淪為黑客淘金的重災(zāi)地。類Fomo3D游戲的空投機(jī)制利用「隨機(jī)數(shù)」來控制中獎(jiǎng)概率,但是由于隨機(jī)數(shù)的難度等,因此在以太坊上可以很容易的預(yù)測所謂的「隨機(jī)數(shù)」。每個(gè)區(qū)塊中僅打包很少的交易(降低他人交易被打包的可能性),類Fomo3D游戲中黑客利用了以太坊共識(shí)協(xié)議的特點(diǎn),找到游戲機(jī)制的漏洞進(jìn)而開發(fā)者應(yīng)持續(xù)關(guān)注更多安全案例存在著各類未知風(fēng)險(xiǎn)。為了開發(fā)成熟、安全、可靠的智能合約,開發(fā)者應(yīng)持續(xù)關(guān)注更多安全案例,從中學(xué)習(xí)經(jīng)驗(yàn)教訓(xùn)。最佳實(shí)踐從智能合約開發(fā)者方面來看,區(qū)塊鏈項(xiàng)目的爆發(fā)吸引了大量開發(fā)者,而這些開發(fā)者往往只能從簡單的參考和修改網(wǎng)上良莠不齊甚至有嚴(yán)重漏洞的示例代碼開始進(jìn)行學(xué)習(xí)開發(fā)。對(duì)于資深智能合約開發(fā)者而言,實(shí)現(xiàn)安全無漏洞的智能合約依舊是不小的挑戰(zhàn)。事實(shí)上,開發(fā)者可以通過遵循最佳實(shí)踐的方法,提高代碼質(zhì)量,降低安全風(fēng)險(xiǎn)?;緦?duì)策針對(duì)智能合約安全生態(tài)中常見的問題,有如下幾點(diǎn)基本對(duì)策:規(guī)范合約安全開發(fā)和發(fā)布流程引入形式化方法保障合約安全開發(fā)更優(yōu)秀的合約語言、編譯器和虛擬機(jī)社區(qū)應(yīng)重視合約標(biāo)準(zhǔn)對(duì)策一:規(guī)范合約安全開發(fā)和發(fā)布流程測試以及必要時(shí)引入外部第三方安全審計(jì)。開發(fā)者可閱讀智能合約安全開發(fā)資料,熟悉常見安全漏洞和安全事故,并自覺規(guī)避。此外,開發(fā)者也可在開發(fā)過程中引入開源的智能合約安全自動(dòng)掃描工具,從而規(guī)范合約代碼書寫,并提前發(fā)現(xiàn)常見的安全風(fēng)險(xiǎn)。這些工具通常采用靜態(tài)分析、符號(hào)執(zhí)行、污點(diǎn)分析、模糊測試等技術(shù),可較快掃描出常見的漏洞和高風(fēng)險(xiǎn)代碼。對(duì)策二:引入形式化方法保障合約安全關(guān)工具。其中,形式化規(guī)范(formalspecification)通過數(shù)學(xué)語言對(duì)系統(tǒng)的預(yù)期行為(例如將數(shù)量S的token從賬戶A轉(zhuǎn)移到賬戶B)和性質(zhì)(例如轉(zhuǎn)賬不會(huì)造成賬戶B額度的溢出)進(jìn)行嚴(yán)格和全面的定義。形式化規(guī)范往往定義了系統(tǒng)的正確性和安全性。(refinement)(synthesis)明在內(nèi)的一系列方法在數(shù)學(xué)上嚴(yán)格的保證迭代產(chǎn)生的系統(tǒng)和迭代前的規(guī)范或者系統(tǒng)保持一致。除了從形式化規(guī)范出發(fā)設(shè)計(jì)和實(shí)現(xiàn)一個(gè)系統(tǒng),我們也可以使用包括符號(hào)執(zhí)行(symbolicexecution)、模型檢測(modelchecking)和形式化證明(formalproving)在內(nèi)的bug在設(shè)計(jì)和實(shí)現(xiàn)中具體位置和成因。開發(fā)高可信的軟件系統(tǒng)提供了有效的手段。對(duì)策三:開發(fā)更優(yōu)秀的合約語言、編譯器和虛擬機(jī)避。而事實(shí)上不少漏洞也正是因?yàn)檎Z言設(shè)計(jì)、編譯器或虛擬機(jī)實(shí)現(xiàn)問題而產(chǎn)生。很多智能合約語言一方面提供高度的靈活性和強(qiáng)大的表達(dá)能力,另一方面又缺乏完Solidity中忽略地址對(duì)齊問題導(dǎo)致短地址攻擊,混淆tx.origin和msg.sender不同對(duì)策四:社區(qū)應(yīng)重視合約標(biāo)準(zhǔn)對(duì)標(biāo)準(zhǔn)提案的重視程度。ERC-20、ERC-721、ERC-998、ERC-1155、ERC-1178在內(nèi)的一系列合約提案或標(biāo)準(zhǔn)。提案實(shí)現(xiàn)代碼時(shí),不能方便地快速測試正確性,從而容易引發(fā)兼容性和安全性問題。ERC-721在這方面有不錯(cuò)的表現(xiàn),社區(qū)提供了基于大量測試用例的代碼驗(yàn)證器?,F(xiàn)的各種預(yù)期行為,并可以與前文提到的形式化方法實(shí)現(xiàn)對(duì)接。社區(qū)最佳實(shí)踐和安全開發(fā)資料開發(fā)者可以參考和遵循以下社區(qū)最佳實(shí)踐和安全開發(fā)資料。DASP10EthereumSmartContractBestPractices(ConsenSysDiligence)EthereumSmartContractsSecurityCheckListFromKnownsec404AguidetoEOSsmartcontractsecuritybestpractices(Slowmist)SoliditySecurityBlog推薦工具智能合約安全生態(tài)已經(jīng)產(chǎn)生了一些優(yōu)秀的代碼安全工具和分析工具,研究人員可以借助這些工具進(jìn)行智能合約安全分析,開發(fā)者也可以在開發(fā)測試過程中引入這些工具,以提升代碼質(zhì)量,提前發(fā)現(xiàn)安全風(fēng)險(xiǎn)。安全工具SlitherSlither是一個(gè)Solidity智能合約靜態(tài)分析框架,還提供了一個(gè)API來給研究人員通過自定義腳本審計(jì)Solidity代碼。我們可以使用Slither做到:識(shí)別能夠修改變量值的代碼隔離受特定變量值影響的條件邏輯語句查找能夠調(diào)用特定函數(shù)的其他函數(shù)項(xiàng)目地址:/crytic/slitherMythrilMythril是一款針對(duì)EVM字節(jié)碼進(jìn)行安全審計(jì)的工具,同時(shí)支持在線合約審計(jì)。項(xiàng)目地址:/ConsenSys/mythrilEchidnaEchidna是一款針對(duì)EVM字節(jié)碼進(jìn)行安全審計(jì)的工具,利用了模糊測試技術(shù),同時(shí)支持和truffle集成使用。項(xiàng)目地址:/crytic/echidnaEthersplayEthersplay是用于BinaryNinja的插件,可以用于分析EVM字節(jié)碼,并用圖形化的方式呈現(xiàn)函數(shù)調(diào)用流程。項(xiàng)目地址:/crytic/ethersplay分析工具Beosin-VaaS一鍵式”95%以上,為智能合約代碼提供“軍事級(jí)的安全驗(yàn)證。官網(wǎng)地址:/vaas/index.htmlSolgraphSolgraph調(diào)用關(guān)系。Sol2umlSol2uml用于以UML圖的形式生成智能合約函數(shù)之間的調(diào)用關(guān)系。項(xiàng)目地址:/naddison36/sol2uml4:以太坊智能合約審計(jì)CheckList下面是知道創(chuàng)宇404區(qū)塊鏈安全研究團(tuán)隊(duì)提供的以太坊智能合約審計(jì)CheckList。404區(qū)塊鏈安全研究團(tuán)隊(duì)參考并整理兼容了各大區(qū)塊鏈安全研究團(tuán)隊(duì)的529能合約安全。編碼規(guī)范問題編譯器版本合約代碼中,應(yīng)指定編譯器版本。建議使用最新的編譯器版本pragmasolidity^0.4.25;老版本的編譯器可能會(huì)導(dǎo)致各種已知的安全問題,例如/631/#44-dividenddistributorv0.4.23更新了一個(gè)編譯器漏洞,在這個(gè)版本中如果同時(shí)使用了兩種構(gòu)造函數(shù),即contracta{functiona()public{...}constructor()public{...}}會(huì)忽略其中的一個(gè)構(gòu)造函數(shù),該問題只影響v0.4.22v0.4.25修復(fù)了下面提到的未初始化存儲(chǔ)指針問題。https://etherscan.io/solcbuginfo構(gòu)造函數(shù)書寫問題對(duì)應(yīng)不同編譯器版本應(yīng)使用正確的構(gòu)造函數(shù),否則可能導(dǎo)致合約所有者變更在小于0.4.22版本的solidify編譯器語法要求中,合約構(gòu)造函數(shù)必須和合約名字相等,名字受到大小寫影響。如:contractOwned{functionOwned()public{}0.4.22constructorfunctioncontractOwnedconstructor()public{}owner權(quán)限被竊取等更嚴(yán)重的后果。返回標(biāo)準(zhǔn)遵循ERC20規(guī)范,要求transfer、approve函數(shù)應(yīng)返回bool值,需要添加返回值代碼functiontransfer(address_to,uint256_value)publicreturns(boolsuccess)而transferFrom返回結(jié)果應(yīng)該和transfer返回結(jié)果一致。事件標(biāo)準(zhǔn)遵循ERC20規(guī)范,要求transfer、approve函數(shù)觸發(fā)相應(yīng)的事件functionapprove(address_spender,uint256_value)publicreturns(boolsuccess){allowance[msg.sender][_spender]=_value;emitApproval(msg.sender,_spender,_value)returntrue假充值問題轉(zhuǎn)賬函數(shù)中,對(duì)余額以及轉(zhuǎn)賬金額的判斷,需要使用require函數(shù)拋出錯(cuò)誤,否則會(huì)導(dǎo)致外部程序錯(cuò)誤地判斷為轉(zhuǎn)賬成功。functiontransfer(address_to,uint256_value)returns(boolsuccess){if(balances[msg.sender]>=_value&&_value>0){balances[msg.sender]-=_value;balances[_to]+=_value;Transfer(msg.sender,_to,_value);returntrue;}else{returnfalse;}}上述代碼可能會(huì)導(dǎo)致假充值。正確代碼如下:functiontransfer(address_to,uint256_amount) publicreturns(boolsuccess){require(_to!=address(0));require(_amount<=balances[msg.sender]);balances[msg.sender]=balances[msg.sender].sub(_amount);balances[_to]=balances[_to].add(_amount);emitTransfer(msg.sender,_to,_amount);returntrue;}設(shè)計(jì)缺陷問題approve授權(quán)函數(shù)條件競爭approve函數(shù)中應(yīng)避免條件競爭。在修改allowance前,應(yīng)先修改為0,再修改為_value。gasprice順序的前后。0approve函數(shù)的用戶,該函數(shù)的操作在一定程度上是不可逆的。functionapprove(address_spender,uint256_value)publicreturns(boolsuccess){allowance[msg.sender][_spender]=_value;returntrue上述代碼就有可能導(dǎo)致條件競爭。應(yīng)在approve中加入require((_value==0)||(allowance[msg.sender][_spender]==0));將allowance先改為0再改為對(duì)應(yīng)數(shù)字,也可以使用increaseApprove和decreaseApprove函數(shù)來更改授權(quán)值Dos問題循環(huán)消耗問題在合約中,不推薦使用太多次的循環(huán)gasgas交易失敗。真實(shí)世界事件Simoleon(SIM)/646/Pandemica/index/detail/id/260/tag/2循環(huán)安全問題合約中,應(yīng)盡量避免循環(huán)次數(shù)受到用戶控制,攻擊者可能會(huì)使用過大的循環(huán)來完成Dos攻擊Dos攻擊。functionDistribute(address[]_addresses,uint256[]_values)payablereturns(bool){for(uinti=0;i<_addresses.length;i++){transfer(_addresses[i],_values[i]);}returntrue;}遇到上述情況是,推薦使用withdrawFunds來讓用戶取回自己的代幣,而不是發(fā)送給對(duì)應(yīng)賬戶,可以在一定程序上減少危害。上述代碼如果控制函數(shù)調(diào)用,那么就可以構(gòu)造巨大循環(huán)消耗gas,造成Dos問題凍結(jié)賬戶檢測賬戶是否被凍結(jié)。freezen()合約在進(jìn)行代幣轉(zhuǎn)移時(shí)只判斷了代幣來源賬戶是否處于凍結(jié)狀態(tài)而未判斷代幣的接受賬戶是否處于凍結(jié)狀態(tài),導(dǎo)致向凍結(jié)的賬戶轉(zhuǎn)賬后轉(zhuǎn)移的資產(chǎn)無法再從中轉(zhuǎn)出。下述代碼就存在凍結(jié)賬戶檢測缺陷:/*Acontractattemptstogetthecoins*/functiontransferFrom(address_from,address_to,uint256_value)returns(boolsuccess){if(frozenAccount[_from])throw;if(balanceOf[_from]<_value)throw;if(balanceOf[_to]+_value<balanceOf[_to])throw;if(_value>allowance[_from][msg.sender])throw;balanceOf[_from]-=_value;balanceOf[_to]+=_value;allowance[_from][msg.sender]-=_value;_to,_value);returntrue;}應(yīng)該在校驗(yàn)代幣來源賬戶是否凍結(jié)的同時(shí)校驗(yàn)?zāi)繕?biāo)賬戶是否被凍結(jié):/*Acontractattemptstogetthecoins*/functiontransferFrom(address_from,address_to,uint256_value)returns(boolsuccess){if(frozenAccount[_from])throw;if(frozenAccount[_to])throw;if(balanceOf[_from]<_value)throw;if(balanceOf[_to]+_value<balanceOf[_to])throw;if(_value>allowance[_from][msg.sender])throw;balanceOf[_from]-=_value;balanceOf[_to]+=_value;allowance[_from][msg.sender]-=_value;_to,_value);returntrue;}Pausable模塊繼承PausableOwnableERC20有交易```{.solidity}contractOwnable{addresspublicowner;eventOwnershipTransferred(addressindexedpreviousOwner,addressindexednewOwner);constructor()public{owner=msg.sender;}modifieronlyOwner(){require(msg.sender==owner);_;}functiontransferOwnership(address_newOwner)publiconlyOwner{_transferOwnership(_newOwner);}function_transferOwnership(address_newOwner)internal{require(_newOwner!=address(0));emitOwnershipTransferred(owner,_newOwner);owner=_newOwner;}}contractPausableisOwnable{eventPause();eventUnpause();boolpublicpaused=false;modifierwhenNotPaused(){require(!paused);_;}modifierwhenPaused(){require(paused);_;}functionpause()onlyOwnerwhenNotPausedpublic{paused=true;emitPause();}functionunpause()onlyOwnerwhenPausedpublic{paused=false;emitUnpause();}}contractStandardTokenisPausable{functiontransfer(address_to,uint256_value)publicwhenNotPausedreturns(bool){//...}function transferFrom(address _from, address _to, uint256 _value) whenNotPausedreturns(bool){//...}}編碼安全問題溢出問題算術(shù)溢出在調(diào)用加減乘除時(shí),應(yīng)使用safeMath庫來替代,否則容易導(dǎo)致算數(shù)上下溢,造成不可避免的損失pragmasolidity^0.4.18;contractToken{mapping(address=>uint)balances;uintpublictotalSupply;functionToken(uint_initialSupply){balances[msg.sender]=totalSupply=_initialSupply;}functiontransfer(address_to,uint_value)publicreturns(bool){require(balances[msg.sender]-_value>=0);//可以通過下溢來繞過判斷balances[msg.sender]-=_value;balances[_to]+=_value;returntrue;}functionbalanceOf(address_owner)publicconstantreturns(uintbalance){returnbalances[_owner];}}balances[msg.sender]-_value>=0可以通過下溢來繞過判斷。正確的寫法如下:functiontransfer(address_to,uint256_amount) publicreturns(boolsuccess){require(_to!=address(0));require(_amount<=balances[msg.sender]);balances[msg.sender]=balances[msg.sender].sub(_amount);balances[_to]=balances[_to].add(_amount);emitTransfer(msg.sender,_to,_amount);returntrue;}真實(shí)世界事件Hexagon代幣變泡沫,以太坊Hexagon溢出漏洞比狗莊還過分SMT/BECSolidity合約中的整數(shù)安全問題——SMT/BEC合約整數(shù)溢出解析鑄幣燒幣溢出問題鑄幣函數(shù)中,應(yīng)對(duì)totalSupply設(shè)置上限,避免因?yàn)樗阈g(shù)溢出等漏洞導(dǎo)致惡意鑄幣增發(fā)functionTokenERC20(uint256initialSupply,stringtokenName,stringtokenSymbol)public{totalSupply=initialSupply*10**uint256(decimals);balanceOf[msg.sender]=totalSupply;name=tokenName;symbol=tokenSymbol;}上述代碼中就未對(duì)totalSupply做限制,可能導(dǎo)致指數(shù)算數(shù)上溢。正確寫法如下:contractOPL{//Publicvariablesstringpublicname;stringpublicsymbol;uint8publicdecimals=18;//18decimalsboolpublicadminVer=false;addresspublicowner;uint256publictotalSupply;functionOPL()public{totalSupply=210000000*10**uint256(decimals);...}重入漏洞智能合約中避免使用call來交易,避免重入漏洞callsendtransfercall最大的gasgasoutof。重入漏洞有幾大特征。1、使用了call函數(shù)作為轉(zhuǎn)賬函數(shù)2、沒有限制call函數(shù)的gas3、扣余額在轉(zhuǎn)賬之后4、call時(shí)加入了()來執(zhí)行fallback函數(shù)functionwithdraw(uint_amount){require(balances[msg.sender]>=_amount);msg.sender.call.value(_amount)();balances[msg.sender]-=_amount;}上述代碼就是一個(gè)簡單的重入漏洞的demo。通過重入注入轉(zhuǎn)賬,將大量合約代幣遞歸轉(zhuǎn)賬而出。transfercall執(zhí)gas,都可以有效的減少該問題的危害。contractEtherStore{//initialisethemutexboolreEntrancyMutex=false;uint256publicwithdrawalLimit=1ether;mapping(address=>uint256)publiclastWithdrawTime;mapping(address=>uint256)publicbalances;functiondepositFunds()publicpayable{balances[msg.sender]+=msg.value;}functionwithdrawFunds(uint256_weiToWithdraw)public{require(!reEntrancyMutex);require(balances[msg.sender]>=_weiToWithdraw);//limitthewithdrawalrequire(_weiToWithdraw<=withdrawalLimit);//limitthetimeallowedtowithdrawrequire(now>=lastWithdrawTime[msg.sender]+1weeks);balances[msg.sender]-=lastWithdrawTime[msg.sender]=now;//setthereEntrancymutexbeforetheexternalcallreEntrancyMutex=true;//releasethemutexaftertheexternalcallreEntrancyMutex=false;}}上述代碼是一種用互斥鎖來避免遞歸防護(hù)方式。真實(shí)事件:TheDaoTheDAOTheDAOaddresscall注入call函數(shù)調(diào)用時(shí),應(yīng)該做嚴(yán)格的權(quán)限控制,或直接寫死call調(diào)用的函數(shù)在EVM的設(shè)計(jì)中,如果call的參數(shù)data是0xdeadbeef(假設(shè)的一個(gè)函數(shù)名)+0x0000000000 01,這樣的話就是調(diào)用函數(shù)call注入可能導(dǎo)致代幣竊取,權(quán)限繞過,通過call注入可以調(diào)用私有函數(shù),甚至部分高權(quán)限函數(shù)。addr.call(data);addr.delegatecall(data);addr.callcode(data);存環(huán)境的復(fù)雜性,防止攻擊者通過修改狀態(tài)來攻擊合約。真實(shí)世界事件call注入以太坊智能合約call注入攻擊以太坊Solidity合約call函數(shù)簇濫用導(dǎo)致的安全風(fēng)險(xiǎn)權(quán)限控制合約中不同函數(shù)應(yīng)設(shè)置合理的權(quán)限publicprivatemodifierfunctioninitContract()public{owner=msg.sender;}上述代碼作為初始函數(shù)不應(yīng)該為public。真實(shí)世界事件:ParityMulti-sigbug1ParityMulti-sigbug2Rubixi重放攻擊合約中如果涉及委托管理的需求,應(yīng)注意驗(yàn)證的不可復(fù)用性,避免重放攻擊付一定的費(fèi)用給受托人。這個(gè)業(yè)務(wù)場景在智能合約中也比較普遍。transferProxyuser1tokenuser3,但沒有ethgaspriceuser2transferProxy來完成。functiontransferProxy(address_from,address_to,uint256_value,uint256_fee,uint8_v,bytes32_r,bytes32_s)publicreturns(bool){if(balances[_from]<_fee+_value||_fee>_fee+_value)revert();uint256nonce=nonces[_from];bytes32h=keccak256(_from,_to,_value,_fee,nonce,address(this));if(_from!=ecrecover(h,_v,_r,_s))revert();if(balances[_to]+_value<balances[_to]||balances[msg.sender]+_fee<balances[msg.sender])revert();balances[_to]+=_value;emitTransfer(_from,_to,_value);balances[msg.sender]+=_fee;emitTransfer(_from,msg.sender,_fee);balances[_from]-=_value+_fee;nonces[_from]=nonce+1;returntrue;}nonce放攻擊,多次轉(zhuǎn)賬。漏洞來自于Defcon2018演講議題ReplayAttacksonEthereumSmartContractsReplayAttacksonEthereumSmartContractspdf一致性檢查智能合約中更新邏輯(例如:代幣數(shù)量更新、授權(quán)轉(zhuǎn)賬額度更新等)時(shí)往往都會(huì)伴隨著對(duì)操作對(duì)象的檢查邏輯(例如:防溢出檢查、授權(quán)轉(zhuǎn)賬額度檢查等之外的邏輯,這里以合約中的授權(quán)轉(zhuǎn)賬函數(shù)為例做簡要說明:functiontransferFrom(address_from,address_to,uint256_value)returns(boolsuccess)allowance[_from][msg.sender]///@noticesend`_value`tokento`_to`from`_from`ontheconditionitisapprovedby`_from`///@param_fromTheaddressofthesender///@param_toTheaddressoftherecipient///@param_valueTheamountoftokentobetransferred///@returnWhetherthetransferwassuccessfulornotfunctiontransferFrom(address_from,address_to,uint256_value)publicreturns(boolsuccess){require(balances[_from]>=_value); //Checkifthesenderhasenoughrequire(balances[_to]+_value>=balances[_to]);//Checkforoverflowsrequire(_value<=allowed[_from][msg.sender]); //Checkallowancebalances[_from]-=_value;balances[_to]+=_value;allowed[_from][_to]-=_value;_to,_value);returntrue;}在上述代碼中下面這一行代碼用于檢測授權(quán)轉(zhuǎn)賬的額度:require(_value<=allowed[_from][msg.sender]);而下面這一行代碼用于更新授權(quán)轉(zhuǎn)賬的額度:allowed[_from][_to]-=_value;權(quán)限后,被授權(quán)轉(zhuǎn)賬的用戶能夠持續(xù)轉(zhuǎn)賬,直到轉(zhuǎn)完授權(quán)賬戶的所有余額為止。正確的寫法應(yīng)該是保持判斷邏輯與更新邏輯中的操作對(duì)象一致且為被授權(quán)轉(zhuǎn)賬用戶的授權(quán)轉(zhuǎn)賬額度:require(_value<=allowed[_from][msg.sender]);allowed[_from][msg.sender]);-=_value;編碼設(shè)計(jì)問題地址初始化問題涉及到地址的函數(shù)中,建議加入require(_to!=address(0))驗(yàn)證,有效避免用戶誤操作或未知錯(cuò)誤導(dǎo)致的不必要的損失EVM0,如果開發(fā)者在代碼中初始化了某addressaddress變量值,但在下面的代碼中操作了這個(gè)變量,就可能導(dǎo)致不必要的安全風(fēng)險(xiǎn)。這樣的檢查可以以最簡單的方式避免未知錯(cuò)誤、短地址攻擊等問題的發(fā)生。判斷函數(shù)問題requireassertassert會(huì)導(dǎo)致剩gas全部消耗掉,而他們?cè)谄渌矫娴谋憩F(xiàn)都是一致的值得注意的是,assert存在強(qiáng)制一致性,對(duì)于固定變量的檢查來說,assert可以用于避免一些未知的問題,因?yàn)樗麜?huì)強(qiáng)制終止合約并使其無效化,在一些固定條件下,assert更適用。余額判斷問題不要假設(shè)合約創(chuàng)建時(shí)余額為0,可以強(qiáng)制轉(zhuǎn)賬謹(jǐn)慎編寫用于檢查賬戶余額的不變量,因?yàn)楣粽呖梢詮?qiáng)制發(fā)送wei到任何賬戶,即使fallback函數(shù)throw也不行。1weiselfdestruct(victimAddress)0.轉(zhuǎn)賬函數(shù)問題在完成交易時(shí),默認(rèn)情況下推薦使用transfer而不是send完成交易當(dāng)transfer或者send函數(shù)的目標(biāo)是合約時(shí),會(huì)調(diào)用合約的fallback函數(shù),但fallback函數(shù)執(zhí)行失敗時(shí)。transfersendfalsesend時(shí)需要判斷返回類型,否則可能會(huì)導(dǎo)致轉(zhuǎn)賬失敗但余額減少的情況。functionwithdraw(uint256_amount)public{require(balances[msg.sender]>=_amount);balances[msg.sender]-=_amount;etherLeft-=_amount;msg.sender.send(_amount);}send()函數(shù)進(jìn)行轉(zhuǎn)賬,因?yàn)檫@里沒有驗(yàn)證send()msg.sender為合約賬戶fallback()send()代碼外部調(diào)用設(shè)計(jì)問題對(duì)于外部合約優(yōu)先使用pull而不是push的把對(duì)外的操作改為用戶自己來取。錯(cuò)誤樣例:contractauction{addresshighestBidder;uinthighestBid;functionbid()payable{if(msg.value<highestBid)throw;if(highestBidder!=0){if(!highestBidder.send(highestBid)){//可能會(huì)發(fā)生錯(cuò)誤throw;}}highestBidder=msg.sender;highestBid=msg.value;}}當(dāng)需要向某一方轉(zhuǎn)賬時(shí),將轉(zhuǎn)賬改為定義withdraw函數(shù),讓用戶自己來執(zhí)行合約將余額取出,這樣可以最大程度的避免未知的損失。范例代碼:contractauction{addresshighestBidder;uinthighestBid;mapping(address=>uint)refunds;functionbid()payableexternal{if(msg.value<highestBid)throw;if(highestBidder!=0){refunds[highestBidder]+=highestBid;//記錄在refunds中}highestBidder=msg.sender;highestBid=msg.value;}functionwithdrawRefund()external{uintrefund=refunds[msg.sender];refunds[msg.sender]=0;if(!msg.sender.send(refund)){refunds[msg.sender]=refund;//如果轉(zhuǎn)賬錯(cuò)誤還可以挽回}}}錯(cuò)誤處理合約中涉及到call等在address底層操作的方法時(shí),做好合理的錯(cuò)誤處理address.call()address.callcode()address.delegatecall()address.send()這類操作如果遇到錯(cuò)誤并不會(huì)拋出異常,而是會(huì)返回false并繼續(xù)執(zhí)行。functionwithdraw(uint256_amount)public{require(balances[msg.sender]>=_amount);balances[msg.sender]-=_amount;etherLeft-=_amount;msg.sender.send(_amount);}sendmsg.sender調(diào)用失敗時(shí),sendfalse。所以當(dāng)使用上述方法時(shí),需要對(duì)返回值做檢查并做錯(cuò)誤處理。if(!someAddress.send(55)){//Somefailurecode}/607/#4-unchecked-return-values-for-low-level-calls值得注意的一點(diǎn)是,作為EVM設(shè)計(jì)的一部分,下面這些函數(shù)如果調(diào)用的合約不存在,將會(huì)返回Truecall、delegatecall、callcode、staticcall在調(diào)用這類函數(shù)之前,需要對(duì)地址的有效性做檢查。弱隨機(jī)數(shù)問題智能合約上隨機(jī)數(shù)生成方式需要更多考量Fomo3D合約在空投獎(jiǎng)勵(lì)的隨機(jī)數(shù)生成中就引入了block信息作為隨機(jī)數(shù)種子生成的參數(shù),導(dǎo)致隨機(jī)數(shù)種子只受到合約地址影響,無法做到完全隨機(jī)。functionairdrop()privateviewreturns(bool){uint256seed=uint256(keccak256(abi.encodePacked((block.timestamp).add(block.difficulty).add((uint256(keccak256(abi.encodePacked(block.coinbase))))/(now)).add(block.gaslimit).add((uint256(keccak256(abi.encodePacked(msg.sender))))/(now)).add(block.number))));if((seed-((seed/1000)*1000))<airDropTracker_)return(true);elsereturn(false);}上述這段代碼直接導(dǎo)致了Fomo3d薅羊毛事件的誕生。真實(shí)世界損失巨大,超過數(shù)千eth。要。hash-commit-reveal,即玩家提交行動(dòng)計(jì)hashhashcommit有一個(gè)很棒的實(shí)現(xiàn)代碼是dice2win的隨機(jī)數(shù)生成代碼。hash-commit-reveal最大的問題在于服務(wù)端會(huì)在用戶提交之后短暫的獲得整個(gè)過安全分析當(dāng)然hash-commit在一些簡單場景下也是不錯(cuò)的實(shí)現(xiàn)方式。即玩家提交行動(dòng)計(jì)劃的hash,然后生成隨機(jī)數(shù),然后提交行動(dòng)計(jì)劃。真實(shí)世界事件:Fomo3d薅羊毛/r/ethereum/comments/916xni/how_to_pwn_fomo3d_a_beginners_guide/8萬筆交易「封死」以太坊網(wǎng)絡(luò),只為搶奪Fomo3D大獎(jiǎng)?LastWinner/672/變量覆蓋問題在合約中避免array變量key可以被控制map[uint256(msg.sender)+x]=blockNum;在EVM中數(shù)組和其他類型不同,因?yàn)閿?shù)組時(shí)動(dòng)態(tài)大小的,所以數(shù)組類型的數(shù)據(jù)計(jì)算方式為address(map_data)=sha3(key)+offset其中key就是map變量定義的位置,也就是1,offset就是數(shù)組中的偏移,比如map[2],offset就是2.map[2]的地址就是sha3(1)+2,假設(shè)map[2]=2333,則storage[sha3(1)+2]=2333。這樣一來就出現(xiàn)問題了,由于offset我們可控,我們就可以向storage的任意地址寫值。這就可能覆蓋storage的任意地址的值,影響代碼本身的邏輯,導(dǎo)致進(jìn)一步更嚴(yán)重的問題。詳細(xì)的原理可以看OPCODE逆向之理論基礎(chǔ)篇/739/編碼問題隱患語法特性問題在智能合約中小心整數(shù)除法的向下取整問題精度時(shí),我們需要使用乘數(shù)來加大這個(gè)數(shù)字。式出現(xiàn),將會(huì)采取向下取整的處理方式。錯(cuò)誤樣例uintx=5/2;//2正確代碼uintmultiplier=10;uintx=(5*multiplier)/2;數(shù)據(jù)私密問題注意鏈上的所有數(shù)據(jù)都是公開的存在鏈上。數(shù)據(jù)可靠性合約中不應(yīng)該讓時(shí)間戳參與到代碼中,容易受到礦工的干擾,應(yīng)使用block.height等不變的數(shù)據(jù)uintsomeVariable=now+1;if(now%2==0){//now可能被礦工控制}gas消耗優(yōu)化對(duì)于某些不涉及狀態(tài)變化的函數(shù)和變量可以加constant來避免gas的消耗contractEUXLinkTokenisERC20{usingSafeMathforuint256;addressowner=msg.sender;mapping(address=>uint256)balances;mapping(address=>mapping(address=>uint256))allowed;mapping(address=>bool)publicblacklist;stringpublicconstantname="xx";stringpublicconstantsymbol="xxx";uintpublicconstantdecimals=8;uint256publictotalSupply=1000000000e8;uint256publictotalDistributed=200000000e8;uint256publictotalPurchase=200000000e8;uint256 public totalRemaining totalSupply.sub(totalDistributed).sub(totalPurchase);uint256publicvalue=5000e8;uint256publicpurchaseCardinal=5000000e8;uint256publicminPurchase=0.001e18;uint256publicmaxPurchase=10e18;合約用戶合約中,應(yīng)盡量考慮交易目標(biāo)為合約時(shí)的情況,避免因此產(chǎn)生的各種惡意利用contractAuction{addresspubliccurrentLeader;uint256publichidghestBid;functionbid()publicpayable{require(msg.value>highestBid);require(currentLeader.send(hi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年特色小鎮(zhèn)開發(fā)建設(shè)合作合同
- 職業(yè)衛(wèi)生課程設(shè)計(jì)崔曉紅
- 統(tǒng)計(jì)學(xué)課程設(shè)計(jì)作業(yè)
- 化工安全生產(chǎn)管理制度
- 自動(dòng)循環(huán)配料課程設(shè)計(jì)
- 照明課程設(shè)計(jì)日志模板
- 中國石化集團(tuán)公司安全生產(chǎn)監(jiān)督管理制度
- 電骰子 課程設(shè)計(jì)
- 碩士課程設(shè)計(jì)論文格式
- 自動(dòng)大門plc組態(tài)課程設(shè)計(jì)
- 2023年二輪復(fù)習(xí)解答題專題十七:二次函數(shù)的應(yīng)用(銷售利潤問題)(原卷版+解析)
- 《ISO56001-2024創(chuàng)新管理體系 - 要求》之26:“9績效評(píng)價(jià)-9.3管理評(píng)審”解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024)
- 2024至2030年中國除草劑行業(yè)市場前景預(yù)測及未來發(fā)展趨勢研究報(bào)告
- 三年級(jí)上冊(cè)乘法豎式計(jì)算練習(xí)200道及答案
- 2024-2030年中國泥炭市場深度調(diào)查研究報(bào)告
- 組建學(xué)?;@球隊(duì)方案
- 政務(wù)服務(wù)中心物業(yè)服務(wù)投標(biāo)方案【新版】(技術(shù)方案)
- (正式版)YS∕T 5040-2024 有色金屬礦山工程項(xiàng)目可行性研究報(bào)告編制標(biāo)準(zhǔn)
- HJ 179-2018 石灰石石灰-石膏濕法煙氣脫硫工程技術(shù)規(guī)范
- JT-T-617.7-2018危險(xiǎn)貨物道路運(yùn)輸規(guī)則第7部分:運(yùn)輸條件及作業(yè)要求
- 消弧產(chǎn)品規(guī)格標(biāo)準(zhǔn)化規(guī)定
評(píng)論
0/150
提交評(píng)論