ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: чтение чужих файлов.



On 25.11.2011 11:54, Alexandre Snarskii wrote:

У апача ЕМНИП есть опция (не )?ходить по симлинкам.
Возможно надо такую же в nginx?

http://httpd.apache.org/docs/2.2/mod/core.html#options

FollowSymLinks
SymLinksIfOwnerMatch

    This option should not be considered a security restriction,
    since symlink testing is subject to race conditions that
    make it circumventable.

Отсюда возникает вопрос: имеет ли смысл тестировать каждый элемент
пути при каждом запросе, если это не даёт 100% гарантии ?

Сугубое jimho: весь путь проверять не надо. Достаточно проверять
последний элемент пути, и, возможно, даже не "проверять самому",
а переложить проверку на операционную систему флагом O_NOFOLLOW
в open(2).

Почему: симлинк-атака базируется на стандартном location'е

  location ~ \.(gif|png|<whatever else static files>)$ {
        root /some/user;
  }

при котором "злому хацкеру" достаточно прописать в своей директории
симлинк image.gif ->  /some/other-user/config.php, и добавление
O_NOFOLLOW от этой атаки прикрывает.

насколько я понимаю, это полностью решит проблему shared hosting`ов.
и этот метод будет работать 100% корректно, без race conditions
- ведь у злоумышленников теперь уже не будет возможности изменить
имя/расширение чужого файла и заставить nginx отдать чужой файл,
который ранее не отдавался им напрямую через location ~ \.gif$ {}

Да, O_NOFOLLOW проверяет только последний элемент пути, но этого
а) достаточно (выставление симлинка "уровнем выше" к атаке не приводит,
ибо под данный location не попадает).
б) не очень сильно ломает функционал атомарных обновлений (хотя
если пользовательская CMS подставляет файлы именно симлинком
"последнего элемента" - это сломается, ведь симлинки не будут работать
даже внутри одной директории, но потому-то эта опция должна быть
конфигурируема для location'а а не включена по умолчанию).

по крайней мере, такая опция была бы точно лучше, чем вообще ничего.
а потом, со временем можно было бы добавить и (3), (4) режимы работы:

0) опция выключена (по умолчанию, для совместимости с пред. версиями)
1) флаг O_NOFOLLOW в open(2), при этом - максимальная производительность
2) флаг O_NOFOLLOW_IF_OWNER_NOT_MATCH в open(2) - более корректный метод
3) O_NOFOLLOW будут проверяться все компоненты пути на наличие симлинков
4) то же что и (3), но запрещать доступ только если владелец не совпадает

многим хостингам для закрытия доступа к чужим конфигам достаточно будет
применить только режим (1) или (2) не теряя при этом в nginx performance
и эта защита в (1) и (2) будет реализована в nginx без race conditions.

- пользователи хостингов будут заранее предупреждены файлы с какими
расширениями будут отдаваться напрямую nginx`ом, а какие через апач
или самостоятельно смогут это конфигурировать в панели управления,
без возможности включить в этот список файлы с расширениями чужих конфигов на хостинге, например .php .inc .ini .conf .htaccess и т.п.

--
Best regards,
 Gena

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.