
CVE-2026-4372: 위협 모델, 근본 원인 분석, 재현 및 탐지
Hugging Face
transformers의 치명적인 원격 코드 실행(RCE) 취약점에 대한 방어적 분석.
| 필드 | 값 |
|---|---|
| 식별자 | CVE-2026-4372 / GHSA-29pf-2h5f-8g72 |
| 구성 요소 | Hugging Face transformers |
| 분류 | 원격 코드 실행 (CWE-94, 코드 주입) |
| 진입점 | AutoModelForCausalLM.from_pretrained(), 모델이 로드될 때 |
| 메커니즘 | 모델의 config.json에 있는 어텐션 설정(attn_implementation / _attn_implementation_internal)이 라이브러리로 하여금 공격자 코드를 다운로드하고 실행하게 함 |
| 핵심 속성 | trust_remote_code=False를 우회함, 바로 이런 상황을 막기 위해 사용자들이 의존하는 설정 |
| 수정 버전 | transformers 5.3.0 |
안전을 위해 의도적으로 trust_remote_code=False를 설정해 둔 사용자도 여전히 노출되었다.
아래 세부 사항을 최종적인 것으로 간주하기 전에 공식 출처와 대조하여 확인하라:
두 가지 트리거 설명이 유통되고 있다:
config.json의 어텐션 필드(_attn_implementation_internal).transformers[all]을 통해 설치되는 kernels 패키지.이들은 대부분 동일한 경로일 가능성이 높다: 어텐션 필드가 Hub 저장소를 지정하고,
kernels 패키지가 그로부터 코드를 다운로드하여 실행한다. 수정 커밋이 이를 확인해 줄 때까지
여기서 언급된 필드 이름은 잠정적인 것으로 간주하라.
[ Model repo on the Hub ] untrusted source
│ config.json, tokenizer, weights, (code)
▼
[ Download to local cache ]
▼
[ Read config.json ] settings become a config object
▼
[ Pick model class + attention type ]
▼
[ Build model, load weights ]
▼
[ Model runs in the user's process, with the user's permissions ]
| # | 경계 | 적용되어야 하는 가드 |
|---|---|---|
| TB-1 | 허브 → 로컬 디스크 | 신뢰할 수 있는 저장소, 고정된 커밋으로의 피닝 |
| TB-2 | 설정 파일 → 설정 객체 | 알려진 안전한 값만 허용 |
| TB-3 | 설정 객체 → 실행 중인 코드 | trust_remote_code |
| TB-4 | 모델 → 운영 체제 | 샌드박스, 최소 권한 |
이 버그는 TB-3에서의 실패입니다. 설정 파일의 값이 trust_remote_code 검사를 거치지 않고 코드 실행에 도달했습니다.
모든 경우에 피해자는 정상적인 호출인
AutoModelForCausalLM.from_pretrained("<repo-id>")만 실행합니다.
trust_remote_code는 저장소 코드를 실행하는 한 가지 방식, 즉 사용자 정의 modeling_*.py 파일을 보호합니다.
어텐션 설정은 그 가드를 거치지 않는 두 번째 방식이었습니다.
untrusted config.json attention setting
│
▼
"pick attention type" logic
│ never checks:
✗ ─────────────▶ trust_remote_code
▼
download + run code from the Hub (via `kernels`)
_ 접두사)가 신뢰할 수 없는 파일에서 여전히 설정될 수 있었음.kernels)가 설치되어 있을 때 공격을 조용히 가능하게 함, 예를 들어 transformers[all]을 통해.위험한 동작을 보호하라, 그 동작에 이르는 하나의 경로가 아니라. "코드 실행"으로 이어질 수 있는 모든 경로는 동일한 검사를 거쳐야 한다.
방어는 하나의 자체 포함 스크립트인 defence/safe_load.py이다.
그 함수 safe_from_pretrained()는 from_pretrained()를 대체하며, 모델이 로드되기 전에 네 가지 검사를 수행한다. 하나라도 실패하면 UnsafeModelLoad를 발생시키고 아무것도 로드되지 않는다.
| # | 검사 | 수행 내용 |
|---|---|---|
| 1 | 버전 | transformers가 5.3.0보다 오래된 경우 거부한다. 이것이 실제 수정이다. |
| 2 | Kernels | 구버전에서 kernels 패키지가 설치되어 있으면 거부한다. 공격에 이것이 필요하기 때문이다. |
| 3 | Config | 모델의 config 파일을 읽고 위험한 설정(아래 참조)이 포함되어 있으면 거부한다. Hub 모델은 동일한 커밋에서 검사되고 로드된다. |
| 4 | 원격 코드 | 항상 trust_remote_code=False로 설정한다. 모범 사례일 뿐이다: 이 CVE는 이를 우회한다. |
구버전은 검사 1에서 거부된다. 검사 2와 3은 실험실 전용 옵션 allow_vulnerable_env=True가 설정된 경우에만 구버전에서 실행된다.
검사 3이 차단하는 것:
attn_implementation, _attn_implementation,
_attn_implementation_internal). eager, sdpa,
flash_attention_2, flash_attention_3, flex_attention만 허용되므로,
attacker-org/evil-kernel과 같은 값은 중첩된 하위 config 내부에 있더라도 차단된다._attn_implementation_internal, auto_map, custom_pipelines 필드.config=로 직접 전달된 config.Hub 모델의 경우 config 파일만 다운로드되며, 가중치나 코드는 절대 다운로드되지 않는다. 이들은 하나의 고정된 커밋에서 다운로드되고, 모델은 그 동일한 커밋에서 로드되므로, 검사와 로드 사이에 파일이 바뀔 수 없다. 경고를 검토한 후, 사람이 accept_findings=True로 검사 3을 재정의할 수 있다.
| 상황 | 공격을 막는 것 |
|---|---|
transformers 5.3.0 이상 | 검사 1 |
구버전, kernels 설치됨 | 검사 2 |
| 구버전, config에 위험한 설정 | 검사 3 |
| 검사 후 저장소가 변경됨 | 검사 3 (동일한 커밋을 검사하고 로드) |
한계: 검사 3은 위에 나열된 설정만 알기 때문에 새로운 공격을 잡을 수 없다. transformers>=5.3.0으로 업그레이드하는 것이 유일한 완전한 수정이다.
탐지 구성 요소는 CVE-2026-4372와 관련된 잠재적으로 안전하지 않은 Hugging Face 모델 구성과 취약한 종속성을 식별한다. 두 가지 독립적인 탐지 메커니즘을 제공한다: 정적 구성 스캐닝과 종속성 분석.
방어 구성 요소와 달리, 이 도구들은 모델을 로드하거나 신뢰할 수 없는 코드를 실행하지 않고 잠재적인 보안 위험을 보고한다.
파일: src/detection/static_detector.py
정적 탐지기는 config.json 파일을 파싱하고 보안에 민감한 필드에 대해 중첩된 JSON 객체와 배열을 재귀적으로 검사한다.
다음 필드가 모니터링된다:
| 구성 필드 | 탐지 목적 |
|---|---|
_attn_implementation_internal | CVE-2026-4372와 관련된 내부 어텐션 구성 필드 |
_experts_implementation_internal | 검토가 필요한 추가 내부 구현 필드 |
auto_map | 사용자 정의 모델 구현 코드를 참조할 수 있음 |
custom_pipelines | 사용자 정의 파이프라인 구현을 참조할 수 있음 |
사용법:
cd src/detection
python3 static_detector.py samples/suspicious_config.json
출력 예시:
[WARNING] samples/suspicious_config.json: review field '_attn_implementation_internal'
종료 코드:
| 종료 코드 | 의미 |
|---|---|
0 | PASS — 모니터링 대상 필드가 감지되지 않음 |
1 | WARNING — 하나 이상의 모니터링 대상 필드가 감지됨 |
2 | ERROR — 잘못된 JSON, 파일 누락 또는 처리 오류 |
모니터링 대상 필드의 존재가 반드시 악용을 의미하지는 않습니다. 발견 사항은 추가 조사가 필요합니다.
파일: src/detection/dependency_detector.py
의존성 탐지기는 Python 환경을 검사하여 다음을 식별합니다:
kernels 패키지 버전kernels 패키지를 import할 수 있는지 여부사용법:
cd src/detection
python3 -m pip install packaging
python3 dependency_detector.py
시뮬레이션된 취약 환경에 대한 예시 출력:
=== CVE-2026-4372 Dependency Detection ===
Transformers version: 5.2.0
Kernels version: Not installed
Kernels import available: False
[WARNING] Vulnerable Transformers version detected.
[INFO] The optional kernels package is not available.
[ACTION] Upgrade Transformers to 5.3.0 or newer.
탐지기는 읽기 전용 검사를 수행하며 취약한 Transformers 버전을 설치하거나 실행하지 않습니다.
pip-audit 도구를 사용하여 취약한 버전과 패치된 Transformers 버전에 대해 공개된 보안 권고를 비교했습니다.
파일:
requirements-vulnerable.txt — Transformers 5.2.0requirements-patched.txt — Transformers 5.3.0명령:
cd src/detection
pip-audit --no-deps --disable-pip -r requirements-vulnerable.txt
pip-audit --no-deps --disable-pip -r requirements-patched.txt
pip-audit 2.10.1을 사용한 관찰 결과:
| Transformers 버전 | 보고된 취약점 항목 |
|---|---|
| 5.2.0 | 6 |
| 5.3.0 | 3 |
패치된 버전에서는 취약점 항목이 세 개 줄어든 것으로 나타났습니다. 그러나 Transformers 5.3.0에는 여전히 다른 보고된 취약점이 있었습니다. 이러한 감사 결과는 권고 데이터베이스가 업데이트됨에 따라 변경될 수 있습니다.
이 감사는 공개된 의존성 취약점을 식별하며, 악용 가능성을 독립적으로 입증하지는 않습니다.
파일: src/detection/test_detection.py
Python의 내장 unittest 프레임워크를 사용하여 8개의 단위 테스트를 구현했습니다.
테스트 범위:
auto_map 필드custom_pipelines 필드테스트 실행:
cd src/detection
python3 -m unittest -v test_detection.py
관찰된 결과:
Ran 8 tests
OK
격리된 Python 3.12 Docker 환경에서 8개 테스트가 모두 통과했습니다.
다른 컴포넌트와의 통합: