tbarabosch/BeastieSentry

GitHub: tbarabosch/BeastieSentry

一款面向 FreeBSD 15.1/arm64 的只读事件响应工具,用于检测系统中的持久化机制和失效信任关系。

Stars: 0 | Forks: 0

# BeastieSentry BeastieSentry 是一个小巧的只读事件响应工具,用于在实时的 FreeBSD 15.1/arm64 主机上查找 已配置的持久化机制。它了解 FreeBSD 的持久化攻击面,能够识别出失效的信任关系以及非原生的 钩子,并输出紧凑的终端报告或原生的 `libxo` 结构化 输出。 BeastieSentry 报告的指标需要分析师自行判断。它不会 宣告系统是干净的还是已被入侵。`NO INDICATORS FOUND`(未发现指标)仅表示 所选的检查项已完成,且未发现高风险或需要审查的 结果。 ## 要求 - FreeBSD 15.1/arm64,其中 `kern.osreldate=1501000` 且 `uname -m` 为 `arm64` - 在 jail 外部执行 - 执行扫描需具有有效 UID 0 - 需要 FreeBSD 基础 C 工具链和 BSD make 文件进行构建 - 没有第三方运行时或测试依赖 帮助和版本输出不需要 FreeBSD 15.1/arm64 或 root 权限。生产环境的 扫描始终以实时的 `/` 层次结构为目标;我们故意没有提供公开的 备用根目录(alternate-root)选项。 ## 构建、安装和测试 ``` make clean all sudo make install make check mandoc -Tlint beastiesentry.8 ``` 默认安装路径为 `/usr/local/sbin/beastiesentry` 和 `/usr/local/share/man/man8/beastiesentry.8`。在 make 时设置 `PREFIX` 可以 更改 `/usr/local`。 测试使用 ATF-C 和 Kyua。它们通过内部的 根目录描述符接缝扫描合成树。测试夹具包含可疑示例和 金丝雀命令,但不会在主机的 `/etc` 或 `/boot` 下放置持久化机制。 ## 源码布局 每个公共扫描器模块在 `src/modules/` 中都有对应的实现: `rc.c`、`loader.c`、`cron.c`、`at.c`、`periodic.c`、`accounts.c`、`ssh.c`、 `profiles.c`、`pam.c`、`ttys.c` 和 `libmap.c`。`scanner.c` 负责固定顺序的 分发,而 `common.c` 仅包含共享的内部解析和基线 辅助程序。 ## 用法 ``` usage: beastiesentry [-Av] [-m module] [--color=when] [--libxo options] beastiesentry -h beastiesentry -V ``` - `-m module`、`--module=module` 选择单个模块。重复使用可选择 多个模块;重复项将被忽略。如果没有指定模块选项,则运行所有模块。 - `-A`、`--allow-known` 仅从输出中抑制 `known`(已知)行。 - `-v`、`--verbose` 添加经过净化的命令骨架,绝不会暴露原始命令或 机密信息。 - `--color=auto|always|never` 控制终端颜色。编码后的输出永远不会 包含 ANSI 转义序列。 - `-h`、`--help` 打印用法、模块、输出指南和状态。 - `-V`、`--version` 打印工具、schema、目标发行版和架构信息。 - `--libxo options` 选择标准的 libxo 输出和格式化。 模块按以下固定顺序运行: 1. `rc` 2. `loader` 3. `cron` 4. `at` 5. `periodic` 6. `accounts` 7. `ssh` 8. `profiles` 9. `pam` 10. `ttys` 11. `libmap` 示例: ``` sudo beastiesentry sudo beastiesentry -m ssh -m accounts --color=never sudo beastiesentry -A -m rc sudo beastiesentry --libxo json,pretty > beastiesentry.json sudo beastiesentry --libxo xml,pretty > beastiesentry.xml ``` ## 结果、判定和状态 严重性代表分析师的优先级,而不是恶意软件判定: - `high`(高)表示直接的特权执行机制或失效的信任边界。 - `review`(审查)表示自定义或已更改的持久化机制,这可能是合法的。 - `known`(已知)表示符合预期 FreeBSD 15.1 行为,并通过了编译基线 和信任检查。 - `error`(错误)表示所选的检查项无法可靠地完成。 当存在任何 high 结果时,判定为 `high-risk`;如果没有 high 但存在 review 结果,则为 `review`;如果没有指标但存在 检查未完成,则为 `incomplete`;只有在没有 high 或 review 结果且完成完整扫描时,才判定为 `none-found`。High 结果在显示上的优先级高于错误,而 不完整状态仍会使进程以退出代码 2 结束。 退出状态: | 状态 | 含义 | | ---: | --- | | `0` | 完整扫描,没有 `high` 或 `review` 结果 | | `1` | 完整扫描,至少包含一个 `high` 或 `review` 结果 | | `2` | 已生成报告,但有一个或多个检查未完成 | | `64` | 无效的选项、模块、颜色或位置参数 | | `69` | 不支持的 OS/发行版/架构,或在 jail 内部执行 | | `71` | 致命的平台或扫描上下文初始化失败 | | `74` | 致命的渲染器或输出失败 | | `77` | 在没有有效 UID 0 的情况下请求扫描 | 已知过滤仅在分类之后应用。`--allow-known` 无法 更改 high、review 或 error 计数、完整性、判定或状态。 ## 结构化输出 Schema 版本 1 使用一个顶层的 `beastiesentry` 容器。它包含主机 和扫描元数据、过滤前摘要计数、所选模块数组,以及 确定性排序的结果数组。可选字符串输出为空 字符串,不可用的行号输出为零。 通过多个本地账户发现的、在其他方面完全相同的结果会被 合并为一个结果。其 `principal` 字符串以确定性的 `/etc/passwd` 顺序 列出受影响的账户 名称,以逗号分隔。因此,摘要计数 描述的是唯一的已分类制品,而不是重复的路径。 ``` beastiesentry --libxo json,pretty | python3 -m json.tool ``` 渲染器调用 `xo_set_version("1")`。即使存在 `--color=always`,JSON 和 XML 也不会包含终端 转义序列。 ## 安全性和证据处理 扫描器永远不会 source 配置文件、调用 shell、执行 发现的目标、调用软件包或更新工具、执行解析器或 socket 操作,也不会向目标系统写入内容。它通过已经打开的 根描述符使用 `openat(2)`、`O_NOFOLLOW`、描述符元数据和 物理目录遍历进行读取。符号链接会被检查,但不会被透明地 跟随。特殊文件永远不会被打开以读取内容。 工作限制为每个文件 4 MiB,每个逻辑行 64 KiB,include 深度 16, 每个受监视目录 8,192 个条目,4,096 个本地账户,以及 10,000 个 结果。达到限制会产生错误并将扫描标记为未完成。 最终模型绝不会存储密码哈希、私钥、公钥 blob 或注释、保存的 at-job 环境块、原始命令、环境 值、URL、token 或任意参数值。命令证据仅 包含安全的可执行 token、未输出命令的摘要、参数 计数或经过净化的骨架,以及受信任的元数据。SSH 密钥由 密钥类型和 SHA-256 blob 指纹表示。 编译的允许列表是根据提供的 FreeBSD 15.1-RELEASE/arm64 `base.txz` 和 `kernel.txz` 归档生成并审查的。运行时文件无法 扩展它。二进制和内核模块哈希是特定于架构的,因此 扫描器在打开扫描根目录之前会拒绝非 arm64 主机。编译文件 匹配需要适用的模块和路径、常规文件类型、摘要、UID、 GID 和模式。清单标识和原生激活字段指导 特定于模块的解析和分类;它们不是通用 文件匹配操作的一部分。模块在 其规则需要的地方单独评估激活和路径信任。仅用于开发的生成器会验证确切的发行版归档摘要,并在 输出 arm64 记录之前验证 AArch64 ELF 标识。 ## 威胁模型的注意事项和局限性 - 本地 root 权限入侵可以同时更改实时主机和扫描器二进制文件;这不属于 远程证明。 - V1 仅捆绑了 FreeBSD 15.1-RELEASE/arm64 清单。要支持 amd64 或 其他架构,需要生成并审查其专属的清单,并具备 明确的选择门控。 - 合法修补的基线文件可能表现为 review 结果,直到 编译的基线被更新。 - 保守的解析方式会报告复杂的 shell 配置,而不是 执行它以重现 shell 语义。 - `/etc/passwd` 会被直接解析;远程 NSS 账户不会被枚举。 - SSH `Match` 的结果和任意 shell 语义不会被重构。 - 被禁用的原生工具会被忽略,因此输出并不是 FreeBSD 附带的 每个功能的清单。 - 无指标结果仅适用于已选择且已完成的检查。
标签:FreeBSD, SQL, 客户端加密, 库, 应急响应, 持久化检测, 系统审计, 进程监控