From b930f376a2e25f0db4fa2086cd2efc224aa50f8a Mon Sep 17 00:00:00 2001 From: Dongliang Mu Date: Mon, 8 Apr 2024 20:30:38 +0800 Subject: docs/translations: add the translation of linux/external_fuzzing_network.md Finish the translation of linux/external_fuzzing_network.md. Signed-off-by: Dongliang Mu --- .../zh_CN/linux/external_fuzzing_network.md | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 docs/translations/zh_CN/linux/external_fuzzing_network.md (limited to 'docs/translations') diff --git a/docs/translations/zh_CN/linux/external_fuzzing_network.md b/docs/translations/zh_CN/linux/external_fuzzing_network.md new file mode 100644 index 000000000..6c4b56dd5 --- /dev/null +++ b/docs/translations/zh_CN/linux/external_fuzzing_network.md @@ -0,0 +1,67 @@ +Linux 内核的外部网络模糊测试 +========================================= + +syzkaller 已支持对网络栈的外部模糊测试。 +这是通过使用 [TUN/TAP](https://www.kernel.org/doc/Documentation/networking/tuntap.txt) 接口来实现的. +它允许设置一个虚拟网络接口,并将从外部网络接收到的数据包发送到内核。 +这触发了真实数据包通过真实网络接口传递的相同路径(除了驱动层)。 + +您需要启用 `CONFIG_TUN` 内核配置来开启外部网络模糊测试。 +关于如何设置虚拟接口,请参考 [executor/common_linux.h](/executor/common_linux.h) 中的 `initialize_tun()` 函数。 + +相关模板描述可在 [sys/linux/vnet.txt](/sys/linux/vnet.txt) 中找到。 +目前有两个系统调用: `syz_emit_ethernet` 和 `syz_extract_tcp_res`。 +第一个伪系统调用通过虚拟接口向外发送数据包。 +第二个伪系统调用尝试从外部接收数据包,并从中解析 TCP 序列号,以便在后续的数据包中使用。 +目前还有很多协议或协议扩展尚未描述,因此非常欢迎补充! + +由于模糊测试可能在同一个虚拟机实例内的多个执行器进程中进行,我们需要一种方式来隔离不同执行器的虚拟网络。 +目前,这是通过为每个执行器创建一个虚拟接口,并为这些接口分配不同的 MAC 地址、IPv4 地址和 IPv6 地址来实现。 +然后,模板描述利用 `proc` 类型来为每个执行器生成适当的地址。 + +由于许多网络协议需要将校验和字段嵌入到数据包中,因此支持描述此类字段。 +这里存在一个 `csum` 类型,目前支持两种不同类型的校验和计算: +Internet 校验和 [the Internet checksum](https://tools.ietf.org/html/rfc1071) : `csum[parent, inet, int16be]`, +以及类似于 TCP 的伪头部校验和: `csum[tcp_packet, pseudo, IPPROTO_TCP, int16be]`。 +在通过虚拟接口发送数据包之前,这些校验和会被计算并嵌入其中。 +这里还有一个很好的特性:当 syzkaller 生成 C 语言 reproducer 时,它也会生成代码并在运行时重新计算校验和。 + +通过使用 `syz_emit_ethernet` and `syz_extract_tcp_res`,以下 syzkaller 程序能够建立基于 IPv4 的 TCP 连接: + +``` +mmap(&(0x7f0000000000/0x10000)=nil, (0x10000), 0x3, 0x32, 0xffffffffffffffff, 0x0) +r0 = socket$inet_tcp(0x2, 0x1, 0x0) +bind$inet(r0, &(0x7f0000001000)={0x2, 0x0, @empty=0x0, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]}, 0x10) +listen(r0, 0x5) +syz_emit_ethernet(0x36, &(0x7f0000002000)={@local={[0xaa, 0xaa, 0xaa, 0xaa, 0xaa], 0x0}, @random="4c6112cc15d8", [], {{0x800, @ipv4={{0x5, 0x4, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x6, 0x0, @remote={0xac, 0x14, 0x0, 0xbb}, @local={0xac, 0x14, 0x0, 0xaa}, {[]}}, @tcp={{0x1, 0x0, 0x42424242, 0x42424242, 0x0, 0x0, 0x5, 0x2, 0x0, 0x0, 0x0, {[]}}, {""}}}}}}) +syz_extract_tcp_res(&(0x7f0000003000)={0x42424242, 0x42424242}, 0x1, 0x0) +syz_emit_ethernet(0x38, &(0x7f0000004000)={@local={[0xaa, 0xaa, 0xaa, 0xaa, 0xaa], 0x0}, @remote={[0xbb, 0xbb, 0xbb, 0xbb, 0xbb], 0x0}, [], {{0x800, @ipv4={{0x5, 0x4, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x6, 0x0, @remote={0xac, 0x14, 0x0, 0xbb}, @local={0xac, 0x14, 0x0, 0xaa}, {[]}}, @tcp={{0x1, 0x0, r2, r1, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, {[]}}, {"0c10"}}}}}}) +r3 = accept$inet(r0, &(0x7f0000005000)={0x0, 0x0, @multicast1=0x0, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]}, &(0x7f0000006000)=0x10) +``` + +``` +Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name +tcp 0 0 0.0.0.0:20000 0.0.0.0:* LISTEN 5477/a.out +tcp 2 0 172.20.0.170:20000 172.20.0.187:20001 ESTABLISHED 5477/a.out +``` + +对于 IPV6 来说也有类似的程序: + +``` +mmap(&(0x7f0000000000/0x10000)=nil, (0x10000), 0x3, 0x32, 0xffffffffffffffff, 0x0) +r0 = socket$inet6_tcp(0xa, 0x1, 0x0) +bind$inet6(r0, &(0x7f0000000000)={0xa, 0x1, 0x0, @empty={[0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]}, 0x0}, 0x1c) +listen(r0, 0x5) +syz_emit_ethernet(0x4a, &(0x7f0000001000)={@local={[0xaa, 0xaa, 0xaa, 0xaa, 0xaa], 0x0}, @random="de895db1468d", [], {{0x86dd, @ipv6={0x0, 0x6, "a228af", 0x14, 0x6, 0x0, @remote={0xfe, 0x80, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0], 0x0, 0xbb}, @local={0xfe, 0x80, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0], 0x0, 0xaa}, {[], @tcp={{0x0, 0x1, 0x42424242, 0x42424242, 0x0, 0x0, 0x5, 0x2, 0x0, 0x0, 0x0, {[]}}, {""}}}}}}}) +syz_extract_tcp_res(&(0x7f0000002000)={0x42424242, 0x42424242}, 0x1, 0x0) +syz_emit_ethernet(0x4a, &(0x7f0000003000)={@local={[0xaa, 0xaa, 0xaa, 0xaa, 0xaa], 0x0}, @random="de895db1468d", [], {{0x86dd, @ipv6={0x0, 0x6, "a228af", 0x14, 0x6, 0x0, @remote={0xfe, 0x80, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0], 0x0, 0xbb}, @local={0xfe, 0x80, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0], 0x0, 0xaa}, {[], @tcp={{0x0, 0x1, r2, r1, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, {[]}}, {""}}}}}}}) +r3 = accept$inet6(r0, &(0x7f0000004000)={0x0, 0x0, 0x0, @empty={[0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]}, 0x0}, &(0x7f0000005000)=0x1c) +``` + +``` +Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name +tcp6 0 0 :::20001 :::* LISTEN 5527/a.out +tcp6 0 0 fe80::aa:20001 fe80::bb:20000 ESTABLISHED 5527/a.out +``` + +**请注意,这是社区驱动的官方 syzkaller 文档翻译。当前文档的最新版本(英文版)可在 [docs/linux/external_fuzzing_network.md](/docs/linux/external_fuzzing_network.md) 找到。** -- cgit mrf-deployment