Skip to content

WARDEN v0.3.4(安全修订:发布物 GPG 签名 + 反降级 + 修掉写坏配置的同源 bug)

Choose a tag to compare

@Firefly0619sec Firefly0619sec released this 11 Oct 13:19
· 10 commits to main since this release
ce0c931

WARDEN 0.3.4(安全修订版)

0.3.3 修了四个工具的 AOT 移植与一批真缺陷 ✓ 本版是信息安全体检后的修订版 ✓
三件事:修掉会写坏配置的同源 bug ✓ 给发布物加来源认证(GPG 签名) ✓ 更新器加反降级门限 ✓

一、修掉「更新器会把配置写坏」的同源 bug ✗→✓

0.3.3 修过安装器里的一处数据破坏级 bug:写自检基线时用了 "$1" + hash + "$3" ✗
而 .NET 的 Regex.Replace 会把 $ 后面连续的数字整段当成捕获组号 ✗
→ 新哈希只要以数字开头(如 4164b4df…)就拼成 $14164b4df… ✗ → 没有 14164 号组 → 按字面量吐出 ✗
→ 配置里那一行变成 $14164b4dfe8523da…b8", ✗ 键名和引号一起被吃掉 ✗ JSON 语法错误 ✗

这一版把同一份 bug 在更新器里的那份也修掉了 ✗→✓
(体检时用 git grep 才发现 ✗ 这段逻辑在安装器与更新器里各抄一份 ✓ 上一版只修了安装器 ✓)

修法(两份都改成一样的 ✓):

  1. 组引用一律加花括号 → ${1} / ${3} ✓
  2. 替换后自检 → 自检不过就一个字都不写 ✓(宁可不动也不能写坏 ✓)
  3. 写之前先留一份 WARDEN.json.setup-bak ✓

二、发布物加上来源认证(GPG 签名)✗→✓

问题:0.3.3 及以前只有 SHA256SUMS.txt ✗
能改下载页的人(或 GitHub 账号被盗 ✗)可以同时换掉 exe 和校验和 ✗ 用户怎么对都对不上 ✓

现在:每次发布自动生成 SHA256SUMS.txt.asc ✓ 签名失败一律中止发布 ✗ 绝不发"说签了其实没签"的包 ✓
发布者指纹(与提交签名同一把钥匙 ✓):

EBFB6B895D8EEC8F59CE0A26E23876CBBDAE330F

用户怎么验(发布说明里也写了同一套 ✓):

gpg --recv-keys EBFB6B895D8EEC8F59CE0A26E23876CBBDAE330F
gpg --verify SHA256SUMS.txt.asc SHA256SUMS.txt      # ★ 这一步才是关键
Get-FileHash WARDEN-Setup.exe -Algorithm SHA256     # 再逐条对哈希

三、更新器加反降级门限 ✗→✓

问题:更新器原来不比对版本 ✗ → 喂一个旧版本包就等于被降级 ✓
(旧版可能带着已知问题 ✓ 而且它会把 expected_self_hash 也改成旧 exe 的 ✓ 用户完全看不出来 ✗)
顺带说:原来的哈希校验只看同目录的 <zip>.sha256 ✗ —— 那个旁文件可以跟包一起被换掉 ✗ 属于 TOFU ✓

现在:包里 WARDEN.exe 的版本必须 ≥ 已安装版本 ✓ 更旧一律拒绝并明确告知 ✓
读不到任何一边的版本 → 放行(只记日志 ✓ 绝不误伤正常升级 ✓)

实测(喂用户机器上真实的 0.2.5 包 ✗):

[更新] ★★ 拒绝更新:这是【降级】✗ 包里 0.2.5 < 已安装 0.3.4 ✓ 已中止,一个文件都没动 ✓
沙箱 WARDEN.exe 有没有被降级覆盖:没有 ✓✓   真实配置:一字未动 ✓

四、新增发布前闸门 tools\pre-release-check.ps1 ✗→✓

体检暴露了一个通病:同一段逻辑抄两份、版本号散在 10 个文件里 ✗ → 修一处漏一处 ✓
所以把这类"漏一处就出事"的检查脚本化 ✓ 发布前必须跑 ✓

① 危险的正则替换写法("$N" + 变量 ✗)→ 全仓搜 ✓ 发现就中止 ✗
② 写配置的地方有没有「替换后自检」兜底 ✓
③ 产品版本号在 10 处是否处处一致 ✓(四个 AOT 工具保留各自历史编号 ✓ 不在范围 ✓)
④ 公开仓里有没有密钥/口令 ✗
⑤ 语言包六份是否齐 ✓

五、本版实测(只写实测到的)

pre-release-check.ps1 → 闸门全过 ✓(版本 10 处全 0.3.4 ✓ 无危险写法 ✓ 无密钥 ✓ 语言包 6 份 ✓)
release.ps1 -Version 0.3.4 → 退出码 0 ✓ 载荷 22.2 MB ✓ 载荷闸门三条全过 ✓
  GPG 签名 → Good signature(ebfb6b895d8eec8f…)✓ 脚本自校验 + 我独立复验 ✓
沙箱静默安装 → 退出码 0 ✓ 17 个文件 + lang\ 六包 ✓ 每个 exe ≤ 8MB ✓
  配置只按设计改 expected_self_hash 一个字段 ✓ 还原后一字不差 ✓
反降级 → 拒绝 0.2.5 ✓ 文件零改动 ✓ 配置零改动 ✓

六、文件与校验值(SHA256)

6d1427a2eeb9aa9c2d87e6515b006924d7dbd9080bba7f9ed69e6a055df4f0fe  WARDEN.exe
5862630b741ba721c35813b3275cbf113ec191c34390be6e3144ca7540f84ff2  WARDEN-Setup.exe
5f261504e8035219a1134b43c23699655e4e4882c43613f1facb9e2d9a20bf18  warden-cli.exe
261df83084a5b53149c3bd8d7f7a88cdc24bb3837137b776a03e216ba26df01b  RedTeam.exe
★ 上面这份列表自身有 GPG 签名 → SHA256SUMS.txt.asc ✓(不签名的哈希等于没认证 ✗)

七、兼容性与怎么装

  • 配置格式未变 ✓ 命令行参数未变 ✓ 语言包位置未变 ✓
  • 装法同 0.3.3:双击 WARDEN-Setup.exe → 向导 → 完成页「打开设置界面」✓
  • 已经从 0.3.3 装过的用户:直接覆盖安装 0.3.4 即可 ✓(本版修的是更新器路径 ✓)

八、许可证

AGPL-3.0-or-later —— 注意:把 WARDEN 做成在线服务也要开源 ✓