무슨 일이 있었나
Trail of Bits fickling 0.1.12까지, 점으로 구분된 __qualname__(예: 'Values.read_file')을 전달하는 pickle STACK_GLOBAL 피연산자는 pickle의 find_class가 _getattribute를 통해 모듈 수준 함수가 아닌 임의 속성 경로로 해석합니다. Fickling은 가져오기 추적에서 선행 구성 요소만 기록하므로 후행 속성 참조는 호출로 취급되거나 분석되지 않습니다. OvertlyBadEvals 분석 패스는 이를 플래그하지 않으며 check_safety()는 발견 사항 없이 LIKELY_SAFE를 반환합니다. optparse.Values.read_file에 도달하는 조작된 pickle은 fickling.load()를 통해 pickle이 로드될 때 exec(open(filename).read(), vars)를 실행합니다. 이는 명시적 보안 게이트로 check_safety()를 pickle.loads()에 연결합니다. 이는 모듈 출처 신뢰 약점 CVE-2026-16760과 구별되며, 2026-10-30 기준 커밋 d011709의 벤더 마스터 브랜치에 여전히 존재합니다. 2026-11-01 기준으로 완전한 수정이 확인되지 않았습니다.
왜 중요한가
Fickling은 신뢰할 수 없는 pickle/모델 파일을 검사하는 방어 도구입니다 — 정확히 ML 공급망(악성 .pkl/.pt 모델, pickle 훈련 체크포인트)의 무기화 경로입니다. 안전 게이트의 우회는 악성 모델 파일이 '안전'으로 승인된 후 ML 파이프라인에서 역직렬화될 때 임의 코드를 실행하여 방어자가 모델 로딩 격리에 의존하는 제어를 조용히 무력화함을 의미합니다. CVSS 8.8, 공식 패치 아직 없음.
공격 경로
공격자는 STACK_GLOBAL 피연산자가 점으로 구분된 속성 경로를 사용하여 fickling의 분석이 무관한 모듈 속성으로 해석하도록 pickle을 조작합니다. check_safety()는 LIKELY_SAFE를 반환하고, pickle이 역직렬화되어 파일 내용을 실행하는 클래스 메서드(optparse.Values.read_file)에 도달하여 애플리케이션 권한으로 임의 코드 실행을 달성합니다.
영향받는 시스템
Trail of Bits fickling <= 0.1.12 (2026-11-01 기준 완전한 수정 확인되지 않음)
완화 방안
현재 창 기준 공식 패치 없음; fickling 결과를 참고용으로 취급하십시오 — 스캐너 판정에 의존하여 신뢰할 수 없는 pickle을 역직렬화하지 말고, 실행 불가능한 직렬화 형식(예: safetensors)을 사용하며, 비밀 없이 모델 로딩을 샌드박스/격리하고, 점으로 구분된 속성 경로 해석을 다루는 수정 릴리스에 대해 Bombadil Systems / Trail of Bits를 모니터링하십시오.