Примечания к выпуску Django 2.1.15

Декабрь 2, 2019

Django 2.1.15 исправляет проблему безопасности и ошибку потери данных в версии 2.1.14.

CVE-2019-19118: Повышение привилегий в администраторе Django.

Начиная с Django 2.1, администратор модели Django, отображающий родительскую модель со связанными с ней вставками, когда пользователь имеет права только на просмотр родительской модели, но имеет права на редактирование вставной модели, отображает вид родительской модели только для чтения, но редактируемые формы для вставки.

Отправка этих форм не позволит напрямую редактировать родительскую модель, но вызовет метод save() родительской модели, а также вызовет обработчики сигналов до и после сохранения. Это является повышением привилегий, так как пользователь, не имеющий прав на редактирование модели, не должен иметь возможности вызывать сигналы, связанные с сохранением.

Для решения этой проблемы был изменен код обработки прав доступа в интерфейсе администратора Django. Теперь, если пользователь имеет только разрешение «просмотр» для родительской модели, вся отображаемая форма не будет редактируемой, даже если у пользователя есть разрешение на редактирование моделей, включенных в инлайн.

Это изменение обратно несовместимо, и команда безопасности Django знает, что некоторые пользователи Django зависели от возможности разрешить редактирование инлайнов в форме администратора родительской модели, доступной только для просмотра.

Учитывая сложность админки Django и, в частности, проверок, связанных с разрешениями, команда безопасности Django считает, что это изменение было необходимым: в настоящее время не представляется возможным сохранить существующее поведение и избежать потенциальной эскалации привилегий таким образом, чтобы избежать повторения подобных проблем в будущем, и чтобы это было совместимо с философией Django safe by default.

На данный момент разработчикам, чьи приложения затронуты этим изменением, следует заменить использование inlines в родительских формах, доступных только для чтения, на пользовательские формы и представления, которые явно реализуют желаемую функциональность. В более отдаленной перспективе добавление документированного, поддерживаемого и должным образом протестированного механизма для частично редактируемых многомодельных форм в интерфейс администратора может произойти в самом Django.

Исправления

  • Исправлена возможность потери данных в select_for_update(). При использовании 'self' в аргументе of с multi-table inheritance вместо модели кверисета (#30953) блокировалась родительская модель.
Вернуться на верх