Re: Аналог htaccess
Gena Makhomed
gmm на csdoc.com
Пт Сен 23 11:19:19 UTC 2011
On 23.09.2011 13:32, Alexandre Snarskii wrote:
>> если операционная система на сервере не является POSIX-совместимой,
>> например, у нее нет поддержки симлинков, то этой уязвимости не будет.
>>
>> решение проблемы:
>>
>> - или отдельный OpenVZ контейнер каждому пользователю хостинга
>> - или отдельный nginx каждому пользователю под его учетной записью
>> - или написать аналог mod_aclr для второго апача и работать через него
> - или написать дополнительную директиву конфигурации, которая позволит
> на уровне location добавлять в open(2) флаг O_NOFOLLOW ?
не поможет. O_NOFOLLOW проверяет только последний элемент в пути.
"Symbolic links in earlier components of the pathname will still be
followed."
и такое ограничение, open с флагом O_NOFOLLOW - будет легко обойти.
гарантированно можно решить эту проблему только с помощью функции
openat вместе с O_NOFOLLOW, при этом "вручную" открывая каждый
элемент пути начиная от корня. но это даст значительное уменьшение
производительности и не слишком соответствует цели high performance.
> PPS: а еще в правильных операционных системах ключик nosymfollow
> может быть выставлен на уровне mount(8)/fstab(5).
мы сейчас говорим про какую-то сферическую операционную систему
с двумя красными рожками? так ведь ключик nosymfollow на самом деле
ломает POSIX-совместимость и делает нерабочими большое количество
технологий, например, атомарное обновление сайта с помощью симлинков.
например:
http://lifeonubuntu.com/setup-wp-wpmu-for-atomic-version-switch-and-revert/
Setup WordPress or WPMU to make an atomic version switch — AND allow you
to revert
тем более, что вместо ключика nosymfollow на уровне
mount(8)/fstab(5) в действительности там нужен ключик
условно говоря, No_FollowSymLinks_And_SymLinksIfOwnerMatch
который будет разрешать симлинки если владелец файла и симлинка
один и тот же, и будет запрещать ресолвить симлинки на чужие файлы.
но при этом - грубо ломется POSIX-совместимость операционной системы.
идеальное решение - флаг к open O_NOFOLLOW_ANY_IF_OWNER_NOT_MATCH,
который будет проверять любой компонент пути (ANY) и не ресолвить,
если владельцы разные - тогда накладные расходы будут минимальны,
не будет ломаться POSIX-совместимость и будет большая гибкость.
но наверное в ядро системы такой флаг не захотят добавлять...
--
Best regards,
Gena
Подробная информация о списке рассылки nginx-ru