Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
fickling — Python pickle 反编译器与静态分析器 | Kitploit
工具/GitHubGitHub/trailofbits/fickling
静态分析漏洞分析代码分析恶意软件分析二进制分析供应链安全机器学习AI 安全
GitHubtrailofbits/fickling

fickling

Python pickle 反编译器与静态分析器

查看仓库
663754天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Fickling

Fickling 图片

Fickling 是一个用于 Python pickle 对象序列化的反编译器、静态分析器和字节码重写器。你可以使用 fickling 来检测、分析、逆向工程,甚至创建恶意的 pickle 或基于 pickle 的文件,包括 PyTorch 文件。

Fickling 既可以作为 Python 库使用,也可以作为 CLI 使用。

  • 安装
  • 保护 AI/ML 环境
  • 通用恶意文件检测
  • 高级用法
    • 跟踪 pickle 执行
    • Pickle 代码注入
    • Pickle 反编译
    • PyTorch 多格式文件(polyglots)
  • 更多信息
  • 联系方式

安装

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 模块,并在加载模型时验证导入操作。它仅对照 ML 库中视为安全的导入白名单检查导入,并阻止包含其他导入的文件。

尽早添加以下代码行,在导入 torch、numpy 或任何其他使用 pickle 的库之前:

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 不允许的导入。如果你仍然想加载该模型,可以通过 also_allow 参数为你的特定用例添加额外允许的导入:

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

重要:你应该始终确保手动添加的导入实际上是安全的,并且不能让攻击者执行任意代码。如果你不确定如何做到这一点,你可以在 Fickling 的 Github 仓库上提交一个 issue,说明有问题的导入/模型,我们的团队可以审查它们,并在可能的情况下将其加入白名单。

通用恶意文件检测

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 多格式文件(polyglots)

PyTorch 包含多种文件格式,可以用这些格式制作多格式文件(polyglot files),这些文件可以被有效地解释为不止一种文件格式。Fickling 支持识别、检查和使用以下 PyTorch 文件格式创建多格式文件(polyglots):

  • 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 或更高(2 个 pickle 文件和一个文件夹)的 ZIP 文件
  • PyTorch v1.3:包含 data.pkl(1 个 pickle 文件)的 ZIP 文件
  • PyTorch 模型存档格式 [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 代码;这些代码在执行时将反序列化为原始的序列化对象。这得益于 Fickling 对 PM 的自定义实现。Fickling 可以安全地运行在可能有恶意文件上,因为其 PM 是符号执行代码,而不是直接执行代码。

作者对 Fickling 中的“F”不赋予任何含义;它可以代表“fickle(善变的)”,……或者其他什么。解读其含义是一段个人判断之旅,留给读者作为练习。

在我们的博客文章和 DEF CON AI Village 2021 演讲中了解更多关于 fickling 的信息。

联系方式

如果你想提交错误报告或功能请求,请使用我们的 issues 页面。欢迎联系我们或在 Empire Hacking 中寻求使用或扩展 fickling 的帮助。

许可证

该工具由 Trail of Bits 开发。它根据 GNU 宽通用公共许可证 v3.0 授权。如果你需要条款的例外情况,请联系我们。

© 2021, Trail of Bits.

下载工具