Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Track 1] 공급망 공격 시대의 안전한 패키지 및 모델 반입 전략 - Reser...

Avatar for Lablup Inc. Lablup Inc.
October 16, 2026
7

[Track 1] 공급망 공격 시대의 안전한 패키지 및 모델 반입 전략 - Reservoir & Reservoir Model

우리는 매일 인터넷에서 오픈소스 패키지와 AI 모델을 받아 그 자리에서 실행하지만, 그 사이에 검증 단계는 없습니다. xz-utils 백도어나 LiteLLM 공급망 공격 사건처럼 정상적인 이름과 경로로 배포된 패키지에 악성코드가 심어지는 공급망 공격(supply chain attack)이 AI 시대 들어 더욱 빈번해지고 있습니다. 특히 AI 모델은 데이터처럼 보이지만 로드하는 순간 코드가 실행될 수 있습니다. 그래서 "받아서 바로 실행하지 말고, 검사한 뒤 반입해서 실행한다"는 원칙이 필요합니다. 공급망 공격 시대의 안전한 패키지 및 모델 반입을 위한 솔루션인 Backend.AI Reservoir와 Reservoir Model 서비스를 소개합니다.

Avatar for Lablup Inc.

Lablup Inc.

October 16, 2026

More Decks by Lablup Inc.

