Alta

djust: A template binding inherits a context safety grant it never earned (XSS)

  • Publicada: 17.09.2026
  • Actualizado: 11.10.2026 15:18

A context safety grant was inherited by a template binding that never earned it, so rebinding a name the view had marked safe left the mark attached to the new, attacker-controlled value.

djust's context safety channel is keyed by name, not by value. Every bind copied the value and left the grant in place:

view marks   p = mark_safe('<b>trusted</b>')
template     {% with p=user_input %}{{ p }}{% endwith %}

  djust   '<img src=x onerror=alert(1)>'          <- executes
  django  '&lt;img src=x onerror=alert(1)&gt;'

Affected binds

Eight distinct shapes were live. All are fixed in 1.1.2:

shape example
{% with %} rebinding a marked name {% with p=hostile %}{{ p }}{% endwith %}
{% with %} descendant of a rebound name {% with p=hostile %}{{ p.a }}{% endwith %}
{% with %} binding over a marked name {% with q=hostile %}{{ q }}{% endwith %}
{% for %} loop variable {% for p in hostiles %}{{ p }}{% endfor %}
{% for %} descendant {% for p in hostiles %}{{ p.a }}{% endfor %}
{% for %} tuple unpacking {% for k, v in rows %}{{ v }}{% endfor %}
{% include … with %} {% include "c.html" with q=hostile %}
assign tags {% … as x %}

No filter chain and no |safe anywhere in the template is required. The precondition is that the application marked some value safe under a name that a template later rebinds — an ordinary pattern, since a view commonly marks trusted markup safe and templates commonly reuse short names such as p, item or row.

Impact

Stored or reflected XSS in any djust application that combines mark_safe (or any framework path that grants a context key safety) with a template that rebinds that name. Exploitation requires no unusual template construct.

Patches

Fixed in 1.1.2, and in 1.2.0 (main).

The rule is that a bind replaces the grant rather than inheriting one. It is stated that way deliberately: the originally reported defects pointed the opposite direction — a grant being lost across some binds, causing over-escaping — and fixing only the reported direction would have left this leak in place. Both directions are the same rule.

Not fixed in 1.1.2, and tracked for 1.2.0: two over-escaping cases where a grant fails to travel with a value that legitimately carries one ({% with body=post.text|linebreaks %}, and mark_safe reaching a template through dict.values / dict.items). Both escape more than Django rather than less, so neither is a leak.

Workarounds

Before upgrading, avoid reusing a context name for both mark_safe'd content and untrusted input, and avoid rebinding such a name in {% with %}, {% for %}, {% include … with %} or an assign tag.

Credit

Found while preparing the 1.1.1 security release: the reproducer published in GHSA-9395-2g46-rj3f was run against the built 1.1.1 artifact before that advisory was published, and proved the class was still live. Publishing the original text would have reported this class as patched when it was not.

Software afectado

Haz clic en una tecnología para ver todas sus vulnerabilidades.

PlataformaPaqueteVersiones vulnerablesCorregida en
Python (PyPI) djust < 1.1.2 1.1.2

Referencias

Puntuación CVSS -
Vector CVSS
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
Debilidad (CWE)
CWE-116, CWE-79
Plataforma
Python (PyPI)
Paquete
djust
Publicada
17.09.2026
Actualizado
11.10.2026 15:18

Fuentes y licencias

OSV / GitHub Advisory Database - GHSA-xjw9-38cr-6372 - CC BY 4.0

Historial de vulnerabilidades: djust

Todas las vulnerabilidades publicadas de este paquete (Python (PyPI)), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.

Todas (15) en el archivo
Entradas en total
15
Primera → última
08.2026 09.2026
Sin corrección
0
Explotada en ataques
0

Distribución por gravedad

  • Crítica 1
  • Alta 11
  • Media 3

Divulgaciones por año

  1. 2026: 15
Gravedad:
  1. djust: A template binding inherits a context safety grant it never earned (XSS) esta entrada
    Alta ghsa-xjw9-38cr-6372 < 1.1.2 1.1.2
  2. Alta · 7.1 CVE-2026-61596 < 1.0.7 1.0.7
  3. Crítica · 9.1 CVE-2026-61594 < 1.0.7 1.0.7

Identifica las vulnerabilidades de tu aplicación

Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.