Во вторник 14 декабря команда разработки Joomla выпустила срочное обновление безопасности, закрывающее 0-day уязвимость, которая открывает злоумышленникам возможность удаленного исполнения кода. Хакеры уже активно пытаются атаковать уязвимые сайты.

Что случилось


По сообщению ИБ-компании Sucuri, эта ошибка уже эксплуатируется киберпреступниками — исследователям удалось обнаружить свидетельства успешных попыток ее использования еще 12 декабря. В лог-файлах веб-серверов скомпрометированных сайтов присутствовали следующие строки:

2015 Dec 12 16:49:07 clienyhidden.access.log
Src IP: 74.3.170.33 / CAN / Alberta
74.3.170.33 – – [12/Dec/2015:16:49:40 -0500] “GET /contact/ HTTP/1.1? 403 5322 “http://google.com/” “}__test|O:21:\x22JDatabaseDriverMysqli\x22:3: ..
{s:2:\x22fc\x22;O:17:\x22JSimplepieFactory\x22:0: .. {}s:21:\x22\x5C0\x5C0\x5C0disconnectHandlers\x22;a:1:{i:0;a:2:{i:0;O:9:\x22SimplePie\x22:5:..
{s:8:\x22sanitize\x22;O:20:\x22JDatabaseDriverMysql\x22:0:{}s:8:\x22feed_url\x22;s:60:..

В коде обработчика сессий Joomla пристутствует уязвимость, которая позволяет осуществить внедрение строки в синтаксис сериализованной сессии через HTTP-заголовки User-Agent и X-Forwarded-For. Эксплоит использует особенность MySQL при обработке utf8-символов из диапазона U+010000 — U+10FFFF. При вставке строки, в конце которой присутствует такой символ, MySQL обрежет данные. Это позволяет сформировать и записать в таблицу сессий строку, в которой присутствуют пользовательские PHP-объекты, без нарушения синтаксиса. В ходе десериализации сессии атакующего вызываются деструкторы классов Joomla, что ведет к выполнению произвольного кода?. Для того, чтобы данные не обрезались, в MySQL необходимо использовать кодировку utf8mb4?. ??

Как заявляют исследователи Sucuri, обнаруженные атаки осуществлялись со следующих IP-адресов:

  • 74.3.170.33 (12 декабря);
  • 146.0.72.83 (13 декабря);
  • 194.28.174.106 (13 декабря);

14 декабря число попыток эксплуатации серьезно увеличилось — все «ловушки» (honeypot), созданные исследователями, были неоднократно атакованы.



Удаленное выполнение кода с помощью уязвимости Joomla

Участники сообщества пользователей фреймворка Metasploit на GitHub в режиме реального времени занимаются написанием эксплойта к обнаруженной уязвимости Joomla. По последним сообщениям участникам удалось создать работающий модуль для эксплуатации уязвимости:



Joomla 1.5 была выпущена в январе 2008 года — это означает, что уязвимость присутствует в этой и более поздних версиях системы уже почти на протяжении восьми лет. В настоящий момент нет данных о том, какое количество сайтов и веб-ресурсов были скомпрометированы вследствие эксплуатации этой бреши.

Как защититься


Уязвимость распространяется на версии Joomla 1.5 по 3.4.5 включительно. Всем пользователям CMS необходимо обновить свою систему — сделать это можно здесь. Пользователям старых неподдерживаемых версий 1.5.x и 2.5.x следует установить патчи, доступные по ссылке (инструкция по использованию фиксов представлена на английском языке здесь).

В качестве временной меры предосторожности исследователи Sucuri рекомендуют заменять потенциально опасные данные в заголовке HTTP User-Agent. Ниже представлен пример конфигурации для веб-сервера Apache:

RewriteCond %{HTTP_USER_AGENT} .*\{.* [NC]
RewriteRule .* - [F,L]

Кроме того, эксперты Positive Technologies рекомендуют использовать специализированные средства защиты от киберугроз — к примеру, межсетевой экран прикладного уровня PT Application Firewall успешно отражает возможные попытки эксплуатации указанной уязвимости:



Исследователи безопасности не в первый раз находят уязвимости в CMS Joomla. В октябре 2015 года была выпущена версия системы 3.4.5, в которой были устранены серьезные уязвимости (CVE-2015-7297, CVE-2015-7857, CVE-2015-7858), которые открывали злоумышленникам возможности, в том числе и осуществления SQL-инъекций.

Напомним также, что использование CMS с открытым кодом – вовсе не гарантия безопасности, если вы не проверяли эти коды на уязвимости. В прошлом году эксперты Positive Technologies, используя анализатор кодов PT Application Inspector, нашли множество багов в нескольких популярных CMS с открытым кодом, включая Joomla, Shopos, Yii и Jahia, а также в плагинах для Wordress. Разбор одного такого исследования, с уязвимостями системы InstantCMS, мы публиковали в начале года.

Комментарии (32)


  1. istui
    15.12.2015 22:38

    Автоматическая рассылка уведомлений об обновлениях, которая появится в версии 3.5, будет как нельзя кстати.


    1. Alexufo
      15.12.2015 23:22
      +2

      все важные секьюрити патчи должны ставится автоматом


      1. Lopar
        16.12.2015 14:52

        Как раз нет. Ибо тот, кто скомпрометирует сервер обновлений — автоматически пропатчит всех пользователей.


        1. Alexufo
          16.12.2015 15:01

          Так работает вордпресс и как то… спокойнее, зная что он хором по всей планете автопатчит серьезные уязвимости.
          Так работает винда, антивирусы и куча другого софта. Этож нормально. А чтобы не скомпрометировали надо делать так чтобы не скомпрометировали :-)


          1. Lopar
            17.12.2015 02:37

            У меня как-то на древней-древней серверной убунте стояло автообновление. Много лет назад. И была там грустная история, когда вышла новая версия с опечаткой в ядре (или не в ядре, но в чём-то очень критичном). Опечатку оперативно испраили и образ новый перезалили минут через 40, но те у кого стояло автообновление его выкачать успели и уронили себе системы. С тех пор — лучше руками.


            1. Alexufo
              17.12.2015 05:13

              Вы описали момент в памяти.
              Ну это же вид суеверия, при котором мы ожидаем ошибки и обходим её казалось бы правильным способом. Так проблема зачастую ошибок в их непредсказуемости. Ну не пользоваться чтоли теперь автообновлением али кто то когда то где то раз испортил ощущение безопасности сего функционала. Вы могли бы обновить руками в эти 40 мин. и получить тот же результат. Кто то наверняка так и сделал и теперь только добавил уровень стресса в работе с обновлением в ручную.
              Не, касаемо обновлений бубунты каждый сам решает как ему удобнее. В принципе если вы не цель хакера номер 1который так и ждёт как бы подловить ваш сайт то снижение уровня стресса от непредсказуемости при автообновлении дело хорошее. Однако для cms это крайне важно.

              Лучше случайно положить, чем дать дорогу спаму, массовых хаков, иддос атак. для тысяч серверов. То есть в случае прокола с автообновлением ответственный есть. И его можно страховать и побить). В случае новых дырок в старых системах поделать уже мало чего можно.


              1. Lopar
                17.12.2015 17:29

                В случае прокола с автообновлением как раз ответственного нет. Тот же wordpress «не несёт ответственности за…» и дальше по тексту. Если обновляться руками — то оператор как минимум должен убедиться, что всё будет работать до и после и весь процесс — под его ответственность. Если оператор бездумно клацает «NEXT-NEXT-NEXT», то это исключительно его проблемы, но не нужно пытаться доказать, что автоматическое обновление — это тот же процесс, только автоматизированный, тем самым приравнивая всех к таким вот операторам.


            1. istui
              17.12.2015 16:11

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


    1. sashabeep
      16.12.2015 00:09

      Вот ни разу не удивили. RSS с уведомлениями на главной странице в админке MODX была с момента ее появления, очень много лет назад.


      1. istui
        16.12.2015 09:57

        В Joomla! тоже уже несколько лет есть уведомления на главной странице админки, правда, не RSS.
        Вот только показываются они (и кнопка обновления) только тем пользователям, у кого есть на обновление права.

        Как часто вы заходите в админку сайта, если «все работает», а особенно — если наполняете сайт не вы, а редакторы, которым это уведомление не приходит?
        Здесь же достаточно указать e-mail, который точно есть у каждого, и который и так указывается при конфигурации сайта, и получать обновления вместе с другими письмами с сайта. Не нужно никаких дополнительных подписок на рассылки ИБ на сайтах, настройки новостных лент (к тому же RSS пользуются не все).

        Другой вопрос, что такую функциональность надо было сделать еще в версии 1.0 десять лет назад, а не вводить сегодня.


  1. nskforward
    16.12.2015 00:21

    А можно ли привести пример временной меры для nginx?


    1. istui
      16.12.2015 10:00

      if ($http_user_agent ~* ".*\{.*")
      {
          return 403;
      }
      


    1. xRay
      16.12.2015 10:04

      Посмотрите в код патча. там как раз избавляются от $_SERVER['HTTP_USER_AGENT']


  1. blueboar2
    16.12.2015 06:59
    +2

    Я правильно понимаю что это специфично для MySQL? Если у меня постгрес, мне бояться нечего?


    1. Raz0r
      17.12.2015 11:23

      Да.


  1. Kain_Haart
    16.12.2015 08:25
    +2

    Во вторник 14 декабря команда разработки Joomla выпустила срочное обновление безопасности, закрывающее 0-day уязвимость

    Как уязвимость может быть 0-day если компания уже выпустила закрывающее ее обновление?

    https://ru.wikipedia.org/wiki/%D0%A3%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BD%D1%8F


    1. Sleuthhound
      16.12.2015 09:18
      +2

      0-day — это такое модное нынче слово для привлечения внимания, если в продукте есть 0-day — то все пропало, нужно срочно покупать дорогие межсетевые экраны типа PT Application Firewall, да и вообще лучше купить коммерческий Bitrix или NetCat, в них же типа нет дыр.

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


    1. VolCh
      16.12.2015 09:52
      +3

      Это была 0-day уязвимость, пока не выпустили исправления.


    1. xRay
      16.12.2015 09:58

      Судя по описанию о уязвимости стало известно аж 12-го декабря.
      Уязвимость становиться не 0-day на следующий день после появления.


      1. akirsanov
        16.12.2015 13:14
        +1

        0-day — уязвимость, к которой нет официальной заплатки. Публикация часто приводит к фиксу 0-day, т.к. разработчик выпускает патч. До момента патча уязвимость — нульдей.


  1. istui
    16.12.2015 10:02

    Судя по тому, что ей подвержены все версии, начиная с 1.5, она могла пробыть в статусе 0-day очень долго. Это сейчас нам стало о ней известно, но не факто что кто-то не знал о ней раньше…


    1. akirsanov
      16.12.2015 13:19

      Специфика современного интернета такова, что он напичкан ханипотами, ids различного уровня, waf`ами, поэтому массовая эксплуатация данной уязвимости годами маловероятна. Для примера — эксплуатацию этой уязвимости нашли Securi, они зафиксировали первую попытку эксплуатации как минимум за 2 дня до официального патча:

      That is very concerning is that this vulnerability is already being exploited in the wild and has been for the last 2 days. Repeat: This has been in the wild as a 0-day for 2 days before there was a patch available.

      Уязвимость была в статусе 0-day долгие годы, другое дело, знал ли кто о ней, эксплуатировал ли. Для этого нужно грепать старые логи.


  1. defuz
    16.12.2015 11:34
    +1

    При вставке строки, в конце которой присутствует такой символ, MySQL обрежет данные.
    Коротко: MySQL в очередной раз ведет себя не как база данных, а как херня, написанная школьником. На этот раз это привело к критической уязвимости.


    1. Raz0r
      16.12.2015 15:45
      +1

      При STRICT_TRANS_TABLES=1 MySQL будет выдавать ошибку. Начиная с версии 5.7.5 строгий режим включен по умолчанию. И нельзя не отметить разработчиков Joomla, использующих неправильную кодировку для таблиц. Кстати, похожий баг был в WordPress: vagosec.org/2013/09/wordpress-php-object-injection


      1. defuz
        16.12.2015 16:56
        +1

        При STRICT_TRANS_TABLES=1 MySQL будет выдавать ошибку. Начиная с версии 5.7.5 строгий режим включен по умолчанию.
        Это должно было быть поведением по-умолчанию с самого рождения MySQL. Я не большой специалист по базам данных, но даже мне это очевидно.

        И нельзя не отметить разработчиков Joomla, использующих неправильную кодировку для таблиц.
        Какую они использовали кодировку и какая правильная?

        Кстати, похожий баг был в WordPress
        Я боюсь, что «похожий баг» был не только в Wordpress, а вообще везде где используется MySQL. Просто где-то уже нашли как применить такое поведение MySQL, а где-то еще нет.


        1. Raz0r
          16.12.2015 17:06

          В Joomla используется кодировка utf8, нужно использовать utf8mb4. Мой посыл в том, что необходимо знать, как правильно пользоваться инструментами, которые ты выбрал; сам инструмент не виноват, если его используют неправильно.


          1. defuz
            16.12.2015 17:24
            +3

            Чесно вам скажу, я пользуюсь MySQL не первый год, и я вообще первый раз слышу, что есть такая кодировка как utf8mb4. Конечно, это я мудак, «неправильно пользуюсь инструментом», но черт возьми, нахрена мне инструмент, который на каждом шагу подкладывает мне грабли под ноги?

            Виноват MySQL. И разработчики MySQL тоже виноваты. Нужно всегда исходить из того, что разработчик не может знать все сразу, так что нечего на них спихивать проблему.


            1. Raz0r
              16.12.2015 18:25

              Во-первых, разработчики Joomla допустили инъекцию в строку сериализованной сессии, так как не проверяют входящие данные, во-вторых, они не разбираются в особенностях работы базы данных. Другое дело, если бы это была уязвимость в самой базе данных.


  1. Pinsky
    16.12.2015 14:53

    Ждумля — это, вообще, кладезь дыр. От самого двигла, заканчивая шаблонами и модулями.


  1. Divasoft
    17.12.2015 23:26
    +1

    После выхода новости мы успели спасти ~15 проектов, но еще несколько успели заразиться… Самое интересное что часть взломов прошла через визуальный редактор JCE. Но заражение пошло не по плану, и обрушилась Mysql с ошибкой MySQL server has gone away

    Зловред закопался в активный шаблон. Аккуратно добавив в начало index.php (шаблона) <?php include_once('ob_cache.php'); ?> и в конец <?php ob_end_flush(); ?>
    Собственно сам код ob_cache.php http://pastebin.com/GUJc1vj8

    Красиво сделали…


  1. Shance
    18.12.2015 18:52
    +1

    Это позволяет сформировать и записать в таблицу сессий строку без нарушения синтаксиса.

    Синтаксис нарушается. Джумла пишет в таблицу сессии сериализованный массив __default|a:7:{...}, а при использовании данной уязвимости можно записать в свойство session.client.browser пайлоад, который начинается с }__test, чтобы закрыть массив default и открыть объект test, синтаксис которого валиден. Но при этом массив default получается невалидным по 3 причинам: количество его элементов(a:7) уже меньше 7, во-вторых параметр s:22:«session.client.browser»;s:435:" остаётся не закрытым, но и самая большая проблема, которую никак не обойти, в отличии от двух предыдущих, длина этого параметра равна длине нашей полезной нагрузки, то есть, в данном случае, 435.
    Это чревато тем, что при попытке стартануть сессию PHP выдаст предупреждение:
    session_start(): Failed to decode session object. Session has been destroyed

    И, как вы можете видеть, уничтожит сессию.
    Честно говоря, я не понимаю, от чего это зависит. Я думал, что это как-то связанно с версией PHP и уязвимостями CVE-2015-0231 или CVE-2014-8142, но собрав PHP 5.5.18 и попробовав на ней эксплоит не пришел ни к какому результату.
    Может, кто-нибудь знает, почему иногда PHP забивает на невалидную сессию, а иногда нет?


    1. Shance
      19.12.2015 03:17

      Скорее всего это связанно с CVE-2015-6835, но всё равно остаётся загадкой, почему php 5.5.18 остался непобежденным. Хотя соседний мак с мампом и такой же версией php пал с первой попытки.