Notas de lanzamiento de Django 1.5.3

10 de septiembre de 2013

Esta es Django 1.5.3, la tercera versión en la serie de Django 1.5. Aborda un problema de seguridad y contiene una característica opt-in para mejorar la seguridad de django.contrib.sessions.

Vulnerabilidad de travesía de directorios en el etiqueta de plantilla ssi

En versiones anteriores de Django era posible evitar la configuración de seguridad ALLOWED_INCLUDE_ROOTS utilizada con la etiqueta de plantilla ssi especificando un camino relativo que comienza con uno de los raíces permitidas. Por ejemplo, si ALLOWED_INCLUDE_ROOTS = ("/var/www",) lo siguiente sería posible:

{% ssi "/var/www/../../etc/passwd" %}

En la práctica no es un problema muy común, ya que requeriría que el autor del plantilla pusiera el archivo ssi en una variable controlada por el usuario, pero es posible en principio.

Mitigación de una vulnerabilidad de ejecución de código remoto en django.contrib.sessions

django.contrib.sessions utiliza actualmente pickle para serializar los datos de sesión antes de almacenarlos en el backend. Si estás utilizando la almacenamiento de cookies con firma (Uso de sesiones basadas en cookies) y la clave secreta (SECRET_KEY) es conocida por un atacante (no existe una vulnerabilidad inherente en Django que cause su divulgación), el atacante podría insertar una cadena en su sesión que, al desempaquetarse, ejecuta código arbitrario en el servidor. La técnica para hacerlo es simple y está fácilmente disponible en Internet. Aunque la almacenamiento de cookies con firma firma los datos almacenados en las cookies para prevenir la manipulación, una divulgación de SECRET_KEY eleva inmediatamente a una vulnerabilidad de ejecución de código remoto.

Esta vulnerabilidad se puede mitigar serializando los datos de sesión utilizando JSON en lugar de pickle. Para facilitar esto, Django 1.5.3 introduce un nuevo parámetro de configuración, SESSION_SERIALIZER, para personalizar el formato de serialización de la sesión. Por compatibilidad hacia atrás, este parámetro se configura por defecto para utilizar pickle. Si bien la serialización JSON no admite todos los objetos Python como lo hace pickle, recomendamos encarecidamente cambiar a valores serializados en JSON. Además, dado que la serialización JSON requiere claves de cadena, es probable que encuentres problemas si estás utilizando claves no de cadena en request.session. Consulta la documentación sobre Session serialización para obtener más detalles.