Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
fickling — Python 피클링 디컴파일러 및 정적 분석기 | Kitploit
도구/GitHubGitHub/trailofbits/fickling
Static AnalysisVulnerability AnalysisCode AnalysisMalware AnalysisBinary AnalysisSupply Chain SecurityMachine LearningAI Security
GitHubtrailofbits/fickling

fickling

Python 피클링 디컴파일러 및 정적 분석기

저장소 보기
663754일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Fickling

Fickling 이미지

Fickling은 Python pickle 객체 직렬화를 위한 디컴파일러, 정적 분석기, 바이트코드 재작성기입니다. Fickling을 사용하면 PyTorch 파일을 포함한 악성 pickle 또는 pickle 기반 파일을 탐지, 분석, 리버스 엔지니어링하거나 생성할 수 있습니다.

Fickling은 Python 라이브러리와 CLI로 모두 사용할 수 있습니다.

  • 설치
  • AI/ML 환경 보안
  • 일반적인 악성 파일 탐지
  • 고급 사용법
    • pickle 실행 추적
    • pickle 코드 주입
    • pickle 디컴파일
    • PyTorch 폴리글롯
  • 추가 정보
  • 연락처

설치

Fickling은 Python 3.9부터 Python 3.13까지 테스트되었으며 의존성이 매우 적습니다. 라이브러리와 명령줄 유틸리티는 모두 pip 또는 uv를 통해 설치할 수 있습니다:

root@kitploit:~
# Using pip
python -m pip install fickling

# Using uv
uv pip install fickling

PyTorch는 Fickling의 선택적 의존성입니다. 따라서 Fickling의 pytorch 및 polyglot 모듈을 사용하려면 다음을 실행해야 합니다:

root@kitploit:~
# Using pip
python -m pip install fickling[torch]

# Using uv
uv pip install fickling[torch]

AI/ML 환경 보안

Fickling은 모델에 포함된 pickle 파일을 자동으로 스캔하여 AI/ML 코드베이스의 보안을 지원할 수 있습니다. Fickling은 pickle 모듈에 훅을 걸고 모델을 로드할 때 수행되는 import를 검증합니다. 안전한 것으로 간주되는 ML 라이브러리의 import 허용 목록에 대해서만 import를 확인하며, 다른 import가 포함된 파일은 차단합니다.

다음 줄을 가능한 한 빨리, torch, numpy 또는 pickle을 사용하는 다른 라이브러리를 import하기 전에 추가하세요:

root@kitploit:~
import fickling

# This sets global hooks on pickle
fickling.hook.activate_safe_ml_environment()

보호를 해제하려면:

root@kitploit:~
fickling.hook.deactivate_safe_ml_environment()

사용 중인 모델에 Fickling이 허용하지 않는 import가 포함되어 있을 수 있습니다. 그래도 모델을 로드하려면 also_allow 인자를 사용하여 특정 사용 사례에 맞는 추가 import를 간단히 허용할 수 있습니다:

root@kitploit:~
fickling.hook.activate_safe_ml_environment(
    also_allow=[
        "some.import",
        "another.allowed.import",
    ]
)

중요: 수동으로 추가한 import가 실제로 안전하고 공격자가 임의 코드를 실행할 수 없도록 항상 확인해야 합니다. 확인 방법이 확실하지 않은 경우, 문제의 import/모델을 명시하여 Fickling의 GitHub 저장소에 이슈를 열 수 있으며, 저희 팀이 검토 후 가능하면 허용 목록에 포함할 수 있습니다.

일반적인 악성 파일 탐지

Fickling은 코드베이스에 원활하게 통합되어 런타임에 악성 파일의 로드를 탐지하고 중지할 수 있습니다.

아래에서는 fickling을 사용하여 pickle 파일에 안전성 검사를 적용할 수 있는 다양한 방법을 보여줍니다. 내부적으로 pickle 라이브러리에 훅을 걸어 안전성 검사를 추가하므로, 파일에서 악성 콘텐츠가 감지되면 pickle 파일을 로드할 때 UnsafeFileError 예외가 발생합니다.

옵션 1 (권장): 로드된 모든 pickle 파일의 안전성 검사

root@kitploit:~
# This enforces safety checks every time pickle is used to deserialize
fickling.always_check_safety()

# Attempt to load an unsafe file now raises an exception
with open("file.pkl", "rb") as f:
    try:
        pickle.load(f)
    except fickling.UnsafeFileError:
        print("Unsafe file!")

옵션 2: 컨텍스트 매니저 사용

root@kitploit:~
with fickling.check_safety():
    # All pickle files loaded within the context manager are checked for safety
    try:
        with open("file.pkl", "rb") as f:
            pickle.load("file.pkl")
    except fickling.UnsafeFileError:
        print("Unsafe file!")

# Files loaded outside of context manager are NOT checked
pickle.load("file.pkl")

종료 시 컨텍스트 매니저는 진입했을 때 설치되어 있던 상태를 복원하므로, 이미 설치된 훅은 pickle이 훅 해제된 채 남는 대신 계속 적용됩니다.

옵션 3: 단일 파일 검사 및 로드

root@kitploit:~
# Use fickling.load() in place of pickle.load() to check safety and load a single pickle file
try:
    fickling.load("file.pkl")
except fickling.UnsafeFileError as e:
    print("Unsafe file!")

옵션 4: 로드하지 않고 pickle 파일 안전성만 검사

root@kitploit:~
# Perform a safety check on a pickle file without loading it
if not fickling.is_likely_safe("file.pkl"):
    print("Unsafe file!")

안전성 분석 결과 접근

