Skip to content

Commit f282de5

Browse files
authored
补记安全批次改动并回填 Windows changelog (#269)
docs: record the security batch and backfill the Windows changelog PRs #265, #266 and #268 changed user-visible security behaviour without a changelog entry. Adds an Unreleased section to both platforms covering the payload $-corruption fix, the macOS log redaction, the Windows CDP -32000 alignment, the Windows Node runtime pinning, and the release-gate changes. Also backfills Windows 1.5.3 through 1.5.5, which were missing entirely while windows/VERSION already read 1.5.5. Verified against the tags that those three versions touched only the version constant and its assertions on the Windows side, so each entry says exactly that rather than inventing a fix.
1 parent fcda509 commit f282de5

2 files changed

Lines changed: 47 additions & 0 deletions

File tree

macos/CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
11
# Changelog
22

3+
## 未发布
4+
5+
### 安全
6+
7+
- 修复主题展示文案里的 `$` 破坏注入载荷的问题:`String.prototype.replace` 即使替换值是字符串也会解释 `$$``$&``` $` ```$'`,而主题名等字段完全来自导入的 `theme.json`,`normalizeThemeText` 只拒绝控制字符和超长值、原样放行 `$`。实测名为 `` $` `` 的主题会把整份 38 KB 渲染器源码拼回载荷并产生语法错误;`$&``$$` 则生成能正常解析、但主题名已被悄悄篡改的载荷。影响是持久的——切换脚本先把 `theme.json` 作为提交标记落盘、之后才应用,所以损坏的主题此时已是活动主题,之后每次启动都会重新读取它。六处占位符替换改为函数形式;载荷构建新增未解析占位符扫描和只解析不执行的编译断言作为纵深防御(注意这两道守卫拦不住 `$$`,函数替换本身才是修复)。未在 `normalizeThemeText` 里拒绝 `$`——它在主题名里是合法字符,已发布的社区主题在用。
8+
9+
### 修复
10+
11+
- 注入器日志与 `--check` 结果不再记录页面标题和 URL。这些字段经 `launchctl submit -o` 落进 `~/Library/Application Support/` 下的长期日志文件,而 Codex 的窗口标题包含会话名与项目名。Windows 侧早已修正(见其 1.3.0 条目),macOS 未同步。渲染器探针也不再把 `document.title``location.href` 回传给宿主,仅保留结构标记。新增仓库级静态检查防止回归。
12+
13+
### 内部
14+
15+
- `runtime-css-nested-has``shell-braced-vars-before-cjk` 两个回归测试此前未被 `run-tests.sh` 引用,只靠 CI 的通配符命中——贡献者在本地跑不到,发布流水线也完全不执行。它们分别是 #221(嵌套 `:has()` 使整条规则被丢弃、首页背景静默失效)和 #251(裸 `$var` 紧邻全角标点在 `set -u` 下崩溃并掩盖真实错误)的唯一防线。现已接入。
16+
- 发布流水线新增可移植回归作业,并作为创建 tag 的前置依赖:回归失败会在 tag 产生**之前**中止发布,而不是等到构建阶段才失败。未采用 `workflow_run` 串接 CI——发布闸门依赖 `github.event.before` 读取上一次 `macos/VERSION` 来判断版本是否真的变化,而该事件不提供此字段,挂接会使"版本未变不得重复发布"失效。
17+
- DMG 挂载验收新增图标断言。此前验收覆盖版本、URL scheme、引擎版本、许可证与预设白名单,唯独不含图标,而 #220 的根因正是缺图标的 DMG 照常出包。
18+
- `bounded-community-http` 测试中的 `swiftc``xcrun` 调用加上超时上限。此前无上限,在繁忙的构建机上会挂起整个测试套件而非快速失败;由于回归作业现在会阻断 tag 创建,一次工具链卡顿足以拖住一次合法发布。
19+
320
## 1.5.5 — 2026-07-25
421

522
### 修复

windows/CHANGELOG.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,35 @@
11
# Windows Changelog
22

3+
## 未发布
4+
5+
### 安全
6+
7+
- 修复 Node.js 运行时可被环境变量重定向、导致全部校验器被整体旁路的问题。`Get-DreamSkinNodeRuntime` 接受 `$env:CODEX_DREAM_SKIN_NODE` 指定的任意路径,而"校验"方式是执行候选二进制读取版本号——恶意程序在任何检查发生之前就已运行,校验本身即是执行。该运行时承载本项目全部校验逻辑:Safe CSS 白名单、主题包 manifest 与 SHA-256 校验、图片尺寸与解码炸弹限制,以及注入器。任何能写入 `HKCU\Environment` 的进程(无需管理员权限)都可让四者全部跑在自己的 `node.exe` 上,社区主题赖以把关的 Safe CSS 白名单随之失效。现已移除环境变量覆盖;新增 Authenticode 签名校验,在候选二进制被执行**之前**验证签名状态与签发者;已安装的引擎始终优先使用自带的、经引擎清单哈希校验的运行时。macOS 侧从来没有这个问题——它钉死 ChatGPT 包内路径、做代码签名校验并比对 team ID,不接受任何覆盖。此前的回归测试断言该环境变量**必须存在**,反而把不安全形态锁定在原地;现改为断言相反的性质,并额外锁定"自带运行时优先于 PATH"与"验签先于执行"两项顺序。
8+
- 修复主题展示文案里的 `$` 破坏注入载荷的问题,与 macOS 同源同修:六处占位符替换改为函数形式,新增载荷完整性断言。详见 macOS changelog 同批条目。
9+
10+
### 修复
11+
12+
- 修复皮肤已正常显示、却在约 90 秒后被强制关闭并重启 Codex 的问题(#267)。启动脚本在自己拉起 Codex 的情况下,把**任何**验证失败都当作重启 Codex 的理由;而 `verifySession` 是整体判定,`Browser.getWindowForTarget` 在部分 Codex 版本上对真实、可见的窗口也返回无用结果。用户看到的是:主题应用成功、界面正常、可交互,一分多钟后 Codex 突然自己重启并恢复官方外观。把用户正在使用的、工作正常的窗口杀掉,比保持"未验证"状态糟糕得多。现在验证循环会记录渲染器是否报告皮肤已安装、有样式、文档可见、视口正常且外壳结构完整;若是,回滚照常停止注入器并删除状态文件(不会有任何东西声称该会话已验证),但**保留 Codex 继续运行**并说明原因。文档隐藏、结构缺失、样式未注入等真正损坏的会话仍然会回滚重启。macOS 从来不做强制重启,本次修复使 Windows 与之对齐。注意这条不依赖 CDP 错误码分类——即使遇到未被识别的错误(如报告中的 `This operation was aborted`),损害面同样被限制。
13+
- 修复 Codex 26.721.x 上换肤永远失败的问题。CDP `Browser.getWindowForTarget` 在 Chrome/150 上对真实、聚焦、可见的窗口也返回 `-32000`,而 Windows 侧仅识别 `-32601`、且原生窗口检查没有降级通道,导致校验永久报错。macOS 已于 1.5.4 修正(#256),Windows 未同步。现与 macOS 采用同一分类语义,并把 CDP 数字错误码传播到分类器,不再仅依赖错误文案匹配。`documentVisible`、视口尺寸与结构检查仍是硬性条件,真正隐藏的窗口依旧拒绝通过——被豁免的只是这个本就无信息量的原生窗口信号。原有回归测试把 `-32000` 判负当作正确行为锁定,已一并修正。
14+
15+
## 1.5.5 — 2026-07-25
16+
17+
### 修复
18+
19+
- 随 macOS 版本号推进,Windows 侧仅更新版本常量与对应断言,无功能改动。该版修复的是 macOS 菜单栏应用的焦点竞态(`LSUIElement` 弹窗关闭后系统不归还焦点),Windows 托盘的焦点语义不同,不适用。
20+
21+
## 1.5.4 — 2026-07-25
22+
23+
### 修复
24+
25+
- 随 macOS 版本号推进,Windows 侧仅更新版本常量与对应断言,无功能改动。该版的 CDP `-32000` 修复当时只落在 macOS,Windows 上同一个缺陷一直存在到本次修复(见上方未发布条目)。
26+
27+
## 1.5.3 — 2026-07-25
28+
29+
### 修复
30+
31+
- 随 macOS 版本号推进,Windows 侧仅更新版本常量与对应断言,无功能改动。该版修复的是 macOS shell 脚本中裸变量紧邻全角标点在 `set -u` 下崩溃的问题,PowerShell 的变量展开规则不同,不受同类影响。
32+
333
## 1.5.2 — 2026-07-25
434

535
### 修复

0 commit comments

Comments
 (0)