Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
fickling — Pythonのpicklingデコンパイラおよび静的解析ツール | Kitploit
ツール/GitHubGitHub/trailofbits/fickling
静的分析脆弱性分析コード分析マルウェア分析バイナリ解析サプライチェーンセキュリティ機械学習AIセキュリティ
GitHubtrailofbits/fickling

fickling

Pythonのpicklingデコンパイラおよび静的解析ツール

リポジトリを見る
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 モジュールにフックし、モデルの読み込み時に行われるインポートを検証します。安全と見なされる 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",
    ]
)

重要: 手動で追加したインポートが実際に安全であり、攻撃者が任意のコードを実行できるようにならないことを常に確認してください。その方法がわからない場合は、該当するインポート/モデルを示す issue を Fickling の GitHub リポジトリに開いてください。可能であれば、チームがそれらを確認し、許可リストに含めます。

一般的な悪意のあるファイルの検出

Fickling はコードベースにシームレスに統合でき、実行時に悪意のあるファイルの読み込みを検出して停止できます。

以下では、pickle ファイルに対して安全性チェックを適用するために fickling を使用できるさまざまな方法を示します。内部では 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 コードに逆コンパイルできます。このコードを実行すると、元のシリアライズされたオブジェクトにデシリアライズされます。これは、Fickling による PM のカスタム実装によって可能になります。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.

ツールをダウンロード