QA-15-Befund F-21 behoben: AES-GCM Seal/Open in vier Stellen (DMS, Archive, Mail, Core internal/kek) binden jetzt ein Additional Authenticated Data (AAD) an ihren Chiffretext. AAD = jeweils bereits vorhandener Kontext-Parameter (Tenant-Slug/-ID, Ziel-URL, fester Zweck-Bezeichner) -- keine neuen Aufrufer-Signaturen noetig fuer die rund 30 externen Aufrufstellen von DMS/Mail Service.Seal/Open.
Rueckwaertskompatibel: open/unwrap versucht zuerst mit AAD, faellt bei Fehlschlag auf kein-AAD zurueck -- vor dieser Aenderung versiegelte Datensaetze bleiben lesbar.
Pruefungen (alle real durchgefuehrt, siehe docs/OPS-13-PRUEFPROTOKOLL.md):
Kontext-Austausch-Erkennung (Pruefung 1) fuer alle vier Stellen: bestanden
Ruecklaufkompatibilitaet mit Alt-Daten ohne AAD (Pruefung 2): bestanden
Bekannte, dokumentierte Grenze: AAD bindet an verfuegbaren Kontext (Mandant/Ziel-URL/Zweck), nicht an eine einzelne Datensatz-ID -- ein Austausch zwischen zwei Datensaetzen DESSELBEN Kontexts bleibt unerkannt. Volle Datensatz-Bindung braeuchte eine ID an ~30 Aufrufstellen bzw. eine Aenderung des modulübergreifend genutzten SecretCipher-Interface (internal/moduletrust) -- bewusst ausserhalb der kleinsten Loesung dieser Kachel, im Pruefprotokoll offen dokumentiert.
QA-15-Befund F-21 behoben: AES-GCM Seal/Open in vier Stellen (DMS, Archive, Mail, Core internal/kek) binden jetzt ein Additional Authenticated Data (AAD) an ihren Chiffretext. AAD = jeweils bereits vorhandener Kontext-Parameter (Tenant-Slug/-ID, Ziel-URL, fester Zweck-Bezeichner) -- keine neuen Aufrufer-Signaturen noetig fuer die rund 30 externen Aufrufstellen von DMS/Mail Service.Seal/Open.
Rueckwaertskompatibel: open/unwrap versucht zuerst mit AAD, faellt bei Fehlschlag auf kein-AAD zurueck -- vor dieser Aenderung versiegelte Datensaetze bleiben lesbar.
**Pruefungen (alle real durchgefuehrt, siehe docs/OPS-13-PRUEFPROTOKOLL.md):**
- Kontext-Austausch-Erkennung (Pruefung 1) fuer alle vier Stellen: bestanden
- Ruecklaufkompatibilitaet mit Alt-Daten ohne AAD (Pruefung 2): bestanden
- Volle Regressionspruefung: DMS internal/crypto (9 Tests) + internal/qa02 End-zu-Ende (6 Tests, echter Postgres, inkl. RewrapDEK-Produktionspfad), Archive internal/backupcrypto (3 Tests), Mail internal/crypto (4 Tests, ARC-08-KEK-Versionsverwaltung), Core internal/kek (17 Tests, echte Rotation), internal/ldapsync (8 Tests), internal/webhook (7 Tests) -- alle gruen, keine Regression.
**Bekannte, dokumentierte Grenze:** AAD bindet an verfuegbaren Kontext (Mandant/Ziel-URL/Zweck), nicht an eine einzelne Datensatz-ID -- ein Austausch zwischen zwei Datensaetzen DESSELBEN Kontexts bleibt unerkannt. Volle Datensatz-Bindung braeuchte eine ID an ~30 Aufrufstellen bzw. eine Aenderung des modulübergreifend genutzten SecretCipher-Interface (internal/moduletrust) -- bewusst ausserhalb der kleinsten Loesung dieser Kachel, im Pruefprotokoll offen dokumentiert.
Kein Merge, kein Deploy.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
patrick
added 2 commits 2026-09-26 22:47:31 +02:00
seal/open (bzw. wrap/unwrap) in allen vier betroffenen Stellen binden
ein Additional Authenticated Data an Chiffretext/DEK-Wrapper: ein
Austausch zwischen zwei Kontexten faellt beim Entschluesseln auf,
statt still zu funktionieren.
- dms/internal/crypto/envelope.go + service.go: AAD = Tenant-Slug
(bereits vorhandener Parameter in Service.Seal/Open, Signatur
unveraendert -- keine der rund 30 externen Aufrufstellen musste
angepasst werden)
- archive/internal/backupcrypto/envelope.go + reposecret.go/file.go:
gleiches Muster, AAD = Tenant-Slug
- mail/internal/crypto/envelope.go + service.go + kekversions.go:
gleiches Muster, AAD = Tenant-Slug (inkl. ARC-08
KEK-Versionsverwaltung)
- internal/kek/master.go + store.go: wrap/unwrap sowie
EncryptWithTenantKEK/DecryptWithTenantKEK binden AAD. Die drei
echten externen Aufrufer angepasst: ldapsync (Tenant-ID + Zweck),
webhook (Ziel-URL des Abonnements), account-api modulekeys (fester
Zweck-Bezeichner -- SecretCipher-Interface aus internal/moduletrust
reicht keine Datensatz-ID durch, eine Erweiterung wuerde in andere
Module hineinwirken, bewusst nicht Teil dieser Kachel)
Rueckwaertskompatibel: jedes open/unwrap versucht zuerst mit AAD,
faellt bei Fehlschlag auf kein-AAD zurueck -- vor dieser Aenderung
versiegelte Datensaetze bleiben lesbar.
Bekannte, dokumentierte Grenze: ein Austausch zwischen zwei
Datensaetzen DESSELBEN Mandanten/Kontexts bleibt unerkannt (identisches
AAD) -- volle Bindung an den einzelnen Datensatz braeuchte eine
Datensatz-ID an rund 30 Aufrufstellen, bewusst nicht Teil dieser
kleinstmoeglichen Loesung.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neue Tests fuer Archive/Mail/Core-kek (Pruefung 1/2 je Stelle,
identisches Muster wie die bereits vorhandenen DMS-Tests). Alle
Pruefungen real gegen Postgres auf Host 204 durchgefuehrt (siehe
Pruefprotokoll), inkl. vollstaendiger Regression von dms/qa02,
internal/kek, internal/ldapsync, internal/webhook.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
QA-15-Befund F-21 behoben: AES-GCM Seal/Open in vier Stellen (DMS, Archive, Mail, Core internal/kek) binden jetzt ein Additional Authenticated Data (AAD) an ihren Chiffretext. AAD = jeweils bereits vorhandener Kontext-Parameter (Tenant-Slug/-ID, Ziel-URL, fester Zweck-Bezeichner) -- keine neuen Aufrufer-Signaturen noetig fuer die rund 30 externen Aufrufstellen von DMS/Mail Service.Seal/Open.
Rueckwaertskompatibel: open/unwrap versucht zuerst mit AAD, faellt bei Fehlschlag auf kein-AAD zurueck -- vor dieser Aenderung versiegelte Datensaetze bleiben lesbar.
Pruefungen (alle real durchgefuehrt, siehe docs/OPS-13-PRUEFPROTOKOLL.md):
Bekannte, dokumentierte Grenze: AAD bindet an verfuegbaren Kontext (Mandant/Ziel-URL/Zweck), nicht an eine einzelne Datensatz-ID -- ein Austausch zwischen zwei Datensaetzen DESSELBEN Kontexts bleibt unerkannt. Volle Datensatz-Bindung braeuchte eine ID an ~30 Aufrufstellen bzw. eine Aenderung des modulübergreifend genutzten SecretCipher-Interface (internal/moduletrust) -- bewusst ausserhalb der kleinsten Loesung dieser Kachel, im Pruefprotokoll offen dokumentiert.
Kein Merge, kein Deploy.
🤖 Generated with Claude Code
Inhalt bereits in main enthalten (geprueft per merge_all_prs.sh: leerer Merge-Diff). Geschlossen ohne Merge.
Pull request closed