The confused deputy
आपके एजेंट के पास ऐसी ताकतें हैं जो आपके यूज़र के पास नहीं हैं। एक हमलावर जो खुद कोई दरवाज़ा नहीं खोल सकता, वह बस एजेंट से उसे अपने लिए खोलने को कहता है।
60 सेकंड में
The confused deputy
आपके एजेंट के पास ऐसी ताकतें हैं जो आपके यूज़र के पास नहीं हैं। एक हमलावर जो खुद कोई दरवाज़ा नहीं खोल सकता, वह बस एजेंट से उसे अपने लिए खोलने को कहता है।
व्यवहार में यह कैसे दिखता है
- 1
मल्टी-टेनेंट लीकेज
एक एजेंट केवल एक डेटाबेस कनेक्शन से हर कस्टमर को सेवा देता है। कस्टमर A "मेरे हाल के ऑर्डर्स" के बारे में इस तरह पूछता है जिससे क्वेरी का दायरा बढ़ जाता है, और उसे कस्टमर B के ऑर्डर्स दिखने लगते हैं। डेटाबेस से विनम्रता से पूछा गया था और उसने ईमानदारी से जवाब दिया। - 2
प्रिविलेज सीढ़ी (Privilege ladder)
एक सपोर्ट एजेंट पासवर्ड रीसेट कर सकता है क्योंकि यह सपोर्ट का काम है। एक यूज़र बातों में उलझाकर उससे एक एडमिन का पासवर्ड रीसेट करवा लेता है। टूल ने बिल्कुल वैसे ही काम किया जैसा उसे बताया गया था। - 3
इंटरनल नेटवर्क तक पहुँच
आपका एजेंट नेटवर्क के अंदर चलता है और इंटरनल सर्विसेज तक पहुँच सकता है। एक इंजेक्ट किए गए निर्देश से वहhttp://internal-admin/से डेटा लाता है और उस पेज की समरी बना देता है। यह सर्वर-साइड रिक्वेस्ट फोर्जरी (SSRF) है, जो आपके अपने एजेंट ने की। - 4
शेयर्ड कैश पॉइज़निंग
तेज़ रहने के लिए एक एजेंट नतीजों को कैश (cache) कर लेता है। एक यूज़र का दूषित (poisoned) परिणाम अगले यूज़र को दिखा दिया जाता है। अब यह हमला अपने आप फैलने लगता है।
समाधान: यूज़र की पहचान साथ रखें, एजेंट की नहीं
- बहुत सारे अधिकारों वाला एक सर्विस अकाउंट।
- एजेंट तय करता है कि वह किस यूज़र की तरफ से काम कर रहा है।
- परमिशन की जाँच प्रॉम्प्ट में होती है।
- लॉग्स दिखाते हैं "एजेंट ने X काम किया" बिना किसी जुड़े हुए यूज़र के।
- असली एंड यूज़र तक सीमित (scoped) पर-रिक्वेस्ट टोकन।
- रनटाइम यूज़र की पहचान तय करता है; मॉडल इसे बदल नहीं सकता।
- परमिशन की जाँच डेटाबेस और API लेयर में होती है।
- लॉग्स दिखाते हैं "एजेंट ने यूज़र 4471 की तरफ से X काम किया"।
और देखें और पढ़ें
लैब
आपके अपने मल्टी-टेनेंट एजेंट के खिलाफ एक confused-deputy हमला, फिर उसका समाधान।
समस्या
# WRONG: one connection, model chooses the filter
def search_orders(query, customer_id=None):
sql = "SELECT * FROM orders"
if customer_id:
sql += f" WHERE customer_id = '{customer_id}'"
return db.execute(sql)
# RIGHT: identity pinned by the runtime, invisible to the model
def search_orders_scoped(query, *, caller_id):
return db.execute(
"SELECT * FROM orders WHERE customer_id = %s AND description ILIKE %s",
(caller_id, f"%{query}%"),
)आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1customer_id केवल रनटाइम आर्ग्युमेंट क्यों होना चाहिए, न कि ऐसा टूल पैरामीटर जिसे मॉडल भरता है?दिखाएं
Q2आपका एजेंट VPC के अंदर चलता है और उसके पास फ़ेच टूल है। हमले का नाम और मायने रखने वाले दो कंट्रोल बताएं।दिखाएं
http://169.254.169.254/ (क्लाउड मेटाडेटा, जिसमें अक्सर रोल क्रेडेंशियल्स होते हैं) या किसी इंटरनल एडमिन सर्विस से डेटा मँगवाता है, और नतीजे की समरी बनवाता है। कंट्रोल्स: नेटवर्क लेयर पर लिंक-लोकल और प्राइवेट रेंज को ब्लॉक करें, टूल में केवल URL चेक करके नहीं — और IMDSv2 अनिवार्य करें या इंस्टेंस क्रेडेंशियल्स पूरी तरह हटा दें। URL पर लगाया गया regex किसी रीडायरेक्ट या इंटरनली रिज़ॉल्व होने वाले DNS नाम से आसानी से चकमा खा जाता है।अक्सर पूछे जाने वाले सवाल
क्या यह सिर्फ एक एक्सेस-कंट्रोल बग नहीं है?
हाँ — यह बिल्कुल वही है, और यह अच्छी बात है। यह बग्स की एक पुरानी, भली-भांति समझी जाने वाली श्रेणी है जिसके समाधान भी अच्छी तरह समझे जा चुके हैं। एजेंट्स इसे गलती से बनाना बहुत आसान कर देते हैं, क्योंकि इसे बनाने का स्वाभाविक तरीका एक ही ताकतवर सर्विस अकाउंट का उपयोग करना होता है।
मैं एजेंट्स की चेन के ज़रिए यूज़र की पहचान कैसे पास करूँ?
हर इंटरनल कॉल के साथ एक स्कोप्ड टोकन भेजें और हर सीमा (boundary) पर उसकी जाँच करें, ठीक उसी तरह जैसे एक बेहतरीन बना हुआ माइक्रोसर्विस आर्किटेक्चर करता है। कभी भी किसी इंटरनल हॉप को सिर्फ इसलिए अधिकार बढ़ाने की छूट न दें क्योंकि वह इंटरनल है।
क्या SSRF सच में एजेंट्स के लिए एक चिंता का विषय है?
बिल्कुल है। नेटवर्क के अंदर चलने वाला फ़ेच टूल वाला एजेंट रिक्वेस्ट-फोर्जरी इंजन जैसा होता है। नेटवर्क लेयर पर ही इंटरनल एड्रेस रेंज और क्लाउड मेटाडेटा एंडपॉइंट्स को ब्लॉक करें, टूल में केवल URL चेक करके नहीं।
उन एजेंट्स के बारे में क्या जिन्हें सच में एडमिन अधिकारों की ज़रूरत होती है?
फिर उन्हें अविश्वसनीय (untrusted) कंटेंट भी नहीं पढ़ना चाहिए। सिस्टम को बाँट दें: एक एडमिन-सक्षम एजेंट जिसे केवल आपके अपने कोड से स्ट्रक्चर्ड, वैलिडेटेड इनपुट मिले, और दूसरा अलग अविश्वसनीय-कंटेंट रीडर जिसके पास कोई अधिकार न हों।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।