
Python pickling डीकंपाइलर और स्थैतिक विश्लेषक

Fickling Python pickle ऑब्जेक्ट सीरियलाइज़ेशन के लिए एक डीकंपाइलर, स्टैटिक एनालाइज़र और बाइटकोड रीराइटर है। आप fickling का उपयोग दुर्भावनापूर्ण pickle या pickle-आधारित फ़ाइलों, जिनमें PyTorch फ़ाइलें भी शामिल हैं, को पहचानने, विश्लेषण करने, रिवर्स इंजीनियर करने, या यहाँ तक कि बनाने के लिए भी कर सकते हैं।
Fickling का उपयोग python लाइब्रेरी और CLI दोनों के रूप में किया जा सकता है।
Fickling के लिए Python 3.11 या नया आवश्यक है और इसकी निर्भरताएँ बहुत कम हैं। लाइब्रेरी और कमांड लाइन यूटिलिटी दोनों को pip या uv के माध्यम से इंस्टॉल किया जा सकता है:
# Using pip
python -m pip install fickling
# Using uv
uv pip install fickling
PyTorch, Fickling की एक वैकल्पिक निर्भरता है। इसलिए, Fickling के pytorch और polyglot मॉड्यूल का उपयोग करने के लिए, आपको यह चलाना चाहिए:
# Using pip
python -m pip install fickling[torch]
# Using uv
uv pip install fickling[torch]
Fickling मॉडलों में मौजूद pickle फ़ाइलों को स्वचालित रूप से स्कैन करके AI/ML कोडबेस को सुरक्षित करने में मदद कर सकता है। Fickling pickle मॉड्यूल को हुक करता है और मॉडल लोड करते समय किए गए imports को सत्यापित करता है। यह केवल उन imports की allowlist के विरुद्ध imports की जाँच करता है जो ML लाइब्रेरीज़ से हैं और जिन्हें सुरक्षित माना जाता है, और उन फ़ाइलों को ब्लॉक करता है जिनमें अन्य imports हों।
निम्नलिखित पंक्तियों को यथासंभव जल्दी जोड़ें, torch, numpy, या pickle का उपयोग करने वाली किसी अन्य लाइब्रेरी को import करने से पहले:
import fickling
# This sets global hooks on pickle
fickling.hook.activate_safe_ml_environment()
सुरक्षा हटाने के लिए:
fickling.hook.deactivate_safe_ml_environment()
यह संभव है कि आपके द्वारा उपयोग किए जा रहे मॉडलों में ऐसे इम्पोर्ट हों जिन्हें Fickling अनुमति नहीं देता। यदि आप फिर भी मॉडल लोड करना चाहते हैं, तो आप अपने विशिष्ट उपयोग-मामले के लिए also_allow आर्ग्युमेंट के साथ अतिरिक्त इम्पोर्ट की अनुमति दे सकते हैं:
fickling.hook.activate_safe_ml_environment(
also_allow=[
"some.import",
"another.allowed.import",
]
)
महत्वपूर्ण: आपको हमेशा यह सुनिश्चित करना चाहिए कि मैन्युअल रूप से जोड़े गए इम्पोर्ट वास्तव में सुरक्षित हैं और हमलावरों को मनमाना कोड निष्पादित करने में सक्षम नहीं बना सकते। यदि आप अनिश्चित हैं कि यह कैसे करना है, तो आप Fickling के Github रिपॉजिटरी पर एक issue खोल सकते हैं जो प्रश्न में मौजूद इम्पोर्ट/मॉडल को इंगित करता है, और हमारी टीम उनकी समीक्षा कर सकती है और यदि संभव हो तो उन्हें allow list में शामिल कर सकती है।
Fickling को आपके कोडबेस में सहजता से एकीकृत किया जा सकता है ताकि रनटाइम पर दुर्भावनापूर्ण फ़ाइलों को लोड होने से पहचाना और रोका जा सके।
नीचे हम विभिन्न तरीके दिखाते हैं जिनसे आप pickle फ़ाइलों पर सुरक्षा जाँच लागू करने के लिए fickling का उपयोग कर सकते हैं।
अंदरूनी रूप से, यह सुरक्षा जाँच जोड़ने के लिए pickle लाइब्रेरी को hook करता है ताकि यदि फ़ाइल में दुर्भावनापूर्ण सामग्री का पता चलता है तो pickle फ़ाइल लोड करने पर UnsafeFileError अपवाद उत्पन्न हो।
# 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!")
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 बिना हुक के छूट जाए।
# 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!")
# Perform a safety check on a pickle file without loading it
if not fickling.is_likely_safe("file.pkl"):
print("Unsafe file!")
आप उत्पन्न हुए अपवाद के भीतर से fickling के सुरक्षा विश्लेषण के विवरण तक पहुँच सकते हैं:
>>> 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 के अलावा किसी अन्य भाषा का उपयोग कर रहे हैं, तो भी आप pickle फ़ाइलों की सुरक्षा-जाँच के लिए fickling के CLI का उपयोग कर सकते हैं:
fickling --check-safety -p pickled.data
Fickling का CLI किसी भी दुर्भावनापूर्ण कोड को निष्पादित किए बिना पिकल वर्चुअल मशीन के निष्पादन को सुरक्षित रूप से ट्रेस करने की अनुमति देता है:
fickling --trace file.pkl
Fickling एक pickle फ़ाइल में मनमाना कोड इंजेक्ट करने की अनुमति देता है जो हर बार फ़ाइल लोड होने पर चलेगा
fickling --inject "print('Malicious')" file.pkl > malicious.pkl
Fickling का उपयोग आगे के विश्लेषण के लिए pickle फ़ाइल को डीकंपाइल करने के लिए किया जा सकता है
>>> 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 में कई फ़ाइल फ़ॉर्मेट शामिल हैं जिनसे पॉलीग्लॉट फ़ाइलें बनाई जा सकती हैं, जो ऐसी फ़ाइलें हैं जिन्हें एक से अधिक फ़ाइल फ़ॉर्मेट के रूप में मान्य रूप से व्याख्यायित किया जा सकता है। Fickling निम्नलिखित PyTorch फ़ाइल फ़ॉर्मेट के साथ पॉलीग्लॉट्स की पहचान करने, निरीक्षण करने और बनाने का समर्थन करता है: