对 5G协议的漏洞挖掘研究
2021-12-17 12:50:00 Author: www.4hou.com(查看原文) 阅读量:17 收藏

如果你曾经对Fuzzing有过深入研究,你会很快意识到它并不像看起来的那么简单:变异、输入、输出。

有许多不同类型的Fuzzer,对5G协议的研究专注于网络Fuzzer。这种Fuzzer非常适合对电信产品、协议进行Fuzzing。当这些应用程序的输入是通过网络套接字而不是传统的命令行界面时,Fuzzer的输入选项就会很少。

在这篇文章中,我将介绍Fuzzing的基本背景,然后再深入探讨使用专用和开源Fuzzer对电信 5G 协议进行Fuzzing的具体细节。我的目标是探索这些Fuzzer是否适合Fuzzing 5G 网络协议。整篇文章包括对 fuzzer 的比较、发现的一些漏洞以及关于 5G 电信协议的 fuzzing 的结论。

尽管在文中引用了一个发现的示例漏洞,但这项研究的重点是在 5G 电信协议方面使用不同的Fuzzer,而不是发现的特定漏洞。

0x01 背景知识

什么是Fuzzing?Fuzzing是向被测程序、系统发送随机输入试图导致目标崩溃或故障的自动化过程。

Fuzzing 并不是一项新技术,但它在当今的软件开发生命周期中变得越来越重要,通常用于挖掘软件中的漏洞,因为正常的单元、系统测试可能会遗漏这些漏洞。

虽然 fuzzing 的概念很容易掌握,但实际实现一个好的 fuzzer 是非常具有挑战性的。

由于软件的复杂性不断增加和软件保护的需要,Fuzzing在软件开发测试中火了起来。虽然系统单元测试更有用,也就是测试软件执行其设计的目的;但模糊测试也是非常重要的,也就是测试软件处理意外输入而崩溃。

传统的 fuzzer 倾向于专注于对软件进行Fuzzing,并通过命令行或输入文件生成输入。但是,Fuzzing网络协议有点不同,它需要通过网络端口发送输入。任何通信通常都涉及多个网络协议,并且这些协议相互叠加。一些协议是无状态的,而另一些协议有状态,这就增加了fuzzing的复杂性。由于网络协议的性质,被测系统 (SUT) 可以是本地的(在同一物理/虚拟机上)或在远程物理/虚拟机上。这些差异增加了使用网络协议对 SUT 进行Fuzzing的挑战。

Fuzzing 5G 协议的另一个困难是访问 5G 内核或组件。我测试了两个开源解决方案Free5GCOpen5GS。选择 Open5GS 是因为它比 Free5GC 更稳定且更易于安装。这些解决方案都不是商业级的,但它们确实为Fuzzing 5G协议提供了合理的测试目标。

