fix(security): scan herstelde documentmomentopnames op uitvoerbare inhoud (#1643) #1694

Merged
brenno merged 1 commit from fix/1643-herstel-scan-sluit-aan into main 2026-08-21 22:17:44 +00:00
Owner

Wat

Een autosave-herstel van een documenttabblad parseerde de snapshot direct (MarkdownDocument.parse(snap.markdown)) zonder de MarkdownSafetyScanner die elk normaal geopend .md-bestand wél doorloopt. Een gewijzigd of vervangen herstelbestand (crash, gedeelde machine, malware in de gebruikersmap) omzeilde zo de fail-closed poort die overal anders op staat.

Hoe

restoreRecovered scant nu documentmomentopnames met MarkdownSafetyScanner.scan vóór het parsen — dezelfde poort als openDocumentDetailed. Bij een treffer:

  • de momentopname wordt geweigerd (geteld als onleesbaar, op schijf laten staan — net als een corrupte momentopname);
  • het beveiligingsalarm wordt geactiveerd via importSecurityAlarmProvider (het bestaande alarmdialoog toont de bevindingen);
  • er wordt géén tabblad teruggezet.

Dit sluit aan bij het bestaande document-open-pad, waar openFileByPath de pre-scan doet en hetzelfde alarm toont voor onveilige documenten.

Scope

Het issue betreft de documentkant (de bron gaat verbatim de editor in). Presentatie-herstel gaat via parseDeck en heeft hetzelfde soort gat; dat is bewust buiten dit issue gehouden en volgt in een aparte wijziging.

Bewaker

Niet van toepassing — de wijziging raakt niet het bestandsformaat, de opslag, een afhankelijkheid, uitgaand verkeer of een publieke belofte. Het sluit een bestaande fail-closed poort op een pad dat haar miste; geen nieuwe belofte, geen formaatwijziging.

Regressietest

Twee tests in test/tabs_settings_provider_coverage_test.dart:

  • <script> in een documentmomentopname → geweigerd, alarm geactiveerd, geen tabblad;
  • javascript:-link in een documentmomentopname zonder bestandspad → geweigerd, label als alarmnaam.

Poorten

  • make check-secrets: gitleaks + trufflehog schoon
  • make sast: semgrep 0 bevindingen
  • Gerichte tests: 34/34 geslaagd (inclusief 2 nieuwe regressietests)
  • Format, analyze, conventions: groen voor de gewijzigde bestanden (file-size en class-size baseline voor tabs_provider.dart verhoogd met motivatie)
  • De volledige make check kon lokaal niet schoon doorlopen door interferentie van een parallelle sessie in dezelfde worktree (branch-switches en oncommitte wijzigingen in document_editor_screen.dart); CI verifieert de volledige suite in isolatie

Generated with Devin

## Wat Een autosave-herstel van een documenttabblad parseerde de snapshot direct (`MarkdownDocument.parse(snap.markdown)`) zonder de `MarkdownSafetyScanner` die elk normaal geopend `.md`-bestand wél doorloopt. Een gewijzigd of vervangen herstelbestand (crash, gedeelde machine, malware in de gebruikersmap) omzeilde zo de fail-closed poort die overal anders op staat. ## Hoe `restoreRecovered` scant nu documentmomentopnames met `MarkdownSafetyScanner.scan` vóór het parsen — dezelfde poort als `openDocumentDetailed`. Bij een treffer: - de momentopname wordt geweigerd (geteld als onleesbaar, op schijf laten staan — net als een corrupte momentopname); - het beveiligingsalarm wordt geactiveerd via `importSecurityAlarmProvider` (het bestaande alarmdialoog toont de bevindingen); - er wordt géén tabblad teruggezet. Dit sluit aan bij het bestaande document-open-pad, waar `openFileByPath` de pre-scan doet en hetzelfde alarm toont voor onveilige documenten. ## Scope Het issue betreft de documentkant (de bron gaat verbatim de editor in). Presentatie-herstel gaat via `parseDeck` en heeft hetzelfde soort gat; dat is bewust buiten dit issue gehouden en volgt in een aparte wijziging. ## Bewaker Niet van toepassing — de wijziging raakt niet het bestandsformaat, de opslag, een afhankelijkheid, uitgaand verkeer of een publieke belofte. Het sluit een bestaande fail-closed poort op een pad dat haar miste; geen nieuwe belofte, geen formaatwijziging. ## Regressietest Twee tests in `test/tabs_settings_provider_coverage_test.dart`: - `<script>` in een documentmomentopname → geweigerd, alarm geactiveerd, geen tabblad; - `javascript:`-link in een documentmomentopname zonder bestandspad → geweigerd, label als alarmnaam. ## Poorten - `make check-secrets`: gitleaks + trufflehog schoon - `make sast`: semgrep 0 bevindingen - Gerichte tests: 34/34 geslaagd (inclusief 2 nieuwe regressietests) - Format, analyze, conventions: groen voor de gewijzigde bestanden (file-size en class-size baseline voor `tabs_provider.dart` verhoogd met motivatie) - De volledige `make check` kon lokaal niet schoon doorlopen door interferentie van een parallelle sessie in dezelfde worktree (branch-switches en oncommitte wijzigingen in `document_editor_screen.dart`); CI verifieert de volledige suite in isolatie Generated with [Devin](https://devin.ai)
fix(security): scan herstelde documentmomentopnames op uitvoerbare inhoud (#1643)
All checks were successful
scans / scans (pull_request) Successful in 6m52s
static-gate / static-gate (pull_request) Successful in 16m19s
348393928b
Een autosave-herstel van een documenttabblad parseerde de snapshot direct
(MarkdownDocument.parse) zonder de MarkdownSafetyScanner die elk normaal
geopend .md-bestand wél doorloopt. Een gewijzigd of vervangen herstelbestand
(crash, gedeelde machine, malware in de gebruikersmap) omzeilde zo de
fail-closed poort die overal anders op staat. Herstel weigert nu net als
openDocumentDetailed: tellen als onleesbaar, op schijf laten staan, en het
beveiligingsalarm tonen.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit 94fa36c334 into main 2026-08-21 22:17:44 +00:00
Sign in to join this conversation.
No description provided.