mORMot2 Daily每日上游提交速读

TTunnelLocal 改用带方向独立密钥的认证 AES-GCM

TTunnelLocal 完成安全协议重写:以带认证的 AES-GCM 帧替换 AES-CTR,分离收发密钥,将会话数据纳入认证,并更早拒绝畸形握手。本批提交还修复 OpenSSL GCM 关联数据处理、二进制 cookie 内存泄漏及带空格的 __Secure- cookie 解析,并针对 Delphi 2010 禁用不安全内联。

要点

  • 使用 build 2.4.17551;TTunnelLocal 安全重写随后立即获得三次加固。
  • 加密 TTunnelLocal 流量现使用 AES-GCM、认证帧及独立的收发密钥。
  • 引用 tlmVersion1 的代码必须迁移到 tlmVersion1_aesctr 或新的 tlmVersion2。
  • TAesGcmOsl 现在能正确认证 AEAD 关联数据。
  • TBinaryCookieGenerator 在失效后销毁时不再泄漏托管状态。

升级建议

应升级到 build 2.4.17551,不要停留在尚未完成后续加固的 2.4.17544-2.4.17545。请同时升级 TTunnelLocal 两端,迁移 tlmVersion1 引用,并复测加密握手、认证标签拒绝及畸形元数据。OpenSSL GCM 用户还应验证 AAD 向量,二进制 cookie 用户应覆盖重复失效与销毁。

版本号2.4.17538 → 2.4.17551
提交11
行数+257 -141
阅读1 分钟

10 条中的 10 条 · 上游 11 次提交

主题
# 条目 类别 单元
1 严重 TTunnelLocal 帧获得认证加密与方向独立密钥 TTunnelLocalMagic 将 tlmVersion1 重命名为 tlmVersion1_aesctr,并新增 tlmVersion2。现行协议把帧从 AES-CTR 切换到 AES-GCM,依据双方握手 CRC 派生独立收发密钥,将 TTunnelSession 作为 AAD 认证,按方向递增 96 位 IV,并拒绝相同 CRC 或密钥。 安全 mormot.crypt.core+1 a9f6b586+105-32

net: fixed TTunnelLocal handshake security

影响

加密隧道帧现在同时提供完整性与机密性,且不会在两个方向复用同一密钥。协议标识和线格式均改变,因此新旧端点无法混用。

需要迁移

请同时升级 TTunnelLocal 两端。搜索 tlmVersion1,将确需旧协议的引用替换为 tlmVersion1_aesctr;认证协议使用 tlmVersion2。

公开 API

  • TTunnelLocalMagic.tlmVersion1renamed — 旧 AES-CTR 值现名为 tlmVersion1_aesctr。
  • TTunnelLocalMagic.tlmVersion2added — 标识带认证的 AES-GCM 隧道协议。

Arnaud Bouchez · 08:29 UTC · 在 GitHub 上查看该提交 →

2 高 隧道认证失败会清除明文与握手密钥 TTunnelLocal 在 GCM 标签验证失败时清除解密输出,为 SHAKE-128 签名加入 Handshake 域标签,在指针访问前检查元数据长度,并在 OpenInternal 后清除收发密钥。若最终化抛错,加密路径仍保留已分配结果以便安全释放。 安全 mormot.net.tunnel beeed494+14-8

net: enhanced TTunnelLocal security

影响

被拒绝的加密帧不再在内存中留下未认证明文,握手签名也与其他 SHAKE-128 用途实现域分离。这是新协议的直接加固。

Arnaud Bouchez · 09:00 UTC · 在 GitHub 上查看该提交 →

3 高 隧道元数据先检查长度、解析后清除 TTunnelLocal.OpenInternal 在提取 JSON 元数据前确认远端帧仍包含 SizeOf(loc) 字节。InitJsonInPlace 消费缓冲区后,FillZero(info) 会清除解密后的元数据副本。 安全 mormot.net.tunnel c08ef0d6+6-7

net: minor TTunnelLocal handshake refactoring

影响

畸形握手会在元数据解析前失败,敏感隧道信息在进程内存中的停留时间缩短。应用 API 不变。

Arnaud Bouchez · 10:15 UTC · 在 GitHub 上查看该提交 →

4 高 隧道握手元数据长度不再导致帧指针下溢 TTunnelLocal.OpenInternal 先从剩余帧长度减去声明的 JSON 元数据长度,拒绝负值后才构造 RawByteString 视图;旧代码在验证减法结果前就形成指针。 安全 mormot.net.tunnel c7e0e055+6-4

net: hardened TTunnel handshake

影响

畸形远端握手无法再让元数据解析访问接收帧之前的字节,隧道对端会以 ETunnel 失败。

