From gmm на csdoc.com Thu Jul 13 02:30:54 2023 From: gmm на csdoc.com (Gena Makhomed) Date: Thu, 13 Jul 2023 05:30:54 +0300 Subject: =?UTF-8?B?0KPRj9C30LLQuNC80L7RgdGC0Ywg0LrQvtC90YTQuNCz0YPRgNCw0YY=?= =?UTF-8?B?0LjQuSBOZ2lueCDRgSDQvdC10LrQvtGA0YDQtdC60YLQvdGL0LzQuCDQvdCw0YE=?= =?UTF-8?B?0YLRgNC+0LnQutCw0LzQuCDQsdC70L7QutCwIGFsaWFz?= Message-ID: <396e5dc8-75d5-f2c5-b1b4-26de04d04442@csdoc.com> Здравствуйте, All! https://www.opennet.ru/opennews/art.shtml?num=59383 Уязвимость конфигураций Nginx с некорректными настройками блока alias Это было сделано для максимизации производительности работы nginx, и в данный момент эту проблему в коде nginx уже нельзя исправить по причине обратной совместимости - потому что могут прекратить работать те конфигурации, которые работают у пользователей сейчас? -- Best regards, Gena From mdounin на mdounin.ru Thu Jul 13 15:54:48 2023 From: mdounin на mdounin.ru (Maxim Dounin) Date: Thu, 13 Jul 2023 18:54:48 +0300 Subject: =?koi8-r?B?9dHa18nNz9PU2CDLz87GycfV?= =?koi8-r?B?0sHDycogTmdpbngg0yDOxcvP0tLFy9TO2c3JIM7B09TSz8rLwc3JIMLMz8s=?= =?koi8-r?Q?=C1?= alias In-Reply-To: <396e5dc8-75d5-f2c5-b1b4-26de04d04442@csdoc.com> References: <396e5dc8-75d5-f2c5-b1b4-26de04d04442@csdoc.com> Message-ID: Hello! On Thu, Jul 13, 2023 at 05:30:54AM +0300, Gena Makhomed wrote: > Здравствуйте, All! > > https://www.opennet.ru/opennews/art.shtml?num=59383 > Уязвимость конфигураций Nginx с некорректными настройками блока alias > > Это было сделано для максимизации производительности работы nginx, > и в данный момент эту проблему в коде nginx уже нельзя исправить > по причине обратной совместимости - потому что могут прекратить > работать те конфигурации, которые работают у пользователей сейчас? Location'ы в nginx'е используют префиксный матчинг, и при использовании location'ов без завершающего слэша - в соответствующий location подпадает не только запросы в конкретный каталог, но и все другие запросы, начинающиеся на заданный префикс. Судя по всему, многие этого не понимают, и пытаются указывать в конфигурации не префиксы, а названия каталогов/файлов - что приводит к проблемам (как в сочетании с директивой alias, так и, строго говоря, и вообще без неё, см. примеры по ссылке ниже). Переделывать location'ы, чтобы они работали по другому - не выглядит простой задачей, в первую очередь в силу того, что это потребует переделки большого количества существующих конфигураций. Кажется, начать тут стоит с явного документирования возможных проблем от некорректного использования префиксов. Подробнее я на днях писал об этом тут: https://mailman.nginx.org/pipermail/nginx-devel/2023-July/YSJ5EIRYFWXIEZKKC6OXW76XIPMDTW6A.html -- Maxim Dounin http://mdounin.ru/ From gmm на csdoc.com Mon Jul 24 15:42:14 2023 From: gmm на csdoc.com (Gena Makhomed) Date: Mon, 24 Jul 2023 18:42:14 +0300 Subject: =?UTF-8?B?0J3QsNGB0LvQtdC00L7QstCw0L3QuNC1INC00LjRgNC10LrRgtC40LIg?= =?UTF-8?Q?proxy=5fhide=5fheader_=d0=b8_proxy=5fpass=5fheader?= Message-ID: <25adfc5d-e4d7-fcee-f56a-310ad0ccbf79@csdoc.com> Здравствуйте, All! Наследование директив proxy_hide_header и proxy_pass_header не работает ожидаемым образом, nginx 1.25.1 конфиг: http { proxy_pass_header Content-Disposition; server { server_name sentry.example.com; location / { proxy_hide_header Content-Disposition; proxy_pass http://172.17.110.100:9000; } } } Директива proxy_hide_header не работает в такой конфигурации, - заголовок Content-Disposition присутствует в ответе сервера. Если закомментировать директиву proxy_pass_header на уровне http - только после этого начинает нормально работать директива proxy_hide_header на уровне location. Это ошибка в коде nginx, что наследование не работает ожидаемым образом, или это ошибка в документации к nginx, что это явно не оговорено, или же это ошибка в моем понимании документации nginx? Задача у меня такая - надо включить заголовок Content-Disposition для всех сайтов, за исключением одного сайта - sentry self-hosted, для того чтобы обойти баг, который присутствует в браузере Safari. Если я что-то делаю неправильно - как правильно решить эту задачу? Подробнее об этом баге в браузере Safari и о workaround, для него: https://github.com/getsentry/self-hosted/issues/2285#issuecomment-1647664859 -- Best regards, Gena From mdounin на mdounin.ru Mon Jul 24 19:22:12 2023 From: mdounin на mdounin.ru (Maxim Dounin) Date: Mon, 24 Jul 2023 22:22:12 +0300 Subject: =?koi8-r?B?7sHTzMXEz9fBzsnFIMTJ0sXL?= =?koi8-r?B?1MnXIHByb3h5X2hpZGVfaGVhZGVyIMk=?= proxy_pass_header In-Reply-To: <25adfc5d-e4d7-fcee-f56a-310ad0ccbf79@csdoc.com> References: <25adfc5d-e4d7-fcee-f56a-310ad0ccbf79@csdoc.com> Message-ID: Hello! On Mon, Jul 24, 2023 at 06:42:14PM +0300, Gena Makhomed wrote: > Здравствуйте, All! > > Наследование директив proxy_hide_header и proxy_pass_header > не работает ожидаемым образом, nginx 1.25.1 > конфиг: > > http { > > proxy_pass_header Content-Disposition; > > server { > > server_name sentry.example.com; > > location / { > proxy_hide_header Content-Disposition; > proxy_pass http://172.17.110.100:9000; > } > } > } > > Директива proxy_hide_header не работает в такой конфигурации, > - заголовок Content-Disposition присутствует в ответе сервера. > > Если закомментировать директиву proxy_pass_header > на уровне http - только после этого начинает нормально > работать директива proxy_hide_header на уровне location. > > Это ошибка в коде nginx, что наследование не работает ожидаемым образом, > или это ошибка в документации к nginx, что это явно не оговорено, > или же это ошибка в моем понимании документации nginx? Насколько я вижу, каких-либо специальных условий наследования для proxy_pass_header и proxy_hide_header в документации не указано. Соответственно, по общему правилу это два разных списка и они наследуются независимо: - список заголовков, которые нужно спрятать, определяется директивами proxy_hide_header; список наследуется с предыдущего уровня, если на текущем уровне не определены директивы proxy_hide_header. - список спрятанных заголовков, которые тем не менее нужно передать клиенту, определяется директивами proxy_pass_header; список наследуется с предыдущего уровня, если на текущем уровне не определены директивы proxy_pass_header. Наблюдаемое поведение, насколько я вижу, ожидаемому соответствует: в случае наличия заголовка в списке proxy_pass_header он передаётся клиенту, в случае отсутствия (и наличия в списке proxy_hide_header) - не передаётся. > Задача у меня такая - надо включить заголовок Content-Disposition > для всех сайтов, за исключением одного сайта - sentry self-hosted, > для того чтобы обойти баг, который присутствует в браузере Safari. > > Если я что-то делаю неправильно - как правильно решить эту задачу? > > Подробнее об этом баге в браузере Safari и о workaround, для него: > > https://github.com/getsentry/self-hosted/issues/2285#issuecomment-1647664859 Заголовок Content-Disposition отсутствует в proxy_hide_header по умолчанию, так что для решения данной задачи будет достаточно указать "proxy_hide_header Content-Disposition;" в конфигурации проксирования для Sentry. Как, собственно, и предлагают по ссылке. -- Maxim Dounin http://mdounin.ru/