Хуки

Хук cors: аудит источников CORS

Просканируйте исходный код на обходимый список разрешенных источников CORS или оцените отдельное значение источника на избыточно широкий доступ из командной строки.

Хук cors представляет собой детерминированный движок, стоящий за специализацией http-request, и вы можете запускать его сами. Он работает в двух режимах одной командой: сканирование проверяет исходный код на обходимый список разрешенных источников (регулярное выражение для проверки хоста, мимо которого проскальзывает хост злоумышленника), а оценка присваивает отдельному значению источника CORS вердикт wildcard, null или safe.

Сканирование кодовой базы​

Без флага хук сканирует весь проект.

npx lagune read cors

Хук перечисляет каждый обходимый список разрешенных источников под одним заголовком, сгруппировав по файлам. Проверка хоста, у которой .+/.* стоит в части authority перед суффиксом доверенного хоста (^https?://.+\.trusted\.com), пропускает хост злоумышленника вроде your-site.com.attacker.com.

Origin-allowlist patterns with a greedy wildcard (bypassable, review):

internal/auth/origin.go
^https?://.+\.trusted\.com

Это повод для проверки, а не закрытая находка: по одному тексту нельзя определить, охраняет ли регулярное выражение настоящее решение о доверии, поэтому сканирование никогда не меняет код выхода. Прочитайте каждое и убедитесь, что список разрешенных источников сравнивает значения на полное равенство. Если ничего не найдено, выводится одна строка.

npx lagune read cors --dir src/clean
# => no bypassable origin allowlist found

Оценка источника​

Передайте каждый источник через --origin. Хук выводит по одному слову на источник и завершается с ненулевым кодом при любом wildcard или null.

npx lagune read cors --origin '*' # => wildcard
npx lagune read cors --origin 'null' # => null
npx lagune read cors --origin 'https://app.example.com' # => safe
ВердиктЗначение
safeНе *, не null и не шаблон с *. Корректность формы источника не гарантируется.
wildcard* или шаблон поддомена, хоста или порта: ответ может прочитать любой сайт (или широкий круг сайтов).
nullИсточник null, который могут подделать изолированные iframe и перенаправления.

Разрешением считается только safe, а --origin служит оракулом значений: он оценивает значение, а не обработчик, поэтому обработчик подтвердите с помощью специализации http-request.

Параметры CLI​

ПараметрЗначениеОписание
--originисточникОценивает одно значение источника. Повторите, чтобы оценить несколько, по одному на строку.
--dirдиректорияОграничивает сканирование директорией. Можно повторять и сочетать с --file.
--fileфайлОграничивает сканирование одним файлом. Можно повторять и сочетать с --dir.

Без параметров хук сканирует весь проект. --origin включает режим оценки и не сочетается с --dir или --file.

Чего он не охватывает

Сканирование распознает форму обходимого регулярного выражения, а --origin оценивает значения источников. Два шаблона на уровне исходного кода остаются вне досягаемости: отражение заголовка Origin из запроса (сервер возвращает входящий Origin обратно или сочетает его с учетными данными) и слишком мягкий список разрешенных источников на основе endsWith или поиска подстроки. Распознавайте их в коде и обрабатывайте так, как описывает специализация http-request.

Частые вопросы

Изолированные iframe и некоторые перенаправления отправляют Origin: null, поэтому список разрешенных источников, доверяющий null, дает этим контекстам доступ на чтение. Хук cors помечает его наравне с wildcard.

Запустите npx lagune read cors по кодовой базе. Хук помечает регулярное выражение для проверки хоста, у которого жадный шаблон стоит перед доверенным суффиксом, из-за чего хост злоумышленника вроде your-site.com.attacker.com проскальзывает мимо.