智能合约安全工具Mythril工作原理解析【Symbolic Execution】

简介:

Mythril是一个基于符号执行技术的以太坊智能合约安全工具,其预置的检测模块可以发现合约中存在的一些安全问题,例如整数溢出和重入漏洞。本文的目的是学习理解Mythril的符号执行机制,以便开发自己的Solidity安全分析模块。

用自己熟悉的语言学习以太坊DApp开发:Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

Mythril的设计目标之一是让安全分析工具更简单易用。换句话说 就是你不需要是计算机科学领域的博士就可以从符号化分析中获益。

1、符号执行概述

为了说明Mythril的运行机制,我们需要先了解Mythril使用的核心技术 —— 符号执行(Symbolic Execution)。如果你之前已经比较了解符号执行的一般思路,那么本文有助于帮助你梳理相关的概念。

我认为解释符号执行的最简单的方法是真正执行它并画图展示出执行过程中发生的事情。为此,我们将使用下面的solidity函数作为我们分析的目标,让我们看看是否可以使用符号化分析来得出函数的结果为10。

2、具体执行: Concrete Execution

在我们开始符号执行之前,先看看具体执行的结果。我们可以用多个不同的输入来执行函数execute(uint256)。例如对于输入4,将产生如下的执行过程:

Initial state (function entry): 
- currently executing: line 1 
- input = 4 
step1: 
- currently executing: line 2 
- input = 4 
- result = uninitialized 
step2: 
- currently executing: line 3 
- input = 4 
- result = 0 
step3: 
- currently executing: line 6: 
- input = 4 
- result = 0

上述过程的图形化表示如下:
在这里插入图片描述

我们可以尝试不同的输入,直到找出可以让函数返回10的输入,这种方法被称为模糊测试(Fuzzing)。

3、符号执行:Symbolic Execution

最后我们要符号化执行程序了。这意味着我们不再将具体的输入(例如4)带入程序执行,而是用一个符号来指代具体的输入。将该符号称为x,x可以是任何有效的uint256值。现在让我们再次执行程序。

前两步的执行简单直白,容易理解:

在这里插入图片描述

现在开始进入有趣的部分。在第3行输入与10进行比较,但是输入是x,它可以是任何具体的值,因此,x > 10和 x < 10都是可能的。如果这种情况发生,我们可以创建两个新的状态分支,其中一个对应 x > 10,另一个对应x <= 10。我们还需要记录这些约束,这样就可以决定具体的输入将执行哪个路径。

现在让我们将状态图扩展到下一步的执行:

在这里插入图片描述

下面是我们通过符号化执行生成的状态。有了这些符号化的状态,我们可以写一个简单的程序来找出什么输入值可以得到输出10。

for state in states:
  # Let's filter all the states that are not return statements
  if state.currently_executing != 6:
    continue
  # We want the result to be 10, let's formulate that as a constraint
  result_constraint = (state.result == 10)
  
  # If it is possible to satisfy both the path constraints (these are the constraints collected on each branch)
  # and the result constraint then there must be an input that makes the function return 10
  if is_possible(result_constraint and state.constraints):
    # Using SMT solving we can get an input that will satisfy all the constraints and make the function return 10
    print(give_satisfying_input(result_constraints and state.constraints))

查看上述代码的执行结果,可以清楚地了解只有状态3和状态5需要考虑。

对于状态3,函数is_possible(result_constraint and state.constraints)将返回false,因为对于该状态我们得到result =0。

现在看一下状态5,我们发现了一些更有趣的东西。让我们看一下这里考虑的两个约束:result == 10 and x > 10 。容易看到第一个约束必须满足,也容易确定 x > 10可以满足,例如对于输入11。我只是手动找了一个值来满足上述约束。再Mythril中,实际上是利用一个SMT(Z3)求解器来找出是否可能满足这些约束条件,而且Z3还可以给出一个可以满足约束条件的具体示例,这让我们可以构建一个实际输入来让函数返回10。

作为函数execute分析的结论,我们可以说:

  1. 输出为10的可能性存在
  2. 可以使用输入11得到输出10

4、结语

在这篇文章中,我们介绍了如何用符号执行来分析一个简单的示例函数,并介绍了如何编写一个简单的分析模块。在后续的文章中,我们将分析更多更有趣的安全漏洞。


原文链接:Mythril符号执行原理 — 汇智网

目录
相关文章
|
10月前
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
9月前
|
机器学习/深度学习 人工智能 JSON
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
1186 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
|
8月前
|
存储 人工智能 API
离线VS强制登录?Apipost与Apifox的API工具理念差异深度解析
在代码开发中,工具是助手还是枷锁?本文通过对比Apipost和Apifox在断网环境下的表现,探讨API工具的选择对开发自由度的影响。Apifox强制登录限制了离线使用,而Apipost支持游客模式与本地存储,尊重开发者数据主权。文章从登录策略、离线能力、协作模式等方面深入分析,揭示工具背后的设计理念与行业趋势,帮助开发者明智选择,掌握数据控制权并提升工作效率。
|
9月前
|
机器学习/深度学习 数据可视化 PyTorch
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
657 7
深入解析图神经网络注意力机制:数学原理与可视化实现
|
9月前
|
机器学习/深度学习 缓存 自然语言处理
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
1173 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
|
10月前
|
数据采集 存储 调度
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
231 1
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
|
9月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离开发中,API调试至关重要。本文探讨有无调试工具时如何高效调试API,重点分析Postman、Swagger等工具优势及无工具代码调试方法。通过实际场景如用户登录接口,对比两者特性。同时介绍Apipost-Hepler(IDEA插件),将可视化与代码调试结合,提供全局请求头配置、历史记录保存等功能,优化团队协作与开发效率,助力API调试进入全新阶段。
|
9月前
|
传感器 人工智能 监控
反向寻车系统怎么做?基本原理与系统组成解析
本文通过反向寻车系统的核心组成部分与技术分析,阐述反向寻车系统的工作原理,适用于适用于商场停车场、医院停车场及火车站停车场等。如需获取智慧停车场反向寻车技术方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
716 2
|
9月前
|
JSON 监控 物联网
WebSocket 调试全攻略:核心解析、工具选择与对比!
WebSocket 是一种全双工、实时交互的网络通信协议,适用于即时通信、实时数据流、多人协作、IoT 等场景。调试 WebSocket 时,工具应具备握手管理、实时消息收发、自定义 Header、消息大小告警、分组管理、多连接支持和断线重现等功能。主流调试工具如 Postman、ApiPost 和 ApiFox 各有优劣:Postman 界面友好适合基础调试;ApiPost 支持高级功能如消息分组和自动重连;ApiFox 则强化了多连接支持。选择工具时需根据具体需求和团队熟悉度决定。
|
9月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离的开发模式中,API 调试的效率直接影响项目的质量和交付速度。通过本文的对比分析,我们可以看到无工具调试模式虽具备灵活性和代码复用能力,但在操作便利性和团队协作上稍显不足。而传统的外部调试工具带来了可视化、高效协作与扩展性,却可能存在工具切换带来的开发链路断层问题。Apipost-Hepler 融合了两者的优势,让开发者无需离开熟悉的 IDEA 环境,就能享受可视化调试工具的强大功能。
313 5

热门文章

最新文章

推荐镜像

更多
  • DNS