阿里DNS:用LibFuzzer照亮DNS代码的死角

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【阿里DNS团队】在很久之前就已经认识到恶意报文防御在整个DNS系统安全稳定保障工作中的重要性,也花了非常大的精力在这个方面做了很多的研究和实践,今天我们就简要介绍一下我们在DNS代码白盒Fuzzing测试方面的一些工作,以供跟大家交流和学习。

1 引言

2018年11月初,国内某云解析服务提供商出现大规模服务不可用故障,在业界引起了不小的震动,以下是官方的故障复盘公告:

cc767bdc04c1e1ad5c2533e422bdce8c3a1e6bdf

技术复盘中很明确地说明了此次故障的起因:大量恶意请求报文攻击触发了软件的bug或漏洞,导致解析服务不可用。

作为域名解析保有量亚洲第一、全球第二的权威域名托管服务商,【阿里DNS团队】打造的阿里云云解析产品和服务(https://help.aliyun.com/product/29697.html),一直致力于通过技术的力量让整个解析服务更加稳定、更加安全和更加快速,在用户服务体验上持续改进。

【阿里DNS团队】在很久之前就已经认识到恶意报文防御在整个DNS系统安全稳定保障工作中的重要性,也花了非常大的精力在这个方面做了很多的研究和实践,下面就简要介绍一下我们在DNS代码白盒Fuzzing测试方面的一些工作。

2 技术方案选型

恶意报文攻击的核心在于攻击者利用了软件处理数据报文的漏洞或者bug,导致软件执行异常或者异常退出,进而导致服务不可用。恶意报文攻击防御要解决的核心问题是尽可能早和尽可能全的发现软件中存在的漏洞,因此需要系统的方法和工具来解决这个问题。

而软件漏洞挖掘属于软件安全或者代码安全的范畴,而阿里巴巴集团安全团队的同学在软件漏洞挖掘领域有非常成熟的可工程落地的经验,因此我们可以利用这些已有的工具和方法帮助我们高效地挖掘DNS软件的漏洞。经过分析和比对,我们最终选定的方案是通过Libfuzzer对DNS软件进行白盒Fuzzing测试。

那么我们为什么使用LibFuzzer呢?

LibFuzzer是一种支持持续执行,基于代码覆盖率的引导式模糊测试引擎。LibFuzzer与被测试的代码链接,然后通过特定的模糊入口(也称为“目标函数”)将模糊输入的样例集提供给LibFuzzer。模糊器跟踪代码会执行到哪些代码块并且收集程序崩溃,内存溢出,内存泄漏等错误,同时对输入数据根据代码覆盖率产生突变,以便最大化覆盖代码达到模糊测试的目的。LibFuzzer的代码覆盖信息由LLVM的SanitizerCoverage指令执行提供。

LibFuzzer相比其他模糊测试平台有如下几个优势:

  • 基于代码覆盖率的引导式模糊测试引擎,相比其他黑盒模糊测试平台如peach,codenomicon等商用工具,其成本低廉,并且代码路径覆盖更加自主可控。
  • LibFuzzer在对网络协议进行模糊测试时不会解析完成后退出,并且LibFuzzer的输入为一串指定长度的字节序列,模糊测试改造更简单,更适合网络协议白盒fuzz测试的场景。
  • 原有单元测试用例改造简单高效,可以按照统一框架生成新的单元测试,提高原有测试资产质量和问题发现概率。
  • 基于地址消毒剂技术进行内存监控,能过发现传统测试方法很难检测到的深层次内存溢出和少量内存泄露问题。

3 实战案例

数组越界异常是一种非常不好发现的运行时异常,代码编译阶段是不容易被发现的,一般隐藏的也比较深,bug重现的触发条件一般也比较严格,测试输入构造起来难度相对比较大,是一种典型的恶意报文攻击的目标。那么我们事先在DNS解析代码里面构造了几处数组越界的漏洞,看看通过LibFuzzer大神是否能够帮我们快速发现它们的藏身之处。

3.1 环境准备

源码编译LibFuzzer很是麻烦,幸运的是Clang在6.0版本之后已经天然集成了LibFuzzer,这样就只需下载新版本的Clang即可。如果觉得Clang源码安装也很麻烦可以直接选择编译好的release版本。Clang下载链接http://releases.llvm.org/download.html

3.2 接口改造

环境配置完毕之后开始进行模糊测试改造,被改造的目标函数要遵循一下几个要求:

  • 被测代码必须能接受任意输入(大,小,非法)。
  • 被测代码不能有执行exit()的分支
  • 如果使用多线程,多线程要在被测函数退出时join。
  • 被测代码不应该修改任何全局状态。
  • 被测代码的执行速度要尽可能的快,避免高复杂度的运算,记日志等。

我们选择了DNS报文的入口函数,即解析DNS报文的接口进行模糊改造,改造代码如下:

f886a27b3723b6cdbed3a7c77254634038f05652


由于被测程序基于DPDK开发,为了提升模糊测试的效果,需要将DPDK也进行改造。DPDK原生支持Clang编译,需修改dpdk/mk/toolchain/clang/rte.vars.mk

edaaa5421957190fc09bfe6e0fc4c22bcb406876

执行dpdk-setup.sh

d9189b7b0a370e69e0a028502cde41b207d32e88


选择12使用Clang编译DPDK。由于解析DNS报文的接口在业务流程上属于偏上层的接口,对其他代码有依赖,为了单独测试这一个接口,需要把其他依赖代码编译成静态库供LibFuzzer调用。

准备工作都完成之后可以编译fuzz taget了。

c06b1bc80e8ad1e87654082969f4461c13e5f1cb


3.3 开始测试

准备工作都就绪,现在可以测试了。

首先不指定语料库直接执行编译获得的可执行程序:

59e3a570d6924fc7e47901db248e805762102ef7

运行了一会儿就发现了一处越界错误:

a02f89cf900b5bec97e3c5395347b45d4a850095
5f7d4c5f9c17fe3db3007c822b38619124f08dd4

3.4 分析异常

发现问题,解决问题,我们再来看代码,问题出现在函数adns_dname_wire_check,该函数的作用是检查DNS query name和合法性,并且把query name都转成小写(DNS协议不区分大小写),其中问题出现在这么一段代码中:

74cffc703097537d23b6eabe7f50a829e63ff822


因为DNS协议规定一个域名wire format的最大长度为255字节,因此lower_name是一个长度为255字节的数组,用来存转小写后的query name,在给lower_name数组循环赋值的时候没有判断wire_len是否已经越界,如果遇到超长非法域名则lower_name数组会写越界。lower_name是一个局部数组,写越界就会写坏后面的栈空间,是一个高危风险。

3.5 测试结论

可见,LibFuzzer非常快速地帮我们发现了我们事先构建的数组越界异常,让我们在代码发布前就可以及早发现代码异常。

为了提高模糊测试效率,也可以指定语料库运行fuzz测试。语料库可以使用CZNIC收集的DNS报文的集合,https://github.com/CZ-NIC/dns-fuzzing。

执行方法:

a57ccc91526b51fe76960822d0043034504bceb5


针对DNS报文解析接口的fuzz测试最终发现了全部的数组越界异常。限于篇幅原因,本文不逐一分析。

4 写在最后

(1) DNS稳定性大于天

DNS作为网络基础服务,又是一种相对陈旧的网络协议,很容易受到黑客攻击,这几年针对DNS的攻击层出不穷,而一旦DNS出现了问题,影响波及范围广,影响力大,因此DNS是我们必须坚守的阵地。打铁还需自身强,在和攻击者的博弈中,需要对开发运维各个环节多维度收敛问题,尽力将风险降到最低。

(2) 不积跬步,无以致千里

Fuzz测试就是一个很好的从软件本身出发,查漏补缺的入口。虽然结合代码的白盒模糊测试虽然效果很好,但是需要按照接口函数逐个改造测试,工程量巨大,整个测试体系的建立是一个慢工出细活的过程,需要慢慢积累。

【阿里DNS团队】始终将软件可靠性放在第一位考虑,持续在软件可靠性上进行资源投入,通过黑盒+白盒结合的方式,以更高性价比的方式持续挖掘漏洞。

5 参考资料

http://llvm.org/docs/LibFuzzer.html


相关文章
|
27天前
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】Foxmail邮箱在人工智能领域的应用方法及代码解析
Foxmail邮箱作为一款流行的邮件客户端软件,主要用于个人和企业的邮件收发、管理等功能。虽然它与人工智能(AI)技术有着潜在的融合点,但直接关于Foxmail邮箱在人工智能方面的应用代码并不是常规的讨论内容,因为邮箱客户端本身并不直接包含复杂的AI算法或代码。
134 58
|
13天前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
30 1
|
13天前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
12 1
|
14天前
|
Java 开发者 UED
“Java开发者必看:异步编程实战解析,掌握这些技巧,让你的代码跑得更快!
【8月更文挑战第30天】随着互联网技术的发展,系统性能和用户体验成为关注焦点。异步编程作为提高应用响应速度和吞吐量的技术,在Java中广泛采用。本文详细介绍了Java异步编程的概念与优势,并通过实战示例展示了如何利用Future、Callable及CompletableFuture在实际项目中实施异步编程,帮助开发者更好地理解和应用这一技术。
29 2
|
27天前
|
机器学习/深度学习 人工智能 自然语言处理
【热门开源项目】阿里开源巨擘:Qwen-2 72B深度解析与推荐
在人工智能的浪潮中,开源模型如同璀璨的星辰,指引着开发者们探索未知的领域。而今天,我们将聚焦在阿里云推出的开源模型Qwen-2 72B上,从其项目介绍、技术特点、代码解析等多个角度,深入解析并推荐这一卓越的开源项目。
72 1
|
13天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
34 0
|
13天前
|
开发者 图形学 C#
揭秘游戏沉浸感的秘密武器:深度解析Unity中的音频设计技巧,从背景音乐到动态音效,全面提升你的游戏氛围艺术——附实战代码示例与应用场景指导
【8月更文挑战第31天】音频设计在游戏开发中至关重要,不仅能增强沉浸感,还能传递信息,构建氛围。Unity作为跨平台游戏引擎,提供了丰富的音频处理功能,助力开发者轻松实现复杂音效。本文将探讨如何利用Unity的音频设计提升游戏氛围,并通过具体示例代码展示实现过程。例如,在恐怖游戏中,阴森的背景音乐和突然的脚步声能增加紧张感;在休闲游戏中,轻快的旋律则让玩家感到愉悦。
27 0
|
13天前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
34 0
|
13天前
|
图形学 开发者
【Unity光照艺术手册】掌握这些技巧,让你的游戏场景瞬间提升档次:从基础光源到全局光照,打造24小时不间断的视觉盛宴——如何运用代码与烘焙创造逼真光影效果全解析
【8月更文挑战第31天】在Unity中,合理的光照与阴影设置对于打造逼真环境至关重要。本文介绍Unity支持的多种光源类型,如定向光、点光源、聚光灯等,并通过具体示例展示如何使用着色器和脚本控制光照强度,模拟不同时间段的光照变化。此外,还介绍了动态和静态阴影、全局光照及光照探针等高级功能,帮助开发者创造丰富多样的光影效果,提升游戏沉浸感。
31 0
|
13天前
|
开发者 图形学 UED
深度解析Unity游戏开发中的性能瓶颈与优化方案:从资源管理到代码执行,全方位提升你的游戏流畅度,让玩家体验飞跃性的顺滑——不止是技巧,更是艺术的追求
【8月更文挑战第31天】《Unity性能优化实战:让你的游戏流畅如飞》详细介绍了Unity游戏性能优化的关键技巧,涵盖资源管理、代码优化、场景管理和内存管理等方面。通过具体示例,如纹理打包、异步加载、协程使用及LOD技术,帮助开发者打造高效流畅的游戏体验。文中提供了实用代码片段,助力减少内存消耗、提升渲染效率,确保游戏运行丝滑顺畅。性能优化是一个持续过程,需不断测试调整以达最佳效果。
30 0

相关产品

  • 云解析DNS
  • 推荐镜像

    更多