ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Binary analysis, meet the blockchain:用 Manticore 符号执行剖析以太坊智能合约

Binary analysis, meet the blockchain:用 Manticore 符号执行剖析以太坊智能合约 【免费下载链接】publicationsPublications from Trail of Bits项目地址https://gitcode.com/GitHub_Trending/pu/publications点击查看免费下载本篇文章围绕 Trail of Bits 的演讲《Binary analysis, meet the blockchain》Mark MossbergNorthsec 2018 与 High Confidence Software and Systems Conference 2018系统讲解如何把经典的二进制分析技术——符号执行——引入以太坊智能合约审计。你将掌握 EVM 的字节码执行模型、符号执行与约束求解器的工作原理以及用开源工具 Manticore 对合约进行自动化漏洞检测的完整实践路径。演讲概览两个世界的一次握手二进制分析Binary analysis与区块链Blockchain原本分属两个领域前者研究传统可执行程序x86/ARM 等的逆向与漏洞发现后者则依赖以太坊虚拟机的去中心化执行环境。这篇演讲的主题正是把前者的核心武器——符号执行——移植到后者的智能合约场景中。演讲内容分三步展开介绍以太坊及其智能合约的执行模型EVM 字节码、账户、交易介绍符号执行的基本原理路径探索、约束求解、状态空间讨论两者结合时面临的独特技术挑战——区块链语义、约束求解器、虚拟机内部机制并最终落在 Manticore 这一开源实现上。Manticore 是 Trail of Bits 开发的开源符号执行引擎在本仓库中它的能力由多份配套资料佐证同主题的演讲 Automatic bugfinding for the blockchainEkoparty 2017详细阐述了 Manticore 作为支持 EVM 的动态符号执行引擎的设计与实现Symbolic Execution for HumansOReilly Security Conference 2017则从理论到实践介绍了符号执行的原理与 Manticore 的用法而 Manticore - EthCC 2018 工作坊提供了完整的可运行示例代码是本文实战部分的核心素材。为什么是符号执行与传统测试的差异在深入 EVM 之前先理解符号执行的价值。传统软件测试包括模糊测试每次只验证一次具体的程序执行路径而符号执行将输入抽象为符号值通过解释执行程序并在分支点收集路径约束从而同时推理大量可能的执行路径。其系统化特性带来两个直接收益高覆盖率只要约束可解每条可达路径都能被探索不再依赖人工构造的测试用例自动发现缺陷当某条路径以异常状态如REVERT、INVALID、溢出结束时求解器可以反解出触发该缺陷的具体输入。符号执行与模糊测试互补模糊测试擅长快速探索浅层路径符号执行则擅长深入复杂分支条件。DARPA Cyber Grand Challenge 等赛事已经证明了符号执行在自动化漏洞挖掘中的实战价值但对多数开发者而言它仍然陌生——这正是这篇演讲面向人类的科普动机。以太坊智能合约的技术语境EVM 与字节码执行模型智能合约部署在以太坊上以 EVM 字节码形式运行。EVM 是一个基于栈的虚拟机所有操作针对 256 位字进行。对二进制分析工程师而言EVM 更像一个目标指令集它是确定性、隔离的执行环境合约之间通过消息调用交互状态由账户账户余额、存储、代码构成交易触发代码执行并改变状态特殊的操作码如SSTORE/SLOAD访问存储、CALL发起跨合约调用、REVERT/INVALID终止执行构成了合约的安全关键面。为什么合约需要形式化分析Solidity 是主流的智能合约语言但仍然年轻。即便是一行看似无害的算术也可能在 256 位运算下溢出msg.sender的信任模型、转账与检查的顺序check-effects-interactions、重入攻击等都是审计中的高频缺陷。历史上多起大型攻击事件损失动辄数百万美元证明共识协议保证了执行的可信却无法保证合约逻辑的正确性。社区审计工具仍处于幼年期开发者常常忽略最基础的安全建议。因此面向 EVM 的符号执行不是学术炫技而是把成熟的程序分析理论移植到钱即代码的场景一次能覆盖全部可达路径的分析恰好匹配合约部署后不可修改的特性——上线前的自动化深度检查比上线后的补丁重要得多。符号执行 × 区块链独特的组合挑战把符号执行用到智能合约上并非简单地把已有引擎指向新指令集。演讲点出了三组核心挑战区块链语义合约的执行不孤立——它依赖调用者、消息值msg.value、区块状态时间戳、区块号和跨合约调用。符号执行必须把这些环境因素也符号化否则会丢失大量真实路径。此外一个合约可能被多次调用状态在调用间持续累积分析需要模拟多条交易序列而非单次调用。约束求解器EVM 的 256 位字宽让算术约束天然复杂SSTORE/SLOAD、CALL等操作产生与存储和跨合约状态相关的约束路径爆炸path explosion让朴素探索难以收敛。引擎需要在符号化、具体化concretization、启发式探索之间做取舍。虚拟机内部机制EVM 的栈模型、内存模型、gas 计量与调用深度限制都必须被精确建模。gas 不足导致的状态回滚revert本身就是一条值得分析的路径——真实攻击常利用 gas 边界。Manticore 正是针对这些挑战的实现它模拟区块链环境账户、存储、消息用 SMT 求解器处理路径约束并对 EVM 操作码逐一建模从而支持人工辅助 自动检测的审计工作流。实战用 Manticore 分析智能合约以下示例全部来自本仓库的 Manticore - EthCC 2018 工作坊作者 Josselin Feist可直接在 Manticore 环境中复现。环境与基本流程Manticore 面向 EVM 的入口是ManticoreEVM。一个完整分析流程包含四步创建区块链模拟器ManticoreEVM()创建账户与部署合约create_account/solidity_create_contract用符号值调用合约函数m.SValue检查终止状态并生成测试用例generate_testcase。simpleRun.py 是最小的完整示例from manticore.ethereum import ManticoreEVM # initiate the blockchain m ManticoreEVM() source_code pragma solidity^0.4.20; contract Simple { function f(uint a) payable public { if (a 65) { revert(); } } } # Initiate the accounts user_account m.create_account(balance1000) contract_account m.solidity_create_contract(source_code, owneruser_account, balance0) # Call f(a), with a symbolic value contract_account.f(m.SValue, user_account) print Results are in %s % m.workspace m.finalize() # stop the exploration关键点解读m.SValue表示符号输入。函数f(uint a)的参数a是符号值Manticore 会同时探索a 65进入revert()与a ! 65正常返回两条路径create_account(balance1000)创建外部账户模拟调用者solidity_create_contract(source_code, owneruser_account, balance0)以指定源码部署合约owner与balance分别对应部署者与合约初始余额每次运行的结果各路径的输入、输出、约束与测试用例都会写入m.workspace指向的工作目录m.finalize()停止探索并收尾。检测 REVERT / INVALID从路径约束到缺陷复现simpleThrow.py 演示了缺陷检测的标准模式遍历m.terminated_states检查最后一条交易的执行结果是否为REVERT或INVALID若是则生成测试用例from manticore.ethereum import ManticoreEVM m ManticoreEVM() # initiate the blockchain source_code pragma solidity^0.4.20; contract Simple { function f(uint a) payable { if (a 65) { throw; } } } # Initiate the accounts user_account m.create_account(balance1000) contract_account m.solidity_create_contract(source_code, owneruser_account, balance0) # Call f(a), with a symbolic value contract_account.f(m.SValue, calleruser_account) # Check if an execution ends with a REVERT or INVALID for state in m.terminated_states: last_tx state.platform.transactions[-1] if last_tx.result in [REVERT, INVALID]: print Error found in f() execution (see %s) % m.workspace m.generate_testcase(state, BugFound)在 Solidity 0.4.x 中throw编译为INVALID0.5 语义为revert()的REVERT因此检查last_tx.result属于REVERT或INVALID即可覆盖两种终止语义。m.generate_testcase(state, BugFound)会为该状态固化为可复现的具体输入。还原符号输入CONCAT 与路径约束simpleConstraint.py 展示了如何从字节码层还原出触发缺陷的具体参数值这对审计报告至关重要from manticore.ethereum import ManticoreEVM from manticore.core.smtlib import Operators from manticore.core.smtlib import solver m ManticoreEVM() # initiate the blockchain source_code pragma solidity^0.4.20; contract Simple { function f(uint a) payable { if (a 65) { throw; } } } # Initiate the accounts user_account m.create_account(balance1000) contract_account m.solidity_create_contract(source_code, owneruser_account, balance0) # Call f(a), with a symbolic value contract_account.f(m.SValue, calleruser_account) ## Check if an execution ends with a REVERT or INVALID for state in m.terminated_states: last_tx state.platform.transactions[-1] if last_tx.result in [REVERT, INVALID]: # return the first symbolic input input0 state.input_symbols[0] # skip the function id, and extract the 32 bytes corresponding to the first parameter input0 Operators.CONCAT(256, *input0[4:36]) # we do not consider the path were a 65 state.constrain(input0 ! 65) if not solver.check(state.constraints): print Error found in infeasible path continue print Error found in f() execution (see %s) % m.workspace m.generate_testcase(state, BugFound)这段代码的要点交易 calldata 的前 4 字节是函数选择器function id因此取input0[4:36]跳过它、截取第一个参数对应的 32 字节再用Operators.CONCAT(256, *...)拼成 256 位符号表达式state.constrain(input0 ! 65)人为排除a 65这条已知路径配合solver.check(state.constraints)验证剩余路径的可行性——这正体现了符号执行中约束即路径定义的核心思想你可以主动追加约束把分析聚焦到感兴趣的路径子集如果约束不可满足check返回 False说明该路径不可达输出相应提示后跳过。综合演练整型溢出与未保护钱包工作坊还提供了两道练习及其参考解法非常适合完整走一遍发现漏洞 → 构造约束 → 反解输入的闭环。溢出检测。overflow.sol 是存在隐患的合约pragma solidity^0.4.20; contract Overflow { uint public sellerBalance0; function add(uint value) public returns (bool){ sellerBalance value; // complicated math, possible overflow } }参考解法 overflow.py 展示了多交易序列分析与状态约束的组合from manticore.ethereum import ManticoreEVM from manticore.core.smtlib import Operators, solver m ManticoreEVM() # initiate the blockchain source_code ... # 即上述 Overflow 合约 # Generate the accounts user_account m.create_account(balance1000) contract_account m.solidity_create_contract(source_code, owneruser_account, balance0) #First add wont overflow uint256 representation contract_account.add(m.SValue, calleruser_account) #Potential overflow contract_account.add(m.SValue, calleruser_account) contract_account.sellerBalance(calleruser_account) for state in m.running_states: # Check if input0 sellerBalance # last_return is the data returned last_return state.platform.last_return_data # First input (first call to add) input0 state.input_symbols[0] # retrieve last_return and input0 in a similar format last_return Operators.CONCAT(256, *last_return) # starts at 4 to skip function id input0 Operators.CONCAT(256, *input0[4:36]) state.constrain(Operators.UGT(input0, last_return)) if solver.check(state.constraints): print Overflow found! see %s%m.workspace m.generate_testcase(state, OverflowFound)分析逻辑值得细读第一次add(m.SValue)不会溢出第二次add(m.SValue)才可能让sellerBalance value在 uint256 上回绕。脚本随后读取sellerBalance()的返回值last_return_data将第二次调用的输入值与当前余额都还原成 256 位表达式追加约束输入大于余额Operators.UGT(input0, last_return)——这正是加法溢出成立的充要条件若约束可满足即存在让余额回绕的具体输入Manticore 便生成测试用例。这里也示范了读取状态函数返回值并把它纳入约束分析的手法。未保护钱包。练习文件 unprotectedWallet.sol 对应典型的权限缺陷如withdraw未校验调用者参考解法 unprotectedWallet.py 的思路同样是符号化调用者/参数 → 约束出非预期调用者却成功取款的状态 → 反解触发输入。此外仓库中另一场 Devcon 4 工作坊 Using Manticore and Symbolic Execution to Find Smart Contracts Bugs - Devcon 4 提供了同主题的进阶示例 my_token.sol一个存在溢出与余额检查缺陷的代币合约可与本文示例相互印证。从演讲到工具链Manticore 在审计中的定位这场演讲的历史意义在于它把符号执行 × EVM从构想推进到了可用的开源工具并直接服务于 Trail of Bits 的智能合约审计业务。后续发展印证了这条技术路线的生命力——Manticore 的 EVM 能力随后被用于检测交易置换攻击Detecting Transaction Replacement Attacks with ManticoreEmpire Hacking 2020攻击者通过把自己的交易插队到合法交易之前来窃取奖励这种攻击非常隐蔽而符号执行可以系统性枚举交易的时序组合把API 是否可被置换变成可判定的问题。对今天的智能合约安全研究者而言这场演讲传递的方法论依然适用先建模再分析把 EVM 的栈、存储、gas 与交易环境精确建模是任何形式化工具的基础符号输入 路径约束 漏洞证据漏洞不只是被发现还能被反解成一组可复现的具体输入自动化与人机协作结合Manticore 的定位是人工辅助的自动检测——分析师负责制定约束与目标引擎负责穷举路径。进一步阅读演讲幻灯片Binary-analysis-meet-the-blockchain.pdf姊妹演讲Automatic bugfinding for the blockchainEVM 技术细节与常见漏洞类型理论入门Symbolic Execution for Humans实战工作坊Manticore - EthCC 2018、Manticore - Devcon 4应用延伸Detecting Transaction Replacement Attacks with Manticore赞分享【免费下载链接】publicationsPublications from Trail of Bits项目地址https://gitcode.com/GitHub_Trending/pu/publications点击查看免费下载相关推荐OCCT布尔运算完全手册10个实用技巧提升建模效率OCCT布尔运算完全手册10个实用技巧提升建模效率 Open CASCADE Technology OCCT 是一款强大的开源3D CAD开发平台其布尔运算图形学3D建模3D渲染LEDE智能合约节点部署LEDE智能合约节点部署 你还在为区块链节点部署繁琐的环境配置而烦恼吗是否想在嵌入式设备上搭建高效的区块链节点却不知从何下手本文将带你基于LEDELea嵌入式固件操作系统网络物联网上一篇推荐一款出色的Neovim配色方案OneDark.nvim下一篇AnyChat客户端开发完全指南基于juggle的轻量级WebSocket实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表