Обход SSRF-фильтра в Gotenberg через зону IPv6 в Go
11 ноября опубликовали обход защиты от SSRF в сервисе Gotenberg. Адрес [::] блокировался фильтром, а запись [::%251] проходила и открывала доступ к сервисам на localhost.
По описанию, уязвимость возникает не из-за самого Gotenberg, а из-за того, как функции netip.Prefix.Contains и IsUnspecified в языке Go обрабатывают зону IPv6. Фильтр проверяет адрес через эти функции, и зона в записи адреса позволяет обойти блокировку.
Похожая проверка есть во многих сервисах, которые работают с вебхуками и превью ссылок, поэтому риск касается не только одного продукта.
Воспроизведение и исправление
Автор воспроизводит утечку на небольшом сервисе. Затем он описывает исправление, которое состоит из трёх шагов, и закрепляет его тестом, чтобы проверка не сломалась в будущем.