Translated ['', 'src/generic-methodologies-and-resources/python/keras-mo

This commit is contained in:
Translator 2025-09-29 12:10:00 +00:00
parent f429a16ee4
commit ca15772bd9

View File

@ -1,19 +1,19 @@
# Keras Model Deserialization RCE और Gadget Hunting
# Keras Model Deserialization RCE and Gadget Hunting
{{#include ../../banners/hacktricks-training.md}}
यह पृष्ठ Keras मॉडल डेसिरियलाइजेशन पाइपलाइन के खिलाफ व्यावहारिक शोषण तकनीकों का सारांश प्रस्तुत करता है, मूल .keras प्रारूप के आंतरिक और हमले की सतह को समझाता है, और मॉडल फ़ाइल कमजोरियों (MFVs) और पोस्ट-फिक्स गैजेट्स खोजने के लिए एक शोधकर्ता टूलकिट प्रदान करता है।
यह पृष्ठ Keras model deserialization पाइपलाइन के खिलाफ practical exploitation techniques का सार देता है, नेटिव .keras फॉर्मेट के इंटरनल और attack surface को समझाता है, और Model File Vulnerabilities (MFVs) तथा post-fix gadgets खोजने के लिए शोधकर्ता टूलकिट प्रदान करता है।
## .keras मॉडल प्रारूप आंतरिक
## .keras model format internals
एक .keras फ़ाइल एक ZIP संग्रह है जिसमें कम से कम शामिल हैं:
- metadata.json सामान्य जानकारी (जैसे, Keras संस्करण)
- config.json मॉडल आर्किटेक्चर (प्राथमिक हमले की सतह)
- model.weights.h5 HDF5 में वजन
A .keras file is a ZIP archive containing at least:
- metadata.json सामान्य जानकारी (उदा., Keras संस्करण)
- config.json मॉडल आर्किटेक्चर (primary attack surface)
- model.weights.h5 weights HDF5 में
config.json पुनरावृत्त डेसिरियलाइजेशन को संचालित करता है: Keras मॉड्यूल आयात करता है, कक्षाओं/कार्यक्रमों को हल करता है और हमलावर-नियंत्रित शब्दकोशों से परतों/वस्तुओं का पुनर्निर्माण करता है।
The config.json drives recursive deserialization: Keras imports modules, resolves classes/functions and reconstructs layers/objects from attacker-controlled dictionaries.
Dense परत वस्तु के लिए उदाहरण स्निपेट:
Example snippet for a Dense layer object:
```json
{
"module": "keras.layers",
@ -32,21 +32,21 @@ Dense परत वस्तु के लिए उदाहरण स्नि
}
```
Deserialization performs:
- मॉड्यूल आयात और मॉड्यूल/क्लास_नाम कुंजी से प्रतीक समाधान
- from_config(...) या हमलावर-नियंत्रित kwargs के साथ कंस्ट्रक्टर का आह्वान
- नेस्टेड ऑब्जेक्ट्स (एक्टिवेशन, इनिशियलाइज़र, प्रतिबंध, आदि) में पुनरावृत्ति
- Module import और symbol resolution module/class_name keys से
- from_config(...) या constructor invocation attacker-controlled kwargs के साथ
- nested objects में recursion (activations, initializers, constraints, आदि)
ऐतिहासिक रूप से, इसने config.json तैयार करने वाले हमलावर के लिए तीन प्राइमिटिव्स को उजागर किया:
- यह नियंत्रित करना कि कौन से मॉड्यूल आयात किए जाते हैं
- यह नियंत्रित करना कि कौन से क्लास/फंक्शन हल किए जाते हैं
- यह नियंत्रित करना कि कंस्ट्रक्टर/ from_config में कौन से kwargs पास किए जाते हैं
Historically, this exposed three primitives to an attacker crafting config.json:
- किन modules को imported किया जाता है, उस पर नियंत्रण
- किन classes/functions को resolve किया जाता है, उस पर नियंत्रण
- constructors/from_config में पास किए जाने वाले kwargs पर नियंत्रण
## CVE-2024-3660 Lambda-layer bytecode RCE
Root cause:
- Lambda.from_config() ने python_utils.func_load(...) का उपयोग किया जो हमलावर बाइट्स पर base64-डिकोड करता है और marshal.loads() को कॉल करता है; Python unmarshalling कोड निष्पादित कर सकता है।
मूल कारण:
- Lambda.from_config() ने python_utils.func_load(...) का उपयोग किया, जो attacker bytes को base64-decode करता है और marshal.loads() को कॉल करता है; Python का unmarshalling कोड निष्पादित कर सकता है।
Exploit idea (config.json में सरलित पेलोड):
Exploit idea (simplified payload in config.json):
```json
{
"module": "keras.layers",
@ -60,19 +60,19 @@ Exploit idea (config.json में सरलित पेलोड):
}
}
```
Mitigation:
- Keras डिफ़ॉल्ट रूप से safe_mode=True लागू करता है। Lambda में सीरियलाइज्ड Python फ़ंक्शन को ब्लॉक किया गया है जब तक कि उपयोगकर्ता स्पष्ट रूप से safe_mode=False के साथ ऑप्ट आउट नहीं करता
निवारण:
- Keras डिफ़ॉल्ट रूप से safe_mode=True लागू करता है। Serialized Python functions in Lambda तब तक ब्लॉक रहती हैं जब तक उपयोगकर्ता स्पष्ट रूप से safe_mode=False सेट करके इस सुरक्षा को निष्क्रिय न करे
Notes:
- विरासती प्रारूप (पुराने HDF5 सहेजने) या पुराने कोडबेस आधुनिक जांचों को लागू नहीं कर सकते, इसलिए "डाउनग्रेड" शैली के हमले तब भी लागू हो सकते हैं जब पीड़ित पुराने लोडर्स का उपयोग करते हैं।
नोट्स:
- Legacy formats (older HDF5 saves) या पुराने codebases आधुनिक checks लागू नहीं कर सकते, इसलिए “downgrade” शैली के हमले तब भी लागू हो सकते हैं जब पीड़ित पुराने loaders का उपयोग करते हैं।
## CVE-2025-1550 Keras ≤ 3.8 में मनमाना मॉड्यूल आयात
Root cause:
- _retrieve_class_or_fn ने config.json से हमलावर-नियंत्रित मॉड्यूल स्ट्रिंग्स के साथ unrestricted importlib.import_module() का उपयोग किया।
- प्रभाव: किसी भी स्थापित मॉड्यूल (या sys.path पर हमलावर-रोपित मॉड्यूल) का मनमाना आयात। आयात-समय कोड चलता है, फिर ऑब्जेक्ट निर्माण हमलावर kwargs के साथ होता है।
मूल कारण:
- _retrieve_class_or_fn ने config.json से आने वाली हमलावर-नियंत्रित मॉड्यूल स्ट्रिंग्स के साथ unrestricted importlib.import_module() का उपयोग किया।
- प्रभाव: किसी भी इंस्टॉल किए गए मॉड्यूल (या sys.path पर हमलावर-द्वारा रखा गया मॉड्यूल) का मनमाना आयात। आयात-समय पर (import-time) कोड चलता है, फिर ऑब्जेक्ट निर्माण हमलावर-नियंत्रित kwargs के साथ होता है।
Exploit idea:
एक्सप्लॉइट आइडिया:
```json
{
"module": "maliciouspkg",
@ -81,15 +81,15 @@ Exploit idea:
}
```
सुरक्षा सुधार (Keras ≥ 3.9):
- मॉड्यूल अनुमति सूची: आधिकारिक पारिस्थितिकी तंत्र मॉड्यूल: keras, keras_hub, keras_cv, keras_nlp तक सीमित आयात
- सुरक्षित मोड डिफ़ॉल्ट: safe_mode=True असुरक्षित Lambda सीरियलाइज्ड-फंक्शन लोडिंग को ब्लॉक करता है
- बुनियादी प्रकार की जांच: डेसिरियलाइज्ड ऑब्जेक्ट्स को अपेक्षित प्रकारों से मेल खाना चाहिए
- मॉड्यूल allowlist: इम्पोर्ट्स आधिकारिक ecosystem मॉड्यूल तक सीमित: keras, keras_hub, keras_cv, keras_nlp
- Safe mode default: safe_mode=True असुरक्षित Lambda serialized-function लोडिंग को ब्लॉक करता है
- Basic type checking: deserialized objects को अपेक्षित प्रकारों से मेल खाना चाहिए
## अनुमति सूची के भीतर पोस्ट-फिक्स गैजेट सतह
## Post-fix gadget surface inside allowlist
अनुमति सूची और सुरक्षित मोड के साथ भी, अनुमत Keras कॉल करने योग्य के बीच एक व्यापक सतह बनी रहती है। उदाहरण के लिए, keras.utils.get_file मनचाहे URL को उपयोगकर्ता-चयन योग्य स्थानों पर डाउनलोड कर सकता है।
Allowlisting और safe mode होने के बावजूद, allowed Keras callables के बीच एक व्यापक सतह बनी रहती है। उदाहरण के लिए, keras.utils.get_file arbitrary URLs को user-selectable स्थानों पर डाउनलोड कर सकता है।
Lambda के माध्यम से गैजेट जो एक अनुमत फ़ंक्शन को संदर्भित करता है (सीरियलाइज्ड Python बाइटकोड नहीं):
Gadget via Lambda that references an allowed function (not serialized Python bytecode):
```json
{
"module": "keras.layers",
@ -105,19 +105,19 @@ Lambda के माध्यम से गैजेट जो एक अनु
}
}
```
महत्वपूर्ण सीमा:
- Lambda.call() लक्षित कॉल करने योग्य को कॉल करते समय इनपुट टेन्सर को पहले स्थिति तर्क के रूप में जोड़ता है। चुने गए गैजेट्स को अतिरिक्त स्थिति तर्क सहन करना चाहिए (या *args/**kwargs स्वीकार करना चाहिए)। यह उन कार्यों को सीमित करता है जो व्यवहार्य हैं।
Important limitation:
- Lambda.call() लक्ष्य callable को invoke करते समय input tensor को पहले positional argument के रूप में prepend करता है। चुने गए gadgets को एक अतिरिक्त positional arg सहन करना होगा (या *args/**kwargs स्वीकार करने होंगे)। यह निर्धारित करता है कि कौन से functions viable हैं।
अनुमत गैजेट्स के संभावित प्रभाव:
- मनमाना डाउनलोड/लेखन (पथ प्लांटिंग, कॉन्फ़िगरेशन विषाक्तता)
- नेटवर्क कॉलबैक/SSRF-जैसे प्रभाव वातावरण के आधार प
- यदि लिखे गए पथ बाद में आयात/निष्पादित किए जाते हैं या PYTHONPATH में जोड़े जाते हैं, या यदि एक लिखने योग्य निष्पादन-पर-लेखन स्थान मौजूद है तो कोड निष्पादन के लिए श्रृंखला बनाना
Potential impacts of allowlisted gadgets:
- Arbitrary download/write (path planting, config poisoning)
- Network callbacks/SSRF-like effects वातावरण पर निर्भ
- Chaining to code execution अगर लिखे गए paths बाद में import/executed किए जाते हैं या PYTHONPATH में जोड़े जाते हैं, या यदि कोई writable execution-on-write स्थान मौजूद है
## शोधकर्ता उपकरण किट
## Researcher toolkit
1) अनुमत मॉड्यूल में प्रणालीबद्ध गैजेट खोज
1) Systematic gadget discovery in allowed modules
keras, keras_nlp, keras_cv, keras_hub में उम्मीदवार कॉल करने योग्य की गणना करें और उन पर ध्यान केंद्रित करें जिनमें फ़ाइल/नेटवर्क/प्रक्रिया/पर्यावरण साइड इफेक्ट्स हैं।
Enumerate candidate callables across keras, keras_nlp, keras_cv, keras_hub and prioritize those with file/network/process/env side effects.
```python
import importlib, inspect, pkgutil
@ -160,9 +160,9 @@ candidates.append(text)
print("\n".join(sorted(candidates)[:200]))
```
2) डायरेक्ट डेसिरियलाइजेशन परीक्षण (कोई .keras आर्काइव की आवश्यकता नहीं)
2) डायरेक्ट डिसिरियलाइज़ेशन टेस्टिंग (कोई .keras आर्काइव आवश्यक नहीं)
Keras डेसिरियलाइजर्स में तैयार किए गए डिक्ट्स को सीधे फीड करें ताकि स्वीकृत पैरामीटर सीखे जा सकें और साइड इफेक्ट्स का अवलोकन किया जा सके
स्वनिर्मित dicts को सीधे Keras deserializers में फीड करें ताकि स्वीकार्य params जानें और साइड-इफेक्ट्स का अवलोकन कर सकें
```python
from keras import layers
@ -178,24 +178,65 @@ cfg = {
layer = layers.deserialize(cfg, safe_mode=True) # Observe behavior
```
3) क्रॉस-वर्जन प्रोबिंग और फॉर्मेट्स
3) क्रॉस-वर्ज़न जांच और फॉर्मैट्स
Keras विभिन्न कोडबेस/युगों में विभिन्न गार्डरेल्स और फॉर्मेट्स के साथ मौजूद है:
- TensorFlow बिल्ट-इन Keras: tensorflow/python/keras (विरासत, हटाने के लिए निर्धारित)
- tf-keras: अलग से बनाए रखा गया
- मल्टी-बैकेंड Keras 3 (आधिकारिक): मूल .keras पेश किया गया
Keras कई कोडबेस/पीढ़ियों में मौजूद है जिनमें अलग-अलग सुरक्षा नियंत्रण और फॉर्मैट होते हैं:
- TensorFlow built-in Keras: tensorflow/python/keras (legacy, हटाने के लिए सूचीबद्ध)
- tf-keras: अलग से मेंटेन किया जाता है
- Multi-backend Keras 3 (official): native .keras पेश किया गया
कोडबेस और फॉर्मेट्स (.keras बनाम विरासत HDF5) के बीच परीक्षण दोहराएं ताकि रिग्रेशन या गायब गार्ड्स का पता लगाया जा सके
रिग्रेशन या गायब गार्ड्स का पता लगाने के लिए अलग-अलग कोडबेस और फॉर्मैट (.keras बनाम legacy HDF5) में टेस्ट दोहराएँ
## डिफेंसिव सिफारिशें
## Defensive recommendations
- मॉडल फ़ाइलों को अविश्वसनीय इनपुट के रूप में मानें। केवल विश्वसनीय स्रोतों से मॉडल लोड करें।
- Keras को अद्यतित रखें; allowlisting और प्रकार जांच के लाभ के लिए Keras ≥ 3.9 का उपयोग करें।
- जब तक आप फ़ाइल पर पूरी तरह से भरोसा न करें, तब तक मॉडल लोड करते समय safe_mode=False न सेट करें।
- विचार करें कि डेसिरियलाइजेशन को एक सैंडबॉक्स, कम-से-कम विशेषाधिकार वाले वातावरण में चलाया जाए जिसमें नेटवर्क एग्रेस न हो और फ़ाइल सिस्टम तक सीमित पहुंच हो।
- जहां संभव हो, मॉडल स्रोतों और अखंडता जांच के लिए allowlists/हस्ताक्षर लागू करें।
- मॉडल फ़ाइलों को अविश्वसनीय इनपुट मानें। केवल विश्वसनीय स्रोतों से मॉडल लोड करें।
- Keras को अपडेट रखें; allowlisting और टाइप चेक्स का लाभ उठाने के लिए Keras ≥ 3.9 का उपयोग करें।
- जब तक आप फ़ाइल पर पूरी तरह भरोसा न करें, मॉडल लोड करते समय safe_mode=False न सेट करें।
- डिसिरियलाइज़ेशन को सैंडबॉक्स्ड, न्यूनतम-प्रिविलेज वाले वातावरण में चलाने पर विचार करें जिसमें नेटवर्क egress बंद हो और फाइल सिस्टम एक्सेस सीमित हो।
- जहां संभव हो, मॉडल स्रोतों के लिए allowlists/signatures और इंटीग्रिटी चेक लागू करें।
## संदर्भ
## ML pickle import allowlisting for AI/ML models (Fickling)
कई AI/ML मॉडल फॉर्मैट (PyTorch .pt/.pth/.ckpt, joblib/scikit-learn, पुराने TensorFlow artifacts, आदि) में Python pickle डेटा एम्बेड रहता है। हमला करने वाले अक्सर pickle के GLOBAL imports और object constructors का दुरुपयोग करके लोड के दौरान RCE या मॉडल स्वैपिंग कर लेते हैं। blacklist-आधारित स्कैनर नए या अनलिस्टेड खतरनाक इम्पोर्ट्स को अक्सर मिस कर देते हैं।
एक व्यावहारिक fail-closed रक्षा यह है कि Python के pickle deserializer को हुक किया जाए और unpickling के दौरान केवल समीक्षा की गई, हानिरहित ML-संबंधित इम्पोर्ट्स के सेट की अनुमति दी जाए। Trail of Bits Fickling इस नीति को लागू करता है और हजारों सार्वजनिक Hugging Face pickles से बनाए गए एक क्यूरेटेड ML import allowlist के साथ आता है।
Security model for “safe” imports (research और practice से निकाली गई अभिरुचियाँ): pickle द्वारा उपयोग किए गए imported symbols को एक साथ निम्नलिखित शर्तें पूरी करनी चाहिए:
- कोड निष्पादित न करें और निष्पादन न कराएँ (कोई compiled/source code objects, shelling out, hooks, आदि नहीं)
- arbitrary attributes या items get/set न करें
- pickle VM से अन्य Python objects के references import या प्राप्त न करें
- किसी भी सेकेंडरी deserializers (जैसे marshal, nested pickle) को ट्रिगर न करें, भले ही अप्रत्यक्ष रूप से ही क्यों न हो
प्रोसेस स्टार्टअप में जितना जल्दी हो सके Ficklings protections सक्षम करें ताकि frameworks (torch.load, joblib.load, आदि) द्वारा किए जाने वाले किसी भी pickle लोड को चेक किया जा सके:
```python
import fickling
# Sets global hooks on the stdlib pickle module
fickling.hook.activate_safe_ml_environment()
```
ऑपरेशनल टिप्स:
- आप जहाँ आवश्यक हो hooks को अस्थायी रूप से disable/re-enable कर सकते हैं:
```python
fickling.hook.deactivate_safe_ml_environment()
# ... load fully trusted files only ...
fickling.hook.activate_safe_ml_environment()
```
- यदि कोई known-good model ब्लॉक हो गया है, तो प्रतीकों की समीक्षा करने के बाद अपने environment के लिए allowlist बढ़ाएँ:
```python
fickling.hook.activate_safe_ml_environment(also_allow=[
"package.subpackage.safe_symbol",
"another.safe.import",
])
```
- Fickling अतिरिक्त generic runtime guards भी उपलब्ध कराता है, अगर आप अधिक बारीक नियंत्रण चाहते हैं:
- fickling.always_check_safety() सभी pickle.load() के लिए चेक लागू करने के लिए
- with fickling.check_safety(): स्कोप्ड प्रवर्तन के लिए
- fickling.load(path) / fickling.is_likely_safe(path) एक-बार के चेक के लिए
- संभव हो तो non-pickle model formats का उपयोग करें (e.g., SafeTensors)। अगर आपको pickle स्वीकार करना ही है, तो loaders को least privilege में चलाएँ, network egress बंद रखें और allowlist लागू करें।
This allowlist-first strategy demonstrably blocks common ML pickle exploit paths while keeping compatibility high. In ToBs benchmark, Fickling flagged 100% of synthetic malicious files and allowed ~99% of clean files from top Hugging Face repos.
## References
- [Hunting Vulnerabilities in Keras Model Deserialization (huntr blog)](https://blog.huntr.com/hunting-vulnerabilities-in-keras-model-deserialization)
- [Keras PR #20751 Added checks to serialization](https://github.com/keras-team/keras/pull/20751)
@ -203,5 +244,11 @@ Keras विभिन्न कोडबेस/युगों में वि
- [CVE-2025-1550 Keras arbitrary module import (≤ 3.8)](https://nvd.nist.gov/vuln/detail/CVE-2025-1550)
- [huntr report arbitrary import #1](https://huntr.com/bounties/135d5dcd-f05f-439f-8d8f-b21fdf171f3e)
- [huntr report arbitrary import #2](https://huntr.com/bounties/6fcca09c-8c98-4bc5-b32c-e883ab3e4ae3)
- [Trail of Bits blog Ficklings new AI/ML pickle file scanner](https://blog.trailofbits.com/2025/09/16/ficklings-new-ai/ml-pickle-file-scanner/)
- [Fickling Securing AI/ML environments (README)](https://github.com/trailofbits/fickling#securing-aiml-environments)
- [Fickling pickle scanning benchmark corpus](https://github.com/trailofbits/fickling/tree/master/pickle_scanning_benchmark)
- [Picklescan](https://github.com/mmaitre314/picklescan), [ModelScan](https://github.com/protectai/modelscan), [model-unpickler](https://github.com/goeckslab/model-unpickler)
- [Sleepy Pickle attacks background](https://blog.trailofbits.com/2024/06/11/exploiting-ml-models-with-pickle-file-attacks-part-1/)
- [SafeTensors project](https://github.com/safetensors/safetensors)
{{#include ../../banners/hacktricks-training.md}}