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, 客户端加密, 库, 应急响应, 持久化检测, 系统审计, 进程监控