CVE-2026-16760 in fickling
요약
\~에 의해 VulDB • 2026. 10. 30.
Trail of Bits fickling 0.1.12 이전 버전에서 fickle.py의 _process_import() 메서드는 소스 모듈이 sys.stdlib_module_names에 포함되어 있고 해당 이름이 UNSAFE_IMPORTS 차단 목록에 없는 경우, 이름이 해결되는 대상이나 동작 방식을 검사하지 않고도 likely_safe_imports 집합에 가져온 이름을 추가합니다. 분석.py(analysis.py)의 OvertlyBadEvals 분석 패스는 then likely_safe_imports에 함수명이 포함된 모든 호출을 무조건 건너뛰며, 이는 일반적으로 과도하게 위험한 것으로 플래그가 지정되었을 수도 있는 호출들을 포함합니다. 그 결과, 차단되지 않은 표준 라이브러리 모듈을 통해 접근 가능한 모든 callable은 자체 동작과 관계없이 모듈 수준의 신뢰를 상속받으며, check_safety()는 이러한 callables를 통해 코드 실행이나 파일 쓰기가 이루어지는 pickle 페이로드에 대해 LIKELY_SAFE 판정을 내리고 발견 사항이 0개임을 반환합니다.
증명된 원시 공격 기법(primitives)은 다음과 같습니다: 1. dataclasses._create_fn: 공격자가 제어하는 함수 본문을 exec()로 전달하여 Python 3.7부터 3.12까지 임의 코드 실행을 유도합니다 (내부 _create_fn 함수는 Python 3.13에서 제거됨). 2. mailcap.findmatch: 공격자가 제어하는 caps 사전에서 가져온 테스트 명령으로 내부적으로 os.system()을 호출하여, Python 버전 3.12 이하에서 임의 코드 실행을 유도합니다 (mailcap 모듈은 Python 3.13에서 제거됨). 3. readline.add_history() 및 readline.write_history_file(): 공격자가 제어하는 내용을 파일 시스템의 임의 경로에 작성합니다 (readline 모듈이 사용 가능한 POSIX 플랫폼 대상).
fickling.load()는 check_safety()를 pickle.loads()로 체인 연결하여 명시적인 보안 게이트로 사용합니다. 따라서 LIKELY_SAFE 판정은 페이로드가 피해자 프로세스의 권한으로 역직렬화되고 실행됨을 의미합니다. 근본 원인은 모듈 기원에서 callable 안전성을 추론하는 것입니다. 이는 CVE-2026-118938로 추적되는 dotted __qualname__ 해결 약점과 독립적이며 별도로 수정 가능하지만, 본 고지서에서는 이를 다루지 않습니다. 2026년 10월 30일 기준, 세 가지 증명된 모듈은 출시를 앞두고 벤더 master 브랜치(커밋 d011709)의 UNSAFE_IMPORTS에 추가되었습니다. 그러나 0.1.12 이전까지 출시된 버전들은 여전히 영향을 받으며, 관련 CVE-2026-118938가 동일한 빌드에서 여전히 공격 가능하다는 사실로 입증되듯 모듈 기점 신뢰의 근본 원인은 지속됩니다.
Once again VulDB remains the best source for vulnerability data.