FlawOpen

flawopen.com/असुरक्षित deserialization/Python pickle सुरक्षा

क्या Python का pickle.load() अविश्वसनीय डेटा के लिए सुरक्षित है?

CWE-502: अविश्वसनीय डेटा का deserializationसंदर्भ पृष्ठ
संक्षिप्त उत्तर

नहीं। pickle को निष्क्रिय रिकॉर्ड नहीं, पैकेट में आए प्रोग्राम की तरह समझें: लोड करते समय ऐप के ऑब्जेक्ट जाँचने से पहले पुनर्निर्माण व्यवहार चल सकता है। भरोसे की सीमा पार करने वाले इनपुट के लिए केवल-डेटा प्रारूप अपनाएँ।

असुरक्षित — अविश्वसनीय bytes लोड होते समय कोड चला सकते हैं
import pickle

# Never accept pickle bytes from a request, upload,
# shared cache, or other untrusted source.
obj = pickle.loads(untrusted_bytes)
अधिक सुरक्षित विकल्प — डेटा पढ़ें और schema जाँचें
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; असर इस पर निर्भर है कि हमलावर लोड होने वाले डेटा को दे या बदल सकता है।
चरण 1

अविश्वसनीय bytes pickle तक पहुँचते हैं

अपलोड, अनुरोध, cache या artifact हमलावर द्वारा नियंत्रित या बदला pickle डेटा प्रक्रिया में ला सकता है।

चरण 2

Unpickler globals खोजता है

इंटरप्रेटर पुनर्निर्माण निर्देश चलाता है; find_class() फ़ंक्शन समेत नामित globals आयात कर लौट सकता है।

चरण 3

लोडिंग व्यवहार चलाती है

load() या loads() के दौरान फ़ंक्शन बुलाए जा सकते हैं, लौटे ऑब्जेक्ट की जाँच से पहले।

चरण 4

असर प्रक्रिया के अधिकार पर निर्भर है

कोड 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 के दुष्ट डेटा को सुरक्षित नहीं बनाती। डेटा-केवल प्रारूप अपनाएँ।

अक्सर पूछे जाने वाले प्रश्न

क्या restricted Unpickler हमलावर-नियंत्रित pickle को सुरक्षित बनाता है?

find_class() बदलकर globals सीमित करने से जोखिम घट सकता है, लेकिन हर protocol और पहुँच योग्य व्यवहार में सुरक्षा सिद्ध करना कठिन है। उपयोगकर्ता bytes के लिए allow-list को डिफ़ॉल्ट रक्षा न मानें; डेटा-केवल प्रारूप लें।

क्या JSON को भी validate करना चाहिए?

हाँ। JSON decode pickle जैसी कोड-निष्पादन समस्या नहीं बनाता, फिर भी प्रकार, फ़ील्ड, आकार, मान और अनुमति जाँचें। JSON parsing और व्यावसायिक नियम अलग रखें।

प्राथमिक स्रोत

यह भी देखें असुरक्षित Deserialization: जोखिम और बचाव | flawopen.com क्या Ruby YAML.load सुरक्षित है? Psych संस्करण और safe_load .NET BinaryFormatter: जोखिम और माइग्रेशन Java ObjectInputStream सुरक्षा: डीसिरियलाइज़ेशन जोखिम घटाएँ Newtonsoft.Json TypeNameHandling: सुरक्षित सेटिंग PHP unserialize() और अविश्वसनीय इनपुट