raytheonbbn/maude-hcs

GitHub: raytheonbbn/maude-hcs

基于 Maude 重写逻辑的隐蔽通信系统形式化建模与统计模型检测框架,用于验证不可检测性与性能的权衡。

Stars: 20 | Forks: 7

# Maude-HCS Maude-HCS 是首批用于在现实世界规模下形式化规范和推理隐藏通信系统 (HCS) 的通用模块化工具链之一。 它使网络设计者能够快速有效地探索不同的 HCS 设计, 并提供信任该设计所需的形式化隐私-性能保证。 ## 简介 隐藏通信系统 (HCS) 将隐蔽消息嵌入到普通网络活动中以隐藏通信的存在。 在实践中,HCS 的不可检测性通常使用临时的流量统计或特定的检测器来评估, 这使得安全性声明与实验设置和隐式的对手假设紧密耦合。 Maude-HCS 是一个可执行的建模和分析框架,为推理复杂 HCS 设计中的不可检测性与性能权衡提供了原则性且可执行的基础。 设计者形式化地规范协议行为、对手可观察量和环境假设,并从诱导的迹分布中生成 Monte Carlo 样本。 这些可用于通过估计统计检验的真阳性率和假阳性率,并将这些估计值转换为不可检测性度量的下界,从而审计不可检测性声明。 这使得能够在明确陈述的建模假设下,系统地评估可检测性及其与性能的权衡。 如果您在建模和推理您的 HCS 时需要帮助,请联系我们。 如果您将其用作研究的一部分,请考虑引用我们的工作。 ``` @article{khoury2026maude, title={Maude-HCS: Model Checking the Undetectability-Performance Tradeoffs of Hidden Communication Systems}, author={Khoury, Joud and Kim, Minyoung and Merlin, Christophe and Meseguer, Jos{\'e} and Ratliff, Zachary and Talcott, Carolyn}, journal={arXiv preprint arXiv:2603.03369}, year={2026} } ``` ## 环境要求 需要 Python 版本 `3.12.4` 创建您偏好的环境并激活它,例如 对于 pyenv ``` pyenv install 3.12.4 pyenv local 3.12.4 ``` 对于 conda ``` conda create --name pwnd2 python=3.12.4 conda activate pwnd2 ``` 对于 virtual env ``` python -m venv venv source venv/bin/activate ``` ## 安装:从 git 源码 我们构建了 repo 源代码结构,以便我们将 dns-formalization-maude 作为依赖项(一个 submodule)导入。 我们创建了该依赖项的一个 fork,以便我们可以跟踪对此的更改。 我们使用 sparse-checkout 来避免检出依赖项的所有源代码,其中包含许多不相关的文件(例如 Testbed)。 克隆主 repo ``` git clone git@github.com:raytheonbbn/maude-hcs.git ``` 主分支包含最新(可能不稳定)的源代码。 较旧的分支/标签(如 `pwnd.cp1`)是指用于在评估期间生成结果的稳定快照 (例如,`pwnd.cp1` 用于挑战问题 1,类似地 `pwnd.cp2`)。 要使用较旧的快照,请检出特定的分支(例如 `pwnd.cp1`)。 使用我们的代码克隆设置 dns submodule,以便我们可以跟踪对原始源代码的更改,使用 sparse-checkout 仅保留相关源代码 ``` cd maude-hcs mkdir -p maude_hcs/deps git submodule add -b -f git@github.com:raytheonbbn/dns-formalization-maude.git \ maude_hcs/deps/dns_formalization cd maude_hcs/deps/dns_formalization git sparse-checkout init --cone git sparse-checkout set "Maude/dns" "Maude/common" "Maude/test" "Maude/attack_exploration" cd ../../../ git reset .gitmodules git reset maude_hcs/deps/dns_formalization ``` 在上面的命令中,将 `` 设置为 `pwnd.cp1` 以重现挑战问题 1 的结果, 或设置为 `pwnd` 以获取最新版本。 上述操作应在 .git/modules/maude_hcs/deps/dns_formalization/info/ 下创建一个名为 sparse-checkout 的新文件, 并指示它仅包含某些目录,例如 `Maude/src`。 此时 `git status` 应显示一个干净的起始状态。 要安装,首先将依赖项安装为名为 dns 的包,我们将其作为 `Maude.*` 导入 然后将 `maude_hcs` 安装为一个包(依赖于 dns)。 ``` cd maude_hcs/deps/dns_formalization pip install -e . cd ../../../ pip install -e . ``` ## 自动生成用户模型 用户模型是旨在表示用户行为的 markov 模型。 这些以 JSON 格式给出。 第一步是将这些转换为形式化的 Maude 表示。 为此,请指定 - protocol:dns 或 mastodon - 包含所有要转换的 JSON 模型的输入目录 - 将包含所有 JSON 模型的 Maude 版本的输出目录 例如, ``` # 转换 dns tgen 用户模型 maude-hcs --verbose \ --protocol=dns markov \ --json-dir=../pwnd-cp2/src/static/tgen_models/dns/ \ --maude-dir=./maude_hcs/lib/tgen/maude/dnsprofiles/markov/ # 转换 mastodon tgen 模型 maude-hcs --verbose \ --protocol=mastodon markov \ --json-dir=../pwnd-cp2/src/static/tgen_models/mastodon \ --maude-dir="./maude_hcs/lib/raceboat/maude/mastodonprofiles/" ``` 请参阅 `./maude_hcs/lib/tgen/maude/dnsprofiles/markov/` 下的示例 markov JSON 规范 (mastodon 同理),以及它们转换后的 Maude 规范。 ## 自动生成 HCS 配置 我们使用 `generate` 命令生成初始配置。 HCS 配置可以使用 HCS 配置参数直接在 JSON 中传递, 或使用 Shadow 实验配置文件,或使用 YML 配置文件。 接下来将分别描述这些内容。 ### 使用 HCS JSON 配置 按如下方式传递 Maude-HCS JSON 配置文件, 要使用 iodine 生成概率 DNS 模型配置并指定输出文件名, ``` maude-hcs --verbose generate \ --run-args="./use-cases/challenge-problem-2/cp2_scenarios/cp2_scenario_1-hcsconfig.json" \ --model=prob \ --filename="cp2_scenario_1" \ --output-dir="./use-cases/challenge-problem-2/cp2_scenarios/" ``` 设置 `--model=nondet` 以生成非确定性版本。 这将在输出目录中生成可执行的 Maude 文件(以及相应的 HCS 配置 JSON)。 输入的 JSON 配置文件应该很容易理解。它包括以下规范: * 网络拓扑(链路及其特征) * 对手(在本例中为 Zeek 检测器配置文件、用于移动平均检测器的基线数据及其配置) * channels/protocols:每个协议包含一个 weird network 和一个底层网络协议。前者将数据隐藏/嵌入到后者中。例如,Iodine 嵌入在 DNS 中(因此通道称为 iodine-dns),而 Destini 嵌入在 Mastodon 中 有关某些参数的说明,请参阅 [HCSParamsGuide](./HCSParamsGuide.md)。 请注意,概率模型将结合非确定性参数以及概率参数(后者会覆盖非确定性参数)。 ### 使用 YML 配置 #### 单个配置 YML 配置包含隧道和底层网络的完整配置。 我们可以直接从中生成 HCS 配置。 ``` maude-hcs --verbose generate --yml-filename=./use-cases/challenge-problem-2/cp2_setup_example.yml --model=prob --filename=generated_test_yml ``` #### CP2 的批量配置 对于像 CP2 中那样的批量配置,将多个 YML 文件转换为 Maude 场景文件: ``` ./scripts/generate_cp2_maude.sh [scenario_dir] ``` 其中 `scenario_dir` 是可选的(默认为 `../pwnd_cp2`) ### 使用 Shadow YAML 配置 可以使用 Shadow 文件代替我们的 HCS 配置 JSON 来指定网络配置 (有关 Shadow 规范的更多信息,请参阅 [Shadow](https://github.com/shadow/shadow) 模拟器)。 要生成使用 Shadow 文件中定义的特征的模型,请指定: ``` --shadow-filename ``` Shadow YAML 文件指定了网络、主机和进程配置。 假设 Shadow 网络配置位于目录 `../pwnd-cp1` 中,运行 ``` maude-hcs --verbose --protocol=dns generate --shadow-filename=../pwnd-cp1/shadow_files/examples/cp1_sim_config.yaml --model=prob --filename=generated_test_shadow ``` ## 运行 HCS 配置 ### 使用 Maude 独立运行 要在独立 Maude 中运行配置,首先为您的系统安装 [standalone maude](https://github.com/maude-lang/Maude)(我们建议使用 3.5.0 或更低版本) 要运行单个配置,请使用文件名调用 Maude,例如在 `results` 中, ``` maude ./use-cases/challenge-problem-2/cp2_scenarios/cp2_scenario_1.maude ``` 在 Maude 提示符内,输入 ``` rew initConfig . ``` 这将执行所有重写,直到找不到更多规则且无法取得进展。 添加日志记录将通过以下方式增加执行的详细程度 ``` set print attribute on . ``` 也可以使用以下命令单步执行(请参阅 Maude 手册) ``` rew[1] initConfig . cont 1 . ``` ### 统计模型检测 统计模型检测可通过 [QMaude](https://github.com/fadoss/umaudemc) 中的 scheck 子命令进行: ``` maude-hcs scheck [-h] [--advise] [--protocol {dns}] [--file FILE] [--test TEST] [--initial INITIAL] [--query QUERY] [--assign METHOD] [--alpha ALPHA] [--delta DELTA] [--seed SEED] [--jobs JOBS] [--format {text,json}] options: --help, -h Show help message and exit --advise Do not suppress debug messages from Maude --protocol PR The protocol module being analyzed e.g., dns, which points to an smc file specific to that protocol. --file FILE Maude source file specifying the model-checking problem. If --protocol is specified, this parameter becomes optional, and if specified overrides the protocol smc file. --test TEST Test generated from maude-hcs, default=results/generated_test.maude --initial INITIAL Initial term, default=initConfig --query QUERY QuaTEx query, default=smc/query.quatex --assign METHOD Assign probabilities to the successors according to the given method, default=pmaude --alpha ALPHA, -a ALPHA Required significance level for the confidence interval, default=0.05 --delta DELTA, -d DELTA Maximum admissible radius for the confidence interval around the mean, default=0.5 --seed SEED, -s SEED Random seed --jobs JOBS, -j JOBS Number of parallel simulation threads, default=1, -j 0 will start as many jobs as CPU units --format {text,json} Output format for the simulation results, default=text --distribute WORKERS Distribute the computation across multiple machines, specified as a list of workers for the simulation. --dump OUTPUTFILE Dump query evaluations into the given file. Currently, it only works with the sequential version (-j 1). For each simulation, a line is written with the result of all queries separated by space. -D D Define a constant to be used in QuaTEx expressions. ``` 上述命令生成的文件的示例 SMC 运行如下: ``` maude-hcs scheck --test ./use-cases/challenge-problem-2/cp2_scenarios/cp2_scenario_1.maude --query ./smc/cp2_eval_cp2_scenario_1.quatex -j 0 -n 30-120 ``` 概率模型及其初始配置应在 Maude 中指定,并通过 ``--test TEST`` 选项提供(默认值:``results/generated_test.maude``)。 Maude 执行从通过 ``--initail INITIAL`` 选项提供的初始项开始(默认值:在 ``TEST`` 中指定的 ``initConfig``),并重写至最终配置。 从最终配置中,使用 Maude 源文件中为模型检测问题指定的 monitor 和 adversary 参与者提取可观察量,该源文件通过 ``--file FILE`` 选项或 ``--protocol PR`` 选项提供。 例如,``--protocol dns`` 指的是在 `lib/` 下专门为 DNS 协议创建的模型检测文件。 定量属性(例如平均延迟的期望值)可以使用 QuaTEx 公式指定,并通过 ``--query QUERY`` 选项提供(默认值:``smc/query.quatex``)。 我们以渗出文件衡量的示例延迟和可扩展性指标定义在 ``smc/latency.quatex`` 和 ``smc/scalability_cp2_scenario_1.quatex`` 中,并导入到 ``smc/cp2_eval_cp2_scenario_1.quatex`` 中,可以用以下形式的 QuaTEx 公式表示: ``` Latency() = s.rval("getLatency(getMonitor(C))"); eval E[Latency()] with delta = 2; ExfilFilesC2() = if (s.rval("getToDCumulativeNQueryPostNAT(C,416)") == 0.0) then discard else s.rval("getExfilFiles(getMonitor(C), getToDCumulativeNQueryPostNAT(C,416))") fi; eval E[ExfilFilesC2()]; ``` 其中表达式 ``Latency()`` 从监视器中提取延迟值,并使用 delta = 2 评估其期望。 表达式 `ExfilFilesC2()` 有条件地评估渗出文件的数量: 如果基于累积的 NAT 后 DNS 查询数的检测时间为零——这意味着没有发生检测,因为累积查询计数从未超过其阈值(例如,上例中的 416)——则丢弃该样本; 否则,评估直到检测时间为止的渗出文件数量。 采样持续进行,直到达到指定的样本数量(即 ``-n min-max`` 选项,例如 ``-n 30-300``)或所有查询都以所需的统计显著性得到回答。 在下面的示例中,使用默认值 alpha=0.05 和 delta=0.5 在 30 个样本后回答第二个查询,而如上所述使用 ``with delta = 2`` 在 270 个样本后回答第一个查询。 输出包括: - mu:样本均值(期望值) - sigma:样本标准差 - r(置信半径):给定 alpha 下 mu 周围的误差范围,即置信度为 (1-alpha) 的 mu ± radius ``` step=30 n=30 30 μ=191.13112908653187 8.066666666666666 σ=20.074331354964382 1.048260737942926 r=7.495878519259243 0.391426992470463 step=60 n=60 30 μ=191.73987197380484 8.066666666666666 σ=18.784008301748255 1.048260737942926 r=4.852423885397848 0.391426992470463 step=90 n=90 30 μ=191.0827655561146 8.066666666666666 σ=17.597893935302075 1.048260737942926 r=3.6858075268606814 0.391426992470463 step=120 n=120 30 μ=191.28516943859958 8.066666666666666 σ=16.712118022094398 1.048260737942926 r=3.0208416995911134 0.391426992470463 step=150 n=150 30 μ=191.81314662826944 8.066666666666666 σ=16.539151183097196 1.048260737942926 r=2.6684398888965446 0.391426992470463 step=180 n=180 30 μ=190.8746803932425 8.066666666666666 σ=16.936122821805657 1.048260737942926 r=2.4909903998666914 0.391426992470463 step=210 n=210 30 μ=191.46358580546917 8.066666666666666 σ=16.52110171477275 1.048260737942926 r=2.24749940416632 0.391426992470463 step=240 n=240 30 μ=191.56944900796088 8.066666666666666 σ=16.513730454991496 1.048260737942926 r=2.0998701423425232 0.391426992470463 step=270 n=270 30 μ=191.8095651355114 8.066666666666666 σ=16.62555049424396 1.048260737942926 r=1.9920516750753852 0.391426992470463 Number of simulations = 270 Query 1 (./smc/readme.quatex:5:1) μ = 191.8095651355114 σ = 16.62555049424396 r = 1.9920516750753852 Query 2 (./smc/readme.quatex:6:1) (30 simulations) μ = 8.066666666666666 σ = 1.048260737942926 r = 0.391426992470463 ``` 如果我们将上述 QuaTEx 公式中的阈值修改为 500,则某些样本会被丢弃。 然后会报告结果以及丢弃的样本数量,并使用剩余样本计算统计保证,如下所示。 ``` Number of simulations = 270 Query 1 (./smc/readme.quatex:7:1) μ = 191.80187664851906 σ = 16.429217228790975 r = 1.9685272804723886 Query 2 (./smc/readme.quatex:8:1) (39 simulations) μ = 9.76923076923077 σ = 0.48458003855418535 r = 0.1570826767676969 where 21 executions out of 60 (35.0%) have been discarded ``` 要在相同的并行化设置(即 ``-j`` 的相同值)下重现相同的实验,请使用带有相同随机种子的 ``--seed`` 选项。 默认情况下或传递 -1 时,使用当前时间作为种子。 ``` # maude-hcs scheck --seed 0 Number of simulations = 30 μ = 1.5301530777180123 σ = 3.9683630959745835e-05 r = 1.481811132921282e-05 # maude-hcs scheck --seed 0 Number of simulations = 30 μ = 1.5301530777180123 σ = 3.9683630959745835e-05 r = 1.481811132921282e-05 # maude-hcs scheck --seed 0 -j 4 Number of simulations = 30 μ = 1.5301436629475402 σ = 5.0836982397393854e-05 r = 1.8982841201450367e-05 # maude-hcs scheck --seed 0 -j 4 Number of simulations = 30 μ = 1.5301436629475402 σ = 5.0836982397393854e-05 r = 1.8982841201450367e-05 ``` ### 测试自动化 runexp.sh 是一个结合了生成和 SMC 分析的自动化脚本。它接受两个必需参数: ``` runexp.sh CONFIG_FILENAME METRIC where CONFIG_FILENAME is the name of the .yaml shadow file defining the experiment METRIC is the quatex property and can be latency, throughput, goodput, or all ``` ### 运行分布式 SMC SMC 具有高度可并行性,可以使用机器上的所有核心在 Monte Carlo 采样中获得接近线性的加速,如上所述使用 `-j 0` 选项。 QMaude 允许使用分布式 SMC 跨机器实现更高的并行性(该功能仍在积极测试中) 要运行分布式 SMC,应该有一个或多个使用以下命令启动的 worker: ``` $ umaudemc sworker -a 127.0.0.1 -p 1234 👂 Listening on 127.0.0.1:1234... ``` 新的 sworker 命令的唯一选项是地址 和端口。它一直等待来自控制器的连接。 在控制器端,可以使用附加选项 --distribute 执行普通的 scheck 命令。例如, ``` $ maude-hcs scheck --distribute workers.json ``` 文件 workers.json(也可以是 TOML 或 YAML)指定了用于模拟的 worker 列表。该文件应该是一个字典,包含一个 workers 键,其值为 ``{ "workers": [ {"address": "127.0.0.1", "port": 1234} ] }`` 或简单地 ``{ "workers": [ "127.0.0.1:1234" ] }`` 形式的列表。除此之外,选项和输出应与常规 scheck 命令相同。 scheck 命令将连接到远程 worker,将它们所需的所有信息传递给它们,激活它们,并处理它们的结果,直到达到规定的置信水平。无需手动将文件复制到每台运行 worker 的机器,文件通过连接发送。Maude 包含内容会被解析,并将 Maude 源代码的扁平化版本发送出去。 ### 运行 QMaude 进行独立测试 QMaude 提供了相同形式主义下模型的统计模型检测 (SMC)。 将 `latency.quatex` 和 `smc.maude` 复制到您的实验目录(或将其保留在 `results` 中)。 修改前者以加载目标(概率)实验。 运行 ``` umaudemc --no-advise scheck smc initConfig latency.quatex -a 0.05 --assign pmaude -j 50 ``` QMaude 返回 quatex 查询的期望值 (μ),以及达到该值所进行的 Monte Carlo 模拟次数。 ## 测试 要运行测试,首先在您的环境中安装 pytest。 ``` pip install -e .[test] ``` 然后运行单元测试 ``` python -m pytest ``` ## 其他实用工具 要将图像目录转换为实验中使用的 JSON 元数据文件, 例如生成 mastodon tgen 客户端使用的图像(destino 的封面图像同理) ``` maude-hcs --verbose --protocol dnsmastodon images --image-dir ../pwnd-cp2/src/static/images/ --image-out-dir results/ ``` ### 跨场景生成 testbed 和 SMC 之间每个 quatex 查询的比较图 使用 `plotfinal.py`,参数为 smc\_directory、tne\_directory、quatex\_directory ``` python scripts/plotfinal.py use-cases/challenge-problem-2/results-aligned/ use-cases/challenge-problem-2/cp2_scenarios_tne/cp2_te_results/ smc/ ``` 同一脚本将生成 CDF 图。 ``` python scripts/gather\_samples.py use-cases/challenge-problem-2/results-aligned/samples/ use-cases/challenge-problem-2/results-aligned/cdfs use-cases/challenge-problem-2/cp2_scenarios_tne/cp2_te_results/ ``` # 参考文献 以下项目被 Maude-HCS 直接使用 * [Maude](https://github.com/maude-lang/Maude) * [QMaude](https://github.com/fadoss/umaudemc) * 使用 Maude 的 [DNS 协议形式化](https://gitlab.ethz.ch/netsec/dns-formalization-maude) * [Actors2PMaude tool](https://zenodo.org/records/7071693)
标签:Google搜索, Homebrew安装, IP 地址批量处理, Maude, Python, 信息隐藏, 入侵检测 evasion, 协议设计, 形式化验证, 性能权衡, 无后门, 模型检测, 私有化部署, 科研工具, 统计分析, 网络安全, 网络安全, 网络隐写, 蒙特卡洛模拟, 逆向工具, 防御规避, 隐私保护, 隐私保护, 隐蔽性分析, 隐蔽通信