Geen disk-exhaustie-verdediging bij pakket-extractie (onduidelijke foutmelding bij volle schijf) #1360

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

Bevinding

importPackageBytesDetailed (lib/services/file/file_service_import.dart:152)
pakt elk lid uit naar schijf via writeBytesAtomic. De totale bytes zijn
begrensd door maxPackageBytes (512 MiB), maar er is geen check of de
doel-schijf voldoende ruimte heeft vóór de extractie begint.

Een schijf die bijna vol is, resulteert in een half uitgepakte map (die
abortAndClean wel opruimt) maar met een onduidelijke foutmelding voor de
gebruiker — een generische "import mislukt" in plaats van "schijf bijna vol".

Ernst

Laag. abortAndClean voorkomt de half-uitgepakte map, en 512 MiB is ruim
binnen elke moderne schijf. Maar voor "extreem robuust" hoort hier een gerichte
melding die de gebruiker vertelt wat er aan de hand is, in plaats van een
generische weigering die hem laat raden.

Oplossingsrichting

Twee opties:

  1. Pre-check: voor de extractie begint, controleer beschikbare schijfruimte
    op de doelmap (statvfs op POSIX, GetDiskFreeSpaceEx op Windows). Weiger
    met een gerichte ImportFailure.diskFull als de beschikbare ruimte onder
    de verwachte extractiegrootte ligt.

  2. Vangende try/catch: vang een FileSystemException met "No space left"
    / "disk full" tijdens writeBytesAtomic en vertaal het naar dezelfde
    gerichte melding. Goedkoper, maar vangt pas na de eerste mislukte write.

Optie 2 is de lazy-senior-keuze: geen platform-specifieke API, en de
foutmelding is hetzelfde. Optie 1 is netter maar brengt platform-code met
zich mee.

Inschatting: ~10 regels voor optie 2, plus een ImportFailure.diskFull-variant
en de bijbehorende UI-tekst.

Herkomst

Gevonden tijdens security research naar defense-in-depth voor OciDeck. De
extractie is verder solide (zip-slip, bom, abort-and-clean), maar de
foutcommunicatie bij schijf-exhaustie is de enige plek waar de gebruiker een
onduidelijke melding krijgt in plaats van een gerichte.

## Bevinding `importPackageBytesDetailed` (`lib/services/file/file_service_import.dart:152`) pakt elk lid uit naar schijf via `writeBytesAtomic`. De totale bytes zijn begrensd door `maxPackageBytes` (512 MiB), maar er is geen check of de doel-schijf voldoende ruimte heeft vóór de extractie begint. Een schijf die bijna vol is, resulteert in een half uitgepakte map (die `abortAndClean` wel opruimt) maar met een onduidelijke foutmelding voor de gebruiker — een generische "import mislukt" in plaats van "schijf bijna vol". ## Ernst Laag. `abortAndClean` voorkomt de half-uitgepakte map, en 512 MiB is ruim binnen elke moderne schijf. Maar voor "extreem robuust" hoort hier een gerichte melding die de gebruiker vertelt wat er aan de hand is, in plaats van een generische weigering die hem laat raden. ## Oplossingsrichting Twee opties: 1. **Pre-check**: voor de extractie begint, controleer beschikbare schijfruimte op de doelmap (`statvfs` op POSIX, `GetDiskFreeSpaceEx` op Windows). Weiger met een gerichte `ImportFailure.diskFull` als de beschikbare ruimte onder de verwachte extractiegrootte ligt. 2. **Vangende try/catch**: vang een `FileSystemException` met "No space left" / "disk full" tijdens `writeBytesAtomic` en vertaal het naar dezelfde gerichte melding. Goedkoper, maar vangt pas na de eerste mislukte write. Optie 2 is de lazy-senior-keuze: geen platform-specifieke API, en de foutmelding is hetzelfde. Optie 1 is netter maar brengt platform-code met zich mee. Inschatting: ~10 regels voor optie 2, plus een `ImportFailure.diskFull`-variant en de bijbehorende UI-tekst. ## Herkomst Gevonden tijdens security research naar defense-in-depth voor OciDeck. De extractie is verder solide (zip-slip, bom, abort-and-clean), maar de foutcommunicatie bij schijf-exhaustie is de enige plek waar de gebruiker een onduidelijke melding krijgt in plaats van een gerichte.
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#1360
No description provided.