LaTeX-injectie via onvolledige escape van afbeeldings- en videopaden #1358

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

Bevinding

_escapeLatex (lib/services/latex/beamer_slide_builder.dart:448) is
volledig: het escaped \, &, %, #, _, {, }, ~, ^ — alle
LaTeX-speciale tekens. Het wordt toegepast op titels, captions, bullets, alle
tekstinhoud.

Maar de escape voor afbeeldings- en videopaden is onvolledig:

  • _escapeImagePath (regel 461-464) doet alleen replaceAll(r'\', '/')
    backslash naar slash, verder niets.
  • _escapeUrl (regel 466-469) voor videopaden escaped alleen % en #.

Deze paden gaan in \includegraphics[width=\textwidth]{${_escapeImagePath(path)}}
en \href{...}{...}. Een pad met } erin breekt uit het argument.

Exploit

Een kwaadwillend deck met imagePath: "foo}\\input{/etc/passwd}{bar"
produceert:

\includegraphics[width=\textwidth]{foo}\input{/etc/passwd}{bar}

\input is een standaard LaTeX-commando — geen --shell-escape nodig.
\write18 vereist dat wél, maar een gebruiker die --shell-escape aan heeft
staan (veel LaTeX-gebruikers doen dat voor bv. minted) voert willekeurige
commando's uit.

De imagePath komt uit de markdown van een deck, en een deck is invoer — een
ontvanger die een aangeleverd deck exporteert naar LaTeX en compileert, voert
de payload uit.

Scope

OciDeck compileert niet zelf — de UI zegt "Compileer met pdflatex of xelatex"
— dus de aanval vereist dat de gebruiker de gegenereerde .tex compileert. Maar
de .tex die OciDeck produceert zou veilig moeten zijn ongeacht wie hem
compileert. Dit is dezelfde asymmetrie als #1350: de tekstinhoud is volledig
geëscaped, de paden niet.

Oplossingsrichting

_escapeImagePath en _escapeUrl dezelfde tekens laten escapen als
_escapeLatex, of — beter — één gedeelde escape-functie gebruiken voor alles
dat in een LaTeX-argument belandt. De backslash-naar-slash-transformatie voor
paden blijft, maar moet daarnaast ook }, {, $, ~, ^ escapen.

Inschatting: ~5-10 regels diff, plus een test die een pad met } en \input
aanlevert en bevestigt dat de gegenereerde .tex de payload als platte tekst
bevat.

Herkomst

Gevonden tijdens security research naar defense-in-depth voor OciDeck. De
tekst-escape is volwassen; de pad-escape is de asymmetrie die een aanvaller
gebruikt om eromheen te komen.

## Bevinding `_escapeLatex` (`lib/services/latex/beamer_slide_builder.dart:448`) is volledig: het escaped `\`, `&`, `%`, `#`, `_`, `{`, `}`, `~`, `^` — alle LaTeX-speciale tekens. Het wordt toegepast op titels, captions, bullets, alle tekstinhoud. Maar de escape voor afbeeldings- en videopaden is onvolledig: - `_escapeImagePath` (regel 461-464) doet alleen `replaceAll(r'\', '/')` — backslash naar slash, verder niets. - `_escapeUrl` (regel 466-469) voor videopaden escaped alleen `%` en `#`. Deze paden gaan in `\includegraphics[width=\textwidth]{${_escapeImagePath(path)}}` en `\href{...}{...}`. Een pad met `}` erin breekt uit het argument. ## Exploit Een kwaadwillend deck met `imagePath: "foo}\\input{/etc/passwd}{bar"` produceert: ```latex \includegraphics[width=\textwidth]{foo}\input{/etc/passwd}{bar} ``` `\input` is een standaard LaTeX-commando — geen `--shell-escape` nodig. `\write18` vereist dat wél, maar een gebruiker die `--shell-escape` aan heeft staan (veel LaTeX-gebruikers doen dat voor bv. `minted`) voert willekeurige commando's uit. De `imagePath` komt uit de markdown van een deck, en een deck is invoer — een ontvanger die een aangeleverd deck exporteert naar LaTeX en compileert, voert de payload uit. ## Scope OciDeck compileert niet zelf — de UI zegt "Compileer met pdflatex of xelatex" — dus de aanval vereist dat de gebruiker de gegenereerde .tex compileert. Maar de .tex die OciDeck produceert zou veilig moeten zijn ongeacht wie hem compileert. Dit is dezelfde asymmetrie als #1350: de tekstinhoud is volledig geëscaped, de paden niet. ## Oplossingsrichting `_escapeImagePath` en `_escapeUrl` dezelfde tekens laten escapen als `_escapeLatex`, of — beter — één gedeelde escape-functie gebruiken voor alles dat in een LaTeX-argument belandt. De backslash-naar-slash-transformatie voor paden blijft, maar moet daarnaast ook `}`, `{`, `$`, `~`, `^` escapen. Inschatting: ~5-10 regels diff, plus een test die een pad met `}` en `\input` aanlevert en bevestigt dat de gegenereerde .tex de payload als platte tekst bevat. ## Herkomst Gevonden tijdens security research naar defense-in-depth voor OciDeck. De tekst-escape is volwassen; de pad-escape is de asymmetrie die een aanvaller gebruikt om eromheen te komen.
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#1358
No description provided.