Zegel wordt niet automatisch bij openen geverifieerd (tamper-evidence is on-demand only) #1355

Closed
opened 2026-08-07 22:17:58 +00:00 by brenno · 0 comments
Owner

Bevinding

DocumentIntegrity.verify() (lib/services/document_integrity.dart) bestaat
en is goed ontworpen — het vergelijkt Deck.fileHash met Deck.sealHash en
onderscheidt intact, changed, notSealed, notVerifiable, en
redactedDerivative. Het is de tamper-evidence-belofte van OciDeck.

Maar het wordt alleen on-demand aangeroepen: vanuit de statusbalk, de
provenance-actions, het audit-dossier en de MIAUW-compliance-check. Niet in
FileService.openDeckDetailed.

Gevolg: een verzegeld deck dat na het verzegelen is bewerkt opent zonder
waarschuwing. De gebruiker moet zelf op het zegel-icoon klikken om te
ontdekken dat de inhoud niet meer klopt. Voor een tool waar het zegel de
integriteitsbelofte is, is "automatisch checken bij openen" de verwachte
defensieve laag.

Waarom dit ertoe doet

document_integrity.dart zegt in zijn eigen commentaar:

"The guarantee is deliberately tamper-evidence, not impossibility: a .md
handed to someone else can always be edited, but a mismatch between the
recomputed hash and the stored Deck.sealHash makes such an edit visible."

Dat is de belofte. Maar "visible" betekent hier "zichtbaar als je weet dat je
moet kijken". Een ontvanger die een verzegeld deck opent en meteen begint
lezen, ziet niets — het zegel staat er, de inhoud is veranderd, en niemand
vertelt het hem.

Risico

Dit crasht niets en lekt geen data. Het verzwakt stilzwijgend de
integriteitsbelofte — precies wat document_integrity.dart in zijn eigen
commentaar zegt te willen voorkomen. Voor een presentatietool die gebruikt
wordt voor politiebriefings, audit-rapporten en MIAUW-disposities is
"stilletjes een veranderd zegel niet opmerken" een echte faalmodus.

Oplossingsrichting

In openDeckDetailed, ná het hydraten van sidecars (waarbij het zegel-sidecar
de sealHash zet), DocumentIntegrity.verify() aanroepen en het resultaat
toevoegen aan DeckOpenResult — bv. een IntegrityStatus? integrity-veld.
De UI toont dan bij het openen een waarschuwing als de status changed is,
op dezelfde plek waar nu warnings (grafiekdata) en skippedSidecars
verschijnen.

Belangrijk: dit is read-only checken, niet weigeren. Een veranderd deck
mag nog steeds openen — de gebruiker moet kunnen zien wat er staat — maar hij
moet weten dat het zegel niet meer klopt vóór hij erop vertrouwt.

Inschatting: ~15-20 regels in openDeckDetailed + DeckOpenResult, plus UI
voor de melding, plus een test die een verzegeld deck bewerkt en opent.

Herkomst

Gevonden tijdens security research naar defense-in-depth voor OciDeck. Het
zegelmechanisme zelf is cryptografisch solide; de zwakte is dat het niet
automatisch wordt ingezet op het moment dat het ertoe doet — bij het openen
van een bestand van buiten.

## Bevinding `DocumentIntegrity.verify()` (`lib/services/document_integrity.dart`) bestaat en is goed ontworpen — het vergelijkt `Deck.fileHash` met `Deck.sealHash` en onderscheidt `intact`, `changed`, `notSealed`, `notVerifiable`, en `redactedDerivative`. Het is de tamper-evidence-belofte van OciDeck. Maar het wordt **alleen on-demand aangeroepen**: vanuit de statusbalk, de provenance-actions, het audit-dossier en de MIAUW-compliance-check. Niet in `FileService.openDeckDetailed`. Gevolg: een verzegeld deck dat na het verzegelen is bewerkt opent zonder waarschuwing. De gebruiker moet zelf op het zegel-icoon klikken om te ontdekken dat de inhoud niet meer klopt. Voor een tool waar het zegel de integriteitsbelofte is, is "automatisch checken bij openen" de verwachte defensieve laag. ## Waarom dit ertoe doet `document_integrity.dart` zegt in zijn eigen commentaar: > "The guarantee is deliberately tamper-evidence, not impossibility: a `.md` > handed to someone else can always be edited, but a mismatch between the > recomputed hash and the stored `Deck.sealHash` makes such an edit visible." Dat is de belofte. Maar "visible" betekent hier "zichtbaar als je weet dat je moet kijken". Een ontvanger die een verzegeld deck opent en meteen begint lezen, ziet niets — het zegel staat er, de inhoud is veranderd, en niemand vertelt het hem. ## Risico Dit crasht niets en lekt geen data. Het verzwakt stilzwijgend de integriteitsbelofte — precies wat `document_integrity.dart` in zijn eigen commentaar zegt te willen voorkomen. Voor een presentatietool die gebruikt wordt voor politiebriefings, audit-rapporten en MIAUW-disposities is "stilletjes een veranderd zegel niet opmerken" een echte faalmodus. ## Oplossingsrichting In `openDeckDetailed`, ná het hydraten van sidecars (waarbij het zegel-sidecar de `sealHash` zet), `DocumentIntegrity.verify()` aanroepen en het resultaat toevoegen aan `DeckOpenResult` — bv. een `IntegrityStatus? integrity`-veld. De UI toont dan bij het openen een waarschuwing als de status `changed` is, op dezelfde plek waar nu `warnings` (grafiekdata) en `skippedSidecars` verschijnen. Belangrijk: dit is **read-only checken**, niet weigeren. Een veranderd deck mag nog steeds openen — de gebruiker moet kunnen zien wat er staat — maar hij moet weten dat het zegel niet meer klopt vóór hij erop vertrouwt. Inschatting: ~15-20 regels in `openDeckDetailed` + `DeckOpenResult`, plus UI voor de melding, plus een test die een verzegeld deck bewerkt en opent. ## Herkomst Gevonden tijdens security research naar defense-in-depth voor OciDeck. Het zegelmechanisme zelf is cryptografisch solide; de zwakte is dat het niet automatisch wordt ingezet op het moment dat het ertoe doet — bij het openen van een bestand van buiten.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1355
No description provided.