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