相關文章:
Rust智能合約養成日記合約狀態數據定義與方法實現
Rust智能合約養成日記編寫Rust智能合約單元測試
Rust智能合約養成日記Rust智能合約部署,函數調用及Explorer的使用
Rust智能合約養成日記Rust智能合約整數溢出
Rust智能合約養成日記拒絕服務攻擊
拒絕服務攻擊又稱DoS(DenialofService)攻擊,該類型的攻擊將使得智能合約在一段時間內(甚至永久)無法被用戶正常使用。
目前已知的原因大致可分為如下兩類:
合約邏輯中存在的某些缺陷。如某一public函數,其實現沒有考慮到計算復雜度。用戶調用該函數時,實際所需消耗的Gas會超出NEAR公鏈創世區塊配置文件(genesis_config.json)中所定義的"max_total_prepaid_gas":300000000000000`(300TGas),導致交易失敗。
某些跨合約調用情形中,合約的執行依賴于其他外部合約的執行狀態。而外部合約的執行并非總是可靠,以至于本合約的執行可能被外部合約阻塞,無法照常運行。該類問題的發生可表現為合約用戶在合約中的資金被鎖定,以至于無法正常的充值或提現。
以太坊客戶端Erigon將結束對Rust版本Akula的支持:金色財經報道,以太坊客戶端Erigon官方Blog表示,將結束對Erigon的Rust版本Akula的支持。團隊近期發現,一個基于Rust語言的Ethereum實現將開放源代碼,其范圍幾乎與Akula相同,并有一些相同/相似的構建模塊。Erigon團隊認為,該項目在開源后將更加受人支持與歡迎,其功能也將很快匹配和超越Akula。與該項目背后擁有的資源和影響力相比,Erigon無法保證Akula能夠吸引未來的資助,因此決定取消對Akula的技術、管理和資金支持。[2022/11/24 8:03:28]
除了合約邏輯的缺陷,DoS現象發生的原因還可以歸因于人為因素:典型的如:合約的所有者丟失了自己的私鑰,以至于合約中部分only_owner可執行的特權函數無法被調用,使得合約中某些重要的系統狀態值無法及時的更新,這將有可能對項目造成較大的損失。
為方便讀者更加深刻地了解智能合約中的DoS攻擊漏洞,本文后續將結合具體DoS攻擊的例子展開描述與分析。本文代碼已上傳至BlockSec官方github,讀者可以自行下載https://github.com/blocksecteam/near_demo/tree/main/DoSDemo
Crust network平行網Crust Shadow成功完成Kusuma平行鏈注冊:5月15日,Crust network平行網Crust Shadow成功完成Kusuma平行鏈注冊,ID為2012。此前,Crust已完成Kusuma平行鏈插槽競拍的準備工作,等待競拍活動開始。[2021/5/15 22:06:38]
1.循環遍歷一個可被外部調用更改的數據結構
以下是一個用于給合約中注冊用戶“分紅”的簡單智能合約,其狀態數據如下:
用戶可通過調用pubfnregister_account()函數進行注冊并初始化。
后續該合約的管理者將調用pubfndistribute_token函數來為系統中用戶進行"分紅"。“分紅”的方式為遍歷用戶數組self.registered,并通過跨合約調用向每一個用戶轉入指定額度amount的代幣以做獎勵。
報告:朝鮮黑客組織Lazarus通過混淆資金來源清洗竊取的加密貨幣:英國跨國安全公司BAE Systems和環球銀行金融電信協會(SWIFT)發表一份報告,揭示了網絡犯罪分子如何清洗加密貨幣。
根據這項研究,與通過電匯等傳統方法洗錢的巨額現金相比,通過加密貨幣進行洗錢的案件仍然相對較少。但也有一些值得注意的例子,報告深入探討了朝鮮黑客組織Lazarus Group使用的洗錢方法。Lazarus通常從一個交易所竊取加密資金,然后開始使用“分層技術”通過不同的多個交易所進行交易。這些黑客雇傭了東亞協助人員,他們接受了部分被盜資金,以幫助洗錢。研究稱,這些協助者在他們擁有的眾多地址之間轉移加密貨幣,以“混淆資金來源”。“協助者通過新增加的銀行賬戶轉移一部分收到的資金,這些賬戶與他們的交易所賬戶相關聯,這使得加密貨幣能夠轉換成法定貨幣。其他被盜資金可能會通過比特幣轉入預付費禮品卡,在其他交易所可以用來購買更多比特幣。”
據此前報道,朝鮮黑客組織Lazarus通過LinkedIn招聘廣告攻擊加密貨幣公司。(Cointelegraph)[2020/9/4]
然而該合約狀態數據(self.registered)的大小沒有限制,并且可以被惡意用戶所操控,使得該合約數據的大小變得過大。以至于DISTRIBUTOR用戶在調用該合約方法時,可能消耗的Gas費用過高,超出了GASLIMIT。
動態 | TrustToken與加密托管服務商Legacy Trust合作推出穩定幣TrueHKD:據Finance Magnates報道,TrustToken公司香港授權的加密托管服務商Legacy Trust合作,持有為與港元掛鉤的穩定幣TrueHKD提供擔保的法幣。這是該公司在美國以外的第一個托管伙伴關系。TrustToken首席執行官安Jai An表示:“我們很高興能與Legacy Trust合作,向亞洲市場擴張。我們的目標是為交易員提供更好的解決方案,讓他們能夠安全地在本國法定貨幣與全球區塊鏈市場和應用程序之間進行交易。” TrueHKD可以由香港居民或任何持有法幣的人從該公司的應用程序購買,還將允許TrueHKD持有者訪問TrustToken的交易網絡、合作伙伴和錢包。[2019/6/25]
如下是該合約在實際NEARLocalnet中測試的結果
可以看到當系統中注冊的用戶較多時,實際在distribute_token執行的過程中,所設置的prepaid_gas將不足以滿足所有用戶的轉賬操作,以至于本次交易失敗。
推薦的解決方案:
動態 | 軟件開發人員通過Rust編寫BCH庫:據bitcoin.com報道,11月5日,軟件開發人員Brenton Gunning向BCH社區宣布,他開發了一個用編程語言Rust編寫的BCH庫。新庫允許開發人員處理在Rust編碼環境中編寫的BCH應用程序和平臺。[2018/11/8]
由于GasLimit的限制,合約方法在執行過程中不建議遍歷一個較大的數據結構(該數據結構的大小可被外部用戶操縱)。確需遍歷的,也需要限制該數據結構的大小,并保證當該數據結構的大小達到該最大值時,也不會觸及GasLimit的限制。
因此推薦采用withdrawal模式對上述合約進行改造。即要求合約方不主動地對所有的用戶逐一發放獎勵,而是先記賬,并設置一個withdraw函數,讓單一用戶通過該函數方法的調用,自行取回“分紅”獎勵。此時合約方也只需要維護逐一用戶已經取回的獎勵數額或者還能取回的獎勵數額即可。
2.跨合約之間的狀態依賴導致合約阻塞
合約在進行跨合約調用時,可能會對外部合約的狀態存在依賴,不恰當的依賴,會導致該合約阻塞,從而可能被發起DoS攻擊
下面考慮一種利用智能合約進行“競價”的場景:
用戶可以通過調用“競價合約”中的pubfnregister_account函數方法注冊賬戶,為參與后續的競價做準備
用戶還可以通過如下接口函數查詢當前系統中目前為止出價最高的用戶ID,及其所出的價格。
用戶還可以通過如下接口函數查詢當前系統中目前為止出價最高的用戶ID,及其所出的價格。
當競價合約收到token時,會通過ft_on_transfer函數調用到如下bid函數。
在該出價函數中,函數的執行邏輯將首先檢查本次用戶的出價是否高于之前出價最高用戶的出價值。如果滿足該條件,將執行self.refund_exe()從“競價合約”中退回之前出價最高用戶的出價代幣。隨后更新目前為止出價最高的用戶ID及其所出的價格。
實際的情況是,根據該合約的邏輯定義:必須要退回之前出價最高用戶的出價代幣,才能將目前為止出價最高的用戶ID進行更替。
在該出價函數中,函數的執行邏輯將首先檢查本次用戶的出價是否高于之前出價最高用戶的出價值。如果滿足該條件,將執行self.refund_exe()從“競價合約”中退回之前出價最高用戶的出價代幣。隨后更新目前為止出價最高的用戶ID及其所出的價格。
實際的情況是,根據該合約的邏輯定義:必須要退回之前出價最高用戶的出價代幣,才能將目前為止出價最高的用戶ID進行更替。
此時測試模擬了“競價系統”的參與的用戶:user0、user1和user2
他們分別擁有10000個初始代幣。user0首先在“競價系統”中出價1000,此時查詢可知current_leader:user0.test.nearhighest_bid:1000。隨后user0立即將剩余的9000個代幣轉給了user2,并銷毀了代幣賬戶。
此后,當user1出價2000時,系統將打算退回user0之前的出價值。但由于此時user0的賬戶已不存在,系統將提示"CannotRefund",始終無法成功完成后續的交易更新狀態。
此時第二位出價者想出價2000:
解決方法:
如果合約的狀態的轉化需要依賴于外部合約的調用處理,則需要考慮外部合約調用可能失敗的情形,防止合約的執行邏輯被阻塞而拒絕服務,即我們需要實現合理的錯誤處理手段。在本例子中,我們可以將無法退回的代幣寄存于合約新增的lost_found用戶組中,當后續用戶滿足條件refund條件時,再由用戶本身來進一步取回代幣(同樣可以實現withdraw函數)。
3.Owner私鑰丟失
去中性化智能合約項目中往往也存在部分中心化的現象:如存在合約的owner。部分合約函數的執行被設置為僅owner可以執行,用以對合約中某些關鍵系統變量值的進行設置更改。我們可以將此類函數稱之為only_owner類型函數。
例如前文在“分紅”合約中所定義的pubfndistribute_token,該函數即為only_owner函數。當合約的owner無法履行職能(私鑰丟失)時,資金將一直被鎖定在合約之中,無法分發給其他用戶。另有大多數的情況下,only_owner函數還可以用來暫停或者重啟合約中的所有交易,可見owner正常履行其職能的重要性。
解決方法:
為避免上述owner個人“失能”情形的發生,我們可增設多位合約的owner共同治理合約,甚至可采用多簽請求的方式來替換原有的合約權限控制方案,以此實現合約的去中心化治理效果。有關智能合約中多簽請求功能的設計實現,將在后續的《智能合約養成日記》中展開詳細的描述。
Tags:USTNEROWNSERJustLiquiditygoldminer幣為什么大漲Town StarSERG價格
對于創業公司來說,crypto行業蘊藏的機遇是其他行業無法企及的。crypto和Web3的核心愿景就是打造向所有人都開放的原生數字經濟.
1900/1/1 0:00:00DAOrayakiDAO研究獎金池:大約一周前,我們發布了下面這條推文,并收到了大量回復: 文檔和團隊知識管理工具是DAO的一大痛點.
1900/1/1 0:00:00TetherCTO:Tether沒有上市計劃5月5日消息,Tether的CTOPaoloArdoino在采訪時表示,計劃做的是繼續做我們正在做的事情,也就是說,真正成為人民的工具.
1900/1/1 0:00:00USDT是加密貨幣市場中最為著名的穩定幣。自創始以來,因其“穩定”特性被廣泛采用,截至發稿,USDT市值位列加密貨幣市場第三位,僅次于BTC和ETH.
1900/1/1 0:00:00Polkadot生態研究院出品,必屬精品波卡一周觀察,是我們針對波卡整個生態在上一周所發生的事情的一個梳理,同時也會以白話的形式分享一些我們對這些事件的觀察.
1900/1/1 0:00:00后知后覺金錢消失術 在加密世界中,私鑰管理和保持私鑰安全性,一直是個重要的話題。近日,當下最流行的NFT游戲AxieInfinity側鏈RoninNetwork受到黑客攻擊,造成價值約6.1億美.
1900/1/1 0:00:00