[방어] 분석 — CVE-2026-24228
The deserialization flaw in NVIDIA NeMo Framework (≤ 2.7.2) enables remote code execution and must be mitigated immediately by disabling untrusted model loading while awaiting a vendor patch.
📋 요약
- 심각도 high · CVSS 7.8 · EPSS 0.00161 · 악용난이도 hard
🔍 공격 기법
NVIDIA NeMo는 모델 파일을 pickle‑like 포맷으로 역직렬화합니다. 공격자는 신뢰되지 않은 경로에 조작된 모델 파일(.pth, .ckpt 등)을 배치하고, 해당 파일이 애플리케이션에 의해 자동 로드되도록 트리거하면 악성 객체가 실행되어 코드 실행·권한 상승·데이터 변조·정보 유출까지 이어집니다.
악용 가능성: AV:L(로컬) 벡터가 의미하는 바는 공격자가 대상 시스템에 직접 접근할 수 있어야 한다는 점이며, 이는 원격에서의 무차별 시도보다는 사전 침투 단계가 선행된 경우에만 가능함을 뜻합니다. AC:L(낮은 복잡도)와 PR:L(저권한) 요소가 결합돼 공격자는 로컬 계정이라도 최소 권한이면 악성 직렬화 데이터를 제공하면 된다는 점에서 실제 수행 절차는 비교적 단순하지만, 초기 접근 자체가 전제 조건이므로 전체 난이도는 “hard”으로 평가됩니다. UI:N(사용자 개입 없음)은 사용자의 클릭이나 입력 없이 자동으로 트리거될 수 있음을 의미하나, 이는 앞서 언급한 로컬 접근 권한 확보가 선행돼야 함을 전제로 합니다. EPSS = 0.00161이라는 실측값은 현재까지 이 취약점이 실제 공격에 활용된 사례가 매우 드물다는 것을 보여주며, KEV 미등재는 아직 활발히 악용되는 위협으로 분류되지 않았음을 뒷받침합니다. NVIDIA NeMo Framework는 모델 로딩·구성 파일·gRPC 등 여러 엔드포인트에서 직렬화된 객체를 역직렬화하므로, 해당 경로에 악의적인 데이터를 삽입할 수 있는 파일 입출력 권한이나 서비스 호출 권한이 공격 표면이 됩니다. 따라서 “hard” 등급은 로컬 접근·파일/서비스 입력이라는 제한된 공격 면을 필요로 하지만, 일단 초기 foothold가 확보되면 낮은 복잡도로 코드 실행까지 이어질 수 있음을 의미합니다.
💥 영향 분석
- 코드 실행: 공격자가 임의의 파이썬 코드를 시스템 권한으로 실행할 수 있습니다.
- 권한 상승: 로컬 서비스 계정(보통
nemo혹은root)으로 실행되는 경우, 루트 권한을 획득합니다. - 데이터 변조·유출: 모델 파라미터 및 학습 데이터가 외부에 노출되거나 조작될 수 있습니다.
🔗 관련 취약점·체이닝
- 동일한
Deserialization (CWE‑502)유형은 Python 기반 AI/ML 프레임워크 전반에서 빈번히 보고됩니다(예: PyTorch, TensorFlow). - 이와 연계된 권한 상승 기법으로는 로컬 파일 포함(LFI)이나 악성 플러그인 로딩이 활용될 수 있습니다.
🔎 탐지
-
로그 지표
syslog/journalctl:nemo프로세스가 시작될 때model_path=파라미터에 비정상적인 경로(예:/tmp/, 사용자 홈 디렉터리 외) 가 기록됨.auditd(type=EXECVE) :python혹은torch실행 시-c import pickle;pickle.load(와 같은 문자열이 포함된 커맨드라인.Filebeat/OSSEC:.pkl,.ckpt,.pth등 모델 확장자를 가진 파일에 대한chmod 777혹은 소유자 변경 이벤트.
-
SIEM 탐지 규칙 예시 (Elastic Kibana Query DSL)
text1{2 "bool": {3 "must": [4 { "match_phrase": { "process.command_line": "pickle.load" } },5 { "wildcard": { "process.executable": "*python*" } }6 ],7 "filter": [8 { "range": { "@timestamp": { "gte": "now-15m" } } }9 ]10 }11} -
정규식 예시 (Logstash Grok)
(?i)pickle\.load\([^)]*\)→pickle.load호출 탐지(?i)model_path\s*=\s*(/tmp|/var/tmp|/home/.+/.*)→ 비신뢰 경로 로드 시도
-
오탐 튜닝
- 정상적인 모델 학습 파이프라인에서 내부 디렉터리(
~/nemo/models/)에 대한 로드를 허용하도록 화이트리스트 규칙을 추가합니다. pickle.load가 테스트 스크립트에서 사용되는 경우, 해당 스크립트 경로를 별도 허용 목록에 등록해 오탐을 감소시킵니다.
- 정상적인 모델 학습 파이프라인에서 내부 디렉터리(
🛡️ 완화 방안
-
즉시(긴급 차단)
nemo서비스의 설정 파일(config.yaml등)에서model_load.untrusted: false옵션을 강제 적용하거나, 운영 체제 수준에서/etc/ld.so.preload를 이용해pickle모듈 로드를 차단합니다.- 난이도: 낮음 / 운영 영향: 기존 모델 재학습 필요 시 일시 중지 / 검증: 서비스 재시작 후
syslog에 “Untrusted model loading disabled” 로그가 남는지 확인.
-
단기(완화)
- 모델 파일 디렉터리에 접근 제어 리스트(ACL) 적용 → 신뢰된 사용자·그룹만 읽기/쓰기 허용.
- 난이도: 중간 / 영향: 파일 관리 프로세스에 약간의 지연 추가 / 검증:
getfacl로 권한 확인.
- 난이도: 중간 / 영향: 파일 관리 프로세스에 약간의 지연 추가 / 검증:
- 실행 시점에 환경 변수
PYTHONPATH를 제한하고,LD_LIBRARY_PATH에 외부 경로를 포함하지 않도록 시스템 서비스 파일(systemd)에Environment=설정 삽입.- 난이도: 중간 / 영향: 기존 커스텀 라이브러리 로드가 차단될 수 있음 / 검증:
systemctl show nemo -p Environment확인.
- 난이도: 중간 / 영향: 기존 커스텀 라이브러리 로드가 차단될 수 있음 / 검증:
- 모델 파일 디렉터리에 접근 제어 리스트(ACL) 적용 → 신뢰된 사용자·그룹만 읽기/쓰기 허용.
-
근본(해결)
- NVIDIA NeMo 공식 패치가 배포되는 즉시 최신 버전(≥ 2.7.3)으로 업그레이드하고, 릴리즈 노트에 명시된 보안 설정을 적용합니다.
- 난이도: 높음 (버전 호환성 테스트 필요) / 영향: 서비스 재배포·테스트 기간 소요 / 검증:
nemo --version로 버전 확인 및 취약점 스캐너(Nessus, OpenVAS) 재실행.
- 난이도: 높음 (버전 호환성 테스트 필요) / 영향: 서비스 재배포·테스트 기간 소요 / 검증:
- NVIDIA NeMo 공식 패치가 배포되는 즉시 최신 버전(≥ 2.7.3)으로 업그레이드하고, 릴리즈 노트에 명시된 보안 설정을 적용합니다.
-
잔여 리스크
- 패치 전까지는 위 즉시·단기 조치를 적용하더라도, 완전히 차단되지 않은 커스텀 직렬화 구현이 존재할 경우 남은 위험이 있습니다. 따라서 지속적인 로그 모니터링과 정기적인 파일 무결성 검사를 병행하시길 권고드립니다.
-
인시던트 대응 플레이북
- 알림 수신 →
syslog·SIEM에서 “Untrusted model load” 이벤트 확인. - 해당 프로세스 PID와 실행 경로 추적, 관련 파일(
*.pkl) 해시값 확보. - 즉시 차단된 서비스 재시작 전, 의심 파일을 격리하고 포렌식 복사본 생성.
- 영향 범위 파악 후, 필요 시 해당 호스트를 네트워크에서 분리.
- 패치 적용 일정 수립 및 사후 검증 보고서 작성.
- 알림 수신 →
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=7.8 · non-KEV · EPSS=0.00161 · exploit=hard · in_scope=None