WordPress 7.1.3: семь уязвимостей и четыре исправления ядра

6 октября вышел WordPress 7.1.3, об этом написал в блоге wordpress.org Джейк Сперлок (Jake Spurlock), который вёл этот релиз. В нём семь исправлений безопасности и четыре исправления ошибок. Раз это релиз безопасности, команда WordPress советует обновить сайты сразу.

Обновиться можно из админки: «Обновления», затем «Обновить сейчас». Архив лежит отдельно: wordpress-7.1.3.zip. Если на сайте работают фоновые автообновления, они поставят релиз сами.

Семь уязвимостей: XSS, SQL-инъекция в экспорте WXR и DoS

Список из анонса, с теми, кто сообщил об уязвимостях:

  • Хранимая XSS на странице комментариев в админке, сработать она могла через комментарии, ожидающие модерации. Сообщил Thomas Chauchefoin из Trail of Bits.
  • DoS в методе WP_Http::make_absolute_url(). Сообщила Anthropic.
  • SQL-инъекция второго порядка в экспорте WordPress в формат WXR. Сообщила Anthropic.
  • Пользователи с ролью «Автор» могли закреплять записи. Сообщила Anthropic.
  • Комментарии к закрытым и неопубликованным записям можно было прочитать без входа на сайт. Сообщил Ananda Dhakal из Patchstack.
  • XSS через встраивание Imgur. Сообщили Zhengyu Liu, Jingcheng Yang и Gavin Zhong.
  • Через подделку параметров хука {status}_{type} можно было добиться совпадения имён действий. Сообщил Alex Concha из команды безопасности WordPress.

Если на сайте открыты комментарии, обновление особенно важно: две уязвимости из семи связаны именно с ними. Одна позволяла подсунуть скрипт через комментарий в очереди модерации, и он срабатывал у того, кто открыл эту очередь в админке. Вторая открывала гостям комментарии под закрытыми и неопубликованными записями.

Что именно поменяли, видно по коммитам в ветке 7.1. Все они попали туда 6 октября, прямо перед релизом, и их можно посмотреть в зеркале wordpress-develop на GitHub:

  • HTTP: WP_Http::make_absolute_url() теперь аккуратнее разбирает относительные пути.
  • Export: при сборке WXR ID записей приводятся к целым числам.
  • REST API: чтобы закрепить запись или снять закрепление, теперь нужны обе возможности (capabilities).
  • Query: комментарии к записям, которые пользователь не может видеть, больше не отдаются.
  • Embeds: поддержку oEmbed для Imgur из ядра убрали совсем.
  • Posts, Post Types: динамические хуки смены статуса срабатывают только для зарегистрированных статусов и типов записей.
  • Administration: ссылки во вкладках контекстной справки обрабатываются как селекторы.

Те же семь правок одним коммитом перенесли в ветку 7.0. Практический момент про Imgur: после обновления ссылки на Imgur больше не превращаются во встроенный блок через oEmbed.

Четыре исправления: значок сайта, DOMDocument и два провайдера oEmbed

Исправления ошибок в ветку 7.1 вливали с конца сентября. По коммитам их четыре, у каждого свой тикет в Trac:

  • #65912, значок сайта в тулбаре. Его добавили в 7.1 и задали только width и height. Если тема или плагин переопределяли размеры картинок правилом вроде img { width: auto !important; }, значок рисовался в размере исходного файла. Теперь у него есть ещё max и min размеры, и он остаётся квадратом 20 пикселей, а на маленьких экранах 28.
  • #66221, DOMDocument при загрузке медиа. Перед чтением alt-текста, встроенного в изображение, ядро теперь проверяет, есть ли класс DOMDocument. Для WordPress он необязателен, и в остальных местах его наличие уже проверяли.
  • #66078, someecards.com. Провайдера убрали из списка oEmbed: его endpoint отвечает 404, а страницы открыток больше не отдают ссылку для автообнаружения oEmbed.
  • #66079, ReverbNation. Сайт и oEmbed API переехали на поддомен legacy.reverbnation.com, старый endpoint отвечает 404. Ядро теперь ходит на новый адрес, поэтому встраивание артистов и песен снова работает.

На странице версии 7.1.3 в документации перечислены девять изменённых файлов, пакеты в этом релизе не менялись:

  • wp-admin/js/common.js
  • wp-admin/includes/export.php
  • wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
  • wp-includes/class-wp-customize-manager.php
  • wp-includes/class-wp-customize-setting.php
  • wp-includes/class-wp-http.php
  • wp-includes/class-wp-oembed.php
  • wp-includes/class-wp-query.php
  • wp-includes/post.php

Старые ветки: сборки вплоть до 4.7

В анонсе сказано, что исправления безопасности переносят во все ветки, которые ещё получают такие обновления, сейчас это ветки начиная с 4.7. Там же напоминают, что активно поддерживается только самая свежая версия WordPress.

Сборки для старых веток вышли в тот же день. На странице релизов 6 октября отмечены, например, 7.0.7, 6.9.10 и самая старая 4.7.38. Так что сайт на 7.0 обновляется до 7.0.7, а на 7.1 до 7.1.3.

Как обновиться и проверить версию

Если есть WP-CLI, всё делается из консоли в каталоге сайта. Сначала посмотрите, какая версия стоит и что доступно:

wp core version
wp core check-update

Потом обновите ядро и базу и проверьте, что файлы ядра совпадают с официальными контрольными суммами:

wp core update
wp core update-db
wp core version
wp core verify-checksums

На ветке 7.1 после этого должно быть 7.1.3, на 7.0 будет 7.0.7. Если обновляете на старой ветке и не хотите переходить на 7.1, используйте wp core update --minor: эта команда ставит только минорные обновления в пределах текущей ветки. Без WP-CLI версию видно в админке на экране «Обновления» и внизу «Консоли».

Бывает, что хостер отключает фоновые обновления ядра. Тогда остаётся кнопка в админке или ручная замена файлов из архива. Перед ручной заменой сделайте копию файлов и базы, порядок действий есть в инструкции Updating WordPress.

Сам релиз в SVN лежит в теге tags/7.1.3, ревизия 64157. В его version.php стоит $wp_version = '7.1.3-src' и $wp_db_version = 61833, минимальная версия PHP 7.4.

В итоге 7.1.3 закрывает семь уязвимостей, из них две в комментариях и SQL-инъекцию в экспорте WXR, и чинит значок сайта, загрузку медиа без DOMDocument и два провайдера oEmbed. Обновляйтесь сразу, старые ветки до 4.7 получили свои сборки в тот же день.

Источники и ссылки


Комментарии загружаются…