Transcript

  1. 공급망 공격 시대의 안전한 패키지 및 모델 반입 전략 Backend.AI

    Reservoir 성대현 래블업 / Software Engineer Reservoir AI
  2. 1 우리는 매일 낯선 코드를 실행합니다 2 모델은 데이터가 아닙니다

    3 원칙 검사한 후 반입 한다 4 Backend.AI Reservoir 공급망 공격은 실시간으로 진행됨 xz utils, PyPI의 수 많은 악성코드 포함된 패키지 가중치 파일을 로드하는 순간, 코드가 실행될 수 있다 그 검사는 사람이 아니라 인프라가 해야 한다 Reservoir AI 검사를 통과한 패키지 및 모델을 반입 및 배포함
  3. 받아서 바로 실행하는 습관 다음 명령어의 공통점 _ 검증 단계가

    없음 apt install pip install from_pretrained() Ubuntu 저장소에서 시스템 패키지 PyPI에서 패키지 HuggingFace서 모델다운로드 후 실행 설치 중 스크립트가 root로 실행 setup.py 실행 공통점 가중치 역직렬화 인터넷에서 코드를 받아 그 자리에서 실행한다. 그리고 그 사이에 이 아티팩트가 안전한가 를 확인하는 단계가 없다. 이름이 맞고 설치가 되면 끝. 출처를 믿는 것은 검사가 아니다. 코드
  4. 공급망 공격 Supply Chain Attack 이란? • 정상적인 이름과 경로로

    배포된 패키지에 악성코드가 심어지는 공격 • • 공격자는 우리가 이미 신뢰하는 소프트웨어의 업데이트 경로를 이용한다 왜 AI시대에 더 빈번해지고 있나? ① 오픈소스 생태계의 폭발적 확산 • 누구나 올리고, 모두가 받음 _ 공격자에게도 열린 공급망 ② AI/ML개발 환경의 복잡화 • 모델 하나 돌리는데 수 백 개의 의존성이 딸려온다 ③ 깊어진 의존성 체인 • 직접 확인하지 않는 코드의 비중이 압도적으로 커짐
  5. 정상적인 이름으로 정상적인 경로로 왔음 오픈소스 멀웨어 현황과 4가지 공격

    유형 공통점: 정상적인 이름으로, 정상적인 경로로 받은 패키지가 공격 수단 900 2,800 매일 새로 올라오는 패키지 최근 1년간 리포트된 멀웨어 40 50 버전 락킹 부재가 원인인 공격 타이포스쿼팅 계정 탈취 의존성 혼동 업스트림 오염 Typosquatting Account Takeover Dependency Confusion Upstream Compromise 이름을 헷갈리게 만들어 오타 설치를 노 림 계정을 뺏어 정상 패키지를 변조 내부 패키지 명을 공개 저장소에 선점함 예 LiteLLM, Lightnings 예 torchtriton 빌드 CI/CD 단계에서 소스 코드 자체를 변조함 예 aiotools 정상 오타 aiotoolsbox 예 Ultralytics
  6. 실제 사례 타이포스쿼팅 Typosquatting 의 예 · Detecting Malicious Packages

    on PyPI Malicious package on PyPI use phishing techniques to hide its malicious intent https://blog.checkpoint.com/2023/03/18/detecting malicious packages on pypi malicious package on pypi use phishing techniques to hide its malicious intent/
  7. 서명이 있어도 업스트림이 오염되면 통과된다 • xz utils 백도어 CVE

    2024 3094 • 무손실 압축 라이브러리에 백도어가 들어간 사건 • Jia Tan이라는 사람이 2년 넘게 성실히 기여하여 신뢰를 쌓음 • 메인테이너 권한 획득 릴리즈 tarball에만 백도어 삽입 • Git 소스엔 안보이고, 빌드 스크립트가 테스트 데이터로 위장한 페이로드를 조립 • 특정 조건에서 sshd 인증 우회 RCE • Stable 버전 배포 직전 SSH지연을 눈치챈 엔지니어가 우연히 발견 • 계정 탈취가 아닌 신뢰 자체를 장기적으로 획득한 업스트림 오염 Upstream Compromise 의 사례 • 소스, 빌드에 숨은 시그니쳐 스캔만으로는 잡기 어렵다 • 쿨 다운 Cool down , 재검사, 행위 관측 등 다층 방어가 필요함
  8. 서명이 있어도 업스트림이 오염되면 통과된다 • LiteLLM 공급망 공격 •

    이름, 경로 전부 정상인데 당한 사례 • 타이포스쿼팅도 피싱도 아님 • PyPI Repository에서 3시간 만에 격리됨: 그러나 3시간 동안 다운로드는 이미 발생됨 유출된 배포 토큰으로 진짜 릴리즈 채널에 배포됨 배포 토큰 유출 악성 버전 배포 개발자 설치 CI 설정 오류로 토큰이 외부 노출 정상 PyPI 채널로 1.82.7 업로드 pip install litellm 평소와 똑같이 애플리케이션 실행 악성코드 동작 import litellm 실행 환경을 뒤진다
  9. pip install package name • 악성코드가 들어간 패키지를 실행한다면 •

    • pip install package name 설치할 때 악성 코드 실행 sdist import할 때 악성 코드 실행 - whl 파일 · sdist(.tar.gz): 소스 + 빌드 레시피 · 설치: 내 머신에서 setup.py 실행 → setup.py는 그냥 파이썬 스크립트다 · 맞는 휠이 없으면 pip는 조용히 sdist로 폴백 · .whl 파일: 빌드가 끝난 결과물 · 설치 시점에는 아무 코드도 실행되지 않는다 · 하지만 import 하는 순간 __init__.py 실행 · 만약, whl파일 안에 **.pth 파일이 들어있다면 import 없이도, 파이썬이 뜰 때마다 실행 “Building wheel for …” 패키지 코드가 실행됨 예시 · Lazarus : __init__.py 가 XOR DLL 자동 실행 · Lightning 2.6.2 : import 시 11MB 난독화 JS 실행 방어 방법 ① 설치할때 only binary :all: whl파일로만 설치 빌드 스크립트가 아예 돌지 않음 ② import 할 때 실행을 막을 수 없음. 설치하기 전에 .whl파일 버전, 해시 고정 반입 전 검사 v 예외 .pth파일은 import없이도, 파이썬이 시작할때마다 실행 예. Shai Hulud 웜 공격 수법
  10. 로드 load 만 해도 코드가 실행된다 • Pickle 역직렬화를 통한

    임의 코드 실행 RCE • 모델은 데이터 라는 통념이 위험함 • 모델 다운로드는 사실상 코드 실행 무엇이 문제인가 import pickle, os class MaliciousPayload: def __reduce__(self): # 역직렬화 시 실행될 명령어(예: 시스템 명령어 실행) return (os.system, ("calc.exe",)) # 계산기 실행 # 악성 페이로드 직렬화 bad_data = pickle.dump(MaliciousPayload()) # 서버 측에서 신뢰할 수 없는 데이터를 unpickle할 경우 RCE 발생 pickle.load(bad_data) 모델 가중치는 직렬화 포맷으로 저장 역직렬화 때 __reduce__ 호출을 그대로 실행 객체를 load 하는 것만으로 코드 실행 공식 문서도 신뢰할 수 없는 데이터에 안전하지 않다 고 경고
  11. 안전한 포맷을 골랐다고 안전한 것이 아님 • 스캐너 미탐 우회

    • HuggingFace에서 다음의 스캐너를 사용 • VirusTotal • Jflog • ProtectAI • ClamAV • HF Picklescan 정상 모델 zai org/GLM 5.3 Flash 스캐너 탐지 사례 ykilcher/totally harmless model 스캐너 미탐 사례 SiggytheShark/pickle bypass mailcap indirect rce
  12. 안전한 포맷을 골랐다고 안전한 것이 아님 trust remote code True

    safetensors는 가중치 숫자 텐서 만 저 장 • 표준 아키텍처 BERT, Llama 등 사용시 transformers 라이브러리 사용 • 커스텀, 신규 아키텍처 DiffusionPipeline.from pretrained author/repo Load repository configuration • AI모델 제작자가 modelling xxx.py 를 레포지토리에 넣음 이때 trust remote code True 를 써야함 참고 • OWASP Seoul 6월 세미나 ML Supply Chain Attacks:Defending with Artifact Firewall 표상영 / 토스 https://www.youtube.com/watch?v CGK 5hczuHKw • FaceHugger: Vulnerabilities in Hugging Face Diffusers Open Door to Supply Chain Attacks on Enterprise AI https://www.zafran.io/resources/facehug ger vulnerabilities in hugging face diffusers open door to supply chain attacks on enterprise ai Custom pipeline? No Load built in Diffusers pipeline Yes trust remote code No Stop loading Raise ValueError Yes Execute custom pipeline code
  13. 받아서 바로 실행하지 말고, 검사한 뒤 반입해서 실행하라 • 왜

    인프라가 해야하는가? ✕ 설치 전에 매번 검사하세요 시간이 걸린다 개발자가 평소처럼 도구가 없다 apt install / pip install / from_pretrained() 무엇보다 급할 때 건너뛴다 사람의 주의력에 기댄 정책은 지켜지지 않는다. • 인프라의 기본 동작으로 만든다 패키지 검사를 반입 할 때 진행한다 실행 요청하면, 이미 검사를 통과한 아티팩트만 받게 되는 구조. 즉, 아티팩트 방화벽 Artifact Firewall 이 필요
  14. 받아서 바로 실행하지 말고, 검사한 뒤 반입해서 실행하라 • 반입

    관문 아티팩트 방화벽 Artifact Firewall : 다운로드와 실행 사이에 멀웨어 검사를 한다 받아서 바로 위험함 인터넷 저장소 그 자리에서 실행 PyPI · apt · AI Model ✕ 검사 단계 없음 통과 원칙 인터넷 저장소 PyPI · apt · AI Model 아티팩트 방화벽 Artifact Firewall 악성 코드 스캐너 V3 ClamScan 등등 멀웨어 및 의심 파일 • 격리 및 판정 확인 개발자가 멀웨어 검사 통과한 패키지만 설치하도록 하면 내부 반입 실행
  15. Backend.AI Reservoir의 실제 반입 사례 일반적인 사이트 반입 • 인터넷망으로

    사이트 담당자에게 Repository 반입 • 고객사이트에서 보안 검토 완료 후 사이트 내로 반입 • 고객사 내 Backend.AI session 및 개발PC에서 Reservoir 저장소 사용 완전 단절망 Air Gapped Network 업데이트 • 외부망과의 직접 연결 지양 • Update 파일 공유 후 고객사 인력에 의해 내부 반입 진 행 담당자가 직접 검사 진행 • 지정한 특정 위치에 해당 업데이트 파일을 넣으면 Reservoir 업데이트 적용 • 고객사 내 Backend.AI session 및 개발PC에서 Reservoir 저장소 사용
  16. Disk 반입 실제 사례 • 에어 갭 Air gapped 환경에서

    수 많은 하드디스크를 직접 반입 반입 후 파쇄 처리됨
  17. Reservoir • Backend.AI 클러스터 내부/외부를 대상으로 한 독립 패키지 저장소

    및 업데이트 서비스 • 로컬 패키지 저장소 서비스 • 격리된 네트워크 내 올인원 오프라인 서비스 구축 • 여러 패키지를 검사를 한 후 인터넷이나 폐쇄망으로 반입 • 검사 엔진: V3 clamscan • 지원가능 패키지 저장소 • AlmaLinux • Ubuntu • CRAN • PyPI • conda
  18. Reservoir AI • 모델 공급망 제공 • Model Reservoir는 HuggingFace,

    외부 Model Reservoir 서버 등에서 모델을 다운로드하여 로 컬 스토리지에 보관하고 관리 • • 모델 중앙 관리: 외부 소스에서 모델을 다운로드하여 로컬 스토리지에서 통합 관리 • 모델 탐색: 외부 소스 HuggingFace 등 에서 가용 모델 검색 지원 • 모델 다운로드 위임 Delegation : DMZ 환경의 Reservoir에서 모델의 다운로드를 외부 Reservoir로 위임 반입 관문에서 이중 엔진으로 검사한 모델만 배포함 • 검사 엔진: V3 sophos • 규제 산업 폐쇄망에서 실제 운영함 • 규제산업 금융, 공공 등 은 이미 AI 모델을 어떻게 안전하게 들여올 것인가? 를 요구함
  19. Reservoir AI 구조 • 고객사 내부 관리자가 외부망 접속 PC를

    이용하여 엔터프라이즈 고객 전용 Reservoir AI Model Catalog 확인 및 반입 신청 • 모델 Artifact의 반입절차 • • 저장매체 직접 전달, 등기 소포 / 별도 절차를 통한 인터넷 기반 다운로드 / 방화벽 허용 가능한 경우 어플라이언스가 직접 다운로드 pull Artifact 반입 후 DMZ의 검증 및 캐시 어플라이언스에 연결 • 어플라이언스 상에서 2차 검토 및 승인 진행 / 필요한 경우 고객 측 추가 보안검사 절차 수행 • 2차 승인 완료하면 캐시 스토리지에 들어있는 모델 연동 스토리지로 복제 checksum 검사, audit log 기록
  20. 받아서 바로 실행하지 말고, 검사한 뒤 반입하라 • 패키지 및

    모델 검사 없이 반입 및 실행은 위험함 _ 출처를 믿는 것은 검사가 아님 • 패키지 및 모델 다운로드 채널 마다 위험이 다름 • 모델은 데이터가 아님 _ pickle, trust remote code • 단일 스캐너 검사는 우회가 가능: 이중 엔진 교차 검증 • 검사는 사람이 아니라 인프라 _ Backend.AI Reservoir 오탐 False Positive 관리 Reservoir AI
  21. Q A