Уязвимость в коннекторах MODX

Php-ниндзя Евгений Борисов откопал очередную уязвимость в MODX Revolution, что подтверждает народную мудрость: «не бывает здоровых людей, бывают плохо диагностированные».

Итак, за подробностями отправляю вас на сайт автора, а сам пока напишу мой способ борьбы с этой (и будущими) уязвимостями.

Защита по ip


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

Честно говоря, я никогда и не полагался, поэтому у меня на всех сайтах директории core, manager и connectors закрыты по ip адресу. Делается это просто, через nginx:
location ~* ^/(core|manager|connectors)/ {
        allow           125.68.91.12;
        deny            all;
        location ~* \.php$ {
            include             fastcgi_params;
            fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass        backend-sitename;
        }
}

Смысл правила в том, что все запросы, которые идут в эти директории проверяются по ip и дальше уже никуда не уходят. Поэтому отдельно прописана обработка php.

Защита по паролю


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

Тут смысл в том, чтобы запоролить системные директории средствами web-сервера. Для этого нужно установить apache2-utils и сгенерировать пароли:
sudo apt-get install apache2-utils
cd /var/www/sitename/
htpasswd -c ./.htpasswd username

Первый запуск htpasswd с ключем -c создаёт файл с паролями, при добавлении новых юзеров этот ключ не нужен.

Дальше настроиваем nginx:
location ~* ^/(core|manager|connectors)/ {
        auth_basic "Restricted Access";
        auth_basic_user_file /var/www/sitename/.htpasswd;
        location ~* \.php$ {
                include         fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass    backend-sitename;
        }
    }

Как видите, разница всего в двух строчках.

Заключение


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

Эти правила должны быть повыше в конфиге, чтобы срабатывать раньше других. Регулярные выражения в nginx имеют приоритет, поэтому других регулярок выше быть не должно (например, обработки ~* \.php).
То есть, сначала защитные правила, потом все остальные location.

Уязвимости были и будут в любом ПО, на 100% от них защититься нельзя, но нужно стараться.

Очевидно, что свой собственный VPS в деле обеспечения безопасности сайтов очень поможет в этом вопросе. Кто еще не смотрел — рекомендую.

Обновлено 05.06.13


Официальное объявление и ссылки на обновление\фикс размещены вот тут.
Василий Наумкин
12 мая 2014, 10:32
modx.pro
4 725
0

Комментарии: 30

