漏洞影响

该漏洞表面上是一个放大5倍udp反射DDOS漏洞,但其对ETH的P2P网络的影响是非常大的,但是这个漏洞有很大的两个副作用,一个是ETH的发现节点池会不断的被堆满,导致正常节点无法加入,二是可屏蔽被攻击节点无法探索到任意子网的节点。

漏洞分析

先让我们来看看ETH P2P发现协议的文档,在https://github.com/ethereum/devp2p/blob/master/discv4.md这篇ETH P2P发现协议文档里是有对udp反射DDOS做防御的。

Pong Packet (0x02)
packet-data = [to, ping-hash, expiration]Pong is the reply to ping.ping-hash should be equal to hash of the corresponding ping packet. Implementations should ignore unsolicited pong packets that do not contain the hash of the most recent ping packet.

其方法就是通过签名PIng包并且让对方主机回复的Pong包要带上之前Ping包的hash才可以通过校验。这个从设计上来说是没什么问题的,然而go-ethereum在实现该协议的时候出了问题。

让我们来看看go-ethereum是怎么实现该协议的,在https://github.com/ethereum/go-ethereum/blob/master/p2p/discover/udp.go#L618

func (req *ping) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error {if expired(req.Expiration) {return errExpired}key, err := decodePubkey(fromKey)if err != nil {return fmt.Errorf("invalid public key: %v", err)}//收到ping包后马上回复pong包t.send(from, pongPacket, &pong{To:         makeEndpoint(from, req.From.TCP),ReplyTok:   mac,Expiration: uint64(time.Now().Add(expiration).Unix()),})n := wrapNode(enode.NewV4(key, from.IP, int(req.From.TCP), from.Port))t.handleReply(n.ID(), pingPacket, req)//如果没通过pong校验则发送一个ping包进行pong校验,如果通过pong校验则加入发现节点池if time.Since(t.db.LastPongReceived(n.ID())) > bondExpiration {t.sendPing(n.ID(), from, func() { t.tab.addThroughPing(n) })} else {t.tab.addThroughPing(n)}t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)})t.db.UpdateLastPingReceived(n.ID(), time.Now())return nil
}

由于我们是第一次连接,所以要进行pong校验,我们来看看go-ethereum是怎么实现协议中的pong校验的,在https://github.com/ethereum/go-ethereum/blob/master/p2p/discover/udp.go#L645

func (req *pong) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error {if expired(req.Expiration) {return errExpired}fromID := fromKey.id()//开始处理pong,如果没有请求过pong,就返回错误if !t.handleReply(fromID, pongPacket, req) {return errUnsolicitedReply}t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)})//刷新pong时间,通过pong校验t.db.UpdateLastPongReceived(fromID, time.Now())return nil
}

可见只要通过t.handleReply的校验我们就可以刷新pong时间通过校验了,让我们来看看t.handleReply 是怎么处理的https://github.com/ethereum/go-ethereum/blob/master/p2p/discover/udp.go#L369

