BearHuddleston/codex-linux-packager

GitHub: BearHuddleston/codex-linux-packager

一个以净室设计和溯源优先为原则的 Linux 桌面包维护工具,用于安全地从官方渠道获取、验证并提取 Codex 应用 payload,同时保持仓库的可审计性。

Stars: 0 | Forks: 0

# codex-linux-packager **用于维护 Linux Codex 桌面包的净室设计、溯源优先工具。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/BearHuddleston/codex-linux-packager/actions/workflows/ci.yml) ![Python](https://img.shields.io/badge/Python-3.11%2B-3776AB?logo=python&logoColor=white) ![License](https://img.shields.io/badge/tooling-MIT-blue) ![Payload](https://img.shields.io/badge/upstream_payload-not_in_repo-success)
## 本仓库存在的目的 现有的 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, 打包工具, 无后门, 自动化构建, 软件分发, 逆向工具