Уведомление о безопасности Link Library
Если вы получили от меня письмо со ссылкой на эту страницу, значит ваш сайт, по всей
видимости, использует версию плагина Link Library (плагин WordPress от Yannick Lefebvre,
который лежит у вас в файлах по пути /wp-content/plugins/link-library/), попадающую в
затронутый диапазон известной проблемы безопасности. На этой странице описано, в чём состоит
проблема, как проверить, какая у вас версия, как обновиться и что делать после этого.
Проблема отслеживается как CVE-2026-16532: это SQL-инъекция без аутентификации, достижимая через обработку присланных ссылок. Она затрагивает все выпуски до 7.9.3 и исправлена в 7.9.3. Текущим выпуском на момент написания является 7.9.4, он также содержит исправление. Если у вас установлено что-либо старше 7.9.3, обновите Link Library до 7.9.3 или новее.
Об одном моменте стоит сказать прямо: безопасной старой версии не существует. Это не та уязвимость, которая появилась в какой-то момент истории плагина, а затем была устранена. Уязвимый код присутствует в каждом опубликованном выпуске, который я смог проверить, вплоть до самой старой версии, которую до сих пор отдаёт каталог WordPress.org. Довод «моя установка слишком старая, чтобы быть затронутой» здесь не работает. Не затронуты только версии 7.9.3 и новее.
Не менее важно и то, что это уведомление не зависит от того, как настроен ваш сайт. В Link Library есть форма, позволяющая посетителям предлагать ссылки, и естественным предположением кажется, что сайт уязвим только тогда, когда эта форма действительно размещена где-то на странице. Это предположение неверно. Затронутый код выполняется при каждом обычном запросе к публичной части сайта, независимо от того, публиковали ли вы когда-либо форму отправки, и штатные настройки плагина этому не препятствуют. Если ваш сайт работает на затронутой версии, он достижим. Точка.
Это уязвимость плагина, а не ядра WordPress. Полностью обновлённый WordPress не защитит вас, если сам плагин Link Library остаётся на затронутой версии.
Это письмо настоящее?
Да. Это добросовестное уведомление в рамках ответственного раскрытия от независимого исследователя безопасности. Я не прошу у вас денег, паролей или доступа к сайту и не пытался в него проникнуть, что-либо ему отправить или что-либо эксплуатировать.
Я лишь посмотрел общедоступные файлы, которые ваш сайт отдаёт любому посетителю (так же, как публична ваша главная страница), и отметил номер версии, который публикует плагин. Я специально не отправлял ничего в функцию приёма ссылок этого плагина, ни на вашем сайте, ни на каком-либо другом, и эта проверка никак не затрагивает ваши данные, вашу панель управления или какую-либо закрытую часть сайта (подробнее ниже, в разделе Что я делал и чего не делал).
Если вы хотите убедиться, кто я, контактные данные приведены внизу этой страницы и на странице Обо мне.
Почему это важно
Link Library собирает и отображает на вашем сайте каталоги ссылок, а также может принимать предложения ссылок от посетителей. Именно в обработке этих предложений и находится проблема.
В затронутых версиях, когда плагин обрабатывает присланную ссылку, его проверка на то, существует ли такая ссылка уже, строит запрос к базе данных, подставляя присланные значения прямо в него. Значения очищаются для отображения, но не экранируются для использования в SQL, и запрос выполняется без подготовленного выражения. Следствие таково: посетитель, не выполнивший вход, может изменить этот запрос и прочитать данные из базы данных вашего сайта. Версия 7.9.3 переписывает запрос на использование подготовленного выражения, что закрывает проблему.
Повторю мысль, высказанную в начале, поскольку именно она скорее всего создаёт ложное спокойствие: уязвимость не зависит от того, опубликована ли форма отправки где-либо на вашем сайте. Путь в коде, который обрабатывает отправку, слушает при каждом запросе к публичной части сайта, а всё, что требуется запросу, чтобы до него добраться, можно получить из самого плагина, без какой-либо формы на какой-либо странице. Уязвим ли ваш сайт, зависит только от одного: от версии, на которой вы работаете.
Стоит также быть точным в том, чем эта проблема является и чем не является. Она позволяет злоумышленнику читать данные из базы данных. Это серьёзно само по себе, поскольку база данных WordPress хранит, например, адреса эл. почты пользователей и хеши паролей, а на некоторых сайтах записи о клиентах или участниках. Но сама по себе она не является ни удалённым выполнением кода, ни захватом сайта, ни способом выдать себе учётную запись администратора. Она уже, чем проблемы с полной компрометацией, о которых я пишу в других местах, и я предпочту честно обозначить масштаб, чем оставить у вас более пугающее впечатление, чем позволяют факты.
Я описываю это на том уровне, который нужен владельцу сайта, чтобы действовать, и не глубже. Я не публикую подробностей, которые позволили бы кому-то это воспроизвести, и прошу вас не пробовать это ни на своём сайте, ни на чужом. Чтение номера вашей версии, как описано ниже, даёт всё необходимое, чтобы решить, что делать.
Если в моём письме упоминалась эта проблема, значит версия, о которой сообщает ваш сайт, старше 7.9.3. Я не проверял, эксплуатируем ли именно ваш сайт; всё, что я наблюдал, это версия.
Затронут ли я?
Всё сводится к одному вопросу: какая версия Link Library у вас установлена?
В панели управления WordPress (главный источник):
- Войдите в консоль WordPress (обычно
вашдомен.ru/wp-admin). - Перейдите в Плагины, затем Установленные плагины.
- Найдите Link Library, запись, папка которой называется
link-library, и посмотрите версию, указанную под названием.
Из публичного манифеста (без входа): откройте в браузере
вашдомен.ru/wp-content/plugins/link-library/readme.txt. Строка Stable tag: ближе к
началу и есть версия, о которой сообщает ваша установка; именно этот публичный файл я и
читал. Для этого плагина я убедился, что она соответствует фактически выпущенному коду во
всех недавних выпусках, так что проверка надёжна.
Одна проверка для этого плагина не работает, поэтому, пожалуйста, на неё не полагайтесь.
Если вы привыкли узнавать версии плагинов по числу в параметре ?ver=, добавленном к
скрипту или таблице стилей в исходном коде страницы, здесь это введёт вас в заблуждение.
Номера версий в URL ресурсов этого плагина являются зафиксированными версиями встроенных
сторонних библиотек (значения вроде 4.0.1, 1.0.0 или 1.3.9) либо версией ядра
WordPress. Ни одно из них не является версией плагина, и сравнивать любое из них с 7.9.3
бессмысленно. Используйте экран в панели управления или readme.txt.
Ещё один краевой случай: некоторые очень старые установки показывают в своём readme.txt
строку Stable tag: trunk. Это вообще не номер версии. Если вы такое видите, воспользуйтесь
экраном плагинов в панели управления, а установку считайте затронутой, пока этот экран не
покажет обратное, поскольку установка, достаточно старая, чтобы содержать trunk, заведомо
старше 7.9.3.
Затем примените правило:
- Всё, что старше 7.9.3: затронуто. Обновляйтесь. Нет такой границы, ниже которой более старый выпуск снова становится безопасным.
- 7.9.3 или новее: уже исправлено. 7.9.4, текущий выпуск, тоже содержит исправление.
Как обновиться
Плагин бесплатный, всё ещё публикуется и активно поддерживается, поэтому исправление устанавливается как обычное обновление. Самый безопасный путь: обновляться средствами самого WordPress, предварительно сделав резервную копию.
- Сделайте резервную копию сайта (файлы и база данных), прежде чем что-либо менять. Большинство хостинг-провайдеров предлагают резервное копирование в один клик, либо воспользуйтесь плагином резервного копирования для WordPress.
- В панели управления WordPress перейдите в Консоль, затем Обновления, либо в Плагины, затем Установленные плагины. Если обновление Link Library есть в списке, установите его отсюда.
- Если вам удобнее командная строка, WP-CLI делает то же самое:
wp plugin update link-library. - Если обновление не появляется, последний выпуск можно взять напрямую со страницы плагина в каталоге WordPress.org, Link Library, и обновиться через Плагины, затем Добавить плагин, затем Загрузить плагин.
- После обновления подтвердите новый номер версии (7.9.3 или новее) описанными выше способами и проверьте, что ваши каталоги ссылок по-прежнему отображаются и работают как обычно.
Раз уж вы этим занялись, стоит убедиться, что ядро WordPress и остальные ваши плагины тоже обновлены, поскольку тот же принцип относится ко всем.
После обновления
Обновление до 7.9.3 или новее закрывает проблему: проверка присланных ссылок теперь выполняется как подготовленное выражение, поэтому присланные значения воспринимаются как данные, а не как часть запроса.
Чего обновление сделать не может, если говорить аккуратно. Обновление останавливает чтение чего-либо из вашей базы данных в будущем. Оно не может «вернуть обратно» то, что уже могло быть прочитано, пока сайт работал на затронутой версии. У меня нет никакой возможности узнать, произошло ли это на вашем сайте, и я не смотрел; большинство сайтов из затронутого диапазона, вероятно, никто никогда не трогал. Но поскольку я не могу утверждать это наверняка, небольшая предосторожность будет разумной, соразмерно тому, что хранится в вашей базе данных:
- Если у вас обычный публикующий сайт, где база данных хранит ваши записи, страницы и небольшое число учётных записей, разумным шагом будет попросить ваших пользователей (и особенно администраторов) сменить пароли. WordPress хранит пароли в виде хешей, а не открытым текстом, но хеши слабых паролей можно взломать в автономном режиме, поэтому свежий пароль снимает это беспокойство.
- Если ваш сайт хранит что-то более чувствительное (записи об участниках, данные клиентов, ключи API или иные учётные данные, хранимые плагинами), их тоже стоит считать подлежащими замене.
- Перегенерация секретных ключей и «солей» WordPress в
wp-config.php(новые значения находятся в одном клике в официальном генераторе секретных ключей) разово завершит сеансы всех пользователей и сделает недействительными любые похищенные токены сеансов.
Чтобы не было недопонимания: это мера предосторожности, а не заявление о том, что ваши данные были похищены. Это уведомление основано на номере версии, а не на каких-либо свидетельствах атаки.
Что я делал и чего не делал
Чтобы полностью прояснить, на чём основано моё письмо: я читал только публичные файлы,
которые ваш сайт и так отдаёт каждому посетителю, а именно публичный файл readme.txt
плагина и вашу главную страницу. Я не обращался ни к панели управления WordPress, ни к
базе данных, ни к какой-либо закрытой части сайта.
В частности, я ни разу ничего не отправлял в функцию приёма ссылок плагина, ни на вашем сайте, ни где-либо ещё. Ничего не было отправлено, сохранено, протестировано или проэксплуатировано. Здесь это важнее, чем на большинстве подобных страниц, потому что обработка присланных ссылок и есть то самое, чего касается эта проблема, так что «я к ней не прикасался» и составляет всю разницу между раскрытием и вторжением.
Я также намеренно не публикую подробностей, которые помогли бы кому-то воспользоваться этой проблемой. Описание выше останавливается на уровне, нужном владельцу сайта, и я не даю ссылок ни на какой демонстрационный код.
Это наблюдение по версии: ваш сайт сообщает версию старше 7.9.3. Сайт из этого диапазона может быть уже защищён иными средствами, например межсетевым экраном веб-приложений или перенесённым исправлением. Это уведомление не является утверждением, что ваш сайт был эксплуатируем на момент моей проверки.
У меня нет вебмастера / я не справляюсь
Если сайтом занимаетесь не вы, перешлите, пожалуйста, эту страницу тому, кто им занимается (вашему разработчику, агентству или хостинг-провайдеру). Шаги выше он узнает сразу.
Если вы ведёте сайт сами и застряли, я с удовольствием подскажу направление бесплатно. Напишите по контактам ниже.
Контакты
Evan Harris, исследователь безопасности
- Эл. почта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я обращаюсь по таким вопросам исключительно ради того, чтобы помочь операторам защитить свои сайты. Если вы предпочитаете больше не получать от меня писем, просто сообщите, и я это учту.
Источники
Официальные бюллетени и отслеживание
Разработчик / плагин