func (t *udp) handleReply(from enode.ID, ptype byte, req packet) bool {matched := make(chan bool, 1)select {//放入gotreply等待返回matchedcase t.gotreply 

我们继续往下追

case r := 

这里基本能看出问题了,p.callback返回了false,只要不抛出错误,matched还是true,校验就算通过了,我们再来看看pong校验的callback是怎么处理的https://github.com/ethereum/go-ethereum/blob/master/p2p/discover/udp.go#L294

func (t *udp) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) 

所有,实际上go-ethereum并没有很好的实现pong校验,导致协议设计的防御机制彻底失效。

漏洞利用

  1. 伪造udp源地址

  2. 构造ping包发送到geth的p2p发现协议UDP端口,拉取pong请求

  3. 构造pong包发送到geth的p2p发现协议UDP端口,hash留空即可

  4. 然后再发送findnode包即可发射5倍以上udp流量

由于官方还未修补该漏洞,所以暂时不公布POC

漏洞演示

下面用go-ETH最新版1.8.21来演示

成功将UDP流量放大5倍反射到1.1.6.7

单个虚拟机测试,CPU占用率轻松达到50%

屏蔽受害节点无法发现指定网段节点:

文章来源:安全客

原文链接:

https://www.anquanke.com/post/id/170611

openssl漏洞怎么处理_以太坊UDP流量放大反射DDOS漏洞相关推荐

  1. 以太坊智能合约 Hexagon 存在溢出漏洞

    作者:zxx友善@360 0KEE Team 来源:https://www.jianshu.com/p/c5363ffad6a7 最近通过对智能合约的审计,发现了一些智能合约相关的安全问题. 其中我们 ...

  2. 以太坊地址和公钥_以太坊交易签名解析源码解读

    上篇文章<以太坊交易签名过程源码解析[1]>从源码角度分析了一个合约调用的的签名过程,签名后的交易发送到以太坊节点后,节点需要从签名交易中还原出公钥(从公钥中单向计算出账号地址),进而将交 ...

  3. 基于tutk方案的p2p源码_以太坊源码分析--p2p节点发现

    p2p(peer to peer)负责以太坊节点间的通信,主要包括底层节点发现(discover)和上层协议运行两大块,本文主要描述其中节点发现部分的实现 数据结构 节点发现功能主要涉及 Server ...

  4. 以太坊地址和公钥_以太坊地址是什么

    以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化. 以太坊使用Secp256k1椭圆曲线得到私钥.公钥,比特币使用的也是 ...

  5. 以太坊区块链同步_以太坊69:如何在10分钟内建立完全同步的区块链节点

    以太坊区块链同步 by Lukas Lukac 卢卡斯·卢卡奇(Lukas Lukac) Ethereu M 69:如何在10分钟内建立完全同步的区块链节点 (Ethereum 69: how to ...

  6. 以太坊区块链_以太坊区块链搭建与使用(一)-私有链

    步骤 一.下载go语言,并配置环境变量 //以太坊源代码依赖的编译与运行环境 二.通过git clone以太坊源码(go-ethereum),并编译 一.go安装 step1:下载 官方(一般打不开) ...

  7. eos和以太坊有什么关系_以太坊 2.0是什么?

    ETH2.0 是以太坊的计划升级方案.在接下来的几年里,ETH2.0 的设计者们计划完全革新以太坊的共识系统,并引入以太坊现有的世界状态.由于涉及面极广,我们也无法准确地说明 ETH2.0 将包括或者 ...

  8. 如何搭建socks5和ss节点_以太坊区块链搭建与使用(三)-联盟链

    首先对以下概念说明下: 一.以太坊大家都知道比特币使用的技术是区块链技术,比特币也是区块链技术的代表. 即比特币=区块链1.0随着区块链技术的发展以太坊也诞生了,也就是我们说的 区块链2.0.为什么说 ...

  9. 区块链开发_以太坊多重签名

    假想这么一个场景: 有一天,你的朋友A来找你开公司,但是钱不够,希望你能在找一个人入伙. 然后,你就找了你另一个朋友C. 你们三个人分别出了500W开公司.但是由于公司资金流动性大,每次拿钱都要三个人 ...

最新文章

  1. 终于来啦!国内首个3D视觉创新应用竞赛|三维重建技术
  2. matlab yalmip 例程,YALMIP工具箱使用范例.pdf
  3. PMP-【第4章 项目整合管理】-2021-1-18(88页-115页)
  4. 关于Java中何时使用static和工具类相关知识
  5. 用键盘全局钩子[Hook]监视多进程键盘操作
  6. Android之Gradle Plugin Samples 之Gradle Library Projects
  7. mysql 出现 quot_MYSQL 新版出现 Client does_mysql _ 搞代码
  8. C语言课后习题(31)
  9. 米斯特白帽培训讲义 工具篇 Nmap
  10. Spring : Spring Aop JDK动态代理调用过程
  11. mysql font连接数据库_MySQL-Front连接数据库的详细操作流程
  12. 百度网盘将推出单次会员服务;苹果回应否认操纵搜索结果;Node.js 12.7.0 发布 | 极客头条...
  13. Oracle Concepts Guide 中 Oracle 实例 和 数据库 【关系图】
  14. pandas.Series
  15. java 7下载地址
  16. VSCODE设置绿豆沙主题
  17. diy服务器个人主机_小型企业及个人用户入门级服务器DIY
  18. Cross Domain Person Re-Identification With Large Scale Attribute Annotated Datasets参考文献解读
  19. key mysql_调整MySQL中的key_reads
  20. 蓝牙连接测试系统软件,蓝牙测试软件官方版

热门文章

  1. python产品缺陷_基于python从redmine-api中获取项目缺陷数据(1)
  2. android汉字笔顺数据库,Chinese stroke order app
  3. python入门之函数调用educoder_Educode Python入门之函数调用
  4. php ajax jquery 表单重复提交,Jquery 防止Ajax重复提交权威解决方案
  5. java 多线程同步_浅谈Java多线程(状态、同步等)
  6. java追加一个sheet_(二)POI-创建一个sheet页,并添加行列数据
  7. Docker进阶-资源管理Swarm+Portainer
  8. 【读书笔记】iOS-设计简单的Frenzic式益智游戏
  9. 真恶心,用安卓模拟器开微信不能找附近的人
  10. 获取窗口上指定控件集合 2012-08-22 16:14 498人阅读 评论(0) 收藏...