vLLM에서 요청과 함께 전달되는 stop_token_ids 값의 검증 범위가 좁게 구현되어, 모델 어휘(vocabulary) 범위를 벗어난 정지 토큰 ID가 내부 로짓 인덱싱 단계까지 도달할 수 있는 결함이 공급자 보안 자문을 통해 공개되었습니다. 어휘 범위 밖 정지 토큰을 담은 요청이 엔진 종료를 유발할 수 있다는 자문 서술을 기준으로 보면, 추론 서비스를 운영하는 환경에서는 버전 확인과 수정 버전 적용 여부를 먼저 점검해야 합니다.
개요

GitHub 보안 자문(GHSA-w9r6-29q4-pvpr)에 따르면 요청에 포함된 stop_token_ids 값은 정수인지 여부만 확인되었고, 모델 어휘 크기 안에 속하는지는 검사되지 않았습니다. 그 결과 어휘 범위 밖(out-of-vocabulary) ID가 그대로 로짓 인덱싱(logits indexing) 단계에 도달합니다.
- 기본 V1 엔진 경로에서는 범위 밖 인덱스 접근이 엔진 충돌로 이어져 서비스 거부(DoS)가 발생합니다.
- V2 러너 경로에서는 같은 검증되지 않은 인덱스가 로짓 버퍼의 인접 값을 덮어쓰거나 다른 GPU 상태를 손상시킬 수 있습니다.
- VulnCheck 자문은 원격 공격자가 어휘 범위 밖
stop_token_ids를 담아 엔진을 종료시키거나 V2 러너의 로짓 버퍼 밖으로 쓸 수 있다고 설명합니다. - 수정 방식은 모든
stop_token_ids값을 샘플러에 도달하기 전에 모델 어휘와 대조해 검증하고, 유효하지 않은 ID를 요청 오류로 거부하는 것입니다.
핵심은 잘못된 값이 거절되지 않고 내부 인덱스 연산까지 흘러간다는 검증 위치의 문제입니다. 값의 형식만 보고 값의 범위를 보지 않았기 때문에, 요청 단위의 입력 검증이 엔진 안정성과 직결되는 구조가 되었습니다.
영향 범위
VulnCheck 자문은 영향 버전을 vLLM 0.20.1 이상 0.29.0 미만으로 안내합니다. 자문에 명시된 조건을 기준으로 점검 범위를 나누면 다음과 같습니다.
- VulnCheck이 지정한 요청 경로: VulnCheck은 OpenAI chat, completion, generate, batch 요청에 무효한 ID를 담아 엔진을 종료시키거나 V2 러너의 로짓 버퍼 밖으로 쓸 수 있다고 설명합니다. 자문이 이름으로 지정한 요청 유형은 이 네 가지이며, 이번 자료는 이 목록을 다른 인터페이스나 플랫폼 전반으로 확장하지 않습니다.
- 기본 V1 엔진 구성: 자문은 어휘 범위 밖 정지 토큰을 담은 단일 요청이 엔진을 종료시키고 다른 사용자의 서비스를 중단시킬 수 있다고 명시합니다.
- V2 러너 구성: 같은 검증되지 않은 인덱스가 인접 로짓 또는 다른 GPU 상태를 손상시킬 수 있습니다.
자문의 다른 사용자의 서비스 중단 서술을 기준으로 조건부 해석을 더하면, 영향의 크기는 같은 엔진을 공유하는 이용 구조와 연결됩니다. 여러 사용자가 하나의 엔진에 요청을 보내는 공유 서빙 환경에서는 요청 하나가 다른 사용자의 가용성까지 건드리므로, 단일 사용자 실험 환경보다 이런 배포의 버전 확인 순서를 앞당기는 것이 자문의 영향 서술과 맞습니다. 다만 GPU 상태 손상은 자문에서 인접 로짓 또는 다른 GPU 상태 손상 수준으로만 확인되어 있으며, 코드 실행 등 더 심각한 결과로 이어지는지는 이번 자료에서 확인되지 않았습니다.
기술적 분석
검증이 실패하는 지점
stop_token_ids는 생성을 멈출 토큰 ID를 지정하는 파라미터입니다. 자문에 따르면 이 값에 대한 검사는 정수인가에 머물렀고, 모델 어휘 크기의 유효한 인덱스인가는 검사되지 않았습니다. 어휘 범위 밖 ID가 로짓 인덱싱 단계까지 도달할 수 있다는 점이 자문에 명시되어 있으므로, 어휘 크기라는 경계값이 요청 경계에서 함께 검증되어야 하는 값입니다. 이 경계 검증이 빠진 것이 근본 원인입니다.
V1 엔진과 V2 러너에서 결과가 다른 이유
같은 검증되지 않은 인덱스라도 실행 주체에 따라 결과가 갈립니다.
- V1(기본 엔진): 범위 밖 인덱스 접근이 엔진 충돌로 이어집니다. 자문은 어휘 범위 밖 정지 토큰을 담은 단일 요청이 엔진을 종료시키고 다른 사용자의 서비스를 중단시킬 수 있다고 명시합니다.
- V2 러너: 같은 인덱스가 로짓 버퍼 외부에 쓰기를 발생시켜 인접 로짓이나 다른 GPU 상태를 손상시킬 수 있습니다. VulnCheck 자문은 V2 러너의 로짓 버퍼 밖으로 쓰기 가능성을 함께 언급합니다.
두 경로에서 확인된 영향은 자문이 서술한 위 범위로 한정됩니다. V1은 엔진 종료와 서비스 중단으로, V2는 인접 로짓 또는 다른 GPU 상태 손상으로 각각 설명되어 있으며, 자문은 각 영향이 운영에서 언제 어떻게 관측되는지까지는 다루지 않습니다.
악용 경로와 난이도
VulnCheck 자문은 원격 공격자가 어휘 범위 밖 stop_token_ids를 담아 엔진을 종료시킬 수 있고, OpenAI chat, completion, generate, batch 요청으로 무효한 ID를 보내 엔진 종료 또는 V2 러너의 로짓 버퍼 밖 쓰기를 유발할 수 있다고 설명합니다. 즉 자문이 지정한 악용 조건은 이 요청 유형을 통해 무효한 ID가 전달될 수 있는지입니다.
다만 이번 증거 수집에서는 공개 PoC, 실제 야생 공격 사례, CISA KEV 등재 여부가 확인되지 않았습니다. 따라서 이 결함은 악용이 확인된 상태가 아니라, 공급자 자문이 확인한 잠재적 악용 가능성에 근거한 예방적 대응 대상으로 이해해야 합니다. 공개 PoC가 확인되지 않은 상태에서 익스플로잇 코드나 내부 구현 세부, 실제 공격 도구의 존재를 추정할 근거는 자료에 없습니다.
수정이 작동하는 방식
수정 PR #54196은 모든 stop_token_ids 값을 샘플러에 도달하기 전에 모델 어휘와 대조해 검증하고, 유효하지 않은 ID를 요청 오류로 거부합니다. 검증 지점이 샘플러 이전이라는 점이 중요합니다. 로짓 인덱싱이 일어나는 샘플러 단계에 값이 도달하기 전에 요청 단계에서 거절되므로, 이 결함의 지점인 검증되지 않은 인덱스의 내부 도달 자체가 차단됩니다. 이 로직을 포함한 릴리스를 적용했는지 확인하는 것이 패치 검증의 기준이 됩니다.
대응 방안
버전과 구성 확인
- 배포 중인 vLLM 버전을 확인해 0.20.1 이상 0.29.0 미만 구간에 해당하면 점검 대상으로 분류합니다. VulnCheck 자문의 버전 범위는 자문 기준이므로, 실제 배포 이미지·패키지의 빌드 정보와 대조해 확인하는 것이 안전합니다.
- VulnCheck이 지정한 OpenAI chat, completion, generate, batch 요청 중 어떤 경로가 실제로 열려 있는지 요청 경로 목록을 정리합니다. 자문이 지정한 악용 경로는 이 요청 유형이므로, 열려 있는 경로가 곧 점검 대상입니다.
- 기본 V1 엔진인지 V2 러너인지 확인합니다. 자문은 V1에서 엔진 종료와 서비스 중단을, V2에서 인접 로짓 또는 다른 GPU 상태 손상을 각각 지목하므로, 구성에 따라 확인해야 할 영향이 다릅니다.
수정 버전 적용
- 기본 대응은 수정 버전 업그레이드입니다. 자문은 모든
stop_token_ids값을 샘플러 도달 전에 모델 어휘와 대조 검증하고 유효하지 않은 ID를 요청 오류로 거부하는 수정(PR #54196)을 안내하고, VulnCheck은 0.29.0 미만을 영향 범위로 안내합니다. 따라서 0.29.0 이상 적용 여부를 확인 기준으로 삼되, 실제 배포 채널별 반영 시점은 별도로 확인해야 합니다. - 제공된 자문은 요청 경로별 별도 완화 절차나 탐지·로그·속도 제한 지침을 제시하지 않습니다. 이번 자료에서 확인된 대응 근거는 어휘 범위 검증과 유효하지 않은 ID의 요청 오류 거부라는 수정 로직이며, 그 밖의 임시 완화책은 이번 자료로 뒷받침되지 않습니다.
한계와 확인이 필요한 부분
- 실제 야생 악용 사례, 공개 PoC, CISA KEV 등재 여부는 이번 증거 수집에서 확인되지 않았습니다. KEV 등재 여부는 대응 우선순위에 영향을 줄 수 있으나 현재 자료에는 없습니다.
- 주요 배포 채널(컨테이너 이미지, Kubernetes 배포 등)에서 수정 버전이 언제 반영되는지, 공식 수정 커밋의 정확한 범위는 확인되지 않았습니다. 패치 적용 시점을 판단할 때는 배포 채널별 안내를 별도로 확인해야 합니다.
- V2 러너의 GPU 경계 외 쓰기가 코드 실행 등 더 심각한 결과로 확장되는지에 대한 추가 기술 분석은 이번 자료에 포함되어 있지 않습니다. 따라서 심각도를 코드 실행 수준으로 단정할 수 없습니다.
- V1과 V2 러너의 구체적 내부 동작 차이, 로짓 버퍼 밖 쓰기의 정밀한 영향 범위도 자문의 서술 수준을 넘어선 세부 정보는 없습니다.
- 이번 자문은
stop_token_ids라는 특정 파라미터의 검증 부재에 한정됩니다. 다른 입력 파라미터나 다른 모델 종속 경계값으로 대응 범위를 넓히는 판단은 이번 자료로 뒷받침되지 않습니다.
참고자료
- Unvalidated stop_token_ids causes engine crash (DoS) and out-of-bounds GPU write
- vLLM 0.20.1 before 0.29.0 DoS and GPU Out-of-Bounds Write via stop_token_ids | Advisories
함께 읽으면 좋은 글
- designer-mcp 경로 순회 취약점 CVE-2026-116045: 태그 없는 저장소를 커밋 기준으로 판별하는 법
- Atlassian 다중 제품 임의 파일 접근 취약점 CVE-2026-21589: 사전 인증 파일 읽기 해석과 공개 점검 도구 범위
- OctoAlly CVE-2026-112147: 1.0.87 이하로 등록된 정보 노출, 관련 커밋은 HOST 해제와 local-only 유지를 경고
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!