
NVIDIA Triton Inference Server의 TRITON_BATCH_STRATEGY_PATH를 통한 임의 dlopen으로 네이티브 코드 실행을 가능하게 하는 CVE-2026-47630에 대한 기술적 취약점 분석 및 개념 증명(PoC)이며, 탐지 및 완화 지침을 포함합니다.
TRITON_BATCH_STRATEGY_PATH를 통한 임의 dlopentriton-inference-server/core의 사용자 정의 배치 전략 로더에서 발생하는 절대 경로 탐색(Absolute Path Traversal) 취약점입니다. 모델 구성 매개변수가 검증 없이 dlopen(RTLD_NOW | RTLD_LOCAL)에 전달되므로, 모델의 config.pbtxt에 영향을 줄 수 있는 사람은 누구나 모델 로드 시점에 Triton 서버 프로세스 내부에서 네이티브 코드를 실행할 수 있습니다.
NVIDIA는 게시판 5865에서 다음과 같이 문자 그대로 인정했습니다: CVE-2026-47630: s1ko.
Triton은 모델의 config.pbtxt에서 모델별 TRITON_BATCH_STRATEGY_PATH 매개변수를 허용합니다. 26.05까지 이 값은 임의의 파일 시스템 경로로 취급되어 수정 없이 dlopen에 전달되었습니다. 포함(containment) 검사도, 허용 목록도, 서명 또는 해시 검증도 없었습니다. 절대 경로, 탐색 시퀀스, 심볼릭 링크가 모두 허용되었습니다.
RTLD_NOW는 모든 심볼을 즉시 해석하고 객체의 __attribute__((constructor)) / .init_array 루틴을 dlopen이 반환되기 전에 실행합니다. 따라서 실행은 로드 성공 여부와 무관하게 이루어집니다. 페이로드가 실행되는 데 TRITONBACKEND_ModelBatch* 진입점이 하나도 존재할 필요가 없으며, Triton 프로세스의 권한(NGC 컨테이너에서는 흔히 root)으로 실행됩니다.
src/backend_model.cc — 공격자 입력이 batch_libpath에 도달하며, 존재 여부만 검증됩니다:
if (model_config.parameters().contains("TRITON_BATCH_STRATEGY_PATH")) {
batch_libpath = model_config.parameters()
.at("TRITON_BATCH_STRATEGY_PATH")
.string_value();
bool exists = false;
RETURN_IF_ERROR(FileExists(batch_libpath, &exists));
if (!exists) {
return Status(
triton::common::Error::Code::NOT_FOUND,
("Batching library path not found: " + batch_libpath).c_str());
}
}
주의할 점으로, 같은 파일의 다른 곳에서 Triton이 레이블 경로와 백엔드 라이브러리 경로에 이미 적용한 IsChildPathEscapingParentPath 호출이 여기에는 전혀 없다는 것입니다.
src/backend_model.cc — SetBatchingStrategy가 이를 전달합니다:
Status TritonModel::SetBatchingStrategy(const std::string& batch_libpath)
{
std::unique_ptr<SharedLibrary> slib;
RETURN_IF_ERROR(SharedLibrary::Acquire(&slib));
RETURN_IF_ERROR(slib->OpenLibraryHandle(batch_libpath, &batch_dlhandle_));
src/shared_library.cc — 싱크(sink):
*handle = dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL);
model_config.parameters()를 제어할 수 있는 현실적인 경로는 세 가지입니다:
config.pbtxt를 소유한 테넌트가 자신의 디렉터리에 .so를 심고 매개변수가 이를 가리키게 합니다. 페이로드는 서버의 권한으로 실행되므로 다른 모든 테넌트의 가중치, 비밀, GPU에 접근할 수 있습니다.file:<rel-path> 매개변수 접두사와 결합된 TRITONSERVER_ServerLoadModelWithParameters를 사용하면 모델 로드 권한이 있는 호출자가 단일 요청으로 config.pbtxt와 .so를 제출하고 즉시 로드를 트리거할 수 있습니다. API 외부의 파일 시스템 접근은 필요하지 않습니다.dlopen합니다.poc/에는 OpenLibraryHandle이 수행하는 동작으로 축소된 프리미티브가 포함되어 있습니다. 소스만 제공됩니다 — 직접 빌드하세요:
$ cd poc && ./build.sh
$ gcc -O0 -o test_dlopen test_dlopen.c -ldl
$ ./test_dlopen ./evil.so
dlopen OK, handle=0x55d1779652c0
$ cat /tmp/triton_dlopen_rce_proof.log
[triton-dlopen-rce] constructor fired @ Fri May 1 09:56:56 2026
pid=240157 uid=1000 euid=1000 cwd=/opt/poc
페이로드는 무해합니다. pid, uid, euid, cwd를 기록하는 한 줄을 추가할 뿐입니다. Debian 13, GCC 14.2, x86_64에서 검증되었습니다.
Triton 쪽 트리거의 경우, 빌드된 evil.so를 모델 저장소의 poc/config.pbtxt 옆에 두고 모델을 로드하세요 — 자동 로드, --load-model, 또는 POST /v2/repository/models/evil_model/load. 영향받는 버전에서는 백엔드 심볼 조회 이전에 SetBatchingStrategy 중에 생성자(constructor)가 실행됩니다.
로드는 Triton 자체가 INFO 수준으로 기록합니다:
Loading custom batching strategy library <path> for model <name>
수정된 빌드에서 거부된 시도는 Batching library path escapes model repository.로 표시됩니다.
절대 경로이거나, ..를 포함하거나, 모델 디렉터리 밖으로 해석되는 모든 TRITON_BATCH_STRATEGY_PATH 값은 버전과 무관하게 알림을 발생시킬 가치가 있습니다. 로그 줄과 구성 매개변수를 모두 포괄하는 Sigma 규칙은 detection/에 있습니다.
보완 신호:
TRITON_BATCH_STRATEGY_PATH 매개변수를 전혀 포함하는 config.pbtxt 파일 — 이 기능은 실제로 드물기 때문에 존재 자체만으로 유용한 필터입니다.tritonserver 프로세스가 모델 루트 밖의 .so를 openat/mmap하는 경우 (auditd, eBPF 또는 Falco).Triton Inference Server 26.06 이상으로 업그레이드하세요. 이 수정은 로더에 누락된 포함(containment) 검사를 추가합니다:
bool escapes{true};
RETURN_IF_ERROR(IsChildPathEscapingParentPath(
batch_libpath, localized_model_dir->Path(), &escapes));
if (escapes) {
return Status(
Status::Code::INVALID_ARG,
"Batching library path escapes model repository.");
}
업그레이드가 즉시 불가능한 경우의 보완 통제:
config.pbtxt에서 모델 저장소에 도달하기 전에 TRITON_BATCH_STRATEGY_PATH를 거부하거나 제거하세요.explicit 이외의 --model-control-mode, 또는 저장소 엔드포인트에 대한 권한 부여).tritonserver를 권한 없는 사용자로 실행하고 모델 저장소 마운트를 읽기 전용으로 유지하여, 로드가 성공하더라도 피해 범위가 최소화되도록 하세요.매핑: MITRE ATT&CK T1574.006 Hijack Execution Flow: Dynamic Linker Hijacking 및 T1129 Shared Modules; NIST SP 800-53r5 SI-7, CM-5, SC-18; CIS Controls v8 §2, §4.
triton-inference-server/core — https://github.com/triton-inference-server/coreMIT — LICENSE 참조.
| CVE | CVE-2026-47630 |
| NVIDIA 보안 권고 | 5865 (2026-08-18) |
| CWE | CWE-36 (절대 경로 탐색); CWE-114 / CWE-829로 보고됨 |
| CVSS v3.1 (NVIDIA) | 5.5 MEDIUM — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 영향받는 버전 | Triton Inference Server 0.0 – 26.05 (Linux) |
| 수정된 버전 | 26.06 |
| 보고자 | s1ko (github.com/s1ko, [email protected]) |
| 공급업체 추적 | NVIDIA PSIRT 티켓 6139742 |
| 날짜 | 이벤트 |
|---|
| 2026-04-25 | 기본 Triton 경로 처리 발견 보고; NVIDIA PSIRT 티켓 6128799 개설 |
| 2026-05-01 | 이 2차 발견 확인 및 보고; PSIRT 티켓 6139742 개설 |
| 2026-05-28 | PSIRT와 조율된 공개 일정 합의 |
| 2026-06 | Triton Inference Server 26.06에서 수정 배포 |
| 2026-08-18 | NVIDIA가 게시판 5865를 발행, CVE-2026-47630 지정 및 s1ko 크레딧 |
| 2026-08-22 | 이 문서 공개 |