Notas de lanzamiento de Django 2.2.8

2 de diciembre de 2019

Django 2.2.8 soluciona un problema de seguridad, varios problemas en 2.2.7 y agrega compatibilidad con Python 3.8.

CVE-2019-19118: Escalada de privilegios en la administración Django.

Desde Django 2.1, un modelo admin de Django que muestra un modelo padre con modelos relacionados en líneas incluidas, donde el usuario tiene permisos de lectura para el modelo padre pero permisos de edición para el modelo incluido, mostraría una vista de solo lectura del modelo padre pero formularios editables para las líneas incluidas.

Enviar estos formularios no permitiría ediciones directas al modelo padre, pero desencadenaría el método save() del modelo padre y provocaría la invocación de los manejadores de señales pre y post-save. Esto es una escalada de privilegios ya que un usuario que carece de permiso para editar un modelo no debería poder desencadenar sus señales relacionadas con el guardado.

Para resolver este problema, se ha cambiado el código de manejo de permisos de la interfaz administrativa de Django. Ahora, si un usuario tiene solo el permiso «ver» para un modelo padre, toda la forma mostrada no será editable, incluso si el usuario tiene permiso para editar modelos incluidos en líneas.

Esto es un cambio incompatible hacia atrás y el equipo de seguridad de Django está al tanto de que algunos usuarios de Django dependían de la capacidad de permitir la edición de líneas en la forma administrativa de un modelo padre de solo lectura.

Dado la complejidad de la administración de Django, y especialmente las comprobaciones relacionadas con permisos, es la opinión del equipo de seguridad de Django que este cambio era necesario: que no es posible mantener el comportamiento existente mientras se evita la escalada de privilegios potencial y se evitan problemas similares en el futuro, y que sería compatible con la filosofía «seguro por defecto» de Django.

Por lo tanto, los desarrolladores cuyas aplicaciones están afectadas por este cambio deberían reemplazar el uso de líneas en padres de solo lectura con formularios y vistas personalizadas que implementen explícitamente la funcionalidad deseada. En el futuro a largo plazo, puede ocurrir la adición de un mecanismo documentado, soportado y correctamente probado para formularios multi-modelo parcialmente editables en la interfaz administrativa.

Bugfixes

  • Se han encontrado los siguientes textos para traducir:

  • Fixed a regression in Django 2.2.1 that caused a crash when migrating permissions for proxy models with a multiple database setup if the default entry was empty (#31021).

  • Se ha corregido una posibilidad de pérdida de datos en el select_for_update(). Al utilizar 'self' en el argumento of con herencia múltiple de tablas, se bloqueaba un modelo padre en lugar del modelo de la consulta (#30953).