NOW Briefing
Citrix NetScaler SAML 인증 우회 취약점 (CVE-2026-19490)
■ 개요
NetScaler ADC는 기업 네트워크 경계에서 애플리케이션 트래픽을 분산·가속하는 장비이고, NetScaler Gateway는 같은 장비로 원격 근무자에게 SSL VPN·ICA Proxy·CVPN·RDP Proxy 접속을 제공하는 구성입니다. 두 구성 모두 사내 시스템으로 들어가는 정문 역할을 하기 때문에, 인증 단계가 뚫리면 그 뒤의 내부 서비스가 노출될 수 있습니다.
CVE-2026-19490은 SAML(서로 다른 시스템 사이에서 로그인 결과를 주고받는 인증 표준) 처리 경로에서 서명 검증을 건너뛰는 취약점입니다. 정상 흐름에서는 신원 공급자(IdP)가 서명한 인증 결과 증명서를 NetScaler가 검증한 뒤 세션을 만듭니다. 그러나 특정 전달 방식으로 들어온 증명서는 서명이 없어도 통과해, 미인증 공격자가 원하는 사용자 이름으로 세션을 만들 수 있습니다. 영향 조건은 펌웨어 빌드에 따라 갈리는데, Citrix 공지 기준으로 14.1-43.56 이상·13.1-61.28 이상 빌드에서는 SAML 인증 액션이 설정돼 있어야 하고, 그보다 오래된 빌드에서는 게이트웨이나 AAA 가상 서버로 동작하는 것만으로 전제조건이 충족됩니다.
Citrix는 2026년 8월 19일 보안 공지와 픽스 빌드를 배포했고, 지원되는 임시 대응책은 없다고 밝혔습니다. 9월 2일에는 근본 원인 분석과 PoC 코드를 담은 공개 저장소가 등록됐습니다. 다음 날인 9월 3일에는 취약점 인텔리전스 업체 Previdian이 자사 NetScaler 센서에서 공개 PoC와 일치하는 요청을 호주·미국·독일 IP 세 곳으로부터 관측했다고 밝혔습니다(9월 4일 보도). Previdian이 확인한 것은 공개 PoC와 일치하는 요청이며, 실제 시스템 침해 여부는 확인되지 않았습니다. Shadowserver 기준 인터넷에 노출된 NetScaler ADC는 2만 2천 대 이상, Gateway는 1,700대에 가까운 수준으로 집계되지만, 이 중 취약한 구성이거나 미패치 상태인 비율은 공개돼 있지 않습니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-19490 (SAML 리다이렉트 바인딩 인증 우회) |
| CVSS 점수 | CVSS v4.0 9.3 |
| 취약점 유형 | CWE-288, 대체 경로를 이용한 인증 우회 |
| 영향/위험 |
• 미인증 원격 공격자가 인증을 우회해 보호 대상 서비스 접근 가능 • 연구자 분석 기준, 서명 없는 인증 응답으로 임의 사용자 명의 세션 발급 가능 • IdP·다중 인증 기록 없이 세션이 생성돼 접속 흔적 추적이 어려움 • 공개 PoC와 일치하는 요청이 실제 관측됨(침해 성공 여부는 미확인) |
| 취약 버전 |
• 14.1 계열: 14.1-73.32 이전 빌드 • 13.1 계열: 13.1-63.21 이전 빌드 • NetScaler ADC FIPS: 14.1-73.32 FIPS 이전 • NetScaler ADC FIPS·NDcPP(13.1 계열): 13.1-37.277 이전 |
| 패치 버전 |
• 14.1-73.32 이상 • 13.1-63.21 이상 • 14.1-73.32 FIPS 이상 • 13.1-37.277 이상(FIPS·NDcPP) |
■ 기술 분석
NetScaler는 SAML 인증 응답을 두 가지 방식으로 받습니다. 브라우저가 표준적으로 사용하는 POST 바인딩과, 메시지를 주소의 질의 문자열에 압축·인코딩해 넣는 HTTP-Redirect 바인딩입니다. 연구자 공개 분석에 따르면 두 경로가 같은 파서를 호출하면서 엄격 검증 플래그를 다르게 넘깁니다. 아래는 해당 저장소의 근본 원인 분석 문서에 실린 바이너리 역어셈블 출력(objdump)으로, 리다이렉트 경로가 파서를 호출하기 직전의 코드입니다. 패킷 처리 엔진 바이너리 nsppe는 플래그 인자를 0으로 설정합니다.
$ objdump -d -M intel --start-address=0xb7f532 --stop-address=0xb7f558 nsppe-14.1-73.30
b7f532: 41 b8 00 00 00 00 mov r8d,0x0 <-- strict OFF
b7f538: 48 8d 8d d8 fe ff ff lea rcx,[rbp-0x128]
b7f53f: 48 8b 95 b8 fe ff ff mov rdx,[rbp-0x148]
b7f546: 8b b5 cc fe ff ff mov esi,[rbp-0x134]
b7f54c: 48 8b 3d f5 9f 6f 02 mov rdi,[rip+0x26f9ff5]
b7f553: e8 f8 14 fc ff call b40a50 <-- the parser
두 번째 결함은 서명 없는 증명서를 거부할지 결정하는 설정 판정에 있습니다. NetScaler에는 SAML 인증 액션의 서명 없는 증명서 거부 옵션(samlRejectUnsignedAssertion)이 있고, ON/OFF/STRICT 중 기본값이 ON입니다. 그런데 같은 분석 문서의 다음 objdump 출력에서는 설정값이 기본값에 해당하는 2일 때 거부가 아니라 수락 분기로 점프하며, 실제로 거부 로직에 도달하는 값은 STRICT에 해당하는 3뿐입니다. 기본값 ON을 그대로 쓰는 환경에서는 서명 없는 증명서가 수락됩니다.
$ objdump -d -M intel --start-address=0xb7ee3b --stop-address=0xb7ee41 nsppe-14.1-73.30
b7ee3b: 83 78 08 02 cmp DWORD PTR [rax+0x8],0x2
b7ee3f: 74 5d je b7ee9e <-- jumps to the ACCEPT path
두 결함이 겹치면 서명 검증 없이 증명서 내용만으로 세션이 만들어집니다. 공격자는 사용자를 식별하는 NameID 값을 임의로 지정할 수 있으므로, 비밀번호나 다중 인증 절차를 거치지 않고 특정 계정 명의의 접근이 가능해집니다. 이때 얻는 권한은 위조한 계정에 부여된 범위로 한정되며, 관리자 계정 권한이나 장비 전체 장악이 자동으로 따라오지는 않습니다.
■ PoC
공개 저장소에는 Python3로 작성된 PoC(poc.py)와 NetScaler CPX 컨테이너 이미지로 취약 환경을 재현하는 랩 스크립트가 함께 들어 있습니다. PoC는 서버 응답 차이로 설정을 판정하는 점검 모드와, 실제 세션 발급까지 시도하는 전체 체인 모드를 분리해 제공합니다. 아래는 공개 PoC의 safe_oracle()에서 서버 응답을 판정하는 부분입니다. 코드는 수정하지 않고 그대로 옮겼습니다. 전체 파일은 참고 자료의 원문에서 확인할 수 있습니다.
if "Malformed Assertion" in body:
print("[-] 0xe0005 'Malformed Assertion' — the unsigned early gate FIRED")
print(" -> rejectUnsignedAssertion == STRICT (word==3).")
print(" -> NOT vulnerable to the CVE-2026-19490 redirect binding bypass.")
result["verdict"] = "not-vulnerable"
result["config"] = "word==3 (STRICT)"
elif "issuer" in body.lower():
print("[!] Issuer validation error (0xe0012) on an UNSIGNED assertion —")
print(" the unsigned early gate did NOT fire = rejectUnsignedAssertion")
print(" == ON (word==2, the DEFAULT). VULNERABLE CONFIG CONFIRMED —")
print(" the target parsed an unsigned assertion and reached post-parse")
print(" issuer validation with no signature check. No session created.")
result["verdict"] = "VULNERABLE-CONFIG (word==2, no session)"
result["config"] = "word==2 (default ON)"
점검 모드는 일부러 잘못된 발급자 값을 넣은 서명 없는 응답을 보내고, 장비가 돌려주는 오류 코드 차이로 설정 상태를 판별합니다. 오류가 형식 오류로 나오면 엄격 검증이 걸린 상태이고, 발급자·정책 오류로 나오면 기본 설정이라 이 경로에 취약하다는 뜻입니다. 세션 발급까지 수행하는 모드는 재현 절차에 해당하므로 본문에 싣지 않았습니다.
⚠️ WARN
위 점검 모드도 대상 장비에 실제 요청을 보냅니다.
자산 소유자의 명시적 승인 없이 외부 시스템을 대상으로 실행해서는 안 됩니다.
■ 탐지 및 점검
• NetScaler 실행 구성에서 add authentication samlAction, add authentication vserver, add vpn vserver 항목을 검색해 전제조건 충족 여부를 먼저 확인합니다.
• 질의 문자열까지 기록하는 웹 접근 로그나 리버스 프록시 로그에서 /cgi/samlauth 경로에 SAMLResponse 파라미터가 붙은 GET 요청을 조회합니다. 정상 통합 인증(SSO) 흐름은 POST 바인딩을 사용하므로 GET 형태는 조사 대상입니다.
• IdP와 다중 인증 서버의 인증 성공 기록을 NetScaler 세션 목록과 대조해, 대응하는 IdP 기록이 없는 세션이 있는지 확인합니다.
• 2026년 8월 19일 이후 구간을 대상으로 인증 로그, 원격 접속 기록, 활성 세션, 관리자 활동, SAML 이벤트를 하나의 타임라인으로 묶어 검토합니다.
• 스캐닝 시도와 실제 우회 성공을 구분합니다. 요청 관측만으로는 침해를 확정할 수 없으므로 세션 생성 여부와 후속 내부 접근 기록을 함께 봐야 합니다.
✅ CHECK
오래된 빌드는 SAML 액션이 없어도 게이트웨이·AAA 구성만으로 전제조건이 충족됩니다.
SAML을 쓰지 않는다는 이유로 점검 대상에서 제외하지 마십시오.
■ 대응 방안
• 14.1 계열은 14.1-73.32 이상, 13.1 계열은 13.1-63.21 이상으로 업그레이드하고, FIPS 장비는 14.1-73.32 FIPS 이상, 13.1 계열 FIPS·NDcPP 장비는 13.1-37.277 이상을 적용합니다.
• Citrix는 지원되는 임시 대응책이 없다고 밝혔으므로, 즉시 업그레이드가 어려운 장비는 게이트웨이·AAA 가상 서버의 외부 노출을 일시 제한하는 방식으로 시간을 확보해야 합니다.
• 연구자 공개 글 기준으로 SAML 인증 액션의 서명 없는 증명서 거부 옵션을 STRICT로 올리면 이 경로를 막을 수 있습니다. 다만 Citrix가 지원 대응책으로 안내한 항목은 아니며, STRICT는 Response와 Assertion 모두에 서명을 요구하므로 IdP 쪽 서명 요구 수준도 함께 올라가 기존 연동이 실패할 수 있습니다. 적용 전 IdP 설정과 호환성을 확인해야 합니다.
• 인터넷에 노출돼 있던 취약 구성 장비는 침해 가능성을 전제로 조사 우선순위를 높입니다. 업그레이드 후에는 기존 세션을 모두 종료하고, 해당 장비로 접근 가능했던 계정의 자격증명 재발급을 검토합니다.
• 관리 인터페이스를 전용 관리망으로 제한하고, 인증 정책과 구성 변경 이력을 외부 로그 수집 시스템으로 중앙화해 다음 사건에서 변조 흔적을 남기도록 합니다.
💡 TIP
업그레이드는 취약점을 막을 뿐 이미 발급된 세션을 무효화하지 않습니다.
패치 적용과 세션 정리를 한 작업으로 묶어 진행하십시오.
[참고 자료]
Citrix 보안 공지 CTX696939 — NetScaler ADC 및 NetScaler Gateway
근본 원인 분석 문서 원문 (커밋 d931de9 고정)
PoC 코드 원문 poc.py의 safe_oracle() 응답 판정 부분 (커밋 d931de9 고정)
Rapid7 — CVE-2026-19490 긴급 대응 분석
BleepingComputer — 공개 PoC를 이용한 공격 시도 관측 보도
Previdian 센서 관측 요약 (BleepingComputer 보도 기반 정리)
Field Effect — 초기 악용 동향과 대응 권고
Help Net Security — Citrix 패치 권고 보도



