Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-8452-check — Citrix NetScaler CVE-2026-8452용 동작 기반 패치 상태 탐지기입니다. 메모리를 악용하거나 손상시키지 않고, 제작된 SAML 요청을 전송하여 PrefixList 크기 검사가 존재하는지 확인합니다. | Kitploit
도구/GitHubGitHub/bishopfox/cve-2026-8452-check
Vulnerability ScannersVulnerability AnalysisWeb SecurityNetwork Security
GitHubbishopfox/cve-2026-8452-check

CVE-2026-8452-check

Citrix NetScaler CVE-2026-8452용 동작 기반 패치 상태 탐지기입니다. 메모리를 악용하거나 손상시키지 않고, 제작된 SAML 요청을 전송하여 PrefixList 크기 검사가 존재하는지 확인합니다.

저장소 보기
14일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Citrix NetScaler SAML PrefixList 힙 오버플로 — 패치 상태 탐지 스크립트

안전하고 비파괴적인 패치 상태 검사 도구로, CVE-2026-8452 — 사전 인증 힙 오버플로 는 Citrix NetScaler ADC / NetScaler Gateway SAML 서명 표준화기에서 발생합니다. (CTX696604, CVSS 8.8). 과도하게 큰 exclusive-canonicalization PrefixList는 표준화 과정에서 고정 크기 버퍼를 오버플로시킵니다. NetScaler는 이 값을 담은 서명을 검증하기 전에 표준화를 수행하므로, 자격 증명, 세션, 유효한 서명 없이도 전체 경로에 도달할 수 있습니다. JPMorgan Chase XOR 팀의 Michael Tucker가 보고했으며, 근본 원인 및 악용 분석은 watchTowr Labs의 공로입니다.

이 스크립트는 버그를 악용하지 않으며 메모리를 손상시키지 않습니다. 대상별로 하나의 질문에 답합니다: 이 어플라이언스에 수정 사항이 적용되었는가? — 빌드를 추측하는 대신 패치를 관찰하여 행동적으로 판정합니다.

실행해도 안전한가?

예. 프로덕션 및 평가 용도로 설계되었습니다:

  • 프로브는 손상 임계값 아래에 머뭅니다. 575바이트는 패치된 빌드와 패치되지 않은 빌드가 서로 다르게 응답할 만큼 충분히 길면서도, 패치되지 않은 어플라이언스의 메모리 손상이 시작되는 길이보다 훨씬 아래입니다. 두 지원 브랜치와 두 패치 상태에 걸친 어플라이언스에서 두 수정 빌드를 포함한 측정을 통해 검증되었습니다.

  • 통과하는 임계값은 하나의 배포 속성이 아니라 고정된 코드 상수입니다. 수정된 빌드는 512바이트의 PrefixList를 허용하고 513바이트 이상을 거부합니다. 이 제한은 바이트 단위로 정확히 확인되었으며, 두 지원 브랜치에서 동일하고, 어플라이언스 구성이나 주변 SAML 메시지의 형태에 따라 변하지 않습니다. 두 경로(값을 상당히 다른 양의 XML로 감싸는)를 프로빙하여 동일한 바이트에서 동작이 바뀌는 것을 확인함으로써 확인되었습니다. 575는 제한을 63바이트 초과하므로, 판정은 대상이 어떻게 설정되어 있는지에 의존하지 않습니다.

  • 패치 적용으로 어플라이언스가 일반적으로 긴 SAML 값을 거부하지는 않습니다. 제한은 특히 PrefixList 속성에만 적용됩니다. 다른 필드(assertion consumer service URL, 발급자 이름, 알고리즘 식별자, 다이제스트 및 서명 값)를 그보다 크게 부풀려도 수정된 빌드에서는 아무것도 변하지 않으므로, 수정을 적용해도 정상 작동 중인 SAML 구성이 실패하기 시작하지 않아야 합니다.

