mORMot2 DailyЕжедневный обзор коммитов апстрима

TTunnelLocal переходит на аутентифицированный AES-GCM с раздельными ключами

TTunnelLocal получает новую security-схему: AES-CTR заменён аутентифицированными кадрами AES-GCM, ключи приёма и передачи разделены, session включена в authentication, а повреждённые handshakes отклоняются раньше. Также исправлены associated data в OpenSSL GCM, утечка binary cookie и разбор __Secure- cookies после пробела. Для Delphi 2010 отключён небезопасный inline.

Коротко

  • Используйте build 2.4.17551: за security rewrite TTunnelLocal сразу следуют три hardening fixes.
  • Шифрованный трафик TTunnelLocal теперь использует AES-GCM, authenticated frames и разные ключи приёма/передачи.
  • Код с tlmVersion1 нужно перевести на tlmVersion1_aesctr или новый tlmVersion2.
  • TAesGcmOsl теперь корректно аутентифицирует AEAD associated information.
  • TBinaryCookieGenerator больше не теряет managed state при уничтожении после invalidation.

Рекомендации по обновлению

Переходите на build 2.4.17551, а не на 2.4.17544-2.4.17545, где новый tunnel protocol ещё не получил все hardening fixes. Обновите оба конца TTunnelLocal одновременно, замените tlmVersion1 и проверьте encrypted handshakes, отказ неверных tags и повреждённые metadata. Пользователям OpenSSL GCM нужны AAD vectors, а binary cookie — циклы invalidate/destroy.

Сборка2.4.17538 → 2.4.17551
Коммиты11
Строки+257 -141
Чтение3 мин

10 из 10 записей · 11 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Критический Кадры TTunnelLocal получают authenticated encryption и directional keys TTunnelLocalMagic переименовывает tlmVersion1 в tlmVersion1_aesctr и добавляет tlmVersion2. Активный protocol меняет AES-CTR на AES-GCM, выводит разные receive/send keys из handshake CRC сторон, аутентифицирует TTunnelSession как AAD, увеличивает 96-bit IV по направлениям и отвергает одинаковые CRC или keys. Безопасность mormot.crypt.core+1 a9f6b586+105-32

net: fixed TTunnelLocal handshake security

Влияние

Encrypted tunnel frames теперь дают integrity и confidentiality и не используют один key в обоих направлениях. Protocol identifiers и wire framing изменены, поэтому смешанные old/new endpoints несовместимы.

Требуется миграция

Обновите оба peer TTunnelLocal одновременно. Найдите tlmVersion1 и замените нужные legacy-ссылки на tlmVersion1_aesctr; для authenticated protocol используйте tlmVersion2.

Публичный API

  • TTunnelLocalMagic.tlmVersion1renamed — Legacy значение AES-CTR теперь называется tlmVersion1_aesctr.
  • TTunnelLocalMagic.tlmVersion2added — Обозначает authenticated AES-GCM tunnel protocol.

Arnaud Bouchez · 08:29 UTC · открыть коммит на GitHub →

2 Высокий Ошибки аутентификации tunnel очищают plaintext и handshake secrets TTunnelLocal очищает decrypted output при ошибке GCM tag, добавляет доменную метку Handshake в SHAKE-128 signatures, проверяет длину metadata до pointer access и обнуляет receive/send keys после OpenInternal. Encryption сохраняет выделенный result при exception финализации. Безопасность mormot.net.tunnel beeed494+14-8

net: enhanced TTunnelLocal security

Влияние

Отклонённые encrypted frames больше не оставляют unauthenticated plaintext в памяти, а handshake signatures отделены от других применений SHAKE-128. Это прямой hardening нового протокола.

Модули

Arnaud Bouchez · 09:00 UTC · открыть коммит на GitHub →

3 Высокий Tunnel metadata проверяются до parsing и затем очищаются TTunnelLocal.OpenInternal проверяет наличие SizeOf(loc) байтов до извлечения JSON metadata. После InitJsonInPlace вызов FillZero(info) стирает расшифрованную копию. Безопасность mormot.net.tunnel c08ef0d6+6-7

net: minor TTunnelLocal handshake refactoring

Влияние

Повреждённые handshakes отклоняются до parsing metadata, а sensitive tunnel information меньше остаётся в памяти. Application API не меняется.

Модули

Arnaud Bouchez · 10:15 UTC · открыть коммит на GitHub →

4 Высокий Длина metadata tunnel handshake больше не вызывает underflow указателя TTunnelLocal.OpenInternal вычитает заявленную длину JSON metadata из остатка frame, отвергает отрицательный результат и только затем создаёт RawByteString view. Ранее pointer формировался до проверки. Безопасность mormot.net.tunnel c7e0e055+6-4

