Security: Jinja2 Template Injection in kontext.md-Generierung #65

Open
opened 2026-03-30 20:18:02 +00:00 by David · 0 comments
Collaborator

Beschreibung

In backend/services/preparation_engine.py:203 wird die Ticket-Beschreibung unescaped in ein Jinja2-Template gerendert. Ein Angreifer kann über ein manipuliertes Odoo-Ticket Jinja2-Expressions einschleusen (z.B. {{ config }}, {{ ''.__class__.__mro__ }}) und damit Code auf dem Server ausführen.

Hintergrund

Die kontext.md wird aus Ticket-Daten generiert. Wenn die Beschreibung Jinja2-Syntax enthält, wird diese interpretiert statt als Text behandelt. Dies ist ein separater Angriffsvektor zu Prompt Injection (#21).

Akzeptanzkriterien

  • Ticket-Beschreibung wird vor dem Rendering escaped (jinja2.Markup.escape())
  • Alternativ: Template-Engine durch einfache String-Substitution ersetzen
  • Test: Ticket mit {{ 7*7 }} in Beschreibung wird als Literaltext gerendert
  • Test: Ticket mit {% import os %}{{ os.system('id') }} wird sicher behandelt

Technische Hinweise

  • Betroffene Datei: backend/services/preparation_engine.py:203
  • Ansatz: jinja2.sandbox.SandboxedEnvironment oder String-Replace statt Jinja2
  • Migration nötig: nein

Aufwand: S

## Beschreibung In `backend/services/preparation_engine.py:203` wird die Ticket-Beschreibung unescaped in ein Jinja2-Template gerendert. Ein Angreifer kann über ein manipuliertes Odoo-Ticket Jinja2-Expressions einschleusen (z.B. `{{ config }}`, `{{ ''.__class__.__mro__ }}`) und damit Code auf dem Server ausführen. ## Hintergrund Die kontext.md wird aus Ticket-Daten generiert. Wenn die Beschreibung Jinja2-Syntax enthält, wird diese interpretiert statt als Text behandelt. Dies ist ein separater Angriffsvektor zu Prompt Injection (#21). ## Akzeptanzkriterien - [ ] Ticket-Beschreibung wird vor dem Rendering escaped (`jinja2.Markup.escape()`) - [ ] Alternativ: Template-Engine durch einfache String-Substitution ersetzen - [ ] Test: Ticket mit `{{ 7*7 }}` in Beschreibung wird als Literaltext gerendert - [ ] Test: Ticket mit `{% import os %}{{ os.system('id') }}` wird sicher behandelt ## Technische Hinweise - Betroffene Datei: `backend/services/preparation_engine.py:203` - Ansatz: `jinja2.sandbox.SandboxedEnvironment` oder String-Replace statt Jinja2 - Migration nötig: nein ## Aufwand: S
Sign in to join this conversation.
No description provided.