assist-project/dtls-fuzzer

GitHub: assist-project/dtls-fuzzer

一款专注于 DTLS 协议的自动化状态机学习与模糊测试工具,用于发现逻辑漏洞并验证协议实现合规性。

Stars: 41 | Forks: 10

**DTLS-Fuzzer** 是一个用于 DTLS 服务器和客户端协议状态模糊测试的工具。 具体来说,它支持以下功能: 1. 给定一个字母表,它可以自动生成 DTLS 服务器/客户端实现的本地模型; 2. 给定一个测试(输入序列)和一个字母表,它可以在 DTLS 服务器实现上执行该测试; 3. 它可以运行批处理学习任务,涉及多次学习运行。 DTLS-Fuzzer 使用 [TLS-Attacker][tlsattacker] 来生成和解析 DTLS 消息以及维护状态。 为此,TLS-Attacker 已扩展支持 DTLS,从 [TLS-Attacker version 3.0b][tlsattackerver] 开始。 # 工件内容 工件包含: 1. DTLS-Fuzzer 文件结构的描述,包括与论文中显示一致的源代码和实验数据; 2. 在选定的 SUT(被测系统)DTLS 服务器实现上评估 DTLS-Fuzzer 的演练指南。 ## 文件结构 DTLS-Fuzzer 根目录中最重要的文件夹是: 1. `src`,包含 Java 源代码; 2. `examples`,包含字母表、测试、规范(即模型)以及可以提供给 DTLS-Fuzzer 以启动学习实验的参数文件示例。此目录中的文件用作学习实验的输入; 3. `experiments`,包含与实验相关的数据。其中一些数据也作为学习实验的输入。最值得注意的文件夹有: 1. `suts`,包含 Java SUT 的二进制文件。这些 SUT 是定制的 DTLS 服务器程序,其源代码是公开的; 2. `patches`,在编译源代码之前应用于某些 SUT(尤其是实用程序)的补丁。这些补丁的主要目的是防止学习过程中的时间诱导行为,启用/禁用 SUT 中的功能,以及配置参数(如预共享密钥); 3. `keystore`,学习期间使用的密钥材料(例如,公私钥对,Java 密钥库); 4. `results`,实验结果。 ## 实验结果 `experiments/results` 包含实验结果,这是使用该工具的主要输出。特别是 - `all_ciphers` 包含所有运行实验的输出文件夹; - `mapper` 包含实验结果,有助于证明做出的一些映射器决策(见第 5.2 节); - `included` 包含收敛实验的输出文件夹(收敛意味着学习成功生成了模型)。 请注意,并非 `all_ciphers` 中的所有实验都成功/以最终模型终止(在这种情况下,我们说模型学习未收敛)。 ### 输出文件夹 输出文件夹根据实验配置命名,即: - 被测 SUT/实现; - SUT 是服务器还是客户端; - 使用的字母表,就涵盖的密钥交换算法而言,其中 `all` 表示使用了所有四种密钥交换算法; - 适用时,是否需要(`req`)、可选(`nreq`)或禁用(`none`)客户端证书; - 可选地,输出中是否包含/排除重传(`incl` 或 `excl`)。 - 默认情况下包含重传 例如,文件夹名称 `jsse-12_server_rsa_cert_none_incl` 表示针对 JSSE 12 DTLS 服务器实现的实验,使用的字母表包括执行 RSA 握手的输入,客户端证书身份验证被禁用,并且包含重传。 输出文件夹包含: - `alphabet.xml`,输入字母表; - `command.args`,使用的参数文件,包含各种实验参数,最显著的是: - *eqvQueries*,通过等价查询(随机游走测试)的界限,必须通过这些查询才能将假设视为最终假设 - *equivalenceAlgorithms*,采用的基于模型的测试算法 - *startWait* 和 *responseWait*,分别是启动和响应超时(我们稍后会谈到) - `sul.config`,TLS-Attacker 的 SUT 相关配置,相同的配置可用于使用 TLS-Attacker 在 SUT 上执行工作流跟踪; - `hyp[0-9]+.dot`,中间假设; - `statistics.txt`,实验统计数据,例如测试总数、学习时间; - 表 4 显示了这些数据 - `nondet.log`,遇到的非确定性行为的日志; - `learnedModel.dot`,在学习收敛的情况下,为学习到的模型(即最终假设); - `error.msg`,在实验失败/学习停止因此未收敛到最终模型的情况下生成的错误消息。 - 主要罪魁祸首是与时间相关的非确定性(相同的输入导致不同的结果)。 评估者可以检查(例如)`included` 中的实验结果是否与表 4 中显示的一致,或者表 2 中测试的配置是否也出现在 `all_ciphers` 中。 请注意,论文中出现的模型是经过大量修剪/整理的结果,而输出文件夹中出现的模型是未更改的。 # DTLS-Fuzzer 评估步骤 为了评估 DTLS-Fuzzer,需要执行以下步骤: 1. 确保满足先决条件 2. 安装 DTLS-Fuzzer 3. 设置 SUT 4. 使用 DTLS-Fuzzer 为 SUT 生成模型 5. 分析结果 本评估部分之后是使用 DTLS-Fuzzer 的指南,介绍了其主要用例。 ## 确保满足先决条件 DTLS-Fuzzer 已在 Ubuntu 18.04 和 Debian 9-12 Linux 发行版上进行了测试。 它应该可以在任何最新的 Linux 发行版上运行。 尚未测试对其他平台的支持。 本指南假设使用基于 Debian 的发行版(具有 `apt-get`)。 需要 Java 17 JDK(Java 开发工具包)虚拟机 (VM) 或更高版本。 我们还依赖 maven(`mvn` 实用程序)进行依赖管理和部署。 我们建议使用足够强大的机器,否则敏感的时序参数(如响应等待时间)可能会变得太低,导致输出与论文中获得的不同。 更糟糕的是,它们可能导致学习实验失败。 最初的实验是在多核服务器上运行的,但是,我们预计(尽管尚未彻底测试)在具有 i7 处理器的台式机上应该可以进行学习。 如果对时序参数进行相应调整,也可以在较弱的系统上进行学习。 最后,通过将 .dot 模型导出为 .pdf 来对其进行可视化需要安装 [graphviz library][graphviz]。 假设 graphviz 提供的 `dot` 实用程序位于系统 PATH 中。 简而言之,建议的先决条件是: - 最新的 Linux 发行版,最好是基于 Debian 的 - 用于实验复现/可靠学习的台式机/服务器 - (>=) 4 GB RAM - Java 17 JDK - maven - graphviz ## 设置环境 ### Java 17 JDK DTLS-Fuzzer 需要 JDK(Java 开发工具包)版本 17 或更高版本。 如果未安装 Java,我们安装 OpenJDK 实现,并可以跳过本小节的其余部分。 ``` sudo apt-get install openjdk-17-jdk ``` 如果安装了某个版本的 java,我们可以通过运行以下命令来检查它是哪个版本: ``` java -version ``` ### 其他 设置好 JDK 后,我们继续安装其他依赖项、maven、graphviz 以及一些常见的 SUT 依赖项。 然后我们将 DTLS-Fuzzer 的仓库克隆到选定的文件夹中,检出工件分支。 最后,我们将该文件夹设为当前目录。 ``` sudo apt-get install maven graphviz autotools-dev automake libtool git clone -b usenix20-artifact https://github.com/assist-project/dtls-fuzzer.git cd dtls-fuzzer ``` ## 安装 运行 `install.sh` 脚本,该脚本安装 DTLS-Fuzzer 依赖的库以及工具本身。 ``` ./install.sh ``` 完成这些步骤后,应该构建了一个名为 `target` 的目录,其中包含 `dtls-fuzzer.jar`。 这是我们的可执行库。 从此时起,假设命令是从 DTLS-Fuzzer 的根目录运行的。 ## 快速运行 假设我们想仅使用 PSK(预共享密钥)为 OpenSSL 1.1.1b 生成模型。 DTLS-Fuzzer 的快速运行如下。 首先我们设置 SUT,这由 `setup_sut.sh` 脚本自动完成。 ``` ./setup_sut.sh openssl-1.1.1b ``` 这将创建一个空的 `modules` 目录和一个 `suts/openssl-1.1.1b` 目录。 然后我们从 `args/openssl` 文件夹中选择一个参数文件。 我们注意到有几个参数文件可供选择,即: ``` learn_openssl_client_dhe_ecdhe_rsa_cert learn_openssl_client_dhe_ecdhe_rsa_cert_reneg learn_openssl_client_ecdhe_cert_reneg learn_openssl_client_psk learn_openssl_client_psk_reneg learn_openssl_server_all_cert_none learn_openssl_server_all_cert_nreq learn_openssl_server_all_cert_req learn_openssl_server_psk ``` 感兴趣的参数文件是 `learn_openssl_server_psk`,因为其文件名指示 PSK。 因此我们选择它,并对其运行 fuzzer。 我们还额外将测试数量上限设为 200,以缩短学习时间。 最后,对于 OpenSSL,LD_LIBRARY_PATH 必须设置为实现的目录(`suts/openssl-1.1.1b/`)。 在运行学习之前,我们可能想要执行一个简单的测试来检查我们的设置是否正常工作。 一个很好的测试就是完成一个握手。 我们提供参数文件以及 `examples/tests/servers` 中的相应测试作为参数。 我们得到: ``` LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl/learn_openssl_server_psk -test examples/tests/servers/psk ``` 如果一切顺利,服务器应该打印出 "This is a hello message",这是我们在完成握手后发送的消息。 知道我们的设置功能正常,我们现在可以通过运行以下命令开始学习: ``` LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl/learn_openssl_server_psk -eqvQueries 200 ``` 我们注意到已经为实验创建了一个输出目录 `output/openssl-1.1.1b_psk/`。 我们可以 `ls` 此目录以检查实验的当前状态(生成的假设数量...)。 ``` ls output/openssl-1.1.1b_server_psk/ ``` ### 当一切顺利时 如果一切顺利,大约 20-30 分钟后,输出目录应包含一个 `learnedModel.dot` 文件。 我们可以使用 graphviz `dot` 实用程序可视化该文件,方法是导出为 .pdf 并使用我们喜欢的 .pdf 查看器打开该 .pdf。 ``` dot -Tpdf output/openssl-1.1.1b_server_psk/learnedModel.dot > output/openssl-1.1.1b_server_psk/learnedModel.pdf evince output/openssl-1.1.1b_server_psk/learnedModel.pdf ``` 最后,我们可以使用 `trim_model.sh` 生成更好/更精简的模型版本。 这可以按如下方式完成: ``` ./trim_model.sh --output output/openssl-1.1.1b_server_psk/nicerLearnedModel.dot output/openssl-1.1.1b_server_psk/learnedModel.dot dot -Tpdf output/openssl-1.1.1b_server_psk/nicerLearnedModel.dot > output/openssl-1.1.1b_server_psk/nicerLearnedModel.pdf evince output/openssl-1.1.1b_server_psk/nicerLearnedModel.pdf ``` 我们现在可以通过根据规范检查模型来确定系统的一致性…… ### 当出现问题时 当 `ls` 输出目录时,我们可能会发现 `error.msg`。 这表明实验失败并且学习突然终止 在这种情况下,显示内容揭示了失败背后的原因 ``` cat output/openssl-1.1.1b_server_psk/error.msg ``` 请注意,仍然可以对最后生成的假设执行一致性检查,只要潜在的发现是针对系统进行验证的(无论如何都应该这样做)。 ## 设置 SUT 我们提供了一个用于设置 SUT 的脚本。 此脚本下载源文件,安装一些依赖项 (JVM) 并构建 SUT。 要查看为其提供自动设置的 SUT,请运行: ``` ./setup_sut.sh ``` 例如,要设置 Contiki-NG 的 tinydtls 实现,请运行: ``` ./setup_sut.sh ctinydtls ``` 该脚本将在 DTLS-Fuzzer 的根目录中生成两个文件夹。 - `suts`,部署 SUT 二进制文件的地方 - `modules`,部署任何依赖项的地方 不幸的是,自动化 SUT 设置是一个复杂的过程,因此我们采取以下捷径。 对于 Java SUT(JSSE, Scandium),我们不构建实现,而是使用 `experiments/suts` 目录中编译好的 .jars。 请注意,这些 Java SUT(服务器应用程序)的源代码在线公开可用,请参阅 [Scandium][scandium] 和 [JSSE][jsse],[PionDTLS][piondtls] 也是如此。 自动安装依赖项可能会提示 `sudo` 访问权限。 对于 GnuTLS(依赖 nettle 等外部库)和 Eclipse 的 TinyDTLS(依赖 autoconf)会发生这种情况。 最后,由于 NSS 和 PionDTLS 的设置非常复杂,我们不提供自动设置/参数文件。 ### 故障排除 如果设置过程中的某些事情停止工作,删除 `suts` 文件夹(或特定于 SUT 的 `suts/SUT` 文件夹)并重新运行设置脚本可能会解决问题。 此外,如果构建失败,实现的源代码仍应下载到 `suts` 目录。 一种解决方法是手动构建实现。 只要构建了实现,我们的设置就应该可以工作。 我们在此给出各种 SUT 具有的依赖项的不完整列表。 - Eclipse TinyDLS: m4 autoconf - WolfSSL: m4 autoconf libtool 斜体显示的是 `setup_sut.sh` 尝试使用 `sudo` 访问权限安装的依赖项。 - GnuTLS: - *m4* - *pkg-config* - *nettle* - nettle - *m4* - *pkg-config* ## 学习 SUT 配置 我们现在准备好学习 SUT 配置了。 位于 DTLS-Fuzzer 主目录中的 `args` 目录提供了各种 SUT 配置的参数文件。 每个参数文件名描述了实验设置(SUT、字母表、身份验证),如 `experiments/results/` 中的输出文件夹名称所述。 要使用参数文件开始 SUT 的学习,请运行: ``` java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file ``` 输出文件夹将存储在生成的 `output` 目录中。 ### 参数调整 #### 测试界限 与论文中的实验相比,我们增加了几个 SUT 的响应超时,以适应性能较低的硬件。 为了缩短学习时间,我们建议将随机游走算法的测试界限从 20000 减少到 5000。 这可以通过以下方式完成: ``` java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -eqvQueries 5000 ``` 这将覆盖参数文件中的界限设置。 除 GnuTLS、PionDTLS 和 JSSE 外,我们预计学习将为这个较低的界限生成相同的模型。 #### 时序参数 时序可能成为一个问题,导致非确定性,随后突然终止并生成信息性的 `error.msg` 文件。 在这种情况下,可以调整两个旋钮: 1. *response timeout*(在得出服务器静默的结论之前等待响应的时间); 2. *start timeout*(等待服务器启动的时间)。 可以通过覆盖参数文件中的相应设置(可能使用更高的值)来调整这些参数: java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -responseWait new_response_timeout -startWait new_start_timeout 为了避免与时序相关的问题,我们建议在足够强大的机器上运行实验。 非确定性的主要原因是 SUT 启动或生成响应的时间过长。 随着提供更多计算能力,这种可能性会降低。 #### 学习时间 我们可能希望在一定时间后自动终止实验,特别是那些预计永远不会终止的实验。 可以通过 **time limit** 参数设置此期间,该参数分配了允许实验运行的最大持续时间。 此持续时间以 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 格式提供。 要将实验的执行时间限制为 60 分钟,我们将运行: ``` java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -timeLimit "PT60M" ``` ### 并发实验和端口冲突 只要服务器配置为侦听不同的端口,就可以一次运行多个实验。 我们可以选择在单独的终端中启动每个实验。 或者,我们可以使用 `disown` 实用程序在单个终端中启动实验: ``` java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_server_psk 1>/dev/null 2>&1 & disown ``` 但是,运行超过几个(>2)会给机器带来额外的负担。 这还增加了由于意外端口冲突导致学习失败的机会。 在大多数配置中,服务器被配置为通过 localhost 侦听某个硬编码端口,`args` 中提供的配置使用不同的硬编码端口。 对于 JSSE 和 Scandium 配置,设置是不同的。 在每次测试中,SUT 启动一个侦听动态选择端口的服务器,并通过 TCP 套接字将该端口通知给 DTLS-Fuzzer。 这样做的好处是通知 DTLS-Fuzzer 服务器何时准备好接收数据包(如果缺少这一点,DTLS-Fuzzer 将不得不盲目地等待任意时间以让服务器启动)。 缺点是分配的端口可能与不同实验的某个硬编码端口相同,其中服务器线程最近已停止并且新线程尚未启动(这意味着硬编码端口可用于动态分配)。 为了避免这种形式的冲突,我们建议将 Scandium 和 JSSE 实验与所有其他实验分开运行。 ## 建议的配置 我们建议以下配置,其自动构建是可靠的,学习速度较快或发现了有趣的错误。 确保在运行提供的命令之前设置 SUT。 您会注意到我们尽可能关注 PSK 配置。 那是因为具有小密码的 PSK 比任何其他加密机制需要更少的处理时间。 ### OpenSSL 1.1.1b 可以尝试任何 openssl-1.1.1b 配置(例如 `args/openssl/learn_openssl_server_all_cert_req`)。 实验快速终止(不到一天),涵盖所有密钥交换算法。 使用所有(PSK、RSA、ECDH、DH)密钥交换算法的客户端证书必需配置的命令: ``` LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl/learn_openssl_server_all_cert_req -eqvQueries 5000 ``` 请注意,在学习 OpenSSL 时,必须将 LD_LIBRARY_PATH 变量指向安装目录。 ### MbedTLS 2.16.1 出于与 OpenSSL 相同的原因,可以使用任何 mbedtls-2.16.1 配置。 由于 SUT 较慢,实验需要更多时间才能完成。 使用所有密钥交换算法禁用客户端证书身份验证配置的命令: ``` java -jar target/dtls-fuzzer.jar @args/mbedtls-2.16.1/learn_mbedtls_server_all_cert_none -eqvQueries 5000 ``` ### Contiki-NG TinyDTLS 使用 PSK 为此配置获得的模型的修订版出现在附录中。 我们可以使用 2000 的低测试界限,因为输入字母表很小,这使得测试更容易。 ``` java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_server_ctinydtls_psk -eqvQueries 2000 ``` ### WolfSSL 4.0.0 使用 PSK 对于 WolfSSL,我们提供了一种 PSK 配置,该配置的学习应该相对较快地终止。 ``` java -jar target/dtls-fuzzer.jar @args/wolfssl-4.0.0/learn_wolfssl-4.0.0_server_psk -eqvQueries 2000 ``` ### GnuTLS 3.6.7 禁用客户端身份验证 我们分析的较新 GnuTLS 版本生成了漂亮、紧凑的模型。 不幸的是,启用客户端身份验证导致所需测试数量急剧增加。 我们建议使用禁用它的配置来缩短学习时间: ``` java -jar target/dtls-fuzzer.jar @args/gnutls-3.6.7/learn_gnutls-3.6.7_server_all_cert_none -eqvQueries 2000 ``` ### Scandium PSK(修复错误前) 为此配置获得的模型的修订版出现在论文中。 该模型暴露了重要的错误,不幸的是,实验很长。 该实验不应与不涉及 Scandium 或 JSSE 的实验并行运行。 命令: ``` java -jar target/dtls-fuzzer.jar @args/scandium-2.0.0/learn_scandium-2.0.0_server_psk -eqvQueries 2000 ``` ### JSSE 12.0.2 需要身份验证 为此配置获得的模型的修订版出现在论文中。 该模型暴露了重要的错误。 该实验不应与不涉及 Scandium 或 JSSE 的实验并行运行。 请注意,JSSE 的学习不会完成/收敛,构建具有越来越多状态的假设。 因此,我们将 JSSE 实验配置为在一天后自动终止(论文中为两天)。 RSA 密钥交换的命令: ``` java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_server_rsa_cert_req ``` 代替艰苦的学习,我们可能只想测试在这种设置下是否可以在不发送任何证书消息的情况下完成握手。 这可以通过运行以下命令来完成: ``` java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_server_rsa_cert_req -test examples/tests/servers/rsa ``` ## 分析结果 学习完成后,要在输出目录中分析的内容是: - `statistics.txt`,实验统计数据,例如测试总数、学习时间; - `nondet.log`,遇到的非确定性行为的日志,如果一切顺利,这应该是空的; - `learnedModel.dot`,成功终止时生成的学习模型(或最终假设); - `hyp[0-9]+.dot`,中间假设; - `error.msg`,如果发生了导致学习停止的不好的事情。如果学习实验超时,也会生成。 ### 可视化模型 可以使用 graphviz 库通过转换为 .pdf 来可视化 .dot 学习模型: ``` dot -Tpdf learnedModel.dot > learnedModel.pdf ``` 不幸的是,随着模型大小的增加,使用此方法生成的 .pdf 变得越来越难以阅读。 因此,我们开发/使用/导入了由 `trim_model.sh` 访问的修剪脚本。 通过在没有任何参数的情况下运行脚本可以查看使用信息: ``` ./trim_model.sh ``` 我们建议以其最基本的形式使用脚本,即: ``` ./trim_model.sh learnedModel.dot ``` 该脚本: 1. 压缩状态和输入/输出标签 2. 为导致握手完成的路径着色 - 然后,用户应根据配置确定握手是否合法 3. 将连接相同状态、具有相同输出但不同输入的 3 个或更多转换组合在 `Other` 输入下 4. (可选地)修剪无法再完成握手的状态(对 JSSE 特别有用) 5. (可选地)将连接相同状态的转换定位在单个边上 (5) 需要安装 `experiments/scripts` 中的自定义 mypydot Python 3 库。 所有其他步骤使用普通的 `sed` 加上 [dot-trimmer][dottrimmer] Java 库。 `experiments/scripts` 中包含该库的 .jar。 # 通用演练 ## 显示帮助页面 运行: ``` java -jar target/dtls-fuzzer.jar ``` ## 学习 DTLS 实现 选项的数量可能过于繁重。 要学习 DTLS 服务器实现,只需指定几个选项,即:“-connect ip_address:port”,这是正在运行的 DTLS 服务器正在侦听的地址。 所有其他选项都设置为默认值,包括字母表。 ### 单次学习运行 要为现有的(例如侦听端口 20000 的)本地服务器实现启动学习运行,请运行: ``` java -jar target/dtls-fuzzer.jar -connect localhost:20000 ``` 这种类型的学习可能会出现问题。 学习要求能够在每次测试后重置服务器。 某些服务器会将某些状态从一个测试带到另一个测试。 这可能导致学习过程中的非确定性,因此更好的方法是使用提供的命令在每次测试中启动新的服务器线程。 服务器线程在测试运行后立即被终止,确保正确重置。 OpenSSL 的示例: ``` java -jar target/dtls-fuzzer.jar -connect localhost:20000 -cmd "openssl s_server -accept 20000 -dtls1_2" ``` 由于参数如此之多,命令可能会变得很长。 DTLS-Fuzzer 使用 JCommander 解析参数,它也可以从文件读取参数。 转到 `experiments/args` 查看参数示例。 要将参数文件提供给 DTLS-Fuzzer,请将其作为前缀为 “@” 的参数提供。 您还可以向命令添加其他显式参数(这将覆盖参数文件中的参数) ``` java -jar target/dtls-fuzzer.jar @arg_file ...overwriting params... ``` ### 批量学习 要启动一批学习运行,可以使用 `experiments/scripts` 中的 `launcher.py` 脚本。 给定一个包含参数文件的目录,该工具将为每个参数文件启动一个学习过程。 ``` experiments/scripts/launcher.py --jar target/dtls-fuzzer.jar --args args_folder ``` ## 运行测试套件 在运行学习实验之前,检查参数是否正确设置(尤其是时序参数)会有所帮助。 为此,DTLS-Fuzzer 可以在 SUT 上执行自定义测试套件(测试集合),并提供输出摘要。 此功能也可用于诊断失败的学习实验,即找出问题所在。 要使用默认字母表在服务器上运行测试套件,可以运行: ``` java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file ``` 有关测试文件的示例,请转到 `examples/tests/servers`。 测试文件包含以换行符分隔的输入列表。 测试由空行分隔。 每个测试的结尾要么是文件末尾,要么是一个空行。 “#” 用于注释掉一行。 如果您有模型/规范,您也可以运行测试套件并将输出与规范中的输出进行比较。 ``` java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -specification model ``` 测试运行的次数可通过 `-times` 参数配置,默认为 1。 将其设置为高数字有助于通过比较每次测试的输出来检测学习配置中的非确定性。 ``` java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -times 10 ``` 最后,如果您有学习实验的参数文件,则可以使用它们在涉及的 SUT 上运行测试,只需添加必要的测试参数: ``` java -jar target/dtls-fuzzer.jar @learning_arg_file -test test_file ```
标签:CISA项目, DTLS, JS文件枚举, TLS-Attacker, 内核驱动, 协议分析, 协议状态机, 安全测试, 客户端加密, 客户端加密, 密码学, 手动系统调用, 攻击性安全, 权限提升, 模糊测试框架, 状态学习, 网络协议, 网络安全, 逆向工具, 隐私保护