flawopen.com/Incidents/citrix-bleed-session-token-leak-october-2023
Citrix Bleed: 세션 토큰 유출과 MFA 우회
CVE-2023-4966은 세션 토큰을 포함한 NetScaler 메모리를 노출해 MFA를 우회한 세션 탈취를 가능하게 했습니다. 악용은 2023년 8월 말 시작됐습니다.[1], [2]
비서에게 메시지를 작은 카드에 옮겨 적고 길이를 알려 달라고 부탁했다고 해 봅시다. 카드에는 50자밖에 들어가지 않아 50자만 적었지만, 길이를 묻자 원문이 그랬으니 정직하게 "800자"라고 답합니다. 당신은 그 카드를 다른 사람에게 주며 800자를 읽으라고 합니다. 그 사람은 당신의 50자를 다 읽고도 종이의 나머지에 적힌 내용을 계속 읽어 내려갑니다.[2]
핵심 개념 및 용어
snprintf- 고정 크기 버퍼에 문자열을 서식화해 넣는 C 함수입니다. 들어가지 않으면 잘라 내지만, 반환값은 전체 문자열이 가졌을 길이입니다.[3]
NetScaler ADC / Gateway- 네트워크 경계에서 원격 접속과 부하 분산을 제공하는 Citrix 장비입니다. Gateway 또는 AAA 가상 서버로 구성된 장비만 영향을 받았습니다.[1]
버퍼 범위 밖 읽기(CWE-125)- 버퍼 끝을 넘어 읽는 것입니다. 덮어쓰는 것은 없지만, 인접한 메모리에 있던 내용이 노출됩니다. 이는 구체적인 범위 밖 읽기 메커니즘(
CWE-125)을 설명합니다. Citrix는 CVE-2023-4966을 더 넓은 CWE-119로 분류합니다.[1], [3] 세션 토큰- 사용자가 이미 로그인했음을 증명하는 값입니다. 이를 제시하는 사람은 비밀번호나 MFA 확인 없이 그 사용자로 취급됩니다.[2]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-119
- CISA KEV — 추가일 2023-10-18 — CVE-2023-4966
사고 타임라인
이후 사고 대응 보고서에 따르면, 이 결함의 제로데이 악용이 시작됩니다.[2]
Citrix가 수정 빌드 14.1-8.50, 13.1-49.15, 13.0-92.19를 담은 보안 공지 CTX579459를 발표합니다.[1]
CISA가 CVE-2023-4966을 알려진 악용 취약점 목록에 추가합니다.[4]
단계별 공격 실행 흐름
버퍼 너머의 메모리가 전송된다
응답이 그 큰 길이로 전송되어, 장비는 잘린 JSON과 함께 인접한 메모리까지 돌려줍니다.[2]
소스 코드 비교: 취약한 구현 vs 보안 패치
설명용 C 코드이며 NetScaler 소스 코드가 아닙니다. 수정 코드는 전체 출력의 예상 길이를 나타내는 snprintf 반환값을 확인합니다. 값이 음수이거나 버퍼 크기 이상이면 형식화가 실패했거나 출력이 잘린 것이므로 함수가 아무것도 보내지 않습니다. 따라서 전체 응답이 buf에 들어가는 경우에만 해당 길이를 send_response에 전달합니다.[3], [2]
#include <stdio.h>
int send_response(const char *data, int len);
int send_oidc_config(const char *host)
{
char buf[256];
/* n은 실제로 기록될 바이트 수이며 sizeof(buf)보다 클 수 있습니다 */
int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
return send_response(buf, n); /* n바이트를 보내기 위해 buf 범위 밖까지 읽습니다 */
}
#include <stdio.h>
int send_response(const char *data, int len);
int send_oidc_config(const char *host)
{
char buf[256];
int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
if (n < 0 || (size_t)n >= sizeof(buf))
return -1; /* 잘린 출력을 거부하고 버퍼 범위를 넘겨 보내지 않습니다 */
return send_response(buf, n);
}
엔지니어링 및 시스템 보안 강화 체크리스트
- ✓snprintf의 잘림을 매번 확인합니다. if (n < 0 || (size_t)n >= sizeof(buf))가 오류 경로입니다. 반환값을 쓴 바이트 수로 여기는 것은 흔하고 심각한 C 버그입니다.[3]
- ✓공격자가 제어하는 입력이 출력 길이를 정하게 두지 않습니다. 신뢰할 수 없는 데이터에서 나온 크기는 사용 전에 버퍼의 실제 경계로 제한합니다.[3]
- ✓FlawOpen 대응 지침: 세션 토큰이 노출된 것으로 의심되면 플랫폼이 지원하는 경우 영향을 받은 세션을 폐기하거나 무효화하세요. 패치는 유출 경로를 막지만 이미 노출된 토큰을 폐기하지는 않습니다.
- ✓FlawOpen 운영 지침: 서비스 요구사항이 허용하는 범위에서 세션 수명을 짧게 유지하고 예상치 못한 네트워크나 기기에서 발생한 토큰 사용을 조사하세요. Mandiant는 의심스러운 로그인 패턴을 조사 단서로 제시하며 조직별 맥락에 따라 판단해야 한다고 설명합니다.[2]
- ✓경계 장비에도 자체 서버와 같은 패치·모니터링 규율을 적용합니다. 인터넷에 노출되어 있고 그 뒤에 있는 모든 사람의 접근 권한을 쥐고 있기 때문입니다.[1], [2]