발생한 예외 내에서 fickling의 안전성 분석 세부 정보에 접근할 수 있습니다:

root@kitploit:~

>>> try:
...     fickling.load("unsafe.pkl")
... except fickling.UnsafeFileError as e:
...     print(e.info)

{
    "severity": "OVERTLY_MALICIOUS",
    "analysis": "Call to `eval(b'[5, 6, 7, 8]')` is almost certainly evidence of a malicious pickle file. Variable `_var0` is assigned value `eval(b'[5, 6, 7, 8]')` but unused afterward; this is suspicious and indicative of a malicious pickle file",
    "detailed_results": {
        "AnalysisResult": {
            "OvertlyBadEval": "eval(b'[5, 6, 7, 8]')",
            "UnusedVariables": [
                "_var0",
                "eval(b'[5, 6, 7, 8]')"
            ]
        }
    }
}

Python이 아닌 다른 언어를 사용하는 경우에도 fickling의 CLI를 사용하여 pickle 파일의 안전성을 검사할 수 있습니다:

root@kitploit:~
fickling --check-safety -p pickled.data

고급 사용법

pickle 실행 추적

Fickling의 CLI는 악성 코드를 실행하지 않고 Pickle 가상 머신의 실행을 안전하게 추적할 수 있게 해줍니다:

root@kitploit:~
fickling --trace file.pkl

pickle 코드 주입

Fickling은 파일이 로드될 때마다 실행될 임의의 코드를 pickle 파일에 주입할 수 있게 해줍니다

root@kitploit:~
fickling --inject "print('Malicious')" file.pkl > malicious.pkl

pickle 디컴파일

Fickling은 추가 분석을 위해 pickle 파일을 디컴파일하는 데 사용할 수 있습니다

root@kitploit:~
>>> import ast, pickle
>>> from fickling.fickle import Pickled
>>> fickled_object = Pickled.load(pickle.dumps([1, 2, 3, 4]))
>>> print(ast.dump(fickled_object.ast, indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='result', ctx=Store())],
            value=List(
                elts=[
                    Constant(value=1),
                    Constant(value=2),
                    Constant(value=3),
                    Constant(value=4)],
                ctx=Load()))],
    type_ignores=[])

PyTorch 폴리글롯

PyTorch에는 폴리글롯 파일을 만드는 데 사용할 수 있는 여러 파일 형식이 포함되어 있습니다. 폴리글롯 파일이란 둘 이상의 파일 형식으로 유효하게 해석될 수 있는 파일입니다. Fickling은 다음 PyTorch 파일 형식으로 폴리글롯을 식별, 검사 및 생성하는 것을 지원합니다:

  • PyTorch v0.1.1: sys_info, pickle, storages 및 tensors가 포함된 Tar 파일
  • PyTorch v0.1.10: 적층된 pickle 파일
  • TorchScript v1.0: model.json이 포함된 ZIP 파일
  • TorchScript v1.1: model.json 및 attributes.pkl이 포함된 ZIP 파일
  • TorchScript v1.3: data.pkl 및 constants.pkl이 포함된 ZIP 파일
  • TorchScript v1.4: data.pkl, constants.pkl 및 버전이 2 이상으로 설정된 ZIP 파일 (pickle 파일 2개와 폴더 1개)
  • PyTorch v1.3: data.pkl을 포함하는 ZIP 파일 (pickle 파일 1개)
  • PyTorch model archive format[ZIP]: Python 코드 파일과 pickle 파일을 포함하는 ZIP 파일
root@kitploit:~
>> import torch
>> import torchvision.models as models
>> from fickling.pytorch import PyTorchModelWrapper
>> model = models.mobilenet_v2()
>> torch.save(model, "mobilenet.pth")
>> fickled_model = PyTorchModelWrapper("mobilenet.pth")
>> print(fickled_model.formats)
Your file is most likely of this format:  PyTorch v1.3
['PyTorch v1.3']

fickling 사용에 대해 더 알아보려면 저희 예제를 확인하세요!

추가 정보

Pickle된 Python 객체는 사실 Python에 내장된 스택 기반 가상 머신인 "Pickle Machine"이 해석하는 바이트코드입니다. Fickling은 pickle된 데이터 스트림을 가져와 사람이 읽을 수 있는 Python 코드로 디컴파일할 수 있으며, 이 코드를 실행하면 원래 직렬화된 객체로 역직렬화됩니다. 이는 PM에 대한 Fickling의 맞춤 구현 덕분에 가능합니다. Fickling의 PM은 코드를 명시적으로 실행하는 대신 기호적으로 실행하므로 잠재적으로 악성인 파일에 대해 실행해도 안전합니다.

저자들은 Fickling의 "F"에 어떤 의미도 부여하지 않습니다. "변덕스러운(fickle)"을 의미할 수도 있고… 다른 무엇일 수도 있습니다. 그 의미를 알아내는 것은 각자의 재량에 달린 개인적인 여정이며, 독자의 몫으로 남겨둡니다.

fickling에 대해 더 자세히 알아보려면 블로그 게시물과 DEF CON AI Village 2021 발표를 확인하세요.

연락처

버그 신고나 기능 요청을 원하시면 issues 페이지를 이용해 주세요. fickling 사용 또는 확장에 대한 도움이 필요하면 Empire Hacking에서 저희에게 연락하거나 문의하세요.

라이선스

이 유틸리티는 Trail of Bits에서 개발했습니다. GNU Lesser General Public License v3.0에 따라 라이선스가 부여됩니다. 약관에 대한 예외가 필요한 경우 문의해 주세요.

© 2021, Trail of Bits.

도구 다운로드