본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
AI supply chain security; AI 공급망 보안
AI 시스템이 외부에서 가져와 쓰는 모델·데이터셋·라이브러리·도구가 변조되거나 악성이지 않은지 확인하고 추적하는 일

AI 공급망 보안(AI supply chain security)은 AI 시스템을 이루는 외부 구성 요소, 곧 사전 학습 모델과 가중치 파일, 어댑터, 학습·미세 조정 데이터셋, ML 프레임워크와 라이브러리, 추론 서버, 에이전트가 쓰는 도구와 플러그인의 무결성과 출처를 관리하는 일이다. 일반 소프트웨어의 공급망 공격 대책(SBOM, 코드 서명, 의존성 관리)을 그대로 이어받되, AI에만 있는 구성 요소 때문에 새 문제가 생긴다.

AI 공급망이 따로 다뤄지는 이유는 세 가지다. 첫째, 모델 파일은 데이터처럼 보이지만 흔한 저장 형식(pickle)은 불러오는 순간 코드를 실행할 수 있다. 둘째, 가중치 수십억 개는 사람이 검토할 수 없어서, 학습 데이터 오염이나 미세 조정으로 심은 백도어를 코드 검토처럼 찾아낼 방법이 없다. 셋째, 대부분의 조직이 허깅 페이스 같은 공개 허브의 모델과 웹에서 모은 데이터셋에 기대고 있어 한 곳의 오염이 넓게 퍼진다.

MITRE ATLAS의 AI 공급망 침해(AI Supply Chain Compromise, AML.T0010)는 하드웨어, AI 소프트웨어, 데이터, 모델 네 가지 하위 기법으로 나뉜다. 별도로 불러오거나 실행할 때 해를 끼치는 안전하지 않은 AI 산출물(Unsafe AI Artifacts, AML.T0011.000)을 두는데, 직렬화된 모델뿐 아니라 채팅 템플릿, 토크나이저 메타데이터, 설정, 전처리·후처리 로직도 포함한다. 정상 구성 요소로 신뢰를 얻은 뒤 악성 판으로 바꾸는 러그 풀(AML.T0109)도 있다.[1]

다른 분류 체계에서의 위치는 다음과 같다.

체계 항목
OWASP Top 10 for LLM Applications LLM03:2025 공급망(2026년판 LLM04)
OWASP Machine Learning Security Top 10 ML06 AI 공급망 공격
OWASP Top 10 for Agentic Applications ASI04 에이전트 공급망 취약점
NIST AI 100-2 E2025 공격 목표 중 공급망(NISTAML.05)
안전한 AI 시스템 개발 가이드라인 안전한 개발 단계의 "공급망 보호", "자산 식별·추적·보호", "데이터·모델·프롬프트 문서화"

구성 요소별 위험

편집 원본 편집

OWASP LLM03:2025가 드는 취약점을 구성 요소별로 정리하면 다음과 같다.[2]

구성 요소 위험 예
모델 파일 역직렬화 코드 실행, 변조된 가중치 허브에 올라온 pickle 악성 모델(아래 사례)
사전 학습 모델 숨은 백도어·편향, 안전 장치 제거 후 재배포, 출처 위장 가중치를 고쳐 거짓 정보를 퍼뜨리게 한 PoisonGPT 시연, 내려간 모델 이름으로 다시 올린 가짜 WizardLM
어댑터 악성 LoRA 어댑터를 기반 모델에 병합 공유 병합·변환 서비스 악용
모델 부속 파일 채팅 템플릿·설정에 숨긴 지시 GGUF 채팅 템플릿에 트리거를 심어 가중치를 건드리지 않고 출력과 도구 사용을 바꾼 시연(18개 모델, 추론 엔진 4종)[3]
데이터셋 학습 데이터 오염, 라이선스 문제 아래 데이터셋 절
프레임워크·라이브러리 오래되거나 취약한 패키지, 악성 의존성 인증 없는 원격 실행 API가 인터넷에 노출된 Ray 클러스터를 장악한 ShadowRay(인공지능 관련 해킹 사례 참고)
모델 이름 공간 삭제·이전된 작성자 이름을 공격자가 다시 차지 아래 사례
에이전트 도구 악성 MCP 서버, 도구 설명 오염 툴 포이즈닝 문서 참고
패키지 추천 LLM이 지어낸 패키지 이름 선점 슬롭스쿼팅 문서 참고
기기 내 모델 앱을 역공학해 모델을 바꿔치기 구글 플레이 앱 116개가 영향을 받은 연구 사례

모델 파일 형식

편집 원본 편집

파이토치의 전통적 저장 형식(.bin, .pt, .pth, .ckpt)은 ZIP 안에 파이썬 pickle을 담는다. 파이썬 공식 문서는 pickle 모듈이 안전하지 않으며, 역직렬화 중에 임의 코드를 실행하는 악성 데이터를 만들 수 있으니 신뢰할 수 없는 데이터는 절대 풀지 말라고 경고한다.[4]

