50 оттенков безопасности Друпала
- Для хеширования паролей используется модифицированная версия phpass [1], от которой на официальном сайте открестились. Но менять механизм не спешат [#1845004] [2].
- Не желают даже предоставить возможность выбора механизма хеширования [#2939888] [3].
- Число итераций для стойкости хеширования не обновлялось больше 7 лет [#1850638] [4], хотя предполагалось увеличение итераций не реже чем в 2 года [#1203852] [5].
- При использовании PostgreSQL хеши паролей сравниваются без учёта регистра [#2475539] [6].
- Также с PostgreSQL есть проблемы с поддержкой SSL [#850600] [7].
- Минимально допустимая версия PostgreSQL 9.2, которая уже давно без поддержки безопасности [#2846994] [8].
- Официальная сборка Друпала содержит устаревшие версии вендорных библиотек (из-за совместимости с PHP 5.5). В некоторых из них, например Zend, есть даже известные уязвимости [#2989631] [9].
- Также в сборке находятся все тесты, тестовые модули, тестовые темы и вендорные библиотеки для тестирования, что увеличивает не только размер архива, но и область возможных брешей [#2338671] [10].
- Застопорилас и идея перенеси исполняемые файлы за пределы сайта [#1672986] [11].
- Проверка обновлений реализована с помощью GET запросов по небезопасному HTTP протоколу [#1538118] [12]. При MITM атаке можно подсовывать любые ссылки на архивы модулей (домен и хеш-суммы не проверяются). Также можно собирать инфу о составе сайта, списке разработчиков и их активности (запросы с локальных версий сайтов совпадут по ip с аккаунтами на d.org). HTTP протокол позволяет разместить скрипт для сбора инфы за пределами drupal.org.
- Пользователь с id = 1 является самым лакомым объектом для атаки, поскольку всегда имеет все существующие на сайте права доступа (permissions), а также имеет все попытки лишить его этих прав [#540008] [13].
- Такое поведение не совсем очевидно, поскольку визуально в админке этот пользователь ничем не отличается от других. Но даже попытка подсветить эту особенность закончилась ничем [#572240] [14].
- Захватить контроль над этим пользователем с id = 1 может любой администратор, или другой пользователь с нужными правами [#39636] [15].
- Определённые права неявным образом дают контроль над всем сайтом, но внешне они тоже никак не выделяются [#2846365] [16], [#594412] [17].
- Некоторые права даже своим названием могут ввести в заблуждение. Например, право на просмотр логов на самом деле позволяет и удалять их [#1635646] [18].
- Наведения порядка в пермишенах давно уже является острой задачей, но ее просто игнорят [#2628870] [19], [#2667018] [20].
- Администратор не может удалить файловый объект загруженный другим пользователем, каким бы вредоносным он ни был [#2949017] [21].
- Хук hook_file_download не использует при валидации соответствующий контроллер [#2148353] [22].
- Нет отрабатывает валидация для файлов на стороне клиента [#2938441] [23].
- Слабые проверки загрузки произвольных файлов [#2543590] [24], не говоря уже о всяких RarJpeg склейках.
- Некоторые проверки файлов полагаются на .htaccess правила [#2829048] [25].
- В .htaccess хватает и других правил безопасности, которые неявным образом теряются при переключении на другое окружение (особенно Nginx), но реализация аналогичных правил web.config заглохла [#154339] [26], [#2669870] [27].
- По умолчанию на любой сайт с Друпал 8 можно заливать изображения простым POST запросом, состоящим из имени формы для регистрации и полем с аватаркой пользователя. Примечательно, что в Drupal 7 от вывода такого поля по умолчанию отказались [#31056] [28], но те времена прошли.
- При многократной загрузке файла с одинаковым названием появляется проблема, связанная с реализацией алгоритма генерирования уникальных названий файлов [#2684403] [29].
- Фильтрация адресов изображений также хромает. Поэтому можно разлогинивать пользователей картинкой с src='/user/logout' [#144538] [30], или реализовать DOS-атаку, разместив пару сотен картинок с src='very/hard/page'.
- Ещё один способ съесть ресурсы, это загрузка изображений размерами 1000х1 в поля, которые обрабатываются с помощью «Scale and crop» эффекта [#2931533] [31], [#872206] [32].
- Забить базу данных мусорным кешем можно просто перебирая урлы [#1245482] [33], хотя система кеширования и без посторонней помощи прекрасно забирает все ресурсы на хранения результатов, которые даже с нуля было бы получить быстрее [#2888838] [34].
- Можно нагружать сайт и забивать логи сообщениями об ошибках с помощью специальных запросов к контекстным ссылкам.[#2864933] [35].
- Доступ к прикреплённым файлам и изображениям есть всегда, вне зависимости от доступа к контенту [#2904842] [36].
- Комментарии к контенту тоже останутся доступны при запрете доступа к контенту [#1781766] [37].
- Зареган ли пользовать на сайте можно узнать по сообщению на восстановление пароля [#1521996] [38].
- Форма для сброса паролей не защищена от флуда [#1681832] [39].
- При создании и проверке паролей, без всякого предупреждения удаляются все пробельные символы вокруг [#1921576] [40]. Это может быть сюрпризом для пользователя, и небольшим послаблением для алгоритма перебора.
- Если у вас нет возможности получить хеш пароля для брутфорса, но есть сессия пользователя, то можно брутить пароль без ограничений через сам аккаунт, например, меняя почтовый ящик [#2339399] [41].
- Кстати, если что, пользователь даже не узнает, что его ящик был изменён, поскольку попытка реализовать эту фичу стопорится уже не первый год [#85494] [42].
- Алгоритм генерации сессий тоже так себе [#2238561] [43].
- Куки протекают между сайтами, которые размещены в подпапках [#2515054] [44].
- В некоторых случаях можно заблочить пользователей, манипулируя с запросами на некорректный ввод пароля [#2449335] [45].
- Доступ к правке шаблонов Twig позволяет получить неограниченный контроль над сайтом [#2860607] [46].
- Упорно игнорируется XSS атака через Twig атрибуты [#2567743] [47], [#2552837] [48], [#2544110] [49].
- Также можно внедрять XSS в info файлы. Например через description или package поля, что можно интересно эксплуатировать через фичи [#846430] [50].
- Не используется заголовок безопасности X-XSS-Protection [#2868150] [51].
- XSS можно протолкнуть и через метод редеринг класса PlainTextOutput, хотя название класса говорит о противоположном [#2896735] [52].
- Также может быть сюрпризом, что некоторые методы проверяют и кешируют права доступа текущего пользователя, а не того, который в них передали [#2628870] [19], [#2266809] [53].
- Из-за неправильной настройки кеша можно делать для пользователя недоступным просмотр собственного профиля [#2614230] [54]. Аналогичный трюк можно проделать при определеных настройках и с контентом [#2982770] [55], и с медиа [#2889855] [56].
- Статистикой просмотров материала можно легко манипулировать через обычный цикл for в консоли браузера, накручивая по тысячи просмотров в минуту даже если у вас нет доступа к самому материалу. Можно накручивать даже пока не существующие материалы [#2616330] [57].
- Хромает валидация внешних урлов [#2691099] [58], [#2652236] [59].
- Нет полноценной защиты от breachattack.com [60] [#2234243] [61].
- Если настроить Content Security Policy, то отваливается редактор контента [#2789139] [62].
- Это любительская подборка, ни на что не претендующая. Быть может кто-то знает дыры похлеще? С 30.01.2019 по 15.10.2020 действует баунти [63] от EU бюджетом в 89 000,00 €. Можете попробовать что-нибудь исправить. Но если не получится — не отчаивайтесь, мантейнеры этого проекта обучены в высшей степени ловко маневрировать между задачами, чтобы годами держать Друпал на одном месте.
Автор: Maureen
Источник [64]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/drupal/306792
Ссылки в тексте:
[1] phpass: https://www.openwall.com/phpass
[2] [#1845004]: https://www.drupal.org/project/drupal/issues/1845004
[3] [#2939888]: https://www.drupal.org/project/drupal/issues/2939888
[4] [#1850638]: https://www.drupal.org/project/drupal/issues/1850638
[5] [#1203852]: https://www.drupal.org/project/drupal/issues/1203852
[6] [#2475539]: https://www.drupal.org/project/drupal/issues/2475539
[7] [#850600]: https://www.drupal.org/project/drupal/issues/850600
[8] [#2846994]: https://www.drupal.org/project/drupal/issues/2846994
[9] [#2989631]: https://www.drupal.org/project/drupal/issues/2989631
[10] [#2338671]: https://www.drupal.org/project/drupal/issues/2338671
[11] [#1672986]: https://www.drupal.org/project/drupal/issues/1672986
[12] [#1538118]: https://www.drupal.org/project/drupal/issues/1538118
[13] [#540008]: https://www.drupal.org/project/drupal/issues/540008
[14] [#572240]: https://www.drupal.org/project/drupal/issues/572240
[15] [#39636]: https://www.drupal.org/project/drupal/issues/39636
[16] [#2846365]: https://www.drupal.org/project/drupal/issues/2846365
[17] [#594412]: https://www.drupal.org/project/drupal/issues/594412
[18] [#1635646]: https://www.drupal.org/project/drupal/issues/1635646
[19] [#2628870]: https://www.drupal.org/project/drupal/issues/2628870
[20] [#2667018]: https://www.drupal.org/project/drupal/issues/2667018
[21] [#2949017]: https://www.drupal.org/project/drupal/issues/2949017
[22] [#2148353]: https://www.drupal.org/project/drupal/issues/2148353
[23] [#2938441]: https://www.drupal.org/project/drupal/issues/2938441
[24] [#2543590]: https://www.drupal.org/project/drupal/issues/2543590
[25] [#2829048]: https://www.drupal.org/project/drupal/issues/2829048
[26] [#154339]: https://www.drupal.org/project/drupal/issues/154339
[27] [#2669870]: https://www.drupal.org/project/drupal/issues/2669870
[28] [#31056]: https://www.drupal.org/project/drupal/issues/31056
[29] [#2684403]: https://www.drupal.org/project/drupal/issues/2684403
[30] [#144538]: https://www.drupal.org/project/drupal/issues/144538
[31] [#2931533]: https://www.drupal.org/project/drupal/issues/2931533
[32] [#872206]: https://www.drupal.org/project/drupal/issues/872206
[33] [#1245482]: https://www.drupal.org/project/drupal/issues/1245482
[34] [#2888838]: https://www.drupal.org/project/drupal/issues/2888838
[35] [#2864933]: https://www.drupal.org/project/drupal/issues/2864933
[36] [#2904842]: https://www.drupal.org/project/drupal/issues/2904842
[37] [#1781766]: https://www.drupal.org/project/drupal/issues/1781766
[38] [#1521996]: https://www.drupal.org/project/drupal/issues/1521996
[39] [#1681832]: https://www.drupal.org/project/drupal/issues/1681832
[40] [#1921576]: https://www.drupal.org/project/drupal/issues/1921576
[41] [#2339399]: https://www.drupal.org/project/drupal/issues/2339399
[42] [#85494]: https://www.drupal.org/project/drupal/issues/85494
[43] [#2238561]: https://www.drupal.org/project/drupal/issues/2238561
[44] [#2515054]: https://www.drupal.org/project/drupal/issues/2515054
[45] [#2449335]: https://www.drupal.org/project/drupal/issues/2449335
[46] [#2860607]: https://www.drupal.org/project/drupal/issues/2860607
[47] [#2567743]: https://www.drupal.org/project/drupal/issues/2567743
[48] [#2552837]: https://www.drupal.org/project/drupal/issues/2552837
[49] [#2544110]: https://www.drupal.org/project/drupal/issues/2544110
[50] [#846430]: https://www.drupal.org/project/drupal/issues/846430
[51] [#2868150]: https://www.drupal.org/project/drupal/issues/2868150
[52] [#2896735]: https://www.drupal.org/project/drupal/issues/2896735
[53] [#2266809]: https://www.drupal.org/project/drupal/issues/2266809
[54] [#2614230]: https://www.drupal.org/project/drupal/issues/2614230
[55] [#2982770]: https://www.drupal.org/project/drupal/issues/2982770
[56] [#2889855]: https://www.drupal.org/project/drupal/issues/2889855
[57] [#2616330]: https://www.drupal.org/project/drupal/issues/2616330
[58] [#2691099]: https://www.drupal.org/project/drupal/issues/2691099
[59] [#2652236]: https://www.drupal.org/project/drupal/issues/2652236
[60] breachattack.com: http://breachattack.com/
[61] [#2234243]: https://www.drupal.org/project/drupal/issues/2234243
[62] [#2789139]: https://www.drupal.org/project/drupal/issues/2789139
[63] баунти: https://juliareda.eu/2018/12/eu-fossa-bug-bounties/
[64] Источник: https://habr.com/ru/post/437820/?utm_source=habrahabr&utm_medium=rss&utm_campaign=437820
Нажмите здесь для печати.