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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
简介:

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符号执行原理 — 汇智网

目录
相关文章
|
3天前
|
域名解析 缓存 网络协议
DNS解析过程原理!
DNS解析过程原理!
|
12天前
|
域名解析 负载均衡 网络协议
【域名解析DNS专栏】DNS解析中的Anycast技术:原理与优势
在互联网中,DNS将域名转换为IP地址至关重要。Anycast技术通过将同一IP地址分配给多台地理上分散的服务器,确保客户端总能连接到最近且最轻载的服务器,从而加速DNS解析、实现负载均衡、提升抵御DDoS攻击的能力及服务高可用性。通过动态路由协议如BGP实现,Anycast极大地增强了DNS系统的性能和稳定性。
34 2
|
1天前
|
域名解析 存储 缓存
域名服务器 (DNS):工作原理及其优势
【8月更文挑战第19天】
11 0
|
4天前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
19 0
|
6天前
|
域名解析 缓存 负载均衡
深度解析Nginx正向代理的原理与实现
Nginx虽然主要被用作反向代理,但也可以通过一些特殊配置用作正向代理。虽然不是它的主流用途,但它仍能以其高性能和高稳定性为用户提供代理服务。不过,出于安全性和匿名性的考虑,在使用它作为正向代理时须谨慎配置,并根据实际需求做出调整。
21 0
|
7天前
ArrayBlockingQueue原理解析
该文章主要讲述了ArrayBlockingQueue的实现原理。
|
15天前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
43 6
|
8天前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
31 1
|
8天前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
21 1
|
22天前
|
负载均衡 Java Spring
@EnableFeignClients注解源码解析
@EnableFeignClients注解源码解析
47 14

热门文章

最新文章

推荐镜像

更多