원리는 __reduce__다. 객체를 저장할 때 이 메서드가 "호출할 함수와 인자" 튜플을 돌려주면 pickle은 그 함수 이름과 인자를 파일에 기록하고, 불러올 때 그 함수를 그대로 호출해 객체를 복원한다. 함수가 무엇이든 상관없다.

import pickle, pickletools

class Payload:
    def __reduce__(self):
        # 실제 공격에서는 os.system, subprocess.Popen, exec 등이 들어간다
        return (print, ("불러오기만 해도 실행된다",))

data = pickle.dumps(Payload(), protocol=2)
pickletools.dis(data)   # 실행하지 않고 명령어만 본다
pickle.loads(data)      # 이 순간 print가 호출된다

pickletools.dis의 출력에는 GLOBAL '__builtin__ print'와 REDUCE 명령이 보인다. 허깅 페이스의 pickle 검사기(picklescan)도 이렇게 파일을 실행하지 않고 명령어를 읽어 위험한 임포트를 찾는다.[5] 다만 차단 목록 방식이라 우회 가능성이 남는다.

대응: 가중치 전용 로딩과 safetensors

편집 원본 편집
  • 파이토치 2.6부터 torch.load는 pickle_module을 따로 주지 않으면 weights_only=True로 동작한다. 텐서와 기본 자료형 등 허용된 타입만 복원하고, 그 밖의 전역 객체는 torch.serialization.add_safe_globals로 명시해야 한다. 공식 문서는 이것이 원격 코드 실행 공격면을 줄일 뿐이고 서비스 거부 공격은 막지 못한다고 적는다.[6] 위 Payload를 넣은 체크포인트를 weights_only=True로 불러오면 UnpicklingError가 난다.
  • safetensors는 JSON 헤더(텐서 이름·자료형·모양·위치)와 원시 바이트만 담아 불러올 때 코드를 실행하지 않는다. 2023년 외부 보안 감사 뒤 허깅 페이스 Transformers의 기본 저장 형식이 되었다. 구조와 감사 내용은 허깅 페이스 문서 참고.
import torch
from safetensors.torch import save_file, load_file

save_file({"weight": torch.zeros(2, 2)}, "model.safetensors")
state = load_file("model.safetensors")                    # 코드 실행 경로 없음
legacy = torch.load("old.pt", weights_only=True)          # pickle 파일은 가중치 전용으로
  • 형식을 바꿔도 모델 코드 자체를 내려받아 실행하는 경로는 남는다. 허깅 페이스 Transformers에서 trust_remote_code=True를 주면 저장소의 파이썬 모델링 코드를 실행하므로, 신뢰할 수 있는 저장소에서 특정 커밋으로 고정해 써야 한다. 2026년 7월 허깅 페이스 내부 침입도 데이터셋 처리 과정의 원격 코드 데이터셋 로더와 템플릿 인젝션이라는 코드 실행 경로에서 시작했다.[7]
시기 내용
2024년 2월 JFrog가 허깅 페이스에서 불러오면 리버스 셸을 여는 악성 pickle 모델들을 보고했다.[8]
2025년 2월 리버싱랩스(ReversingLabs)가 picklescan을 피한 악성 모델 2개를 발견해 "nullifAI"라고 이름 붙였다. 파이토치 기본 ZIP 대신 7z로 압축하고 pickle 스트림 중간을 일부러 깨뜨려, 검사기는 파일 오류만 보고 앞부분의 위험한 호출을 놓쳤다. pickle은 명령을 차례로 실행하므로 깨진 지점 전에 리버스 셸이 실행되었다. 허깅 페이스는 24시간 안에 모델을 내리고 picklescan을 고쳤다.[9]
2025년 9월 팔로알토 네트웍스 Unit 42가 모델 이름 공간 재사용 공격을 공개했다. 허깅 페이스에서 삭제되거나 이전된 작성자 이름을 공격자가 다시 등록해 옛 작성자/모델명 경로에 악성 모델을 올리면, 그 경로를 고정하지 않고 참조하던 구글 버텍스 AI·애저 AI 파운드리 모델 카탈로그에서 배포 시 코드가 실행되었다.[10]
2025년 9월 npm의 가짜 postmark-mcp 패키지가 정상 판으로 사용자를 모은 뒤 악성 판으로 바꿔 메일을 빼냈다.[11]

