TMT观察网_独特视角观察TMT行业

【慢霧】EOS智能合約最佳安全開發(fā)指南區(qū)塊鏈

鏈向財(cái)經(jīng) 2018-10-01 23:32
分享到:
導(dǎo)讀

本文由慢霧(SlowMist)同學(xué)主導(dǎo),麒麟小組以及其他同學(xué)參與,旨在為EOS智能合約開發(fā)人員提供一些智能合約的安全準(zhǔn)則及已知漏洞分析。https://github.com/slowmist/eos-smart-contract-security-best-practices

目錄

  • 安全準(zhǔn)則

  • 已知漏洞

          1.  數(shù)值溢出

                1.1 漏洞示例

                1.2 防御方法

                1.3 真實(shí)案例

           2. 權(quán)限校驗(yàn)

                 2.1 漏洞示例

                 2.2 防御方法

                 2.3 真實(shí)案例

            3. apply 校驗(yàn) 

                 3.1 漏洞示例

                 3.2 防御方法

                 3.3 真實(shí)案例

  • 參考文獻(xiàn)

  • 致謝

安全準(zhǔn)則

EOS 處于早期階段并且有很強(qiáng)的實(shí)驗(yàn)性質(zhì)。因此,隨著新的 bug 和安全漏洞被發(fā)現(xiàn),新的功能不斷被開發(fā)出來,其面臨的安全威脅也是不斷變化的。這篇文章對于開發(fā)人員編寫安全的智能合約來說只是個(gè)開始。

開發(fā)智能合約需要一個(gè)全新的工程思維,它不同于我們以往項(xiàng)目的開發(fā)。因?yàn)樗稿e(cuò)的代價(jià)是巨大的,很難像中心化類型的軟件那樣,打上補(bǔ)丁就可以彌補(bǔ)損失。就像直接給硬件編程或金融服務(wù)類軟件開發(fā),相比于 Web 開發(fā)和移動(dòng)開發(fā)都有更大的挑戰(zhàn)。因此,僅僅防范已知的漏洞是不夠的,還需要學(xué)習(xí)新的開發(fā)理念:

  • 對可能的錯(cuò)誤有所準(zhǔn)備

任何有意義的智能合約或多或少都存在錯(cuò)誤,因此你的代碼必須能夠正確的處理出現(xiàn)的 bug 和漏洞。需始終保證以下規(guī)則:

1.當(dāng)智能合約出現(xiàn)錯(cuò)誤時(shí),停止合約;

2.管理賬戶的資金風(fēng)險(xiǎn),如限制(轉(zhuǎn)賬)速率、最大(轉(zhuǎn)賬)額度;

3.有效的途徑來進(jìn)行 bug 修復(fù)和功能提升。

  • 謹(jǐn)慎發(fā)布智能合約

盡量在正式發(fā)布智能合約之前發(fā)現(xiàn)并修復(fù)可能的 bug。

1.對智能合約進(jìn)行徹底的測試,并在任何新的攻擊手法被發(fā)現(xiàn)后及時(shí)的測試(包括已經(jīng)發(fā)布的合約)

2.從 alpha 版本在麒麟測試網(wǎng)(CryptoKylin-Testnet)上發(fā)布開始便邀請專業(yè)安全審計(jì)機(jī)構(gòu)進(jìn)行審計(jì),并提供漏洞賞金計(jì)劃(Bug Bounty)

3.階段性發(fā)布,每個(gè)階段都提供足夠的測試

  • 保持智能合約的簡潔

復(fù)雜會(huì)增加出錯(cuò)的風(fēng)險(xiǎn)。

1.確保智能合約邏輯簡潔;

2.確保合約和函數(shù)模塊化;

3.使用已經(jīng)被廣泛使用的合約或工具(比如,不要自己寫一個(gè)隨機(jī)數(shù)生成器);

4.條件允許的話,清晰明了比性能更重要;