도구 다운로드
  • 메모리가 손상되지 않으며 프로세스가 재시작되지 않습니다. 패치된 빌드에서는 크기 검사에서 프로브가 거부되고, 패치되지 않은 빌드에서는 파서 내부에서 무해하게 실패합니다. 어느 쪽도 오버플로에 도달하지 않습니다.

  • 스캔 출력에 민감한 정보는 포함되지 않습니다. 프로브는 합성 네임스페이스 접두사 토큰만 담고 있으며, 도구는 응답 본문이 아닌 판정을 보고합니다.

  • 고정된 두 길이, 스윕 없음. 575바이트 프로브와 응답하는 경로의 35바이트 대조군. 이 도구는 길이 범위를 스윕하지 않으며 다른 길이를 전혀 보내지 않습니다.

  • 프로브를 수정하는 경우 PROBE_PREFIXES를 변경하지 말고 길이를 스윕하지 마십시오. 575바이트는 하중을 견디는 값입니다. 다른 PrefixList 길이는 어플라이언스를 불안정하게 만들 수 있으며, 최소 한 건은 이 수정 사항이 포함된 빌드에서 발생했습니다. 따라서 길이 스윕은 이 버그를 탐구하는 안전한 방법이 아니며, 더 짧다고 더 안전한 것도 아닙니다.

    작동 방식

    패치된 빌드는 과도하게 큰 PrefixList를 특징적인 메시지와 함께 깔끔하게 거부합니다. 패치되지 않은 빌드는 파서를 통과하여 일반 내부 오류를 반환합니다. 동일한 요청 하나에 두 가지 다른 응답:

    575바이트 PrefixList응답
    패치되지 않음500 Internal Server Error 43549
    패치됨200 Malformed Assertion sent to Netscaler

    두 경로가 시도되며, IdP가 먼저 시도되고 하나가 응답을 주는 즉시 중단됩니다. 각각 단독으로도 충분하며, 함께 사용하면 두 SAML 역할을 모두 다룹니다:

    경로요청필요 사항
    1 (첫 번째)POST /saml/login — 서명된 AuthnRequest, ds:SignedInfo의 PrefixList대상 vserver에 바인딩된 SAML IdP 정책
    2 (대체)POST /cgi/samlauth — SAMLResponse, assertion 서명의 PrefixList대상 vserver의 SAML SP assertion consumer service

    IdP 경로가 먼저 시도되는 이유는 둘 중 더 견고하기 때문입니다. 이 경로는 Issuer 값, AssertionConsumerServiceURL, 시계 오차(clock skew)에 영향을 받지 않습니다. 어플라이언스의 오차 허용 범위를 크게 벗어난 IssueInstant도 여전히 정확히 판별하는데, 이는 표준화가 시간 검사와 서명 검사보다 먼저 수행되기 때문입니다.

    경로 1의 AuthnRequest는 반드시 서명되어야 합니다. 서명되지 않은 요청은 패치된 빌드와 패치되지 않은 빌드 모두에서 200 Malformed Assertion sent to Netscaler를 반환하며, 이는 패치된 신호와 바이트 단위로 동일합니다. 따라서 서명 블록을 생략한 프로브는 모든 어플라이언스를 패치된 것으로 보고합니다. 서명은 유효할 필요가 없으며, 이 도구의 서명도 유효하지 않습니다. 단지 존재하기만 하면 됩니다. 그 SignedInfo가 PrefixList를 표준화기로 전달하는 수단이기 때문입니다.

    수정 경계에서의 동작

    두 지원 브랜치 모두 수정 빌드에서 정확히 동작이 바뀌며, 두 경로 모두 동일합니다:

    빌드판정
    13.1-63.16마지막 취약한 13.1VULNERABLE
    13.1-63.18최초 수정된 13.1PATCHED
    14.1-66.59취약한 14.1VULNERABLE
    14.1-72.61최초 수정된 14.1PATCHED

    13.1-63.16과 63.18은 연속된 릴리스이므로, 이 변경은 중간 빌드에 걸친 변동이 아니라 패치 자체에 기인합니다.

    이것들은 이 수정 사항이 처음 등장한 빌드이며, 프로브는 정확히 그 전환을 감지합니다. 이제 그것들은 업그레이드 대상 빌드가 아닙니다. 이후 보안 권고가 이를 대체했으므로, 13.1-63.18과 14.1-72.61은 여기서 PATCHED로 응답하지만 최신 문제에는 여전히 노출되어 있습니다. 현재 수정 빌드는 Remediation을 참조하십시오.

    빌드 지문을 사용하지 않는 이유는?

    이 버그에는 원리적으로도 동작할 수 없기 때문입니다. 13.1-63.16과 13.1-63.18은 수정 바로 양쪽 빌드로, 바이트 단위로 동일한 tmindex.html, base.css 및 resources.js를 제공합니다. 수정 사항은 어떤 웹 자산도 건드리지 않습니다. 정적 자산 해시도 브랜치 간에 충돌하므로, 해시 기반 접근법은 취약한 어플라이언스를 패치된 빌드로 판정하여 정상으로 보고할 수 있으며, 이는 탐지 도구가 가질 수 있는 최악의 실패 모드입니다. 따라서 빌드 지문 방식은 의도적으로 구현되지 않았습니다. 패치 상태는 프로브 또는 자격 증명이 있는 경우 show ns version을 통해 얻습니다.

    요구 사항

    • Python 3.8+, 표준 라이브러리만 사용 — 타사 패키지 없음.

    사용법```bash

    single target

    ./cve_2026_8452_check.py https://gateway.example.com

    a specific AAA / Gateway virtual server

    ./cve_2026_8452_check.py https://gateway.example.com:9443

    scan a list, one target per line ('#' comments allowed), compact output

    ./cve_2026_8452_check.py -f targets.txt --brief

    machine-readable output for pipelines

    ./cve_2026_8452_check.py -f targets.txt --json > results.json

    root@kitploit:~
    도구를 **Gateway 또는 AAA 가상 서버**에 지정하세요(관리 인터페이스가 아님).
    전제 조건은 가상 서버마다 적용되므로, VIP가 여러 개인 어플라이언스는 각각 테스트해야 합니다.
    
    ### 옵션
    
    | 플래그 | 설명 |
    | --- | --- |
    | `URL` | 하나 이상의 `https://HOST[:PORT]` 대상 |
    | `-f, --targets-file FILE` | 파일에서 대상 읽기(한 줄에 하나씩; `#` 주석) |
    | `-b, --brief` | 대상마다 정렬된 한 줄 — 판정, 대상, 이유 태그 — 많은 호스트를 스캔할 때 |
    | `--json` | 구조화된 JSON 결과 출력 |
    | `--no-color` | 컬러 출력 비활성화 (`NO_COLOR` 및 non-TTY도 인식) |
    | `--timeout SECS` | 요청당 타임아웃(기본값: 15) |
    
    ### 예제
    
    **패치되지 않은 어플라이언스,** IdP 경로에서 응답하고 대조군과 대조하여 확인됨:```console
    $ ./cve_2026_8452_check.py https://gateway.example.com:9443
    ====================================================================
      CVE-2026-8452 - NetScaler SAML PrefixList patch-state check
      https://gateway.example.com:9443
    ====================================================================
    
    >> Identifying the appliance
         [ OK ]  NetScaler indicators: 5 (CSP contains citrixng://)
    >> Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control)
         idp /saml/login      HTTP 500 / 43549: no size check present
         idp /saml/login      35-byte control: HTTP 200 "message timestamp outside the appliance's skew tolerance": a different SAML condition, not the size check
         [FAIL]  Size check absent (via the IDP route)
    
    ====================================================================
                             RESULT: VULNERABLE
    ====================================================================
    
      https://gateway.example.com:9443 via IDP  [size-check-absent]
    
      The size check is absent. This appliance is unpatched for
      CVE-2026-8452. Upgrade to 13.1-63.21+ / 14.1-73.32+ (12.1 and
      13.0 are EOL and never fixed).
    
    ====================================================================
    

    The control line is worth reading closely: the 35-byte request clears the size check and is then rejected for its stale IssueInstant, while the 575-byte probe never got that far. That is the ordering the whole method rests on — canonicalization runs before the time check, just as it runs before the signature check.

    A patched appliance, the same request against the fix build. Only the probe line differs — the oversized PrefixList is rejected by name instead of falling through to the internal error:```console

    Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control) idp /saml/login HTTP 200 "Malformed Assertion": size check rejected the probe idp /saml/login 35-byte control: HTTP 200 "message timestamp outside the appliance's skew tolerance": a different SAML condition, not the size check [ OK ] Size check present (via the IDP route)

    root@kitploit:~
                          RESULT: PATCHED
    

    https://vpn.example.com via IDP [size-check-present]

    root@kitploit:~
    **SP 경로로 폴백.** 여기서 IdP 엔드포인트는 연결 가능하지만 이 가상 서버에 바인딩된 IdP 정책이
    없으므로 경로 1은 기권하고 경로 2가 응답합니다. *어느 쪽도* 정책과 일치하지 않으면
    verdict는 `INCONCLUSIVE`이고 `no-policy-match` 태그가 붙습니다. 절대 `PATCHED`가 아닙니다. 이것이 바로 그 verdict가 존재하는 이유
    입니다:```console
    >> Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control)
         idp /saml/login      HTTP 200 "Matching policy not found": parser not reached
         sp  /cgi/samlauth    HTTP 500 / 43549: no size check present
         sp  /cgi/samlauth    35-byte control: HTTP 200 "assertion rejected before the size check": a different SAML condition, not the size check
         [FAIL]  Size check absent (via the SP route)
    
                             RESULT: VULNERABLE
    

    제어 검사가 이를 포착했습니다. 여기서 엔드포인트는 두 길이 모두에서 패치된 메시지로 응답했으므로 크기 검사는 실행되지 않았고, 결정적으로 보였던 답변은 철회되었습니다. 이는 오탐 방지 가드가 발동한 것이며, 발동한 이유는 추측에 맡겨지지 않고 명시적으로 서술됩니다:```console

    Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control) idp /saml/login HTTP 200 "Malformed Assertion": size check rejected the probe idp /saml/login 35-byte control: HTTP 200 "Malformed Assertion": size check rejected the probe [WARN] Probe and control answered alike, so the size check was never exercised

    root@kitploit:~
                        RESULT: INCONCLUSIVE
    

    https://sp-strict.example.com via IDP [flat-response]

    The 575-byte probe and the 35-byte control got the same answer, so this endpoint replies the same way whatever it is sent and the size check was never exercised. Unknown, not patched.

    root@kitploit:~
    **플릿 스캔** (`--brief`), 대상마다 정렬된 한 줄씩, 끝에 이유 태그가 붙습니다. 종료 상태는
    `1` 대상 중 하나라도 `VULNERABLE`이면:```console
    $ ./cve_2026_8452_check.py -f targets.txt --brief; echo "exit: $?"
    VULNERABLE       https://gateway.example.com:9443   size-check-absent
    VULNERABLE       https://gateway.example.com:9444   size-check-absent
    PATCHED          https://vpn.example.com            size-check-present
    INCONCLUSIVE     https://sp-strict.example.com      flat-response
    INCONCLUSIVE     https://gw-nopolicy.example.com    no-policy-match
    UNAFFECTED       https://mgmt.example.com           no-saml-endpoint
    ERROR            https://offline.example.com        not-identified
    exit: 1
    

    기계 판독 가능한 출력 (--json)은 시도된 모든 경로를 기록합니다. verdict, reason 및 detail은 공식 필드이며, attempts는 원시 증거이므로 개별 시도는 verdict가 INCONCLUSIVE인 대상에서 patched로 읽힐 수 있습니다:```console $ ./cve_2026_8452_check.py https://vpn.example.com --json [ { "target": "https://vpn.example.com", "verdict": "PATCHED", "reason": "size-check-present", "route": "idp", "detail": "HTTP 200 "Malformed Assertion": size check rejected the probe", "attempts": [ { "route": "idp", "path": "/saml/login", "state": "patched", "detail": "HTTP 200 "Malformed Assertion": size check rejected the probe" }, { "route": "idp", "path": "/saml/login", "state": "control:known-error", "detail": "35-byte control: HTTP 200 "message timestamp outside the appliance's skew tolerance": a different SAML condition, not the size check" } ], "netscaler_indicators": [ "CSP contains citrixng://", "CSP contains com.citrix.nsgclient://", "CSP contains nsgcepa://", "CSP report-uri /nscsp_violation/report_uri", "/vpn/js/rdx/ present (HTTP 404)" ] } ]

    root@kitploit:~
    ## 판정
    
    모든 판정에는 그 배경이 되는 조건을 명명하는 짧은 `reason` 태그가 있습니다. `--brief`는 태그를 세 번째 열로 출력하고, `--json`은 이를 `reason`으로 전달합니다.
    
    | 판정 | 사유 태그 | 의미 |
    | --- | --- | --- |
    | `VULNERABLE` | `size-check-absent` | 크기 검사가 없습니다. 이 어플라이언스는 패치되지 않았습니다 — 패치하십시오. |
    | `PATCHED` | `size-check-present` | 크기 검사가 프로브가 도달한 코드 경로에서 트리거되었습니다. **이 CVE에 한정됨:** 어플라이언스가 최신 빌드라는 의미는 아닙니다. |
    | `UNAFFECTED` | `no-saml-endpoint` | 이 가상 서버에서 SAML 엔드포인트가 응답하지 않았으므로 취약한 경로에 도달할 수 없습니다. **vserver별, 어플라이언스별 아님:** SAML은 동일한 상자의 다른 vserver 또는 VIP에 구성되어 있을 수 있습니다. |
    | `INCONCLUSIVE` | `flat-response` | 엔드포인트가 575바이트 프로브와 35바이트 대조 요청에 동일하게 응답했으므로 크기 검사가 실행되지 않았습니다. 결정적으로 보이는 답변은 철회됩니다 — 오탐지 방지 가드가 작동한 것입니다. |
    | `INCONCLUSIVE` | `no-policy-match` | SAML 엔드포인트가 응답했지만 바인딩된 정책이 프로브와 일치하지 않아 어떤 경로도 canonicalizer에 도달하지 못했습니다. |
    | `INCONCLUSIVE` | `other-saml-error` | 인식 가능하지만 진단적이지 않은 SAML 조건이 크기 검사 전에 프로브를 거부했습니다 — 다른 길이 제한, 서명 정책, 타임스탬프. |
    | `INCONCLUSIVE` | `unrecognized-reply` | SAML 표면이 인식된 집합에 속하지 않는 응답으로 답변했습니다. |
    | `ERROR` | `not-identified` | NetScaler로 식별되지 않았거나 연결할 수 없습니다. |
    
    네 가지 `INCONCLUSIVE` 사유는 모두 의사 결정 측면에서 같은 의미입니다 — **알 수 없음, 패치되지 않음.** `show ns version`으로 확인하십시오. 태그는 운영자에게 재실행 전에 *어떤* 조건을 고쳐야 하는지 알려주기 위해 존재합니다: 프로브를 다른 가상 서버에 지정하거나 일치하는 정책을 바인딩하십시오.
    
    `INCONCLUSIVE`는 취약한 어플라이언스가 프로브에 응답하지 않을 수 있기 때문에 자체 종료 코드를 가진 별개의 판정으로 존재합니다. 가상 서버에 바인딩된 SAML 정책이 프로브의 요청과 일치하지 않으면 어플라이언스는 canonicalizer 앞에서 short-circuit되며 진단 정보를 반환하지 않습니다. 단순히 일치하지 못하는 스캐너는 그러한 호스트에서 침묵하며, 침묵은 "패치됨"으로 읽힙니다. 이 도구는 대신 이를 알 수 없음으로 보고합니다.
    
    ### 모든 판정은 대조 요청으로 확인됩니다
    
    `PATCHED`와 `VULNERABLE`는 둘 다 *단일한* 식별 응답에 의존하므로, 도구는 응답이 실제로 전송된 내용에 의존하는지 확인합니다. 결정적인 답변 후에는 어떤 크기 검사보다도 낮은 35바이트의 짧은 `PrefixList`로 요청을 반복하며, 두 답변이 다를 때만 판정이 유지됩니다. 둘이 일치하면 엔드포인트는 무엇을 받든 동일한 방식으로 응답하며, 크기 검사는 실행되지 않았고 결과는 `INCONCLUSIVE`입니다.
    
    이것은 가상의 이야기가 아닙니다. `samlRejectUnsignedAssertion STRICT`로 구성된 서비스 제공자는 canonicalization *전에* 서명 누락으로 프로브를 거부하고 모든 길이에서 패치된 메시지로 응답합니다. 대조 요청이 없으면 그러한 어플라이언스는 종료 코드 0으로 `PATCHED`를 보고합니다 — 실제 취약한 빌드에서 관찰된 사례입니다. 이제는 `flat-response`라는 사유 태그와 함께 `INCONCLUSIVE`를 보고하며, 실행 결과는 크기 검사가 실행되지 않았다는 점을 명시합니다. 동일한 대조 요청은 그 반대 경우도 포착합니다. 즉, 엔드포인트가 구문 분석하지 않은 요청에 일반 내부 오류를 반환하는 경우입니다.
    
    ### 인식되는 비진단 응답
    
    NetScaler SAML 엔드포인트는 많은 가능한 응답 집합을 가지며, 그중 두 가지만이 패치 상태를 확립합니다. 도구는 나머지 중 20가지를 인식하고 응답 본문을 그대로 출력하는 대신 경로별 라인에 해당 조건을 명명합니다. 예를 들어:```text
         idp /saml/login      HTTP 200 "post body over the appliance's maximum": a different length limit rejected the probe first
         sp  /cgi/samlauth    HTTP 200 "assertion rejected before the size check": a different SAML condition, not the size check
    

    그중 세 가지는 길이 제한입니다 — 지나치게 큰 본문, 지나치게 큰 RelayState, 지나치게 긴 추출된 사용자 이름. 이 세 가지가 가장 중요합니다. 요청이 패치 상태를 구분하는 길이 검사에 도달하기 전에 다른 길이 검사에서 거부되었음을 의미하기 때문입니다. 이는 일반적으로 어플라이언스가 괜찮다는 뜻이 아니라 프로브가 다른 가상 서버를 대상으로 해야 한다는 뜻입니다.

    20가지 중 하나는 모든 IdP 경로 실행에서 나타납니다: 바로 message timestamp outside the appliance's skew tolerance 제어 항목입니다. 프로브는 고정된 IssueInstant를 전달하므로 크기 검사를 통과한 제어 항목은 이후 연식 때문에 거부됩니다 — 이는 어플라이언스의 속성이 아니라 프로브의 속성입니다. 20가지 집합에 속하지 않는 응답은 명명된 조건 대신 자체 첫 줄로 출력됩니다.

    이 모든 것은 여전히 INCONCLUSIVE를 생성하며 other-saml-error로 태그됩니다. 응답을 인식한다고 해서 PATCHED로 승격되지는 않습니다. 오직 명시적인 패치 빌드 응답만 그렇게 하며, 인식되지 않은 모든 응답도 unrecognized-reply로 INCONCLUSIVE로 귀결됩니다. 이 인식 기능은 대상이 분류되지 못한 이유를 운영자에게 알려주기 위한 것이지, 분류하기 위한 것이 아닙니다.

    Exit codes

    CodeMeaning
    0패치됨, 또는 대상 가상 서버에서 영향 없음
    1하나 이상의 대상이 VULNERABLE임
    2사용법 오류 (잘못된 인자 / 읽을 수 없는 대상 파일)
    3하나 이상의 대상이 INCONCLUSIVE이고 취약한 대상은 없음
    4하나 이상의 대상에서 오류 발생, 취약하거나 불확정인 대상 없음

    2는 잘못된 호출에 대한 argparse 자체의 종료 코드이므로 verdict 코드는 이를 건너뜁니다. 따라서 래퍼 스크립트는 "이 어플라이언스를 분류할 수 없음"(3)과 "도구를 잘못 호출함"(2)을 구분할 수 있으며, 2를 중복 사용하는 방식으로는 불가능합니다.

    다중 대상 스캔에서 코드는 최악의 상태가 아닌 우선순위로 선택됩니다: VULNERABLE > INCONCLUSIVE > ERROR > 정상. 따라서 도달 불가능한 호스트는 종료 코드에서 취약한 발견을 결코 가리지 않습니다.

    Limitations

    • 이 도구는 하나의 CVE만 확인하며 어플라이언스의 패치 수준을 확인하지 않습니다. PATCHED 및 종료 코드 0은 프로브가 도달한 경로에 CVE-2026-8452 크기 검사가 존재함을 의미합니다. 이는 이 버그 이후에 공개되고 이후 빌드에서 수정된 다른 NetScaler 취약점에 대해서는 아무것도 말해주지 않습니다. 이 도구의 종료 코드 0을 어플라이언스에 대한 완전한 건강 상태로 해석하지 마십시오.
    • 취약하지 않다는 판정은 프로브한 엔드포인트에 한정됩니다. 선행 조건은 가상 서버별입니다. UNAFFECTED는 "여기서 도달 불가능"을 의미하지 "이 어플라이언스는 안전함"을 의미하지 않습니다.
    • 정책 매칭이 파서의 관문 역할을 합니다. /saml/login은 어플라이언스 전체에 적용되지만 바인딩된 IdP 정책이 없는 가상 서버에서는 Matching policy not found로 응답하고 canonicalizer 앞에서 단락됩니다. 프로브의 요청을 충족하지 않는 표현식 규칙을 사용하는 정책을 가진 IdP는 응답 대신 INCONCLUSIVE로 귀결됩니다.
    • INCONCLUSIVE는 완전한 건강 상태가 아닙니다. 침묵이 통과 결과로 오인되지 않도록 별도의 종료 코드로 의도적으로 PATCHED와 구분됩니다.
    • 첫 번째 요소 뒤에 SAML이 있는 nFactor 배포는 INCONCLUSIVE를 보고합니다. SAML 정책이 가상 서버에 직접 바인딩되는 대신 nextFactor로 도달하는 정책 라벨에 있는 경우, 요청되지 않은 assertion은 일치하는 정책을 찾지 못하고 canonicalizer 앞에서 단락됩니다. 취약한 빌드에서 검증했으며 INCONCLUSIVE를 보고했습니다. 디바이스 자세 또는 로그인 스키마 첫 번째 요소 뒤의 SAML은 일반적인 패턴이므로 nFactor 게이트웨이에서의 INCONCLUSIVE는 호기심이 아니라 "아마도 도달 가능, show ns version으로 확인"으로 취급하십시오.
    • 악용 확인이 아닙니다. VULNERABLE 판정은 패치 상태인 누락된 크기 검사를 확인합니다. 공격자가 빌드에서 얼마나 멀리 손상을 진행할 수 있는지는 측정하지 않습니다.
    • 단지 도달 가능성만을 나타냅니다. 결과는 어플라이언스가 도구를 실행하는 네트워크 위치에 노출하는 것을 반영합니다. 어플라이언스 앞의 WAF는 응답을 가릴 수 있습니다.

    Remediation

    13.1-63.21 이상 또는 14.1-73.32 이상으로 업그레이드하십시오 (FIPS 및 NDcPP: 14.1-73.32 FIPS, 또는 13.1-FIPS 및 13.1-NDcPP의 경우 13.1-37.277).

    CVE-2026-8452 자체에 대한 수정은 CTX696604에 따라 13.1-63.18 / 14.1-72.61에서 처음 제공되었으며, 이 도구가 감지하는 전환이 바로 그것입니다. 이후 해당 빌드는 CTX696939 (2026-08-19)로 대체되었으며, 이 게시판은 CVE-2026-19489 및 CVE-2026-19490을 추가합니다. 후자는 CVSS 9.3의 사전 인증 인증 우회입니다. 14.1-43.56 / 13.1-61.28 이후 빌드에서의 선행 조건은 구성된 SAML 액션입니다 — 따라서 이 도구가 확인하는 버그의 범위에 해당하는 어플라이언스는 해당 버그의 범위에도 해당할 가능성이 높으며, 여기서 PATCHED 판정이 나왔다고 업그레이드를 미룰 이유가 되지는 않습니다. 두 게시판 모두 위 빌드로 해결됩니다.

    12.1 또는 13.0을 사용하는 어플라이언스는 수정이 없으며 앞으로도 제공되지 않습니다 — 해당 브랜치는 수명 종료 상태이므로 영구적으로 취약한 것으로 간주하고 지원되는 브랜치로 마이그레이션해야 합니다.

    두 가지 추가 참고 사항:

    • HA 쌍의 두 노드를 모두 패치하십시오. 패치되지 않은 보조 노드는 인계받는 순간 완전히 노출된 어플라이언스입니다.

    • 가상 서버 유형이 아닌 SAML 구성으로 인벤토리 범위를 정하십시오. 공급업체 권고의 표현(Gateway 또는 AAA 가상 서버)은 트리거 조건보다 더 넓습니다. 실행 중인 구성에서 add authentication samlAction 및 add authentication samlIdPProfile을 add authentication vserver 및 add vpn vserver와 함께 확인하십시오.

      이는 추론이 아니라 테스트된 내용입니다. 취약함이 확인된 어플라이언스에서 모든 SAML 개체를 제거하고 그 자리에 SAML이 아닌 인증 요소를 바인딩한 후 AAA 가상 서버를 계속 실행 상태로 두었습니다. 그러자 SAML 엔드포인트는 모든 요청에 404를 반환했습니다. SAML 구성 없이 단순히 정책으로 차단된 것이 아니라 아예 존재하지 않게 된 것입니다. 따라서 SAML이 없는 가상 서버는 이 버그의 범위에서 진정으로 제외되며, 그러한 대상에서의 UNAFFECTED는 맹점이 아니라 실제 답변입니다. 여전히 적용되는 주의 사항은 위의 범위 지정에 관한 것입니다: 가상 서버별이므로 어플라이언스에 대해 결론 내리지 말고 각 VIP를 확인하십시오.

    CVE-2026-8452는 동일한 게시판에서 5개의 형제 취약점과 함께 공개되었습니다. 그중 주목할 만한 것은 CVE-2026-8451로, SAML IdP 경로의 사전 인증 메모리 초과 읽기이며 실제 환경에서 활발히 악용되었습니다. 두 취약점은 공격 표면을 공유하므로 동일한 구성 감사로 둘 다를 다룰 수 있습니다.

    License

    이 코드는 MIT 라이선스 하에 배포됩니다.

    Legal Disclaimer

    사전 상호 동의 없이 대상을 공격하는 데 이 도구를 사용하는 것은 불법입니다. 모든 해당 지역, 주, 연방 법률을 준수할 책임은 최종 사용자에게 있습니다. 개발자는 어떠한 책임도 지지 않으며 이 프로그램으로 인한 오용이나 손해에 대해 책임지지 않습니다.

    See Also

    • Citrix CTX696604 — NetScaler 보안 게시판
    • Citrix CTX696939 — 해당 수정 빌드를 대체하는 이후 NetScaler 게시판
    • watchTowr Labs — CVE-2026-8452 기술 분석
    • NVD — CVE-2026-8452