【链安科技】EOS部分智能合约漏洞

2018年6月27日,链安科技利用VaaS-EOS自动化合约审计工具对多个EOS合约进行了安全审计,发现存在整型溢出等问题,部分合约实现不够严谨。为了便于大家在EOS平台写出更加安全的智能合约,我们将发现的一系列问题进行了分析和总结,并给出了建议。

主要存在的问题包括: 一、存在整型溢出错误; 二、权限检查不严谨; 三、API函数的不规范使用; 四、常规代码错误。

EOS合约存在不严谨之处

我们通过对已审核的EOS合约分析,发现存在如下主要问题:

1、存在整型溢出错误 使用自己的数据结构描述代币,对代币数值进行算数运算时未进行安全检查。在误操作时容易产生整型溢出错误,可能导致代币量归零甚至变成负数的严重结果!

2、权限检查不严谨

权限检查不严谨,造成逻辑漏洞。部分代币合约设置了冻结账户和代币的功能,然而用户将检查 “冻结” 的代码仅仅放在transfer(转账)函数中,从而导致执行issue(发行代币)的时候不受“冻结”状态影响,可以任意增发代币。

image

3、API函数的不规范使用

注意EOS API函数的参数类型。如 string_to_symbol(uint8_t , const char *),第一个参数传入的整型变量需要小于256,若使用该API前未对输入进行检查,则可能导致整型溢出,从而导致操作了错误类型的代币,带来严重后果。

image

4、常规代码错误

数据库API使用不严谨,如multi_index中提供的get和find。其中get会检查数据是否查询成功,数据未找到则断言退出,而find不会检查数据查询情况,需要用户自行判断,如果缺少判断直接使用将会导致指针使用问题。

image

如何避免将会导致的风险

既然EOS代币合约存在不严谨之处,那么作为项目方应该如何去防范后期可能造成的风险呢?我们给出下面三种建议方法:

1.合约中使用官方提供的 asset 数据结构描述代币,对代币的算数运算同样利用asset完成。

image

2.在使用multi_index的find函数时,一定要进行返回值的检查。

image

3.对所有输入都通过断言检查有效性,调用API函数前,检查参数类型和大小。

最后,建议代币合约参照EOS官方给出的eosio.token示例进行实现,避免疏忽从而导致安全检查不完备。

项目方应该引起足够的重视

EOS代币合约虽然目前还没有上线,但是项目方一定不能掉以轻心,避免再次重蹈整型溢出等问题引发的代币被盗事件。

总体而言,我们认为从目前审计EOS代币合约所遇到的问题来看,开发者在合约敏感代码(如操作代币数额)前后,一定要做好参数限制和权限检查,使用EOS API时一定要搞清楚该函数的输入限制和返回值形式,同时多多参考官方的示例实现。

另一方面,智能合约安全作为一个关键的链上交易程序,一旦部署将无法撤销。因此,项目方合约开发完成后除了自己做好测试外,选择专业的第三方单位进行安全审计也是很有必要的,因为安全审计公司能多角度分析合约代码,找出开发者容易忽略的问题,做到事先预防安全事件的发生。

本文转载自《EOS部分智能合约漏洞》,已获得授权转载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏酷玩时刻

Android版-支付宝APP支付

补充(20170513) 支付宝APP支付可以使用沙箱环境测试。如需开启测试模式只需要在OnCreate中添加如下代码。沙箱环境测试APP支付中请使用沙箱版钱...

8674
来自专栏XAI

企业支付宝账号开发接口教程--JAVA-UTF-8(实际操作------SpringMVC+JSP)

关于即时到账的开发。审核通过。简单测试如下。 希望看的可以收藏或者赞一下哦。 1:拥有自己的支付宝企业账号。去产品商店选择适合自己的方案。并签约合同。 ? 2:...

1.4K9
来自专栏圆方圆学院精选

【许晓笛】 EOS 智能合约案例解析(2)

之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能...

1405
来自专栏工科狗和生物喵

FreeRTOS-Qemu 实现三任务同步通信机制以及API信息

---- 1. 本次作业的考察要点: 作业地址:https://github.com/HustWolfzzb/STM32F429DiscoveryFreeRTO...

1.1K6
来自专栏数据之美

修改 mysql/oracle/bash/vimrc/cmd 提示符格式与颜色

(1)修改mysql提示符: MySQL 客户端的默认提示符是 "mysql>",基本上没什么实际作用。其实可以修改这个提示符,让它显示一些有用的信息,例如当前...

26010
来自专栏一个番茄说

Swift中防止ptrace依附

在移动开发中,安全是一个很重要的话题,当然安全是没有绝对的,只能说尽可能的提高安全性。在iOS的开发中,为了防止别人窥视我们的App,我们得采用一些手段来进行防...

1253
来自专栏圆方圆学院精选

【许晓笛】49行代码就能发币?而且EOS连例子都给你了

Daniel Larimer 在他的博客介绍了EOS新的智能合约架构(EOS团队的开发速度实在是太吓人,根本追不上)。他给出了最简单的一个新币种的智能合约代码,...

1821
来自专栏圣杰的专栏

ABP入门系列(10)——扩展AbpSession

源码路径:Github-LearningMpaAbp 一、AbpSession是Session吗? 1、首先来看看它们分别对应的类型是什么? 查看源码发现Ses...

3586
来自专栏开发与安全

linux网络编程之进程间通信基础(二):死锁、信号量与PV原语简介

一、死锁 (1) 死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发...

2560
来自专栏圆方圆学院精选

【杨镇】【中译修订版】以太坊的分片技术官方介绍

本文的目的是为那些希望理解分片建议详情,乃至去实现它的朋友提供一份相对完整的细节说明和介绍。本文仅作为二次方分片(quadratic sharding)的第一阶...

1251

扫码关注云+社区

领取腾讯云代金券