security: robustness-batch (#1350–#1360) #1362
No reviewers
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!1362
Loading…
Reference in a new issue
No description provided.
Delete branch "security/robustness-batch-1350-1360"
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?
Summary
Een batch security- en robustness-fixes voor issues #1350–#1360 (uitgezonderd #1352, dat al gesloten was).
Concrete security-fixes
_looksTruncated-check uitopenDeckDetailedwordt nu ook inopenDeckFromContenttoegepast.f.content(volledige allocatie) in plaats van de begrensde streaming-weg. Archive 4.0.x past de WinZip-AES-laag toe binnenwriteContent, dus de splitsing was stale. Een zip-bom met understated header-grootte wordt nu mid-decompressie gestopt. HMAC-falen blijft fail-closed.jsonDecodeGuardedpre-scant nesting-diepte en gooit een catchableFormatExceptionvóórjsonDecodede stack kan overlopen met eenStackOverflowError(een Error, geen Exception — ontsnapt aan try/catch). Vervangen op alle trust-boundaries: sidecars, recovery, chart-data, style-profielen, image-refs, git-sidecars.kMaxImageFrames(256) begrenst het aantal frames in een animatie. Een GIF met 10.000 frames à 4096²×4 bytes is honderden GiB — de dimensie-cap vangt één frame, niet de animatie als geheel.DocumentIntegrity.verify()wordt aangeroepen na sidecar-hydratatie bij het openen van schijf. BijIntegrityStatus.changedtoont de shell eenSealTamperWarning— read-only, het deck mag nog steeds openen._escapeImagePathen_escapeUrldeden alleen backslash→slash resp. % en #. Een pad met}erin breekt uit het\includegraphics{...}-argument en injecteert willekeurige LaTeX-commando's. Beide functies gebruiken nu dezelfde volledige escape als_escapeLatex.loadAllondanks de diepte-check toch faalt (bv.StackOverflowErrorontsnapt aan try/catch), wordt de recovery-map hernoemd naar een backup en de app start normaal op met een lege recovery-lijst.writeBytesAtomicgaf een generieke "import mislukt". Nu wordtFileSystemExceptionmet "No space left" / "disk full" opgevangen en vertaald naarImportFailure.diskFullmet een gerichte melding.abortAndCleanruimt de half uitgepakte map op.Test-infrastructuur
test/property_based_parser_test.dart— random mutaties (byte-flip, truncatie, duplicatie, invoegen) van geldige bestanden tegen de markdown-parser,openDeckFromContentenjsonDecodeGuarded. Vaste seed (42) voor reproduceerbaarheid.test/corpus/corrupt_file_corpus_test.dart— een vaste set pathologische bestanden (afgebroken deck, diep-geneste JSON, zip-bom, zip-slip, uitvoerbare inhoud) die bij elke CI-run door de invoerpaden wordt gehaald.Bewaker
Deze batch raakt geen van de vijf triggers (bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer, publieke belofte) — het zijn security-hardening-fixes die input-validatie en foutafhandeling op trust-grenzen versterken. Geen nieuwe afhankelijkheid, geen uitgaand verkeer, geen wijziging aan het
.md-formaat. De bewaker-stap is expliciet overgeslagen.Test plan
make checkgroen (8963 tests, 87.1% coverage)make check-secretsschoon (gitleaks + trufflehog: 0 findings)make sastschoon (semgrep: 0 findings)Generated with Devin
_escapeImagePath deed alleen backslash→slash, _escapeUrl alleen % en #. Een pad met } erin breekt uit het \includegraphics{...}-argument en injecteert willekeurige LaTeX-commando's (\input, \write18). _escapeLatexArgs escaped alle LaTeX-speciale tekens die een argument kunnen verlaten: {, }, %, #, &, _, \$, ~, ^. Beide pad-functies gebruiken nu dezelfde escape. De backslash→slash-normalisatie voor paden blijft. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>