Проблема безопасности: nginx (+ISPManager, как частный случай)

esetnod
На сайте с 16.07.2009
Offline
134
6091

Доброго времени.

Обнаружилась одна весьма неприятная проблема безопасности nginx, как частный случай, с ISPManager (конфиг).

Суть следующая: nginx свободно ходит по симлинкам (не имея контролирующих подобное поведение директив), опять же, в отличие от хардлинка, не надо иметь соответствующих прав, чтобы залинковать файл.

Из коробки, в ISPManager (может и в других панелях, поддерживающих его), создается отдельный локейшен под статику, через который nginx ходит прямо к файлам.

Достаточно иметь доступ к созданию файлов (линков, хоть даже через менеджер файлов манагера), чтобы через линк получить доступ с правами воркера nginx к любому файлу.

Пример:

Имеем аккаунт, виртуалхост и локейшен обрабатываемый стандартной регуляркой ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$

К примеру, владелец user1.

Делается линк в корне сайта, например something.css -> /$homedirs/user2/$site/config.php,

не доступный для чтения самим user1(mgrsecure), обращаемся по http к something.css, получаем конфиг в красивом виде.

Естественно, должен читаться с правами nginx. Учитывая, что для раздачи статики в хоумдиры nginx'у попадать надо, по пути нормальных прав не организуешь, а в рамках шареда, сущие единицы следят за правами своих файлов.

На вскидку подумал над тем как полечить, несколько костылей:

-С Freebsd шибко не знаком, но где-то натыкался на параметр монтирования nosymfollow, возможно оно.

-Временно отказаться от прямой раздачи статики, оставив в качестве только буферизующего прокси, не совсем решение, но вариант.

-Более-менее красивый вариант (на мой взгляд), проверять файл на линк.

Из доки следует, что -f должен быть true, только если файл регулярный, однако на практике не работает, из коробки -f не отличает файл от линка.

Ковырнул, стало понятно что файл проверяется через stat(), на сколько понимаю, будет проверен файл, на который указывает линк. Попробовал lstat() , теперь -f линки от файлов стал отличать, (не уверен, не вылезет ли каких проблем, но на вскидку - нет). /src/os/unix/ngx_files.h

А суть в следующем: проверять запрашиваемый файл, в каждом локейшене для статики, на предмет не линк ли он, и если линк, отдавать 403, примерно так:

if ( !-f $request_filename ) { return 403; } //Основное

Дополнительно:

if ( -d $request_filename ) { break; } //Если у кого-то есть диры с названиями, похожими на статический файл, и нужен оттуда индекс корня, выше проверки на линк.

if ( $realpath_root != $document_root ) { return 403; } // На случай, если есть статически заданные локейшены, обрабатываемые прямо nginx'ом (от промежуточных линков в пути).

Для новых виртуалхостов, можно добавить сабж в server.templ, чтобы манагер добавлял при создании.

//Если кто решит временно подшиться через проверку файла, существующий конфиг обработал новыми правилами так: (на точность тоже не претендует, ибо в попыхах, но у меня чисто отработал (локейшены манагеровские, обычные)).


awk -v STATE=OUT '{ if ( $0 ~ /location \~\* \^\.\+\\\.\(jpg/ ) { STATE="IN" }; if ( $0 ~ /\;\n\t\t\}/ ) { STATE="OUT" }; if ( STATE=="IN" && $0 ~/location \~\* \^\.\+\\\.\(jpg/ ) { print $0; print "\t\t\tif ( !-f $request_filename ) { return 403; }"; } else { print $0 } }'
Быстрый хостинг на SSD от $0.99 (http://just-hosting.ru/) | OpenVZ (http://just-hosting.ru/vds.html) и KVM (http://just-hosting.ru/vds-kvm.html) VDS от $7.95
iHead
На сайте с 25.04.2008
Offline
137
#1

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

Рекомендуемый хостинг партнер 1С-Битрикс (https://www.ihead.ru/bitrix/), PHP-хостинг (https://www.ihead.ru/php/), доверенный партнер RU-CENTER (https://www.ihead.ru/news/573.html), официальный представитель REG.RU в Кирове (https://www.ihead.ru/news/851.html)
M
На сайте с 16.09.2009
Offline
278
#2
iHead:
да, есть такое. нужно запретить создавать симлинки.

Это как? 🍿

esetnod:
Более-менее красивый вариант (на мой взгляд), проверять файл на линк.

Баг насоздать не задумались? У апача есть опции на тему ходьбы по линкам. Тем более, нельзя ходить за пределы DocumentRoot.

esetnod:
Из коробки, в ISPManager (может и в других панелях, поддерживающих его), создается отдельный локейшен под статику, через который nginx ходит прямо к файлам.

Есть еще одно решение: убрать к ляду этот локейшен. Вряд-ли на массовом виртуальном хостинге у вас будут сайты, для которых польза от него будет заметна.

А если у вас пара проектов - зачем вообще ISPManager? :)

Абонементное сопровождение серверов (Debian) Отправить личное сообщение (), написать письмо ().
iHead
На сайте с 25.04.2008
Offline
137
#3
myhand:
Это как? 🍿

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

---------- Добавлено 07.01.2012 в 00:05 ---------- Предыдущее сообщение было 06.01.2012 в 23:43 ----------

вот еще есть на эту тему.

M
На сайте с 16.09.2009
Offline
278
#4
iHead:
правкой исходников, ограничением доступа к серверу.

Несмешно.

iHead:
вот еще есть на эту тему.

Там ответил автор "сейчас - никак" (тм)

iHead
На сайте с 25.04.2008
Offline
137
#5
myhand:
Несмешно.
Там ответил автор "сейчас - никак" (тм)

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

---------- Добавлено в 00:27 ---------- Предыдущее сообщение было в 00:26 ----------

myhand:
Несмешно.

ну, любителям ставить бинарные пакеты, наверное, не смешно, а тем, кто привык все делать ручками - флаг в руки и барабан на шею :)

M
На сайте с 01.12.2009
Offline
235
#6

Ещё в 2007 году ответил.

Администратор Linux,Freebsd. построения крупных проектов.
Zaqwr
На сайте с 08.08.2007
Offline
111
#7

а это не поможет?

http://www.lexa.ru/nginx-ru/msg14919.html

Администрирование, Linux, Cisco, Juniper
iHead
На сайте с 25.04.2008
Offline
137
#8
Zaqwr:
а это не поможет?
http://www.lexa.ru/nginx-ru/msg14919.html

возможно. но для большей гибкости нужно что-то типа open_basedir в PHP.

производительность упадет, если делать в лоб.

KB
На сайте с 17.02.2010
Offline
16
#9

Обещают счастье через 3 недели http://trac.nginx.org/nginx/milestone/1.1.14

M
На сайте с 01.12.2009
Offline
235
#10
kuzma.bukin:
Обещают счастье через 3 недели http://trac.nginx.org/nginx/milestone/1.1.14

Это хорошо через 3 недели проверим

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий