Animated image frame-count onbegrensd (dimensie-cap vangt één frame, niet de animatie) #1354
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#1354
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?
Bevinding
CappedImage(lib/utils/image_limits.dart) capt de decode-dimensies perframe naar
kMaxImageDecodeDimension = 4096. Dat dicht de klassiekedecode-bom: een 30000×30000 PNG van een paar KB decodeert niet meer tot
gigabytes.
Maar er is geen frame-count-limiet.
CappedImagegebruiktMultiFrameImageStreamCompleter, die alle frames van een animated GIF/WebP/APNG decodeert. Een GIF met 10.000 frames à 4096×4096×4 bytes = ~64 MiB per
frame = honderden GiB totaal. De dimensie-cap vangt één frame, niet de
animatie als geheel.
Dit is hetzelfde klasse probleem als de decode-bom die
kMaxImageDecodeDimensional oplost — maar dan voor de tijdsas in plaats vande ruimteas.
Locatie
lib/utils/image_limits.dart:CappedImage._decodegebruiktgetTargetSizevoor dimensie-capping, maar geen frame-limiet.MultiFrameImageStreamCompleter(Flutter engine) decodeert alle frames.Oplossingsrichting
Een
maxFrames-limiet opCappedImage, of een pre-check die het frame-countuit de codec haalt vóór volledige decode. Flutter's
ui.Codecheeft eennumFrames-property nainstantiateImageCodec, dus een optie is:numFrameschecken tegen een limiet (bv. 256 — ruim voor elke echteanimatie, begrenst een bom).
dimensie-cap al maakt voor over-cap afbeeldingen: "shows its first frame,
a rare, safe trade-off" per het bestaande commentaar).
Inschatting: ~20-30 regels, plus een test met een synthetic high-frame-count
GIF.
Herkomst
Gevonden tijdens security research naar defense-in-depth voor OciDeck. De
bestaande decode-bom-verdediging (
kMaxImageDecodeDimension) is volwassen voorstilstaande afbeeldingen, maar de animatie-as staat open.