Security: in-memory Markdown omzeilt de 32 MiB-cap met multibyte UTF-8 #1693

Closed
opened 2026-08-21 21:53:52 +00:00 by brenno · 0 comments
Owner

Kwetsbaarheid

De groottepoort voor content die al als String wordt aangeleverd vergelijkt het aantal UTF-16-code-units met de bytecap. Een string kan minder dan 32 MiB code-units maar veel meer dan 32 MiB UTF-8-bytes bevatten, bijvoorbeeld door veel drie- of vierbyte-tekens. Zo accepteert openDeckDetailed/openDocumentDetailed invoer die de equivalente on-disk bytecap zou weigeren en voert daarop vervolgens scanners en parsers uit.

Dit vergroot het DoS-oppervlak voor web-, connector- en andere in-memory openpaden.

Reproductie

  1. Bouw een String met bijvoorbeeld 12 miljoen eurotekens of een vergelijkbare multibyte-inhoud.
  2. Controleer dat content.length onder 32 MiB blijft terwijl utf8.encode(content).length erboven ligt.
  3. Geef de content aan het in-memory openpad.
  4. Observeer dat _providedContentOverCap false retourneert.

Verwacht

Dezelfde 32 MiB-grens geldt voor de werkelijke UTF-8-byteomvang van on-disk én aangeleverde content, bij voorkeur zonder eerst onbeperkt extra geheugen te alloceren.

Technische oorzaak

lib/services/file/file_service_open.dart:_providedContentOverCap retourneert direct false wanneer content.length <= maxDeckMarkdownBytes. De comment die code-unitlengte equivalent noemt is in deze richting onjuist.

Afbakening

Openbare plaatsing is door de opdrachtgever/repositorybeheerder expliciet geautoriseerd voor directe afhandeling.

Gevonden bij audit van commit d439638c6b.

## Kwetsbaarheid De groottepoort voor content die al als String wordt aangeleverd vergelijkt het aantal UTF-16-code-units met de bytecap. Een string kan minder dan 32 MiB code-units maar veel meer dan 32 MiB UTF-8-bytes bevatten, bijvoorbeeld door veel drie- of vierbyte-tekens. Zo accepteert openDeckDetailed/openDocumentDetailed invoer die de equivalente on-disk bytecap zou weigeren en voert daarop vervolgens scanners en parsers uit. Dit vergroot het DoS-oppervlak voor web-, connector- en andere in-memory openpaden. ## Reproductie 1. Bouw een String met bijvoorbeeld 12 miljoen eurotekens of een vergelijkbare multibyte-inhoud. 2. Controleer dat content.length onder 32 MiB blijft terwijl utf8.encode(content).length erboven ligt. 3. Geef de content aan het in-memory openpad. 4. Observeer dat _providedContentOverCap false retourneert. ## Verwacht Dezelfde 32 MiB-grens geldt voor de werkelijke UTF-8-byteomvang van on-disk én aangeleverde content, bij voorkeur zonder eerst onbeperkt extra geheugen te alloceren. ## Technische oorzaak lib/services/file/file_service_open.dart:_providedContentOverCap retourneert direct false wanneer content.length <= maxDeckMarkdownBytes. De comment die code-unitlengte equivalent noemt is in deze richting onjuist. ## Afbakening Openbare plaatsing is door de opdrachtgever/repositorybeheerder expliciet geautoriseerd voor directe afhandeling. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
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#1693
No description provided.