Хук network решает, защищен ли адрес серверной загрузки от SSRF (запроса, который можно направить на внутренние сервисы, облачные метаданные или приватные хосты). Это детерминированный движок, стоящий за специализацией network, и вы можете запускать его сами.
Запуск
Передайте каждый адрес через --url. Хук выводит по одному слову на адрес, значения которых описаны в таблице ниже.
- Один адрес
- Несколько адресов
npx lagune read network --url 'http://example.com/'
# => safe
npx lagune read network --url 'http://0x7f000001/'
# => private-target
Повторите --url, чтобы оценить весь список разрешенных или запрещенных адресов за один вызов, по одному вердикту на строку, по порядку.
npx lagune read network \
--url 'http://example.com/' \
--url 'http://[::1]/' \
--url 'http://allowed.com@evil.example/'
# => safe
# => private-target
# => parser-divergent
Хук разрешает хост так же, как это делает сеть, поэтому закодированные формы внутреннего адреса не проскальзывают: шестнадцатеричная, восьмеричная, десятичная без точек, сокращенная запись, IPv6 и IPv4-mapped получают вердикт private-target. А там, где небрежная проверка и настоящий загрузчик прочитали бы разные хосты, вердикт будет parser-divergent.
Как читать вердикт
| Вердикт | Значение |
|---|---|
safe | Адрес ведет к публичному хосту, и небрежная проверка прочитала бы тот же хост. |
private-target | Хост разрешается в приватный, loopback, link-local, неуказанный адрес или адрес облачных метаданных. |
parser-divergent | Небрежная текстовая проверка прочитала бы другой настоящий хост, чем тот, к которому подключается загрузчик. |
invalid url | Строка не разбирается как URL, поэтому загружать нечего. |
Разрешением считается только safe. Считайте private-target, parser-divergent и invalid url блокировкой.
Параметры CLI
| Параметр | Значение | Описание |
|---|---|---|
--url | URL или хост | Проверяет один адрес. Повторите, чтобы проверить несколько, по одному вердикту на строку. |
Нужен хотя бы один --url. Адрес никогда не передается как голый позиционный аргумент, поэтому его нельзя принять за флаг.
Каждый адрес передается как значение флага и никогда не подставляется в команду. Значение с кавычками или обратными кавычками остается инертным и не может внедриться в оболочку. Всегда заключайте его в одинарные кавычки, чтобы оболочка не раскрыла его раньше.
Хук чистый и никогда не разрешает DNS, поэтому два пробела времени выполнения находятся вне его охвата: DNS rebinding (имя, которое при проверке разрешается в публичный адрес, а при загрузке во внутренний) и цепочки перенаправлений (первый шаг проходит проверку, а затем перенаправляет внутрь). Закрывайте их, разрешая имя один раз и подключаясь к проверенному адресу, а также отказываясь следовать перенаправлениям. Зарезервированные loopback-имена (localhost и семейство .localhost) хук без поиска считает внутренними, но любое другое DNS-имя получает safe, потому что утверждать, что оно разрешается внутрь, можно было бы только после разрешения: такие имена охраняет список разрешенных адресов, и именно его проверяет этот инструмент.
Это та же проверка, которую запускает специализация network, чтобы доказать, что фильтр адресов действует.
Частые вопросы
Запустите хук network. Он оценивает адрес загрузки и возвращает safe, private-target, parser-divergent или invalid url. Разрешением считается только safe.
URL, который разные парсеры читают по-разному, классический способ обойти защиту от SSRF. Хук network помечает его, а не пропускает.