5.只在你系統(tǒng)的去中心化部分使用區(qū)塊鏈。

  • 保持更新

通過公開資源來確保獲取到最新的安全進(jìn)展。

1.在任何新的漏洞被發(fā)現(xiàn)時(shí)檢查你的智能合約;

2.盡可能快的將使用到的庫或者工具更新到最新;

3.使用最新的安全技術(shù)。

  • 清楚區(qū)塊鏈的特性

盡管你先前所擁有的編程經(jīng)驗(yàn)同樣適用于智能合約開發(fā),但這里仍然有些陷阱你需要留意:

require_recipient(account_name name) 可觸發(fā)通知,調(diào)用name合約中的同名函數(shù),官方文檔

https://developers.eos.io/eosio-cpp/v1.2.0/reference#section-require_recipient

已知漏洞

數(shù)值溢出

在進(jìn)行算術(shù)運(yùn)算時(shí),未進(jìn)行邊界檢查可能導(dǎo)致數(shù)值上下溢,引起智能合約用戶資產(chǎn)受損。

1.漏洞示例

存在缺陷的代碼:batchTransfer 批量轉(zhuǎn)賬

typedef struct acnts {account_name name0;account_name name1;account_name name2;account_name name3;} account_names;void batchtransfer(symbol_name symbol, account_name from, account_names to, uint64_t balance){    require_auth(from);account fromaccount;    require_recipient(from);    require_recipient(to.name0);    require_recipient(to.name1);    require_recipient(to.name2);    require_recipient(to.name3);    eosio_assert(is_balance_within_range(balance), "invalid balance");    eosio_assert(balance > 0, "must transfer positive balance");    uint64_t amount = balance * 4; //乘法溢出int itr = db_find_i64(_self, symbol, N(table), from);    eosio_assert(itr >= 0, "Sub-- wrong name");    db_get_i64(itr, &fromaccount, (account));    eosio_assert(fromaccount.balance >= amount, "overdrawn balance");    sub_balance(symbol, from, amount);    add_balance(symbol, to.name0, balance);    add_balance(symbol, to.name1, balance);    add_balance(symbol, to.name2, balance);    add_balance(symbol, to.name3, balance);}

2.防御方法

盡可能使用 asset 結(jié)構(gòu)體進(jìn)行運(yùn)算,而不是把 balance 提取出來進(jìn)行運(yùn)算。

3.真實(shí)案例

【EOS Fomo3D你千萬別玩】狼人殺遭到溢出攻擊, 已經(jīng)涼涼(https://bihu.com/article/995093)

權(quán)限校驗(yàn)

在進(jìn)行相關(guān)操作時(shí),應(yīng)嚴(yán)格判斷函數(shù)入?yún)⒑蛯?shí)際調(diào)用者是否一致,使用require_auth進(jìn)行校驗(yàn)。

1.漏洞示例

存在缺陷的代碼:transfer 轉(zhuǎn)賬

void token::transfer( account_name from,account_name to,asset        quantity,string       memo ){    eosio_assert( from != to, "cannot transfer to self" );    eosio_assert( is_account( to ), "to account does not exist");    auto sym = quantity.symbol.name();stats statstable( _self, sym );    const auto& st = statstable.get( sym );    require_recipient( from );    require_recipient( to );    eosio_assert( quantity.is_valid(), "invalid quantity" );    eosio_assert( quantity.amount > 0, "must transfer positive quantity" );    eosio_assert( quantity.symbol == st.supply.symbol, "symbol precision mismatch" );    eosio_assert( memo.size() <= 256, "memo has more than 256 bytes" );    auto payer = has_auth( to ) ? to : from;    sub_balance( from, quantity );    add_balance( to, quantity, payer );}

2.防御方法

使用require_auth( from )校驗(yàn)資產(chǎn)轉(zhuǎn)出賬戶與調(diào)用賬戶是否一致。

