BearHuddleston/codex-linux-packager
GitHub: BearHuddleston/codex-linux-packager
一个以净室设计和溯源优先为原则的 Linux 桌面包维护工具,用于安全地从官方渠道获取、验证并提取 Codex 应用 payload,同时保持仓库的可审计性。
Stars: 0 | Forks: 0
# codex-linux-packager
**用于维护 Linux Codex 桌面包的净室设计、溯源优先工具。**
[](https://github.com/BearHuddleston/codex-linux-packager/actions/workflows/ci.yml)



## 本仓库存在的目的
现有的 Linux 移植版通常难以审计,因为它们会将解压后、经过压缩的应用包直接提交到代码仓库中,并在原处对这些包进行修补。本项目采用了净室设计的方法:
- 在 Git 中仅保留原始的打包、验证和测试代码;
- 直接从 OpenAI 公开的 Codex Sparkle feed 获取发布版;
- 将下载限制在预期的 HTTPS 源和路径内;
- 保留发布元数据和 SHA-256 溯源信息;
- 仅在被忽略的本地目录中暂存下载的 payload;
- 以可单独审查、经过测试的 patch 形式开发 Linux 兼容行为。
## 当前状态
本仓库目前提供了一个**可运行且经过测试的上游获取层 (upstream-ingestion layer)**,而不是一个最终完成的 Linux 应用包。
| 功能 | 状态 |
|---|---:|
| 解析官方 Sparkle feed | ✅ |
| 拒绝未经批准的源 URL 和重定向 | ✅ |
| 有界且原子化的 artifact 下载 | ✅ |
| ZIP 路径穿越/symlink/歧义防御 | ✅ |
| 仅提取 `*.app/Contents/Resources/app.asar` | ✅ |
| SHA-256 溯源清单 | ✅ |
| 原创的 Linux 兼容 patch 引擎 | 计划中 |
| 重新编译 Linux 原生 Node 模块 | 计划中 |
| 构建并对 AppImage 进行冒烟测试 | 计划中 |
| 发布带有签名/启用 zsync 的 release | 计划中 |
本仓库目前未发布任何可安装的 Codex 应用程序。
## 环境要求
- Linux
- Python 3.11 或更高版本
- 运行实时的上游暂存操作大约需要 1 GiB 的临时空间
获取层仅使用 Python 标准库。
## 安装说明
请使用隔离的虚拟环境,而不是直接修改系统自带的 Python:
```
python -m venv .venv
.venv/bin/python -m pip install -e .
```
## 用法
### 检查最新的上游 release
```
.venv/bin/codex-linux-packager inspect
```
该命令会打印出版本号、build 号、架构、URL、预期长度、发布日期、媒体类型,以及由 feed 提供的 Sparkle 签名。
### 下载并暂存最新的 payload
```
.venv/bin/codex-linux-packager stage --work-dir work
```
这会下载完整的 macOS release,安全地仅提取出 `app.asar`,并写入:
```
work/
├── downloads/
│ └── ChatGPT-darwin-arm64-
.zip
└── upstream/
└── /
├── source.zip
├── app.asar
└── provenance.json
```
`work/` 下的所有内容都会被 Git 忽略。
### 检查本地 feed fixture
```
.venv/bin/codex-linux-packager inspect --feed-file tests/fixtures/appcast.xml
```
### 从已下载的 ZIP 中提取
```
.venv/bin/codex-linux-packager extract release.zip \
--output work/upstream/manual/app.asar
```
## 安全模型
即使上游 feed 和 artifact 是从预期的 OpenAI 主机名获取的,它们也属于不受信任的输入。
获取层会:
- 锁定 feed URL 以及 artifact 的主机名和路径前缀;
- 强制要求 HTTPS,并拒绝包含凭证、自定义端口、查询语句和片段的 URL;
- 拒绝 HTTP 重定向,而不是将请求转发到其他地方;
- 对 feed、artifact 和已提取的 ASAR 大小设置上限;
- 仅接受作为有界常规文件的本地 feed fixture,并将 feed XML 标准化为 UTF-8;
- 在解析 XML 之前,拒绝 NUL 字符、DTD 和实体声明;
- 采用流式下载,而不是将其缓冲在内存中;
- 写入一个私有的临时文件,对其进行 `fsync` 操作,然后原子化地替换目标文件;
- 在提取之前,通过一次有界遍历对选定的 artifact 进行快照和哈希处理;
- 拒绝 symlink 和非常规文件 artifact 源,且不会阻塞在 FIFO 上;
- 在提取后重新对该私有快照进行哈希校验,如果发现改变则执行失败即停止 (fail closed);
- 在 `ZipFile` 解析元数据之前,限制 ZIP 成员数量 (16,384) 和中央目录字节数 (64 MiB);
- 拒绝 ZIP64/多磁盘存档、路径穿越、反斜杠路径、symlink 以及存在多个 `app.asar` 候选项;
- 仅允许存储/deflate 压缩的 `app.asar` 成员,并将其压缩比例限制在 200:1 以内;
- 仅提取预期的 `app.asar`,绝不提取整个存档;
- 记录源 artifact 和提取出的 payload 的 SHA-256 哈希值。
CI 还会运行一个失败即停止的仓库边界扫描器。在这个初始阶段,
被追踪的文件必须是较小的文本源文件:存档、应用包、原生模块、可执行文件、二进制资产、symlink 以及大小超过 1 MiB 的文件都会被拒绝。
目前,Sparkle EdDSA 签名**仅作记录,并未进行独立验证**。在实现无人值守的发布自动化之前,必须锁定 OpenAI 的 Sparkle 公钥并对签名进行验证。
## 净室边界
贡献内容必须是原创的。请勿从第三方的 Codex 重打包仓库中复制代码、编译后的 bundle、patch 表达式或生成的资产,除非它们带有明确兼容的开源许可证。
允许的输入包括:
- 公开文档化的格式和 API;
- 从合法获取的官方 artifact 中得出的行为观察结果;
- 独立编写的测试和实现;
- 在兼容许可证下的开源依赖项。
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和 [架构文档](docs/architecture.md)。
## 路线图
1. 锁定并验证官方的 Sparkle 签名密钥。
2. 在不将提取出的 payload 提交到仓库的情况下提取应用元数据。
3. 使用合成的 fixture 定义 Linux 行为兼容性契约。
4. 实现一个带有失败即停止匹配功能的原创 patch 引擎。
5. 为目标 Electron ABI 重新编译 `better-sqlite3` 和 `node-pty`。
6. 使用 Linux Electron runtime 将暂存的应用打包。
7. 添加隔离的启动、protocol-handler、app-server 和 KDE/GNOME 冒烟测试。
8. 生成 AppImage 更新元数据和 `.zsync` 附带文件。
9. 仅在解决许可和再分发问题之后才进行发布。
## 开发
运行完整的测试套件:
```
PYTHONPATH=src python -m unittest discover -s tests -v
```
验证模块语法:
```
python -m compileall -q src tests
```
源码目录结构:
```
src/codex_linux_packager/
├── cli.py # inspect, extract, and stage commands
├── repository_boundary.py # CI guard against payloads/binaries in Git
└── upstream.py # feed, download, provenance, and archive boundaries
tests/
├── fixtures/ # synthetic metadata only
├── test_cli.py # real CLI behavior
└── test_upstream.py
```
## 许可证
本仓库中的原创工具基于 [MIT License](LICENSE) 提供授权。
该许可证**不**适用于 OpenAI 软件、下载的应用 payload、商标或其他第三方材料。您有责任遵守适用于您下载或打包的任何 artifact 的相关条款。标签:Python, 打包工具, 无后门, 自动化构建, 软件分发, 逆向工具