Евгений Борисов
04 июня 2013, 23:52
0
Спасибо за анонс. На самом деле за кадром остался еще один баг с LFI тоже через коннекторы. Но я его не раскручивал, т.к. эта дырка будет покритичней. Да и в версии 2.2.8 скорее всего LFI отвалится под воздействием факторов. Хотя… Поживем увидим в общем)
    Василий Наумкин
    04 июня 2013, 23:57
    0
    Я так понимаю, если позакрывать core|manager|connectors — то с этими багами вполне можно жить.

    Но вообще, MODX явно потерял звание безопасной CMS.
      Евгений Борисов
      05 июня 2013, 00:14
      0
      Но вообще, MODX явно потерял звание безопасной CMS.
      Это и была моя первоочередной целью после статьи про то, какие они крутые по сравнению с Drupal и другими движками modx.com/blog/2012/05/29/why-we-dont-do-powered-by-by-default/
        Clean
        05 июня 2013, 00:56
        0
        я метод по паролю где-то тут уже предлагал…
        А насчет генератора, я б не стал захламлять сервер апачевыми кишками и использовал бы утилитку в онлайне, например вот эту
          Василий Наумкин
          05 июня 2013, 07:47
          0
          Да, предлагал.

          И спасибо тебе за это!
            Василий Наумкин
            05 июня 2013, 08:42
            0
            Кстати, тебе предупреждение, за то что лазил на mamaboutique.

            Сайт немного поломался, в логах твой ip.
              Clean
              05 июня 2013, 11:29
              0
              Да на самом деле не совсем корректно с моей стороны, но я там заметил открытую директорию с коннектрорами ну и к моему сожалению смог воспользоваться хаком, утром думал об этом отписать+)
              Экспиременты уже продолжал на локалхосте дабы ничего не сломать…
            Roman Smile
            09 июня 2013, 04:34
            0
            Закрывал директорию админки с помощью .htaccess с кодом, где xxx.xx.xx.xx — это айпи админа.
            Order Deny,Allow
            Deny from all
            Allow from xxx.xx.xx.xx
            То есть также нужно смело закрывать директории core и connectors? Это не может сделать что-то недоступным для пользователей?
              Василий Наумкин
              09 июня 2013, 07:17
              0
              Если твои пользователи не ходят в админку — все будет ок.
          Николай
          05 июня 2013, 02:36
          0
          Оперативненько вышел фикс, 2.2.8 :)
          Alex Vakhitov
          05 июня 2013, 08:32
          0
          Одни из причин изза которых я недолюбливаю php это его встраиваемость, и то что php файл можно запустить просто вбив путь к нему в адресной строке.
            Василий Наумкин
            05 июня 2013, 08:36
            0
            Это проблема не php, а веб-серверов и их настройки.

            Nginx запускает php ровно так же, как и python — через proxy. Как настроишь, так он и отработает по указанному адресу.
              Alex Vakhitov
              05 июня 2013, 09:01
              0
              Не совсем так, всетаки на Python «true runtime» приложения. И в той же Django нельзя получить доступ к самим .py/.pyc файлам набрав их в адресной строке
                Василий Наумкин
                05 июня 2013, 09:06
                0
                Не буду спорить, python изучал 2 дня.

                Данный случай демонстрирует, что о своей безопасности нужно забодиться самому, не надеясь на авторов CMS или фреймворка. Ведь дырки находятся везде, независимо от языка.

                А если не можешь позаботиться сам — нужно нанять специалиста, который всё проверит и настроит.
                  Alex Vakhitov
                  05 июня 2013, 09:20
                  0
                  Я в этом не спорю просто сказал о том что лично мне не нравится в использовании php. А так ошибки безопасности есть везде, просто гдето их легко найти гдето тяжело, но на все 100% безопасного ПО нет. Все измеряется только количеством времени которое нужно истратить на поиск уязвимости и ее использования.
                  Евгений Борисов
                  05 июня 2013, 10:47
                  0
                  набрав их в адресной строке
                  Именно поэтому и выносят ядро выше корня и в идеале должен остаться только 1 index.php через который и должен идти роутинг на основании $_SERVER['REQUEST_URI'], а не $_REQUEST['q'] и т.п.
                  В случае с контроллерами ничего удивительно, т.к. они и задумывались для того, чтобы к ним обращались на прямую. Правда странно, что тут авторы не подумали про маршрутизацию наплодили туеву кучу файлов однотипного содержания.
                    Василий Наумкин
                    05 июня 2013, 10:48
                    0
                    Есть мнение, что это остатки чего-то старого.

                    Ибо в дополнениях используется обычно всего один коннектор, который всё разруливает.
                      Евгений Борисов
                      05 июня 2013, 10:54
                      0
                      Ибо в дополнениях используется обычно всего один коннектор, который всё разруливает.
                      Подозрительный коннектор. На LFI смахивает, но потом посмотрю:-)
              Мордынский Николай
              05 июня 2013, 14:00
              0
              Уже хот фикс в репозитории лежит можно ставить заплатку
              Илья
              08 июня 2013, 02:02
              0
              У меня на сайте причудливые глюки появились((
              по всему сайту появились ссылки на одно из страниц этого же сайта причем если открыть исходный код то ничего этого не видно, разве что только через просмотр кода элемента или файрбаг.
              не могу понять моей ли рукожопостью вызваны они, аль кто воспользовался этой уязвимостью, да и самое страшное не могу понять как же от них избавиться
                Смирнов Николай
                Смирнов Николай
                08 июня 2013, 02:21
                0
                ищите в яваскриптах (файлы с расширением .js)
                  Илья
                  08 июня 2013, 09:32
                  0
                  да я изначально проверил все скрипты, потом даже по очереди все скрипты вырезал ничего не пропало, потом вообще отключил скрипты в браузере, тоже никуда эти ссылки не пропали, базу даже прошеристил уже не знаю где и смотреть, а проблема тем делом развивается на той странице, на которую адресуются эти ссылки, вылетели картинки с галереи и весь текст выделился ссылкой на эту же страницу. в ресурсах эту страницу удалить не могу отключить тоже, выдает окно что этот ресурс настроен как главная страница сайта, в настройках провели главной установлена та которая главная. Также интересно что id этого ресурса не отображается совсем
                    Василий Наумкин
                    09 июня 2013, 07:18
                    0
                    Напиши Евгению Борисову — поможет.
                      Смирнов Николай
                      Смирнов Николай
                      11 июня 2013, 00:34
                      0
                      Кстати, личных сообщений в вашем блоге не хватает )
                      Смирнов Николай
                      Смирнов Николай
                      11 июня 2013, 00:34
                      0
                      Киньте ссылка на сайт и данные для авторизации я могу глянуть
                      Вот на этот адрес smirnov1982kolya@yandex.ru
                        Илья
                        11 июня 2013, 08:14
                        0
                        Спасибо с проблемой не разобрался но избавился с помощью бекапа базы.
                  Алексей
                  11 июня 2013, 00:11
                  0
                  сегодня засек что кто-то по админке лазит. просто офигеть. а сначала не придал значения этому обновлению.
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    30