TheDAO周年祭--攻击事件回顾及区块链固有安全性分析

2023-10-17 05:59

本文主要是介绍TheDAO周年祭--攻击事件回顾及区块链固有安全性分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题记:若干年后,将来的新人类写《新史记》的时候,the DAO事件应该会是一个重要的篇章。

由于区块链的不可篡改的特性和存证的特长,the DAO事件的细节被完整地保存了下来,包括攻防双方的在以太坊区块链上的具体动作,如果说这是一场战争的话,那将是有史以来被最真实地记录下来的一场战争

因为the DAO出事了,所以备受关注。但是就算the DAO没有出事,它也照样会被载入史册,因为它出现标志着一种新的人类社会的组织形式。

说了这么多,可能有人还不知道the DAO是什么?

这么说吧,the DAO其实是一个去中心化运作的基金,任何人都可以往里面打钱,打钱后有了投票权,投给你喜欢的投资项目,进而享受收益。和以前的基金会不同,不需要配备会长、经理、秘书。所有会务都是通过区块链自动处理的。不同于人性的的不确定性,开源代码的运行结果是可预期的,具有确定性。很多人期望the DAO能够投石问路,开创一种新的社会组织形态。

正所谓“code is law”,代码即法律。

人和代码,哪一个更可信?

回顾这次著名的攻击事件之前,先准备预备知识:


预备知识1:以太坊两种不同的账户
  • 外部账户,由人类控制(通过拥有私钥)

  • 合约账户,由代码控制(代码即法律)只有合约账户才有fallback功能

那么哪个更可信?这涉及到信任的产生,一个陌生人,你不信任他;比特币也是代码控制,但是久经考验,就产生了信任。

说明信任涉及两个要素:
  • 时间 从事时间越长越容易取得信任

  • 考验 涉及很多因素,比如成功应对重大危险,比如你亲身体验可行


预备知识2:fallback函数是理解的关键

以太坊的智能合约之间可以相互调用。也就是说除了人类触发以外,智能合约之间也可以通过消息调用进行触发,消息调用分为如下2种情况:

  • 显式调用,比如A合约调用B合约的某个函数,传入什么参数,获得什么返回

  • 隐式调用,没有函数名,没有任何参数,是如下3种情况(这个过程叫做fallback)

    • 如果调用时,可能是函数名写错了,总之没有匹配的,就落到这个匿名函数上

    • 当合约收到了以太币(且不带extra data时)

    • 如果调用时没有data(像是处理一种异常情况)


学习完预备知识后,恭喜你,你就快要明白史上最复杂的黑客行为了,再加把劲,我梳理如下:

  1. the DAO其实是一个去中心化运作的基金,任何人都可以往里面打钱,打钱后有了投票权,投给你喜欢的投资项目,进而享受收益

  2. the DAO编写者还特别民主,考虑到一个“多数人暴力”的情况,就是你很有见解,但是大众很愚昧,你的投票被人否了,而且其他人都是多数,你因此承受了损失,怎么办?

  3. the DAO编写者针对“多数人暴力”开发了一个功能,叫做“分裂”,就是你这个聪明人不和愚昧大众玩了,你拉上少数派另立山头!

  4. “另立山头”就是由你这个聪明人申请建立子dao,你的钱从总dao里面打给子dao,以后你就是独立运作了。注意这里涉及了资金转移,这是关键因素

  5. 钱从总dao里面打给子dao是代码自动控制的,只要你申请了“另立山头”,且审查合理,审查通过后,经过n天的冷静期,你的钱就由代码自动打入子dao了,这是关键代码,这里因为没有考虑到fallback出错了,请看如下:
    这里写图片描述

里面的withdrawRewardFor是将钱从总dao打到你的子dao合约,注意前面提到的fallback函数,发送金额到你子dao合约时会触发fallback函数

如果你特别写了fallback是再调用总dao的withdrawRewardFor呢?

代码会重新运行withdrawRewardFor再给你打钱,而扣钱的代码在第二行,永远都不会运行到!!!

所以问题:

  1. 扣钱的代码在打钱的代码后面,反面教材

  2. 两类地址设计缠在一起,这个设计比较稳妥的是打钱给外部账户(也就是打钱给人),但是因为两类地址格式和权限上没有区分,也可以打给合约,偏巧合约还有fallback功能。

  3. fallback函数功能不合理,为啥有3种功能一起,到底是打款后处理还是处理异常的,固有设计缺陷

如果我们在以太坊的基础上设计新一代区块链系统,能从theDAO事件中学到什么呢?

启示:

  1. 资金流和信息流分开。一个没有经过检验的代码控制几亿的资金,是不稳妥的。交易链在设计上可以有这样的模式:资金流和信息流分开,对ICO特别合适。主链打款,子链记名。子链几乎没钱,谁来偷?

  2. 智能合约的定义和调用权限要分开。在主链定义,且要经过认证的才能定义。调用也分init权限和普通权限。init权限也要经过认证的才能调用,且init时可以指明参与者。

结论

theDAO攻击事件和最近的Parity多签钱包攻击事件,分别造成了数亿美元的损失,给尚在幼年的区块链技术带来重大打击,通过对攻击细节的分析,显示作为区块链重大流派的以太坊技术上存在固有安全缺陷。失败是成功之母,这一次次的攻击提示我们要将安全性放在区块链架构设计的首要位置进行考虑,本文作了有益的探索,希望能抛砖引玉,希望区块链技术更加安全更加完善,臻于成熟。


这里写图片描述
如上就是老外画的theDAO循环攻击的一个例子,构造一个攻击合约,调用被攻击合约(其在正常的取钱函数中打钱给攻击合约),关键在于判断额度的动作在打钱之后;攻击合约精心构造了一个fallback函数,每次收钱后都调用,结果会再次调用被攻击合约(又运行到了取钱函数),打钱又触发fallback函数,也就是说打钱永远会被执行,扣额度永远不会被执行。钱就这么出去了。

这篇关于TheDAO周年祭--攻击事件回顾及区块链固有安全性分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/223407

相关文章

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

web网络安全之跨站脚本攻击(XSS)详解

《web网络安全之跨站脚本攻击(XSS)详解》:本文主要介绍web网络安全之跨站脚本攻击(XSS)的相关资料,跨站脚本攻击XSS是一种常见的Web安全漏洞,攻击者通过注入恶意脚本诱使用户执行,可能... 目录前言XSS 的类型1. 存储型 XSS(Stored XSS)示例:危害:2. 反射型 XSS(Re

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re