Professional Documents
Culture Documents
EOSFuzzer
EOSFuzzer
脆弱性检测* #
黄玉河计算机科学 Bo Jiang†北京航空航天 W.K.陈
学院 大学计算机科学与工程 计算机科学系
北京航空航天 学院 香港城市大学
大学的工程 中国北京 wkchan@cityu.edu.hk
中国北京 jiangbo@buaa.edu.cn
huangyuhe@buaa.edu.cn
EOSIO 区块链平台的功能和特征被设计得非常灵活,可以修改
以适应特定的业务需求。共识、收费计划、账户创建和修改、 在预期情况下,EOSIO 智能合约只接受通过 EOSIO 转移的
token 经济等区块链核心功能在系统智能合约[30]中实现,系统智 EOS。令牌系统合同。如果受到攻击的合同是脆弱的,因为它不检
能合约部署在 EOSIO 区块链平台上。为例。eosio。令牌系统智能 查代码是 eosio。令牌当动作在其应用函数内传输时,攻击者可以
合约[24]定义了结构和 直接调用契约内的传输函数
2
EOSFuzzer: Fuzzing EOSIO 智能合约漏洞检测
伪造 EOS 转账。因此,脆弱的合约可能会错误地认为攻击者已经
将 EOS 转移给了它。 帐户 B 可以使用 require_recipient 函数故意将转移通知转发给另
如表 1 所示,在 EOSBet 契约的 apply 函数中,它只检查代码 一个合同(本例中为 eosbetcasino),以便误导它,如表 4 所示。表
是契约本身还是 eosio。令牌,但它不检查动作传输是否最初被发 4。攻击者编码发送伪造的传输
送到 eosio。令牌系统智能合约。因此,攻击者契约可以直接调用 通知
脆弱契约的传递函数进行赌博,而不花费任何 EOS。 1 类别 contractB: public eosio::contract {
2 公众:
表 2。攻击者合同的假冒 EOS 传输漏洞
3. eosio::contract(self) {}
1 类 hackcontract: public eosio::contract { 4 void transfer(uint64_t sender, uint64_t receiver) {
2 … 5 require_recipient (N (eosbetcasino));
3. void hack(account_name self, eosio::资产数量, std::string memo) { 6 }
7 };
4 eosio::操作 (
5 eosio: permission_level {_self, N(活动 )}, 如表 5 所示,eosbetcasino 是脆弱的,因为它不检查目的地(即
6 N
(eosbet), EOS 传递本身就在其传递函数内。那么,它可能会错误地认为自己
7 N(转移), 已经收到了 EOS。因此,它可能错误地记入攻击者的账户 a,而实
8 std::make_tuple(self, N(eosbet), quantity, 际上攻击者并没有向 eosbetcasino 发送任何信息。
memo)).send();
9 }}; 表 5 所示。智能合约 eosbetcasino
1 class eosbetcasino: public eosio::contract {
如表 2 所示,黑客可以使用攻击者契约来利用假冒的 EOS 传输 2 公众:
漏洞。这种攻击很简单:它直接对 EOSBet 的传输函数执行内联调用。 3. void transfer(uint64_t sender, uint64_t receiver) {
4 自动数据= unpack_action_data<st_transfer>();
表 3。修复了假冒 EOS 转移漏洞
5 if (data.from == _self) //不检查 data.to
1 … 6 返回;
2 / /应用功能 7 doSomething
3. void apply(uint64_t receiver, uint64_t code, uint64_t action){ ();
4 auto self = receiver; 8 }
5 if(code == self || code == N(eosio.token) || action == N(onerror)){ 9 };
6 if(action == N(transfer)){
7 eosio_assert(code == N(eosio.token), "必须转移 EOS"); 如表 6 所示,对伪造的转账通知漏洞的修复是简单的检查转账的目的
8 } 地(第 5 行)。如果 EOS 转账的目的地不是当前合同,那么合同应该直
9 …
接忽略转账通知。表 6 所示。伪造转账通知的修复
脆弱性
如表 3 所示,建议修复漏洞的方法是在 apply 函数中添加一个
1 class eosbetcasino: public eosio::contract {
check,确保 eosio。token 是传输操作的原始接收者(第 6 行和第 7 2 公众:
行)。换句话说,当操作被传输时,代码必须是 eosio.token。 3. void transfer(uint64_t sender, uint64_t receiver) {
3.2 伪造转账通知 4 自动数据= unpack_action_data<st_transfer>();
当调用合约的传递函数时,智能合约可能永远不会检查目的地 5 if (data.from == _self || data。_self ! =)
(即:,至)的转让。然而,这是容易受到攻击的,因为智能合约可 6 返回;
7 doSomething
能只接收到转移到另一个合约的通知,而不是转移到它自己。 ();
在 正 常 的 EOS 转 账 过 程 中 , 接 收 方 合 同 可 以 选 择 通 过 8 }
require_recipient 将转账通知转发到其他账户(即发送转账行动的 9 };
副本)。伪造传输通知攻击[22]时,攻击者控制两个账户 a 和 B,
通过系统合约 eosio.token 将 EOS 从 a 转移到 B 进行初始化攻击。 3.3 块信息依赖
当转账成功时,A 和 B 都会收到转账通知。然而,合同部署在
由于缺乏随机性来源,EOSIO 智能合约可能依赖于区块信息
内部
如 tapos_block_prefix 和 tapos_block_num 来生成随机数,这些随
机 数 可 能 决 定 EOS 的 转 移 或 彩 票 的 中 奖 者 。 但 是 ,
tapos_block_prefix 和 tapos_block_num 不是可靠的随机性来源,因
为它们
黄玉河,江波,陈伟强
图 1 EOSFuzzer 工作流程
4
EOSFuzzer: Fuzzing EOSIO 智能合约漏洞检测
授权在测试中的当前智能合约上工作。使用其他相关智能合约的
常量数据,定位与偏移量对应的字符串(如果它是 string 类型的),并
名称和 public_key 可能需要进一步分析项目中智能合约之间的关
将其保存在 vector memo 中,作为 memo 参数的候选项(第 9 至 12
系,我们将此作为未来的工作。
行)。
对于数组数据类型,我们的算法将迭代地为其原始数据类型成
当传递函数中存在与传递函数签名相同的函数或传递函数中存在
员生成输入。对于 struct 数据类型,我们的算法将迭代地为其每个
与 memo 参数无关的其他常数字符串时,分析可能会变得不精确。
成员生成输入。如果它的成员是 struct 数据类型,算法也将递归地
然而,我们使用开源契约的分析表明,备忘录向量只包含少量的不
进行,直到遇到基元类型。
相关候选,这仍然是有效的模糊。
对于每个智能合约,输入生成算法将生成一个包含一组测试用
伪造 EOS 传输攻击代理的设计。 一个安全编写的智能合约将检查
例的测试套件。每个测试用例都是 ABI 函数调用和攻击交互(从代
代码是否是 eosio。当动作在 apply 函数中传输时。因此,为了触
理契约)到 fuzzing 下的智能契约的组合。测试用例中的函数调用
发假冒 EOS 传输漏洞,我们使用名为 fakeTransferAgent 的攻击者
和攻击交互的数量是随机长度的,可以在 EOSFuzzer 中配置。
合约,使用不同于 eosio.token 的代码在 fuzzing 下调用智能合约的
为 Memo 参数生成种子。memo 参数是传递函数中使用的一个参 传输函数。调用涉及两个场景,它们都在 fakeTransferAgent 的传递
数。根据我们的分析,我们发现发送方和接收方可以使用字符串
函数中执行。一种是用等于接收者(即模糊下的合同)的代码调用传
类型的 memo 参数来确认和保护一个传输操作。为了为 memo 参
递函数,另一种是用不同于接收者和 eosio.token 的代码调用传递
数生成种子,我们的算法将对测试中的智能合约执行静态分析,
函数。因此,代理合约将在 fuzzing 下对智能合约执行两种可能的
以提取传递函数中使用的字符串。
攻击。
表 8 所示。用于提取候选备忘录字符串的静态分析 一种攻击是在 fuzzing 下对智能合约的传递函数执行内嵌函数调
1 getMemoStrings(vector length, string param) { 用。换句话说,我们的工具故意避免使用 eosio。执行传输操作的
2 向量<字符串>备忘录 令牌契约。在这种攻击中,代码等于接收者(即。fuzzing 下的智能
3. 设置<字符串>补 合约)。
偿 另一种攻击是首先使用 cleos 工具调用 fakeTransferAgent 智能合
4 在所有带有像 param 这样签名的函数中
约 的 传 递 函 数 。 然 后 , fakeTransferAgent 智 能 合 约 将 通 过
5 for 指令包含" "i32 。const”“{
6 从指令中提取偏移量
require_recipient 在 fuzzing 下将行为转发给智能合约。通过这种方
7 offsets.insert(抵消) 式,fuzzing 下的智能合约将收到一个 transfer action,代码等于
8 } fakeTransferAgent,这与两个 eosio 都不同。令牌及其本身(接收方)。
9 for offset in offsets 最后,如果攻击成功触发了 fuzzing 下的智能合约传递函数,则
10 foreach 指令包含偏移量 { 认为该智能合约是脆弱的。
11 从指令中提取字符串 伪造传输通知攻击者代理的设计。为了有效地触发伪造传输通知
12 memos.insert(字符 漏洞,我们设计了一个通知代理合约来装载攻击。为了发起攻击,
串)
13 } EOSFuzzer 将首先通过 eosio 向通知人合同发送一些 EOS。令牌
14 返回的备忘 智能合同。然后,通知程序合约将通过 require_recipient()函数将
录 传递操作转发给智能合约。最后,EOSFuzzer 漏洞检测模块在收
15 }
到通知后,会对智能合约在 fuzzer 下的行为进行分析,判断其是
否存在漏洞。
如表 8 所示,getMemoStrings 函数提取可能用于与传递函数中
的 memo 参数进行比较的候选字符串。wast 参数是 fuzzing 下智能
4.3 Fuzzing 执行引擎
合约的 WebAssembly 文本格式。EOSFuzzer 使用 wasm2wat 工具 生成了用于 fuzzing 智能合约的输入后,fuzzing 执行引擎负责
[33]将 wasm 字节码转换为 waste 表示。参数是一个字符串,表示 执行针对 EOSIO 智能合约的输入。fuzzing 执行引擎利用 cleos 工
返回值的数据类型和传递函数的参数(即。,字符串" (param i32 i64 具与智能合约进行交互。在我们的设计中,EOSFuzzer 创建了一
i64 i32 i32) "))。在第 4 行,算法迭代所有带有签名的函数,如传 个管道来与 cleos 进程通信。它调用 cleos 工具的 push action 命令
递函数(即,具有相同类型的参数和返回值)。在每个函数中,它迭 来
代代码中包含常量值的每条指令(即:,包含 i32.const),并在这些
函数中提取相应常量变量的偏移量(第 4 行到第 7 行)
黄玉河,江波,陈伟强
6
EOSFuzzer: Fuzzing EOSIO 智能合约漏洞检测
不精确,因为 EOSIO 没有强制 ABI 接口和实际实现之间的一致
性。
5 实验与结果分析
在本节中,我们展示了我们的模糊实验来评估 EOSFuzzer 漏洞检
在我们的智能合约 fuzzer 过程中,EOSFuzzer 会多次发起来自
测的有效性。
通知代理的攻击,只有在所有来自通知代理的攻击中没有对 EOS
转移收件人进行检查时,才满足!CheckRecipient 条件。由于 Fuzzer 5.1 课题项目
可能不会遍历接收方检查代码的每一条路径,EOSFuzzer 可能会在 我们实验研究中使用的课题程序包括 82 个开源 EOSIO 智能合约
报告伪造传输通知漏洞时产生误报。但是,当模糊尺度较大时,产 和 3881 个无源代码智能合约。82 开源智能合约主要用于手动验证
生假阳性的概率会非常低,这也被我们的实验评估所证实。 我们工具的有效性。然而,收集大量带有源代码的 EOSIO 智能合约
块信息的依赖。检测块信息依赖的测试 oracle 如下: 是困难的,因为大多数 EOSIO dapp 都不是开源的。3881 个没有源
BlockInfoRead & EOSTransferCalled 代码的智能合约只包含 Wasm 字节码和 ABI 文件,它们用于大规模
block foread 测试 oracle 检查是否有 api 调用读取块信息。在实 评估我们的工具。对于带有源代码的智能合约,我们首先将其编译
现过程中,这是通过检测 tapos_block_num 和 tapos_block_prefix 成字节码,然后将其部署到我们的测试网中进行 fuzzing。对于只使
API 来实现的。EOSTransferCalled oracle 检查 eosio 的传递功能是 用 Wasm 字节码的智能合约,我们直接将它们部署在我们的测试网
否正常。称为令牌智能合约。EOSFuzzer 通过简单地测量 eosio 的 中。
传递函数来实现这一点。令牌系统智能合约,并在 EOSIO 内重新 5.2 实验设置
部署。
实 验 是 在 码 头 内 进 行 的 。 docker 的 主 机 是 一 台 配 备 了 8 核
4.5 讨论 Intel®Core™i7- 6700 CPU @ 3.4GHz 和 16GB 内存的台式机。该主机
在本节中,我们从两个方面讨论对 EOSFuzzer 可能的扩展。 使用的是 Ubuntu 16.04.1 和 Docker 18.06.1 版本。此外,docker 运行
首先,EOSFuzzer 被设计为黑盒模糊器,但它也可以扩展为灰 的是 Ubuntu 18.04.4。我们在 docker 的 Ubuntu 操作系统中运行了仪
盒模糊器。扩展的关键是在模糊过程中收集代码覆盖信息。目前, 器化的 EOSIO 客户端(节点)和 EOSFuzzer。使用的 EOSIO 客户端是
EOSFuzzer 仪器各种字节码指令在 WASM 虚拟机。我们可以通过 nodeos 1.5.2 版本。EOSFuzzer 通过 cleos 工具与 EOSIO 节点对话。
在 VM instrumentation 中收集分支覆盖信息来扩展 EOSFuzzer:每当 在执行 fuzzing 实验之前,我们必须正确配置 EOSIO 测试网。
遇到分支指令时,我们可以记录两个分支的位置以及新分支的覆 首先,我们启动 keosd 钱包来提供密钥管理器服务守护进程,用
盖范围。增量分支覆盖信息可用于指导基于突变的灰盒模糊过程。 于存储私钥和签名数字消息。其次,我们运行插装的 nodeos 守护
新的变异和选择策略可以进一步提高模糊算法的有效性。 进程来启动单节点测试网。第三,我们部署了仪器化的 eosio。令
其次,EOSFuzzer 也可以扩展到支持新漏洞的检测。例如,回 牌系统智能合约和攻击者代理合约。第四,我们创建了 2 个
滚漏洞[10]是赌博 DApp 智能合约中的一个漏洞。本质上,漏洞在 EOSIO 账户,与攻击者代理合同合作,在攻击期间执行 EOS 转移。
于赌博智能合约的揭示功能,所有的行为都位于单一交易中。因 最后,我们将 fuzzing 下的智能合约部署到 EOSIO 测试网。部署
此,每当攻击者输掉赌博游戏时,就可以恢复整个事务以恢复其 的智能合约包括 3881 个无源代码智能合约和 82 个带源代码智能
平衡。我们可以扩展 EOSFuzzer,使用另一个攻击者代理来实现上 合约。
述攻击场景。通过简单的扩展,EOSFuzzer 框架可以轻松地支持在 当 EOSIO 测试网配置好后,我们进一步配置了 EOSFuzzer,
fuzzer 下对合同的 EOS 转移、揭示函数的调用、攻击者代理平衡 使其在每个智能合约上执行大约 1000 次交叉 ABI 函数调用和代
的检查以及 revert 操作的调用。 理合约攻击。最后,我们开始使用 EOSFuzzer 对部署的智能合约
执行 fuzzer。
5.3 实验与结果分析
在本节中,我们首先展示 EOSFuzzer 在有源代码和没有源代
码的契约上的结果。然后进一步比较 EOSFuzzer 和 EVulHunter
工具[17]的漏洞检测效果。EVulHunter 是一款基于静态分析的
EOSIO 智能合约漏洞检测工具。最后,给出了 EOSFuzzer 在漏
洞检测方面的有效性。
EOSFuzzer 结果与源代码的合同。 EOSFuzzer 漏洞检测结果如
表 9 所示。的
黄玉河,江波,陈伟强
假的 EOS 转移 82 2 1 0 9 8 0
8
EOSFuzzer: Fuzzing EOSIO 智能合约漏洞检测
在 82 个智能合约中,EVulHunter 成功分析了 74 个智能合约。 表 14。EVulHunter 伪造 EOS 转账的假阳性案例
其他 8 个合同都无法输出。在 74 份智能合同中,EVulHunter 报告
了 12 份存在伪造转移通知漏洞的智能合同。但是经过人工检查, 1 类 token:公共契约{
我们发现其中有 10 个是假阳性。此外,EVulHunter 错过了 2 个易 2 …
3. };
受攻击的智能合约。因此,EOSFuzzer 工具在检测伪造传输通知
4 EOSIO_ABI(eosio::token, (create)(issue)(transfer))
漏洞时优于 EVulHunter。
5 //默认动作映射的宏
如表 13 所示,智能合约 salescon 是 EVulHunter 伪造传输通知
漏洞的假阳性案例。它使用断言语句(即:, eosio_assert)执行条
EOSFuzzer 结果没有源代码的合同。 我们还仅使用字节码和
件检查。然而,EVulHunter 工具似乎只适合使用 if 语句进行条
件检查,在使用断言时导致误判。在我们的手动确认过程中,当 ABI 对 3881 EOSIO 智能合约进行了 fuzzing。如表 15 所示,
我们将契约中的断言语句更改为 if 语句时,EVulHunter 工具将 EOSFuzzer 共识别出 3 个块信息依赖漏洞、183 个伪造传输通知
不再生成假阳性。 漏洞、265 个伪造 EOS 传输漏洞。3881 份智能合约中,区块信
息依赖率为 0.07%,伪造转账通知率为 4.72%,伪造 EOS 转账率
表 13。伪造转账通知书的假阳性案例。由 EVulHunter 为 6.83%。没有源代码,很难手动验证那些报告的智能合约,以
1 类[[eosio::contract]] salescon: public eosio::contract { 识别假阳性和假阴性的准确数量。但研究结果给了我们一个估计,
2 … 在野生环境中易受攻击的智能合约的数量。
3. void salescon::transfer(name from, name to, asset quantity, string 考虑到潜在的大量伪造转账通知和假冒 EOS 转账漏洞,建议
memo) 开发人员在公开发布 EOSIO 智能合约之前进行安全检查和加固合
4 {… 同。
5 eosio_assert(from == buyer, "Transfer must come from buyer"); /
/转让必须来自买方 表 15。智能合约的 EOSFuzzer 结果没有
6 eosio_assert(to == _self,“合同不是收件人”);/ / 源代码
7 eosio_assert (quantity.symbol.is_valid(),“无效的数量”);
漏洞检测
8 … 脆弱性 总计 百分比
EVulHunter 工具伪造传输通知漏洞的一个假阴性案例是智能合 块信息。依赖 3881 3. 0.07%
约 vigor。在分析过程中,EVulHunter 工具未能找到任何间接调用 伪造转让通知 3881 183 4.72%
的路径。然而,EOSFuzzer 工具在 fuzzer 过程中确实找到了间接
调用的路径。因此,EVulHunter 在其静态分析过程中似乎不够精 假的 EOS 转移 3881 265 6.83%
确。
对于假冒的 EOS 转移漏洞,EOSFuzzer 发现了 2 个漏洞,而 EOSFuzzer 效 率 。 在 对 每 个 合 约 进 行 fuzzer 时 , 我 们 将
EVulHunter 工具报告了 9 个漏洞。然而,经过人工检查,我们发现 EOSFuzzer 配置为对每个智能合约执行大约 1000 次交叉 ABI 函
EVulHunter 报告的 9 个漏洞中有 8 个实际上是假阳性的。相反, 数调用和来自代理合约的攻击。对于每个合约,fuzzing 实验平
EOSFuzzer 报告的 2 个漏洞中只有 1 个是假阳性的。因此,对于假 均需要 90 秒左右,基于我们实验的硬件配置,这是很小的。此
冒 EOS 转移漏洞,EOSFuzzer 产生的误阳性率要比 EVulHunter 低 外,平均每秒调用约为 11 次,这对于全面的模糊足够快了。部
得多。 分原因是基于 DPOS 共识协议的 EOS 具有较高的交易速度。因
如表 14 所示,EVulHunter 报告 token 智能合约为虚假 EOS 转 此,EOSFuzzer 对于 EOSIO 智能合约漏洞检测也是非常有效的。
移漏洞。但是,在令牌契约中,它使用 EOSIO_ABI 宏进行默认操
对易受攻击的合同发起攻击
作映射。EOSIO_ABI 只能处理 code 等于 self 的情况。因此,
token 合同不能处理来自 eosio 的 EOS 转移。令牌的合同。它只是 我们还成功地对名为 diamond1 的智能合约发起了攻击,以在我
处理 EOS 以外的代币的合同。因此,token 合同是 EVulHunter 的 们的测试网中获得 EOS。因为 diamond1 没有提供源代码,所以我
一个假阳性案例。 们 基 于 它 的 ABI 接 口 对 它 的 字 节 码 进 行 了 模 糊 处 理 。 除 了
EOSFuzzer 中定义的测试 oracle 外,我们还检查了 diamond1 的
EOS 余额在每次 ABI 调用后是否减少(fuzzer 之前初始化为 1000
EOS)。换句话说,我们想要确保 fuzzing 下的合同资产在攻击中丢
失。
黄玉河,江波,陈伟强
10
EOSFuzzer: Fuzzing EOSIO 智能合约漏洞检测
自动定位原始种子输入文件的区域,影响在关键程序攻击点使用的
参考文献
值。然后,BuzzFuzz 工具通过模糊原始种子输入文件的这些识别区
Abdellatif, T., Brousmiche, K.L.“基于用户和区块链行为模型的智能合
域,自动生成新的模糊测试输入文件。 约正式验证”,《2018 第九届 IFIP 国际新技术、移动和安全会议
Chen 等人[3]提出了一种名为 Angora 的基于突变的模糊器, 论 文 集 》 , 巴 黎 , 2018 , 第 1-5 页 , doi:
该模糊器提出使用可扩展的字节级污染跟踪、上下文敏感的分支 10.1109/NTMS.2018.8328737。
计数、基于梯度下降的搜索和输入长度探索技术来有效地解决路 “RESTler:有状态 REST API Fuzzing”,2019 IEEE/ACM 第 41 届软件工程
国际会议(ICSE ' 19),蒙特利尔,QC,加拿大,
径约束。Lyu 等[13]提出了一种新的突变调度方案,使基于突变 2019, pp. 748-758, doi: 10.1109/ICSE.2019.00083。
的模糊器更有效地发现漏洞。Chen 等人[4]提出了一种全局异步
Chen, P. and Chen, H., [3]“基于原则搜索的高效 Fuzzing”,《2018
和局部同步(GALS)种子同步机制来无缝集成基模糊器以获得更 IEEE 安全与隐私研讨会论文集》(SP’18),旧金山,2018,第
好的性能。 711-725 页,doi: 10.1109/SP.2018.00046。
You 等人[21]提出了 ProFuzzer,它可以自动恢复和理解在 Chen, Y., Jiang, Y., Ma, J., Wang, M., Zhou, C., Jiao, X., and Su, Z. Z.
fuzzer 过程中对漏洞发现至关重要的输入字段。模糊器可以智能 EnFuzz: ensemble fuzzzz with seed synchronization .(通讯作者)在第 28
届 USENIX 安全研讨会会议记录(第 19 章)。USENIX 协会,美国,
地调整突变策略,以提高击中零日目标的机会。 1967 - 1983,2019。
一般来说,与 EOSFuzzer 不同,上述 fuzzer 技术并不是专门 陈涛,张勇,罗旭,王涛,曹睿,肖新,张旭。2019。TokenScope:自动检
为检测 EOSIO 智能合约中的漏洞而设计的。 测以太坊中加密货币令牌的不一致行为。2019 ACM 计算机和通信安全
还有一些关于有状态模糊技术的有趣作品。AFLnet 采用了一种 SIGSAC 会议论文集(CCS ' 19)。计算机器的协会,纽约,纽约,美国,
变异的方法,并使用状态反馈来指导网络协议[16]的模糊过程。 1503-1520。
REST-ler[2]是一个有状态的自动智能 REST API 安全测试工具。 Dai, H., Murphy, C.,和 Kaiser, G.。“用于软件漏洞检测的配置模糊”,
《 2010 可 用 性 、 可 靠 性 和 安 全 性 国 际 会 议 论 文 集 》, 克 拉 科 夫 ,
REST-ler 通过推断 Swagger 规范中声明的请求类型之间的依赖关系 2010,525-530 页,doi: 10.1109/ ares2010.22。
来智能地生成测试。它还分析在之前的测试执行期间观察到的响应
Duy Tai Nguyen, Long H. Pham, Jun Sun, Yun Lin and Minh Quang
的动态反馈,以便生成新的测试。目前,EOSFuzzer 执行的 fuzzer Tran:“fuzzy:一种有效的自适应模糊控制”,第 42 届软件工程国际
是无状态的。在未来的工作中,我们可以扩展 EOSFuzzer,在数据 会议论文集。IEEE 计算机协会,2020 年。
流分析的支持下执行有状态的 fuzzer。 Ganesh, V., Leek, T., and Rinard, M.。“基于污染的定向白箱模糊”,
《IEEE 第 31 届软件工程国际会议论文集》,温哥华,BC, 2009, pp.
9 结论与未来工作 474-484, doi: 10.1109/ icce .2009.5070546。
EOSIO 智能合约的漏洞给用户造成了重大损失。因此,需要有 基于语法的白盒模糊法。发表在第 29 届 ACM SIGPLAN 编程语言设计与
效的工具来检测 EOSIO 智能合约中的漏洞。在这项工作中,我们 实现会议论文集(PLDI ' 08)。计算机器的协会,纽约,纽约,美国,
206-215。
提 出 了 EOSFuzzer , 一 个 黑 匣 子 fuzzer 工 具 , 可 以 自 动 检 测
何宁,张睿,吴磊,王辉,罗旭,郭勇,于涛,姜旭" EOSIO 智能合约的安全
EOSIO 智能合约中的漏洞。在 EOSFuzzer 中,我们提出了有效的 分析" .电子商务学报,2014,34 (6):1102 - 1104 . [10]" ArXiv abs/ 2003.06568,
攻击场景以及对 ABI 接口的调用,以对 EOSIO 智能合约执行全面 2020.
的 fuzzer。此外,我们还定义并实现了测试 oracle 来检测 EOSIO 以太坊名称服务契据合同的正式验证。http://yoichihirai.com/deed.pdf, 2016。
智能合约的三个典型漏洞。我们的 fuzzer 实验表明,EOSFuzzer 是 让智能合约更智能。第 23 届计算机与通信安全会议论文集(CCS ' 16),
有效和高效的检测 EOSIO 智能合约漏洞的实际使用。特别是, 254- 269,维也纳,奥地利,2016。
EOSFuzzer 已经成功地在没有源代码的情况下攻击 EOSIO 智能合 吕超,张超,李勇,李伟,宋勇,和 Beyah, R. MOPT:最优变异调度算法。
约,在不花费任何 EOS 的情况下下注。 在第 28 届 USENIX 安全研讨会会议记录(第 19 章)。USENIX 协会,
对于未来的工作,我们希望扩展 EOSFuzzer,以支持 EOSIO 美国,1949-1966,2019。
智能合约中新型漏洞的检测。我们还计划改进 EOSFuzzer 在 Nikolic, I., Kolluri, A., Sergey, I., Saxena, P., and Hobor, A. Ivica 2018。
大规模发现贪婪、挥霍和自杀的合同。在第 34 届年度计算机安全应
fuzzer 中搜索策略,以提高其针对复杂智能合约的漏洞检测效率 用会议(ACSAC ' 18)的会议记录。计算机器的协会,纽约,纽约,美
国,653-663。DOI: https://doi.org/10.1145/3274694.3274743
Parizi, R. M., Dehghantanha, A., Choo, K. K. R., and Singh, A. Reza
2018。区块链自动智能合约安全测试的经验漏洞分析。在第 28 届
年度会议上
黄玉河,江波,陈伟强
计 算 机 科 学 与 软 件 工 程 国 际 会 议 (CASCON ' 18)。 IBM 公 司 , 美 国 ,
103-113。
[16] Van-Thuan Pham, Marcel Böhme, Abhik Roychoudhury。AFLNet:网络协
议的灰盒模糊器。软件测试,验证与验证:测试工具轨道(ICST'20)。
2020.
全利进,吴磊,王昊宇。“EVulHunter:在 Webassembly 级别检测 EOSIO 智
能合约的虚假传输漏洞。ArXiv abs/1906.10362, 2019。
Tsankov P., Dan, A., Drachsler-Cohen, D., Gervais, A., Bünzli, F., and
Vechev M. 2018 。 Securify: 智 能 合 约 的 实 用 安 全 分 析 。 2018 ACM
SIGSAC 计算机和通信安全会议论文集(CCS ' 18)。计算机械协会,
纽 约 , 纽 约 , 美 国 , 67-82 。 DOI:
https://doi.org/10.1145/3243734.3243780
H。[19]王,李,Y。,林,年代,妈,L。,和刘,Y。“VULTRON:一劳永得地捕捉
易受攻击的智能合约”,《IEEE/ACM 第 41 届软件工程国际会议论文
集:新想法和新结果》,蒙特利尔,QC, 2019 年,第 1-4 页。
Wang, T., Wei, T., Gu, G., Zou。“TaintScope:一种用于自动软件漏洞检
测的 checksum 感知定向模糊工具”,发表在 2010 IEEE 安全与隐私
研讨会论文集(SP ' 10), Berkeley/Oakland, CA, 2010, pp. 497-512, doi:
10.1109/SP.2010.37。
youw ., Wang, X., Ma, S., Huang, J., Zhang, X., Wang, X., Liang,
B. .“ProFuzzer:实时输入类型探测以更好地发现零日漏洞”,《2019
IEEE 安全和隐私研讨会论文集》(SP ' 19),旧金山,美国,2019,pp.
769- 786, doi: 10.1109/SP.2019.00057。
EOS 押 注 [22] 攻 击 。 https://medium.com/leclevietnam/hacking-in-eos-
contracts-and-how-to-prevent-it-b8663c8bffa6。2020 年最后一次访问。
[23]克莱奥的工具。https://eos.io/build-on-eosio/cleos/。2020 年最后一
次访问。
[24] EOSIO.TOKEN。https://developers.eos。io /欢迎/最近/——开始/ smart-
contract-development / deploy-issue-and-transfer-tokens。2020 年最后一
次访问。
[25] EOSIO ABI 宏并应用。https://developers.eos。io / eosio - cpp / v1.2.0 /
docs / abi。2020 年最后一次访问。
EOS 智 能 合 约 中 的 虚 假 EOS 转 移 漏 洞 。
https://blog.peckshield.com/2018/11/02/eos/。2020 年最后一次访问。
EOS 智 能 合 约 中 的 [27] 伪 造 转 账 通 知
https://blog.peckshield.com/2018/10/26/eos/。2020 年最后一次访问。
无 年 龄 [28] 随 机 数 生 成 漏 洞 。
https://github.com/NoneAge/EOS_dApp_Security_Incident_Analysis/tr ee
/主/ noneage - 20181103 eosdice -预测-随机种子。
2020 年 最 后 一 次
访问。
EOS 上的[29]智能合约开发。https://developers.eos.io/welcome/latest/getting-
started/index。2020 年最后一次访问。
EOSIO 上 的 [30] 系 统 智 能 合 约 。
https://developers.eos.io/manuals/eosio.contracts/latest/index 。 2020 年 最
后一次访问。
EOSIO 智能合约[31]传递函数。https://developers.eos.io/manuals/eosio。cdt /
最近/最佳实践/ abi / abi - code-generator-attributes
解 释 / # eosioon_notifyvalid_eosio_account_namevalid_eosio_action
_name。2020 年最后一次访问。
[32] Web 组件。https://webassembly.org/。2020 年最后一次访问。
WebAssembly 二进制工具包。https://github.com/WebAssembly/wabt。2020
年最后一次访问。
12