立即处理可能影响正在运行的系统
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 用户应覆盖重复失效与销毁。
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 隧道协议。
2
高
隧道认证失败会清除明文与握手密钥
TTunnelLocal 在 GCM 标签验证失败时清除解密输出,为 SHAKE-128 签名加入 Handshake 域标签,在指针访问前检查元数据长度,并在 OpenInternal 后清除收发密钥。若最终化抛错,加密路径仍保留已分配结果以便安全释放。
安全
mormot.net.tunnel
beeed494+14-8
net: enhanced TTunnelLocal security
影响
被拒绝的加密帧不再在内存中留下未认证明文,握手签名也与其他 SHAKE-128 用途实现域分离。这是新协议的直接加固。
建议升级
使用此加固提交或更高版本,并验证修改后的 GCM 标签会终止隧道且不暴露明文。
3
高
隧道元数据先检查长度、解析后清除
TTunnelLocal.OpenInternal 在提取 JSON 元数据前确认远端帧仍包含 SizeOf(loc) 字节。InitJsonInPlace 消费缓冲区后,FillZero(info) 会清除解密后的元数据副本。
安全
mormot.net.tunnel
c08ef0d6+6-7
net: minor TTunnelLocal handshake refactoring
影响
畸形握手会在元数据解析前失败,敏感隧道信息在进程内存中的停留时间缩短。应用 API 不变。
建议升级
请将此后续修复与隧道协议重写一并采用,并测试截断元数据帧的拒绝处理。
4
高
隧道握手元数据长度不再导致帧指针下溢
TTunnelLocal.OpenInternal 先从剩余帧长度减去声明的 JSON 元数据长度,拒绝负值后才构造 RawByteString 视图;旧代码在验证减法结果前就形成指针。
安全
mormot.net.tunnel
c7e0e055+6-4
net: hardened TTunnel handshake
影响
畸形远端握手无法再让元数据解析访问接收帧之前的字节,隧道对端会以 ETunnel 失败。
建议升级
升级隧道两端,并在握手测试中加入过小与过大的 JSON 元数据长度。
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 输出应与框架纯实现一致。
建议升级
所有结合 AesGcmAad 使用 TAesGcmOsl 的场景都应升级,并重新运行密文与标签的已知答案测试。
公开 API
TAesOsl.UpdEvpsignature-changed — 新增默认值为 false 的可选 boolean 参数 KeepIV。
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 失效后销毁时保留内存。
建议升级
会创建并销毁 TBinaryCookieGenerator 的服务应升级,尤其是一次性 cookie 失效后的路径。
7
中
带前导空格的 __Secure- cookie 可按逻辑名称解析
THttpCookies.ParseServer 与 CookieFromHeaders 在检查每个 cookie 对的 __Secure- 前缀前调用 GotoNextNotSpace。测试覆盖位于另一值之后、由分号和空格分隔的前缀 cookie。
修复
mormot.core.text
95a8e9d0+8-2
net: fixed #649 cookie parsing
影响
使用常见分号加空格分隔符的 cookie 头现在能以预期的无前缀名称读取 __Secure- 值,而不会漏掉。
建议升级
读取多 cookie 头中 __Secure- cookie 的 HTTP 代码应升级,并重新运行 cookie 查找测试。
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 部分。
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 不变。
建议升级
重新构建 Delphi 2010 目标,并覆盖字符串转换、锁、HTTP 压缩与 ORM JSON 路径。
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 目标解析的内部整理。