[Free5GC](https://github.com/free5gc/free5gc)
[Open5GS](https://github.com/open5gs/open5gs)

0x02 认识Fuzzer

一个内部开发和两个开源网络协议Fuzzer可用于测试:Fuzzowski 5GC、Frizzer 2AFLNet 3。从测试用例的生成到对结果的反馈,它们有完全不同的Fuzzing方法。

[Fuzzowski 1](https://github.com/nccgroup/fuzzowski)
[Frizzer 2](https://github.com/demantz/frizzer)
[AFLNet 3](https://github.com/aflnet/aflnet)
[BooFuzz 4](https://github.com/jtpereyda/boofuzz)

之所以选择Fuzzowski 1,是因为它以前曾用于Fuzzing网络打印机协议,并且是从开源项目BooFuzz 4 改造开发的。Fuzzowski 是开源的,但是这里用于 fuzzing 5G 的修改版本目前不是开源项目。

Frizzer是一个黑盒 fuzzer,它使用动态二进制检测提供覆盖反馈来指导 fuzzer,不需要源代码或重新编译 SUT。

AFLNet 可用于比较,因为 AFL 是一个使用良好且能力已被证明的Fuzzer,AFLNet 建立在 AFL 之上,以使用网络响应执行网络Fuzzing和跟踪状态变化。

Fuzzowski 5GC

Fuzzowski 5GC 是一个基于模板的突变、遗传Fuzzer。指定了输入的格式,并且根据数据类型使用选定的算法来改变格式中定义的值。

Fuzzowski 5GC 可以Fuzzing消息序列,但它没有状态概念。由于 Fuzzowski 5GC 有Fuzzing数据结构,它可以修复校验和和长度字段,这有助于避免解析错误,从而阻止对协议栈更深层部分的测试。

Fuzzowski 5GC 是一个黑盒Fuzzer,这意味着除了网络 API 之外,它对 SUT 一无所知。

img

Frizzer

Frizzer 是一个黑盒引导的基于突变的Fuzzer。它使用示例输入并使用Radamsa 7对其进行随机变异。它使用Frida 6 动态检测 SUT 以提供代码覆盖率反馈。

[Radamsa 7](https://gitlab.com/akihe/radamsa)
[Frida 6](https://frida.re/)

img

AFLNet

AFLNet 是一种基于引导突变的Fuzzer。它使用示例输入并根据不同的变异算法随机变异输入。不知道输入数据格式,并使用来自网络消息传递的状态反馈来指导Fuzzing过程。

AFLNet 是一个灰盒Fuzzer,使用源代码检测来生成代码覆盖率反馈。

img

0x03 测试环境

为了测试Fuzzer,使用了运行Open5GS 5的 ubuntu 环境。

[Open5GS 5](https://github.com/open5gs/open5gs)

Open5GS 是使用 C 语言编写的 5G 内核和 EPC 的开源实现。选择 Open5GS 来模拟 5G 内核,因为它可以免费获得并得到积极维护。由于它不是商业产品并且是用 C 编写的,因此它是Fuzzing的理想目标,因为它不太可能经过彻底的测试。它也更有可能主要关注功能,而不是安全性。

由于开源产品和商业产品的协议规范是相同的,网络消息格式应该代表真正的5G内核网络。我选择将测试范围限制为查看 NGAP、GTPU、PFCP 和 DIAMETER 协议,我将在下面简要说明。

所有Fuzzer都针对 Open5GS 软件的 AMF 组件进行了测试,以对更复杂的 NGAP 协议进行Fuzzing。该理论认为,作为更复杂的 5G 协议之一,它出现错误的可能性更高——但是,由于其复杂性,它也更难以进行Fuzzing。

Fuzzowski 5GC 还针对其他 5G 组件进行了测试,以对 GTPU、PFCP 和 DIAMETER 协议进行Fuzzing。

发现这些协议中的漏洞及其实施可能会导致各种类型的攻击场景,例如拒绝服务、权限提升、远程代码执行、用户信息泄露和捕获。

GTPU

GPRS 隧道用户数据协议 (GTPU) 实际上是一种相对简单的基于 IP 的隧道协议,它可以在每组端点之间有许多隧道。它用于在不同网络节点之间建立用户平面数据隧道。在我的测试中,这是 gNB 和 UPF 之间的 N3 接口。

PFCP

数据包转发控制协议 (PFCP) 有助于在用户平面功能内建立、修改和删除 Sx 会话。从控制平面功能传递到用户平面功能的 PFCP 规则包括数据包检测规则 (PDR)、QoS 强制规则 (QER)、缓冲操作规则 (BAR) 等。在我的测试中,这是UPF 和 SMF。

DIAMETER

DIAMETER 是一种认证、授权和计费协议,是一种应用层协议。可以通过添加新命令和/或属性来扩展基本协议。在我的测试中,这是 MME 和 HSS 之间的 S6a 接口。DIAMETER S6a 接口允许在 MME 和 HSS 之间提供与移动设备相关的位置信息和订户管理信息。

NGAP

下一代应用协议 (NGAP) 支持 UE 和非 UE 相关服务。它包括诸如配置更新、UE 上下文传输、PDU 会话资源管理以及对移动性过程的支持等操作。在我的测试中,这是 AMF 和 gNB 之间的 N2 接口。

0x04 Fuzzing结果

Fuzzowski 5GC 发现了 GTPU、PFCP 和 DIAMETER 的几个问题,但未能找到 NGAP 协议的相关问题。

Frizzer 和 AFLNet 仅针对 5G 协议的一个子模块代码进行了Fuzzing,并发现了一些问题,在撰写本文时,这些问题正在进一步分析中。

在这些目标中可以观察到的崩溃类型可能会导致网络订阅者的服务中断,阻止用户连接到网络上,如果可以利用栈堆破坏来执行任意代码,则可能存在其他安全隐患或获得特权访问。

以下是使用 Fuzzowski 5GC 对 GTPU/PFCP 协议进行Fuzzing时导致的崩溃示例。截至 2021 年10 月 6日,此漏洞已修补,修复补丁已提交到 Open5GS 的主分支并在 2.3.4 版中发布。

PFCP 漏洞 (CVE-2021-41794)

漏洞是由函数“ogs_fqdn_parse”写入超出堆栈上定义为 100 个字符 (OGS_MAX_DNN_LEN = 100)的“dnn”字符缓冲区末尾导致的堆栈破坏。例如,如果“message->pdi.network_instance.data”包含值“internet”,则会导致堆栈破坏发生。

img

函数'ogs_fqdn_parse'存在一些问题。第一个是变量“len”的计算,该变量被设置为“src”参数中第一个字符的值。在此示例中,小写字母“i”等于数值 105。“src”参数的长度为 8,但是参数被传入后才进行检查。memcpy 读取超过'src'参数的末尾,并写入超过'dst'参数的末尾,实际上是堆栈中的变量'dnn'。

由于“src”参数最终来自 PFCP 会话建立请求,因此可以对其进行操作以包含通过设置第一个字节控制的任何值和长度。

img

0x05 Fuzzer的性能比较

Fuzzowski 5G

Fuzzowski 5GC 擅于发现无状态协议中的漏洞,我们对 Fuzzowski 5GC 进行了改进,希望对 NGAP 协议进行Fuzzing。

使用 Fuzzowski 5GC 的最大问题是它需要定义消息的结构。创建消息定义、序列和函数来处理消息序列是一个缓慢的手动过程。消息通常是从 WireShark 捕获创建的,因此往往不会涵盖协议规范的所有部分。

Frizzer

由于源代码可用于 SUT,因此 Frizzer 比较容易设置。如果没有源代码,则需要进行一些逆向才能找到应用程序网络处理部分的函数、地址。

将 SCTP 协议添加到 Frizzer 以便它可以连接到 AMF。它还被修改为在测试之间保持 SCTP 连接打开,否则 AMF 会失败。

由于 frizzer 使用 Frida 6动态检测二进制文件,因此不需要像 AFLNet 那样对应用程序进行特殊编译。

Frizzer 与 AFLNet 在校验和方面存在相同的问题,尽管可以使用 Frida 6动态更改 SUT 的执行路径并强制通过校验和计算。

AFLNet

AFLNet 需要进行一些配置,程序的默认配置不适合我的测试目的,在连接类型中添加了 SCTP 协议,以防止 SCTP 协议被 fuzz。

为了使 AFLNet 发挥作用,SUT 需要进行编译。为了编译 AMF 应用程序,需要修改 Open5GS 的构建过程来检测代码。由于 AMF 应用程序在 AFLNet 的每次测试中都会初始化,因此与其他Fuzzer相比,Fuzzing的过程非常缓慢。

由于Fuzzing的速度较慢,因此只需花费很少的时间和精力就可以对单个 NGAP 消息进行Fuzzing。AFLNet 的变异性质意味着它在处理长度和校验和参数方面不是很有效,使其难以探索协议的更深层部分。

0x06 Fuzzing 5G 协议的一些思考

这项研究表明,对 5G 电信协议进行Fuzzing并不像下载你最喜欢的开源Fuzzer并开始运行那么简单!当然,可能会在简单的无状态协议中发现一些漏洞,但这些Fuzzer无法找到那些更深、更难解决的问题。Fuzzing 5G 协议带来了特定的挑战,例如需要对闭源的商用 5G 组件进行二进制检测。

电信协议Fuzzer的一个很好的起点是从协议的 ASN1 定义创建输入。与手动定义输入相比,这将更容易为特定版本的协议创建测试用例,并提供更好的协议覆盖范围。生成测试用例也会更快,错误更少。这种方法需要编写一个 ASN1 解析器,它可以生成适合Fuzzer使用的输出。

测试商用 5G 组件时是没有源码的。出于这个原因,二进制检测将极大地帮助指导Fuzzer。可以使用像 Frida 6这样的工具来检测 SUT 以提供类似于 AFL 的覆盖率反馈。

由于 SUT 可能位于远程服务器上,因此监控崩溃更具挑战性。监控应用程序需要与 SUT 在同一台服务器上运行,以将状态信息反馈给Fuzzer。当 Frida 6在目标进程中运行时,它可用于监控以及提供其他反馈。

遇到的另一个问题是意外消息。如果收到无效响应,某些 5G 协议(例如,NGAP)会以一定的时间间隔重复发送请求。这会给 Fuzzowski 5GC 等具有预定义消息序列的Fuzzer带来问题。在测试真实系统时,诸如此类的问题会使 Fuzzowski 5GC 的效率降低。

很少有公司为 5G 协议提供网络Fuzzer,原因很容易理解。这些Fuzzer更昂贵,需要较长的测试周期和复杂的配置。所有这些额外的时间和复杂性都会延长开发周期,尤其是在deadline紧迫的情况下。

通用安全保证要求目录(3GPP TS 33.117 版本 16.5.0 第 16 版)包含一个关于鲁棒性和Fuzzing的部分,越来越多的运营商、监管机构和认证机构要求在未来几年对 5G 组件进行彻底的Fuzzing和测试。为了满足这些要求,很明显需要Fuzzing工具和技术的组合。

0x07 改进 Fuzzowski 5G

我们在改进 Fuzzowski 以创建5G 协议专有版本Fuzzowski 5G C方面投入了大量工作。以下是已添加到公开可用的 Fuzzowski 1的功能的列表:

全局/本地 JSON 配置文件

请求变量

使用一组特定值Fuzzing请求部分的组

每个测试用例的设置,在 GTPU Fuzzer中用于设置 GTP 隧道

SCTP 连接

HTML 文档

为请求输出字节流以帮助调试的渲染选项

显示所有可用选项的帮助选项

添加接收策略

添加了更多测试用例来验证功能

添加的协议:GTPU、PFCP、DIAMETER、SIP、NGAP/NAS

词汇表

image.png

参考资料

[1] GitHub – nccgroup/fuzzowski: the Network Protocol Fuzzer that we will want to use.

[2] GitHub – demantz/frizzer: Frida-based general purpose fuzzer

[3] GitHub – aflnet/aflnet: AFLNet: A Greybox Fuzzer for Network Protocols

[4] GitHub – jtpereyda/boofuzz: A fork and successor of the Sulley Fuzzing Framework

[5] GitHub – open5gs/open5gs: Open5GS is an Open Source implementation for 5G Core and EPC

[6] Frida – A world-class dynamic instrumentation framework

[7] GitLab – Aki Helin / radamsa

本文翻译自:https://research.nccgroup.com/2021/10/11/the-challenges-of-fuzzing-5g-protocols/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/oXmN
如有侵权请联系:admin#unsafe.sh