코드 서명처럼 모델에도 서명해 "누가 만든 어떤 파일인지"를 검증하려는 움직임이 있다. 대표적인 것이 Sigstore와 OpenSSF가 함께 만든 model-transparency 프로젝트의 model_signing 도구다. 2025년 4월 4일 1.0.0이 나왔다.[12]

  • 모델 디렉터리의 파일마다 해시를 계산해 경로·해시 목록(매니페스트)을 만들고, 이를 in-toto 진술로 감싸 DSSE 봉투에 넣어 서명한 뒤 Sigstore 번들(JSON)로 저장한다.
  • 서명 방식은 Sigstore(OIDC 로그인과 투명성 로그를 써서 키 관리가 필요 없다)가 기본이고, 개인 키, 인증서, PKCS #11 장치도 지원한다.
  • 검증할 때는 서명을 확인한 다음 파일 해시를 다시 계산해 서명된 값과 비교한다.[12]
pip install model-signing
model_signing sign bert-base-uncased --signature model.sig      # Sigstore로 서명
model_signing verify bert-base-uncased --signature model.sig \
    --identity "$identity" --identity-provider "$oidc_provider"

서명은 파일이 바뀌지 않았고 누가 서명했는지를 보장할 뿐, 서명한 쪽의 학습 데이터에 백도어가 없다는 것까지 보장하지는 않는다.

AI-BOM(AI 자재 명세서, AIBOM)은 SBOM을 AI 구성 요소로 넓힌 것이다. 모델, 데이터셋, 학습 설정, 의존성을 기계가 읽을 수 있게 기록해 취약점이나 오염이 발견되었을 때 영향을 받는 시스템을 찾게 한다.

표준 AI 지원 시작 내용
CycloneDX 1.5(2023년 6월) 구성 요소 유형에 머신러닝 모델과 데이터를 두고, 모델 카드(modelCard: 모델 매개변수, 정량 분석, 고려 사항)를 붙인다. OWASP 계열 표준으로 이를 ML-BOM이라 부른다[13]
SPDX 3.0(2024년 4월) AI 프로필(AIPackage: 자율성 유형, 도메인, 에너지 소비, 하이퍼파라미터, 한계, 안전 위험 평가, 민감 개인정보 사용 여부 등)과 데이터셋 프로필(DatasetPackage: 수집 과정, 전처리, 익명화 방법, 알려진 편향, 민감 개인정보 포함 여부 등)을 추가했다[14]

OWASP는 서명된 SBOM과 AI/ML BOM으로 구성 요소와 라이선스를 추적하라고 권한다.[2] AI용 SBOM 최소 요소에 관한 정부 지침은 SBOM 문서 참고.

데이터셋 출처

편집 원본 편집

웹에서 모은 데이터셋은 URL 목록 형태로 배포되는 경우가 있어, 목록을 만든 뒤 도메인이 만료되면 공격자가 그 도메인을 사서 내용을 바꿀 수 있다. Carlini 외 연구진은 2023년 이런 분할 보기 중독(split-view poisoning)으로 60달러만 들여 LAION-400M이나 COYO-700M의 0.01%를 오염시킬 수 있었다고 밝혔고, 위키백과처럼 주기적으로 스냅숏을 뜨는 데이터셋은 스냅숏 직전에 편집을 넣는 선행 중독(frontrunning poisoning)이 가능하다고 보였다.[15] 대책은 내려받은 내용의 해시를 데이터셋과 함께 배포해 검증하는 것이다. 오염 공격 자체는 데이터 오염 공격 문서 참고.

데이터 쪽 문서화로는 데이터 출처, 수집 과정, 라이선스, 해시를 담는 데이터 카드와 위 SPDX 데이터셋 프로필을 쓸 수 있다. 영국 NCSC 등의 가이드라인은 모델·데이터셋·시스템 프롬프트의 생성과 수명 주기를 문서화하고, 학습 데이터 출처, 의도한 범위와 한계, 암호 해시나 서명을 기록하라고 권하며 모델 카드, 데이터 카드, SBOM을 예로 든다.[16]

대응 체크리스트

편집 원본 편집
단계 할 일
선택 검증된 출처의 모델·데이터만 쓴다. 공급자의 보안 수준과 약관(입력 데이터 학습 사용 여부)을 확인한다.[2] 제3자 모델은 자기 용도에 맞춰 직접 평가·레드티밍한다(벤치마크 점수는 조작될 수 있다)
가져오기 safetensors 등 코드 실행이 없는 형식을 우선하고, pickle은 weights_only=True로 읽는다. 원격 코드 실행 옵션은 끈다. 서명과 해시를 검증하고, 저장소 경로 대신 커밋 해시로 고정한다
보관 내부 모델 레지스트리와 미러를 두고, 모델·데이터·프롬프트·로그를 자산으로 버전 관리한다. 침해 후 알려진 정상 상태로 되돌릴 수 있게 한다[16]
추적 AI-BOM을 만들고 서명한다. 구성 요소 취약점과 라이선스를 지속적으로 점검한다
실행 모델 로딩·변환·데이터 처리 작업을 격리된 환경에서 최소 권한으로 돌린다. 공급망 증명 추적에는 SLSA 같은 틀을 쓸 수 있다[16]