Protonk/PAWL
GitHub: Protonk/PAWL
一个通过双向搜索和运行时验证来枚举、解析 macOS Seatbelt 沙箱策略的研究框架,能够自动发现和追踪沙箱行为变化。
Stars: 2 | Forks: 0
# Pawl:通过搜索进行沙箱检测
Pawl 是一个基于搜索构建的 macOS Seatbelt 沙箱分解视图。它通过对操作系统的机械式演练运行,沿着两个方向拉取相同的策略:正向,从配置文件记录通过策略字节到运行时拒绝;以及反向,从编译后的 blob 回溯到输入——跨越多条路径,并记录它们一致或分歧的地方。
Seatbelt 策略是通过一个混乱、受审查的堆栈强制执行的:多层因素共同影响结果。即使拥有良好的工具和强烈的先验知识,从结构 → 含义 → 运行时行为闭环也非常困难。此外,协同努力的回报是一种脆弱的、绑定主机的理解,这种理解可能会在下一次操作系统更新时失效。重建这种理解需要新的逆向工程工作。
Pawl 刻意不同:它提供单一且可检查的描述,具备足够的内部关联,能够在不再成立时自我察觉。我们不是在 macOS 更新时重新调整逆向工程工具然后探索 Seatbelt,而是由内向外检测策略。我们发现新版本 macOS 有何不同的方式与我们了解当前版本的方式相同:`pawl` 中的每一步都经过检测并与系统输出进行差异比对。我们在测试新配置时,通过让这些输出保持富有成效的[怀疑](pawl/PAWL.md)来收敛于系统特性。
## Pawl 产出的内容
IR(中间表示)有两层。证据层(`pawl/structure/`)从编译后的配置文件中提取字节精确、哈希稳定的结构——头部、op-table、节点流、字面量和正则池——并显式标记未知区域。策略层将证据解释为操作、谓词和控制流,形成一个类型化的 `Policy` DAG(`pawl/contract/`),保留指向底层字节的来源链接(`origin_offsets`, `origin_spans`)。正向路径(SBPL → 编译 → 解码)和反向路径(字节 → 解析 → 发射)都产生相同的 `Policy` 类型,使结构比较成为类型检查操作而非字符串差异比对。
## Pawl 如何确保正确性
**五点安全带**(`integration/ir/profile/`)通过往返来验证 IR:一个只有在多条独立路径一致时才闭合的回路,使故障可定位而非神秘不可知。
```
1 ◄══ normalized eq ══► 3
Source Reversed
│ ↗ │
│ reverse │ compile
▼ ╱ ▼
2 ───────────╯ 4
Source ◄═ structural eq ═► Roundtrip
blob blob
│ │
└────────────┬────────────┘
│
▼
5
PolicyWitness
```
点 1–4 形成一个由工件构成的正方形:源 SBPL 编译为源 blob,反向渲染回 SBPL,再重新编译为往返 blob。水平边缘是交叉检查——上方是规范化表面比较,下方是结构哈希比较。点 5 是通过 PolicyWitness(`sandbox_check`)实现的运行时预言机,它在不信任任何静态比较的情况下验证行为。当回路不一致时,不一致的位置会告诉你哪个转换出了问题。
| 级别 | 捕获内容 |
|-------|-----------------|
| 规范化相等性 | 规范化漂移,解析器 bug |
| 结构哈希 | Op-table 分歧,节点图差异 |
| PolicyWitness | 尽管内部一致但主机不一致 |
此正方形的上边缘——源 SBPL 与反向 SBPL 之间的规范化相等性——取决于比较表面的公平性。编译器以无法完美倒转的方式转换源代码:它添加隐式规则、重构谓词、跨操作共享节点、替换参数以及扁平化导入。如果不考虑这些,每一次分歧都是反向器 bug 与已知编译器转换之间的模糊判定。规范化层(`pawl/normalize/`)以编程方式处理此问题,而不是维护不断增长的例外列表。基线工件跟踪约 54 个配置文件类型的基线允许(deny-default 配置文件)和约 5 个基线拒绝(allow-default 配置文件);反向路径抑制这些,并由专门的测试套件保护。两个永久附件处理编译器静默丢弃的授权块以及由编译器节点共享引起的跨操作谓词错误归因。
我们通过更严格的测试工具(`integration/ir/profile/regex/`)定位正则流水线中的错误,其中 DFA 等价性取代了结构哈希,并得到独立于 `sandbox_check` 的运行时文件读取预言机的支持。
## 事物所在位置
`integration/tests/` 包含测试套件(`make test`)。`integration/ir/` 容纳用于正则和配置文件验证的五点测试工具。CARTON(`integration/carton/`)是一个冻结的、可审查的主机范围映射和契约包——当输入更改时,使用 `build`、`diff`、`check` 刷新它。`integration/evidence/` 下的证据是经过整理的输出;消费它,切勿手动编辑。`integration/fixtures/` 下的 Fixtures 是合成样本,用于隔离单一结构或语义旋钮;d-ring 走廊(`integration/fixtures/pawl/d-ring/`)在狭窄、检测过的轨道内引导反向/编译/追踪循环。
## 文档索引
**架构**
- [`pawl/README.md`](pawl/README.md) — 工作台概述与 CLI
- [`pawl/PAWL.md`](pawl/PAWL.md) — 模块、边界与独立契约
- [`pawl/contract/README.md`](pawl/contract/README.md) — 共享类型、双渲染器边界、导入约定
- [`pawl/normalize/README.md`](pawl/normalize/README.md) — 规范化比较表面与规范化目录
- [`pawl/casefile/CASEFILE.md`](pawl/casefile/CASEFILE.md) — 案例文件模式与收据
**测试工具**
- [`integration/ir/ir_schema.md`](integration/ir/ir_schema.md) — IR 规范(证据 + 策略层)
- [`integration/FIVE_POINT_HARNESS.md`](integration/FIVE_POINT_HARNESS.md) — 五点测试工具规范(配置文件 + 正则 + 诊断)
**运行时**
- [`runtime/PolicyWitness.md`](runtime/PolicyWitness.md) — 运行时预言机与探针执行
- [`runtime/specimen/probe_plan_contract.py`](runtime/specimen/probe_plan_contract.py) — 探针计划契约检查
- [`orchestration/probe_plan_builder.py`](orchestration/probe_plan_builder.py) — 从案例文件生成计划
**Fixtures 与证据**
- [`integration/fixtures/pawl/d-ring/`](integration/fixtures/pawl/d-ring/) — 用于编译器行为的合成 Fixture 系列
- [`integration/carton/README.md`](integration/carton/README.md) — 冻结的映射与可审查的契约
**支持**
- [`tools/README.md`](tools/README.md) — Ghidra/Frida/doctor 表面与绑定主机的 CLI
## 欢迎加入
该项目有**许多活动部件**;静态工件、解码器、映射、测试工具、探针及其周围的 macOS 环境都在相互作用。它是一个活的、相互依赖的网格,深入触及研究它的 agents,正如它深入沙箱一样。
在这个纠缠中,你的角色可能是将其中一些部分粘合在一起,或者是把它们分开,视情况而定。追踪你正在接触的边界上的输入和输出,并更新定义接口的生成器或契约,而不是直接修补工件。留下一条从源到输出的清晰、可重新运行的路径,以便接线在下一次更改时保持明确。这是通常的进行方式;特别是,请先阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 和 [AGENTS.md](AGENTS.md)。
标签:Code Signing, Compiler, Compliance, Confined, DAG, Diff, Entitlements, Kext, Policy Enforcement, Privacy, Red Team, Regex, Sandbox, Seatbelt, Security, SIP, System Integrity Protection, TCC, 中间表示, 云安全监控, 云资产清单, 内核扩展, 凭据导出, 子域名枚举, 操作系统, 无线安全, 权限控制, 沙箱, 策略分析, 系统安全, 红队技术, 网络安全审计, 逆向工具, 逆向工程, 静态分析