
Правила Semgrep для выявления паттернов обхода аутентификации, основанных на доверии к заголовкам (класс CVE-2025-29927). Компаньон к bk-security.github.io.
Небольшой набор правил Semgrep, который помечает код, принимающий решения об аутентификации, авторизации или доверии на основе HTTP-заголовков запроса, контролируемых злоумышленником.
Каноническим примером данного класса уязвимостей является
CVE-2025-29927: Next.js
доверял заголовку x-middleware-subrequest для принятия решения о выполнении middleware, и любой входящий запрос с поддельным значением мог полностью пропустить middleware. Такая же модель повторяется в различных фреймворках и экосистемах.
Этот набор включает правила для двух языковых семей и трех подклассов ошибки. Он предназначен как вспомогательное средство для проверки кода, а не как полностью настроенный шлюз CI. Правила отдают предпочтение полноте обнаружения перед точностью и лучше всего запускаются в интерактивном режиме, когда решение по каждому срабатыванию принимает человек.
Более подробное описание класса уязвимостей и обоснование дизайна этого набора см. на bk-security.github.io.
| Правило | Язык | Серьезность | Что обнаруживает |
|---|---|---|---|
nodejs-header-flag-auth-bypass | JS / TS | Предупреждение | Чтение заголовков, имя которых указывает на использование внутреннего протокола или обхода аутентификации (x-internal, x-bypass-auth, x-middleware-subrequest, x-admin-override, x-impersonate и т.д.) |
nodejs-header-as-identity | JS / TS | Предупреждение | Чтение заголовков, традиционно используемых для передачи идентификатора пользователя (x-forwarded-user, x-authenticated-user, x-remote-user и т.д.) |
nodejs-forwarded-for-trust | JS / TS | Информация | Чтение заголовков x-forwarded-for, x-real-ip и подобных заголовков исходного IP, которым часто доверяют при принятии решений безопасности |
python-header-flag-auth-bypass | Python | Предупреждение | Аналогично варианту для Node.js, включая доступ в стиле Django (request.META["HTTP_X_*"]) |
python-header-as-identity | Python | Предупреждение | Аналогично варианту для Node.js, адаптировано для Python |
python-forwarded-for-trust | Python | Информация | Аналогично варианту для Node.js, адаптировано для Python |
Установите Semgrep:
pip install semgrep
Запустите набор правил для целевой директории:
semgrep --config /path/to/auth-header-trust-rules/rules /path/to/target
Или выполните одно правило:
semgrep --config /path/to/auth-header-trust-rules/rules/nodejs/header-flag-auth-bypass.yaml /path/to/target
Проверьте правила на входящих тестовых данных:
semgrep --test --config rules/ tests/
Ожидаемый вывод:
6/6: ✓ All tests passed
Правила сопоставляются с заданным списком имен заголовков, которые считаются опасными при доверии. Они будут обнаруживать типичные случаи. Они не будут обнаруживать:
getInternalFlag(req), читающая x-some-novel-name, не будет обнаружена правилами.x-internal-*, x-trust-* и x-bypass-*, но новые имена могут остаться незамеченными.При расширении набора для конкретной кодовой базы наиболее ценными дополнениями обычно являются шаблоны вспомогательных функций, специфичных для фреймворка. Если в кодовой базе есть функция isInternalRequest(req), правило, которое её обнаруживает, представляет собой одну строку YAML.
rules/<lang>/<name>.yaml.tests/<lang>/<name>.<ext> с положительными примерами, помеченными # ruleid: <rule-id>, и отрицательными примерами, помеченными # ok: <rule-id>.semgrep --test --config rules/ tests/. Новое правило и фикстура будут подобраны автоматически; тесты должны проходить перед отправкой изменения.MIT.
Bruce Kang. Исходный код для сопутствующей статьи находится на bk-security.github.io.