flawopen.com/असुरक्षित deserialization/Python pickle सुरक्षा
क्या Python का pickle.load() अविश्वसनीय डेटा के लिए सुरक्षित है?
नहीं। pickle को निष्क्रिय रिकॉर्ड नहीं, पैकेट में आए प्रोग्राम की तरह समझें: लोड करते समय ऐप के ऑब्जेक्ट जाँचने से पहले पुनर्निर्माण व्यवहार चल सकता है। भरोसे की सीमा पार करने वाले इनपुट के लिए केवल-डेटा प्रारूप अपनाएँ।
import pickle # Never accept pickle bytes from a request, upload, # shared cache, or other untrusted source. obj = pickle.loads(untrusted_bytes)
import json
def parse_profile(raw: bytes) -> dict[str, str]:
if len(raw) > 65_536:
raise ValueError("Payload too large")
try:
value = json.loads(raw)
except (json.JSONDecodeError, UnicodeDecodeError):
raise ValueError("Invalid JSON") from None
if not isinstance(value, dict) or set(value) - {"display_name", "theme"}:
raise ValueError("Invalid profile")
name = value.get("display_name")
theme = value.get("theme")
if not isinstance(name, str) or len(name) > 80:
raise ValueError("Invalid display name")
if theme not in {"light", "dark"}:
raise ValueError("Invalid theme")
return {"display_name": name, "theme": theme}
- Pickle stream:
- Python-विशिष्ट bytes क्रम जो ऑब्जेक्ट पुनर्निर्माण बताता है, जिसमें globals के संदर्भ और पुनर्निर्माण व्यवहार शामिल हैं।
- Unpickling:
- stream को समझकर ऑब्जेक्ट ग्राफ़ पुनः बनाना; इस दौरान फ़ंक्शन बुलाए जा सकते हैं।
- Trust boundary:
- वह बिंदु जहाँ उपयोगकर्ता, सेवा, अपलोड या साझा स्टोरेज bytes नियंत्रित या बदल सकता है।
- CWE-502:
- अविश्वसनीय डेटा का deserialization; असर इस पर निर्भर है कि हमलावर लोड होने वाले डेटा को दे या बदल सकता है।
अविश्वसनीय bytes pickle तक पहुँचते हैं
अपलोड, अनुरोध, cache या artifact हमलावर द्वारा नियंत्रित या बदला pickle डेटा प्रक्रिया में ला सकता है।
Unpickler globals खोजता है
इंटरप्रेटर पुनर्निर्माण निर्देश चलाता है; find_class() फ़ंक्शन समेत नामित globals आयात कर लौट सकता है।
लोडिंग व्यवहार चलाती है
load() या loads() के दौरान फ़ंक्शन बुलाए जा सकते हैं, लौटे ऑब्जेक्ट की जाँच से पहले।
असर प्रक्रिया के अधिकार पर निर्भर है
कोड Python प्रक्रिया के अधिकार से चलता है। नेटवर्क, secrets, फ़ाइल पहुँच और isolation प्रभाव तय करते हैं।
pickle लोड करना code-execution सीमा क्यों पार करता है
pickle stream globals और पुनर्निर्माण फ़ंक्शन नामित कर सकता है। Unpickling के दौरान Unpickler.find_class() फ़ंक्शन समेत globals खोजता है; opcodes पुनर्निर्माण चला सकते हैं। जोखिम वाला कदम स्वयं pickle.load() या pickle.loads() है; बाद में अलग execute कॉल नहीं चाहिए। कोड प्रक्रिया के अधिकार से चलता है। यह प्रारूप का दस्तावेज़ित व्यवहार है; अविश्वसनीय डेटा के आदान-प्रदान में pickle न लें।
JSON क्या ठीक करता है और क्या नहीं
Python दस्तावेज़ बताता है कि अविश्वसनीय या बदला pickle लोड करने से मनमाना कोड चल सकता है, जबकि JSON decode स्वयं ऐसा code-execution रास्ता नहीं बनाता। JSON अपने आप इनपुट validate नहीं करता: आकार सीमित करें, अपेक्षित शीर्ष-स्तरीय प्रकार और फ़ील्ड अनिवार्य करें, schema से मान जाँचें और authorization अलग करें। पुराने सिस्टम में pickle जरूरी हो तो लोड करने से पहले सुरक्षित key से ठीक उन्हीं bytes को authenticate करें; signature केवल key की धारणाओं के अंतर्गत स्रोत और अखंडता सिद्ध करती है और विश्वसनीय signer के दुष्ट डेटा को सुरक्षित नहीं बनाती। डेटा-केवल प्रारूप अपनाएँ।
- ✓अनुरोध, अपलोड, साझा cache या अज्ञात स्रोत वाले artifact सँभालने वाले रास्तों से
pickle.load()औरpickle.loads()हटाएँ। - ✓JSON या अन्य डेटा-केवल प्रारूप लें; आकार, schema, स्वीकृत फ़ील्ड, मान-सीमाएँ और endpoint authorization लागू करें।
- ✓यदि भरोसेमंद आंतरिक प्रक्रिया अस्थायी रूप से pickle रखे, तो लोड से पहले ठीक bytes का HMAC/signature जाँचें, key सुरक्षित रखें और प्रक्रिया के अधिकार घटाएँ।
- ✓कोड और डेटा प्रवाह में pickle उपयोग खोजें; हर स्रोत को कौन बदल सकता है पहचानें और जोखिमयुक्त उपयोग हटाएँ या अलग करें।
अक्सर पूछे जाने वाले प्रश्न
find_class() बदलकर globals सीमित करने से जोखिम घट सकता है, लेकिन हर protocol और पहुँच योग्य व्यवहार में सुरक्षा सिद्ध करना कठिन है। उपयोगकर्ता bytes के लिए allow-list को डिफ़ॉल्ट रक्षा न मानें; डेटा-केवल प्रारूप लें।
हाँ। JSON decode pickle जैसी कोड-निष्पादन समस्या नहीं बनाता, फिर भी प्रकार, फ़ील्ड, आकार, मान और अनुमति जाँचें। JSON parsing और व्यावसायिक नियम अलग रखें।
प्राथमिक स्रोत
- Python दस्तावेज़ — pickle सुरक्षा चेतावनी और restricted globals
- Python दस्तावेज़ — JSON decoder
- CWE-502 — अविश्वसनीय डेटा का deserialization