net: hardened TTunnel handshake

Влияние

Повреждённый remote handshake больше не может направить metadata parsing перед началом принятого frame; peer завершается с ETunnel.

Модули

Arnaud Bouchez · 08:39 UTC · открыть коммит на GitHub →

5 Высокий OpenSSL GCM сохраняет IV при обработке associated data TAesOsl.UpdEvp получает optional KeepIV. TAesGcmOsl включает его для payload и AAD, чтобы не копировать EVP_CIPHER_CTX_iv обратно в Owner.IV во время GCM round, и пропускает AAD нулевой длины. Исправления mormot.crypt.openssl c9ed0cb9+14-19

crypt: fixed TAesGcmOsl with AEAD associated information

Влияние

TAesGcmOsl теперь корректно аутентифицирует associated information без повреждения IV state. AEAD output OpenSSL должен совпадать с pure implementation на тех же vectors.

Публичный API

  • TAesOsl.UpdEvpsignature-changed — Добавлен optional boolean KeepIV со значением false по умолчанию.

Arnaud Bouchez · 08:21 UTC · открыть коммит на GitHub →

6 Высокий Уничтожение binary cookie освобождает managed state контекста TBinaryCookieGenerator.Destroy заменяет FillCharFast для fContext на FillZeroRtti(TypeInfo(TBinaryCookieContext), fContext). Regression test инвалидирует cookie, проверяет пустое состояние и уничтожает generator. Исправления mormot.crypt.secure 69b16d3f+13-3

crypt: fixed #650 binary cookie generator memory leak

Влияние

Managed fields в TBinaryCookieContext финализируются перед anti-forensic zeroing, что устраняет удержание памяти при destroy после invalidation cookie.

Arnaud Bouchez · 10:33 UTC · PR #650 · открыть коммит на GitHub →

7 Средний Cookies __Secure- после пробела разбираются под логическим именем THttpCookies.ParseServer и CookieFromHeaders вызывают GotoNextNotSpace перед проверкой префикса __Secure- каждой пары. Тест покрывает prefixed cookie после другого значения, точки с запятой и пробела. Исправления mormot.core.text 95a8e9d0+8-2

net: fixed #649 cookie parsing

Влияние

Cookie headers с обычным разделителем «точка с запятой + пробел» теперь находят __Secure- значения под ожидаемым именем без префикса.

Модули

Arnaud Bouchez · 10:29 UTC · PR #649 · открыть коммит на GitHub →

8 Средний AES-GCM получает public helper инкремента 96-bit nonce mormot.crypt.core добавляет GCM_IncIV, увеличивающий байты 0..11 TAesBlock в big-endian порядке и не меняющий 32-bit counter suffix. GMAC_SIZE выражен как SizeOf(THash128), документация AES-GCM уточняет layout buffers. Новые возможности mormot.crypt.core 54b070e6+24-3

crypt: new GCM_IncIV() wrapper function

Влияние

Cryptographic callers могут увеличивать 96-bit GCM nonce без изменения block counter. Existing API и ciphertext format не меняются без использования helper.

Публичный API

  • GCM_IncIVadded — Увеличивает 96-bit AES-GCM nonce в TAesBlock.

Модули

Arnaud Bouchez · 08:24 UTC · открыть коммит на GitHub →

9 Средний Delphi 2010 избегает небезопасного inline в core paths HASSAFEINLINE теперь начинается с Delphi XE, а не Delphi 2010. Ряд string, lock, HTTP и ORM methods используют его, поэтому Delphi 2010 компилирует их без inline, а новые Delphi и FPC сохраняют прежний путь. Компилятор и платформы mormot.core.base+4 86119552+15-16

core: circumvent Delphi 2010 inlining bug

Влияние

Сборки Delphi 2010 обходят compiler inlining defect в часто используемых routines. Другие компиляторы сохраняют поведение и API.

Arnaud Bouchez · 10:14 UTC · открыть коммит на GitHub →

10 Низкий Доступ к заголовкам строк упрощён без изменения поведения mormot.core.base единообразно именует PStrRec переменные sr и использует decrement pointer для string headers в EnsureRawUtf8 и FakeCodePage. TLdapClientSettings.SetTargetUri убирает нормализацию, уже выполненную URI parser. Внутреннее устройство mormot.core.base+1 b59d0bf0+51-46

core: some refactoring with no functional change

Влияние

Ожидаемых изменений application code или runtime behavior нет. Это внутренний cleanup string allocation и LDAP target parsing.

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