
헤더 신뢰 인증 우회 패턴(CVE-2025-29927 클래스)을 탐지하는 Semgrep 규칙입니다. bk-security.github.io의 동반 도구입니다.
공격자가 제어하는 HTTP 요청 헤더를 기반으로 인증, 권한 부여 또는 신뢰 결정을 내리는 코드를 플래그하는 작은 Semgrep 규칙 팩입니다.
이 취약점 클래스의 대표적인 예는 CVE-2025-29927입니다. Next.js는 x-middleware-subrequest 헤더를 신뢰하여 미들웨어가 실행되었는지 여부를 결정했으며, 조작된 값을 제공하는 모든 인바운드 요청이 미들웨어를 완전히 건너뛸 수 있었습니다. 동일한 패턴이 여러 프레임워크와 에코시스템에서 반복됩니다.
이 팩은 두 가지 언어 계열과 버그의 세 가지 하위 클래스에 대한 규칙을 제공합니다. 완전히 조정된 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 | 경고 | 일반적으로 사용자 ID를 전달하는 데 사용되는 헤더 읽기 (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
규칙은 신뢰할 때 위험하다고 알려진 헤더 이름의 선별된 목록과 일치합니다. 일반적인 경우는 잡아냅니다. 잡아내지 못하는 경우:
x-some-novel-name을 읽는 getInternalFlag(req)라는 사용자 정의 도우미는 규칙을 통과합니다.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에 있습니다.