3.真實(shí)案例

暫無

apply 校驗(yàn)

在處理合約調(diào)用時(shí),應(yīng)確保每個(gè) action 與 code 均滿足關(guān)聯(lián)要求。

1.漏洞示例

存在缺陷的代碼:

// extend from EOSIO_ABI#define EOSIO_ABI_EX( TYPE, MEMBERS ) \extern "C" { \   void apply( uint64_t receiver, uint64_t code, uint64_t action ) { \      auto self = receiver; \      if( action == N(onerror)) { \         /* onerror is only valid if it is for the "eosio" code account and authorized by "eosio"'s "active permission */ \         eosio_assert(code == N(eosio), "onerror action's are only valid from the \"eosio\" system account"); \} \      if( code == self || code == N(eosio.token) || action == N(onerror) ) { \TYPE thiscontract( self ); \         switch( action ) { \            EOSIO_API( TYPE, MEMBERS ) \} \         /* does not allow destructor of thiscontract to run: eosio_exit(0); */ \} \} \}EOSIO_ABI_EX(eosio::charity, (hi)(transfer))

2.防御方法

使用

if( ((code == self  && action != N(transfer) ) || (code == N(eosio.token) && action == N(transfer)) || action == N(onerror)) ) { }

綁定每個(gè)關(guān)鍵 action 與 code 是否滿足要求,避免異常調(diào)用。

3.真實(shí)案例

EOSBet 黑客攻擊事件復(fù)盤

(https://medium.com/@eosbetcasino/eosbet-黑客攻擊事件復(fù)盤-13663d8f3f1)

參考文獻(xiàn)

  • 保管好私鑰就安全了嗎?注意隱藏在EOS DAPP中的安全隱患

    https://zhuanlan.zhihu.com/p/40625180

  • 漏洞詳解|惡意 EOS 合約存在吞噬用戶 RAM 的安全風(fēng)

    https://zhuanlan.zhihu.com/p/40469719

  • How EOSBET attacked by aabbccddeefg

    https://www.reddit.com/r/eos/comments/9fpcik/how_eosbet_attacked_by_aabbccddeefg/

  • BET被黑客攻擊始末,實(shí)錘還原作案現(xiàn)場和攻擊手段

    https://github.com/ganjingcun/bet-death-causes/blob/master/README.md

  • 累計(jì)薅走數(shù)百萬,EOS Dapps已成黑客提款機(jī)?

    https://mp.weixin.qq.com/s/74ggygC3nbDihLkobXOW2w

致謝

  • 麒麟工作組

  • eosiofans

  • 荊凱(EOS42)

  • 星魂

  • 島娘

  • 趙余(EOSLaoMao)

  • 字符

合約 漏洞 智能 安全 https
分享到:

1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。


主站蜘蛛池模板: 金联宇电缆|广东金联宇电缆厂家_广东金联宇电缆实业有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 纯化水设备-EDI-制药-实验室-二级反渗透-高纯水|超纯水设备 | 黄石妇科医院_黄石东方女子医院_黄石东方妇产医院怎么样 | 卷筒电缆-拖链电缆-特种柔性扁平电缆定制厂家「上海缆胜」 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 方源木业官网-四川木门-全国木门专业品牌 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 广州网站建设_小程序开发_番禺网站建设_佛山网站建设_粤联网络 | 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | 煤粉取样器-射油器-便携式等速飞灰取样器-连灵动 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 517瓜水果特产网|一个专注特产好物的网站 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 苏州工作服定做-工作服定制-工作服厂家网站-尺品服饰科技(苏州)有限公司 | 一航网络-软件测评官网 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 自动化展_机器人展_机床展_工业互联网展_广东佛山工博会 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 小型单室真空包装机,食品单室真空包装机-百科 | 订做不锈钢_不锈钢定做加工厂_不锈钢非标定制-重庆侨峰金属加工厂 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 |