Arnaud Bouchez · 08:39 UTC · 在 GitHub 上查看该提交 →

5 高 OpenSSL GCM 处理关联数据时保持 IV 不变 TAesOsl.UpdEvp 新增可选 KeepIV 参数。TAesGcmOsl 在载荷与 AAD 更新时启用它,避免在一次 GCM 操作中把 EVP_CIPHER_CTX_iv 回写到 Owner.IV,并跳过零长度 AAD。 修复 mormot.crypt.openssl c9ed0cb9+14-19

crypt: fixed TAesGcmOsl with AEAD associated information

影响

TAesGcmOsl 现在可正确认证关联信息而不破坏 IV 状态;相同向量下,OpenSSL 后端 AEAD 输出应与框架纯实现一致。

公开 API

  • TAesOsl.UpdEvpsignature-changed — 新增默认值为 false 的可选 boolean 参数 KeepIV。

Arnaud Bouchez · 08:21 UTC · 在 GitHub 上查看该提交 →

6 高 二进制 cookie 销毁会释放上下文中的托管状态 TBinaryCookieGenerator.Destroy 将对 fContext 的 FillCharFast 改为 FillZeroRtti(TypeInfo(TBinaryCookieContext), fContext)。回归测试会使已生成 cookie 失效、验证空状态并销毁生成器。 修复 mormot.crypt.secure 69b16d3f+13-3

crypt: fixed #650 binary cookie generator memory leak

影响

TBinaryCookieContext 中的托管字段会在反取证清零前完成终结,避免生成器在 cookie 失效后销毁时保留内存。

Arnaud Bouchez · 10:33 UTC · PR #650 · 在 GitHub 上查看该提交 →

7 中 带前导空格的 __Secure- cookie 可按逻辑名称解析 THttpCookies.ParseServer 与 CookieFromHeaders 在检查每个 cookie 对的 __Secure- 前缀前调用 GotoNextNotSpace。测试覆盖位于另一值之后、由分号和空格分隔的前缀 cookie。 修复 mormot.core.text 95a8e9d0+8-2

net: fixed #649 cookie parsing

影响

使用常见分号加空格分隔符的 cookie 头现在能以预期的无前缀名称读取 __Secure- 值,而不会漏掉。

Arnaud Bouchez · 10:29 UTC · PR #649 · 在 GitHub 上查看该提交 →

8 中 AES-GCM 新增公开的 96 位 nonce 递增辅助函数 mormot.crypt.core 新增 GCM_IncIV,以大端顺序递增 TAesBlock 的 0 至 11 字节,同时保持末尾 32 位计数器不变。GMAC_SIZE 改写为 SizeOf(THash128),AES-GCM 文档也明确缓冲区布局。 新功能 mormot.crypt.core 54b070e6+24-3

crypt: new GCM_IncIV() wrapper function

影响

加密调用方可递增 96 位 GCM nonce 而不修改块计数器;除非采用新辅助函数,现有 API 与密文格式不变。

公开 API

  • GCM_IncIVadded — 递增 TAesBlock 中的 96 位 AES-GCM nonce 部分。

Arnaud Bouchez · 08:24 UTC · 在 GitHub 上查看该提交 →

9 中 Delphi 2010 避免核心路径中的不安全内联展开 HASSAFEINLINE 现在从 Delphi XE 而非 Delphi 2010 开始启用。多个字符串、锁、HTTP 与 ORM 方法使用该条件,使 Delphi 2010 采用非内联编译,新版 Delphi 与 FPC 保持原路径。 编译器与平台 mormot.core.base+4 86119552+15-16

core: circumvent Delphi 2010 inlining bug

影响

Delphi 2010 构建可避开常用例程中的编译器内联缺陷;其他受支持编译器的行为与 API 不变。

Arnaud Bouchez · 10:14 UTC · 在 GitHub 上查看该提交 →

10 低 字符串头访问得到简化且行为不变 mormot.core.base 统一将 PStrRec 变量命名为 sr,并在 EnsureRawUtf8 与 FakeCodePage 中通过指针递减访问字符串头。TLdapClientSettings.SetTargetUri 移除 URI 解析已完成的地址归一化。 内部重构 mormot.core.base+1 b59d0bf0+51-46

core: some refactoring with no functional change

影响

应用代码与运行时行为无预期变化;这是字符串分配与 LDAP 目标解析的内部整理。

Arnaud Bouchez · 09:37 UTC · 在 GitHub 上查看该提交 →

上游活动 每日提交数 · 最近 60 天
提交977
活跃天数44/60
最忙一天2026-09-30
峰值60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13