[Security][P1] Neutraliseer Markdown- en YAML-injectie uit presentatie-import #876
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#876
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Probleem
Tekst uit
.pptx,.odpen.keywordt als data in het OciDeck-model gezet, maar wordt later per Markdown-context geserialiseerd. Met nameDeckBuilder._freeMarkdownBodyschrijft titels, alinea's, koppen, bullets, quotes en links rechtstreeks als Markdown. Ook gestructureerde velden worden doorMarkdownServiceals kop, lijst, tabel of front matter uitgegeven. De importer valideert het uiteindelijke document niet opnieuw en de veiligheidspoort voor het openen van een vreemd.mdwordt bij deze modelroute niet doorlopen.Daardoor kunnen Markdown-metatekens, slide-separators, Marp-directives, afbeeldings-/linksyntax, regeleinden en YAML-controltekens uit een bronpresentatie structurele betekenis krijgen in het opgeslagen deck.
Risico
Een gemanipuleerde presentatie kan extra slides of directives introduceren, ongeldige front matter maken of een externe resource in het gegenereerde document opnemen. Netwerkmedia heeft elders een fail-closed poort, maar de import hoort brondata niet ongemerkt in actieve Markdown-structuur te veranderen.
Voorgestelde aanpak
Acceptatiecriteria
![](),---, Marp-directives, HTML en multiline-invoer verschijnt als tekst en maakt geen extra structuur.Verificatie
Draai
make checken importeer kwaadaardige synthetische fixtures voor PPTX, ODP en Keynote; genereer, parse en render het resultaat opnieuw.Herkomst
Verplaatst en tegen de actuele OciDeck-port herijkt vanuit Keiko #6.
Opgepakt. Tak: fix/876-import-injection. Verwachte reikwijdte: de uitvoercontexten in lib/services/import/deck_builder.dart (_freeMarkdownBody: titel/heading/bullet/quote/link/tekst) en de gestructureerde serialisatie in de MarkdownService/YAML-front-matter; contextspecifieke escaping + validatie van het gegenereerde document vóór opslaan/heropenen. Bouwt voort op het #874-werk dat net op main staat.
Tussenstand. Aanpak afgestemd: neutraliseren aan de importgrens (niet in de serialisatielaag), zodat alleen imports worden geraakt en het .md-formaat voor eigen decks ongewijzigd blijft.
GEDAAN (tak fix/876-import-injection, commit gepusht, nog geen PR): de kern-neutralisator sanitizeImportedText + 26 tests groen. Het contract is getoetst tegen de bestaande fail-closed poort (MarkdownSafetyScanner als orakel): alle scanner-vectoren (script/foreignObject, iframe/object/embed/applet, on...=-handlers, javascript:/vbscript:/data:text/html-links, <!--, plus numerieke-entity- en zero-width-evasie) zijn na sanitizing veilig, en de structurele injectie (koppen, lijsten, thematische breuken, afbeeldings-/linksyntax, regeleinden) is ontmanteld — met behoud van gewone proza (haakjes, mintekens).
Belangrijk inzicht: de scanner decodeert numerieke entities maar geen named, dus &/</> is een veilige, inerte weergave (& eerst escapen).
NOG TE DOEN op deze tak:
Kern bewust apart gehouden en getoetst vóór de bedrading, omdat een fout in een injectie-neutralisator een echt gat is; de rest volgt op deze tak.
Gebouwd en gemerged in main (merge
27c172e2, PR #889). Neutralisatie per uitvoercontext aan de importgrens (titel/heading/bullet/quote/section/timeline/vrije-md/chart/linktekst via de volle sanitizer; tabelcel/notitie inline; URL- en video-ref via _safeUrl-breakout-encodering), plus een fail-closed backstop die de definitieve serialisatie nog eens door MarkdownSafetyScanner haalt vóór loadDeck/saveDeck (bulk/service → unsafeContent, enkel bestand → hetzelfde alarm als bij een vreemd .md). YAML-hardening voor gereserveerde woorden + controltekens. 37 tests (26 sanitizer + 11 integratie/regressie), 31 l10n-vertalingen.Security-architect akkoord na twee gedichte gaten (newline in de hyperlink-URL én de video-ref braken uit tekst, backstop-blind — beide via _safeUrl gedicht, met regressietests die eerst rood stonden), en een uitputtende sweep over alle SourceSlide/SourceDeck-velden. Bewaker akkoord (de YAML-touch is round-trip-neutraal en uitwisselbaarheids-versterkend). make check groen op élke poort die de #876-code raakt, secrets/SAST schoon.
Bewust op het bewijs gemerged: de resterende make check-ruis op main (dartcv4 niet in THIRD_PARTY_NOTICES + een flaky detectietest) is #870's onafgemaakte migratie, niet #876 — apart gemeld. Tijdbudget/annulering blijven bij #875.