flawopen.com/Incidents/capital-one-ssrf-imds-july-2019
Capital One SSRF: AWS IMDSv1 क्रेडेंशियल चोरी
संघीय आपराधिक शिकायत में आरोप है कि गलत कॉन्फ़िगर WAF ने SSRF को AWS IMDSv1 तक पहुँचाया और अस्थायी भूमिका-क्रेडेंशियल तथा लगभग 10.6 करोड़ लोगों का S3 डेटा उजागर किया। टोकन अनिवार्य करें और भूमिकाएँ सीमित रखें।[10], [2]
DOJ की आपराधिक शिकायत में इस तरह की श्रृंखला का आरोप है: एक ऐसे रिसेप्शनिस्ट की कल्पना करें जो आपके बताए पते से दस्तावेज़ ले आता है। अनुरोध को आगे भेजने की सुविधा किसी को उसे इमारत के अंदरूनी कमरे तक निर्देशित करने दे सकती है। वहाँ रिसेप्शनिस्ट को वर्कलोड के लिए अस्थायी प्रवेश-बैज मिल सकता है; वह बैज केवल वही कमरे खोलता है जिनकी अनुमति उस वर्कलोड की भूमिका देती है। गलती यह मानना थी कि कमरे तक केवल कर्मचारी पहुँच सकते हैं, जबकि रिसेप्शनिस्ट को वहाँ भेजा जा सकता था।[10], [8]
इस पेज के मुख्य शब्द
SSRF- सर्वर-साइड रिक्वेस्ट फ़ॉर्जरी (
CWE-918): सर्वर से हमलावर का चुना हुआ अनुरोध भिजवाना, ताकि उस अनुरोध को सर्वर की नेटवर्क स्थिति और भरोसा मिल जाए।[9] वेब एप्लिकेशन फ़ायरवॉल- वेब एप्लिकेशन के आगे लगा फ़िल्टर। आपराधिक शिकायत में आरोप है कि Capital One का गलत कॉन्फ़िगर WAF आंतरिक पतों पर अनुरोध आगे भेज सकता था।[10]
IMDSv1- IMDSv1 चालू होने पर मेटाडेटा अनुरोधों के लिए टोकन आवश्यक नहीं होता। IAM भूमिका का सुरक्षा-क्रेडेंशियल पथ उस भूमिका से जुड़े अस्थायी क्रेडेंशियल लौटाता है।[7], [8]
IMDSv2- IMDSv2 में PUT अनुरोध से प्राप्त सत्र टोकन का उपयोग होता है। बिना टोकन वाले IMDSv1 अनुरोधों को अस्वीकार करने के लिए
HttpTokens=requiredसेट करें; इससे केवल साधारण GET भेज सकने वाले कई SSRF रिले रुकते हैं, पर SSRF का पूरा जोखिम समाप्त नहीं होता।[7], [6] IAM रोल क्रेडेंशियल- किसी इंस्टेंस को जारी की गई अस्थायी AWS चाबियाँ। रोल जो कुछ कर सकता है, चाबियाँ रखने वाला भी उनकी समय-सीमा ख़त्म होने तक वही कर सकता है।[8]
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-918
- D3-OTF आउटबाउंड ट्रैफ़िक फ़िल्टरिंग — इस गाइड में दिया गया आउटबाउंड नेटवर्क प्रतिबंध सेवा या होस्ट के पहुँच योग्य गंतव्यों को सीमित करता है।
घटना का समयक्रम (Timeline)
एक बाहरी शोधकर्ता Capital One के ज़िम्मेदार खुलासा कार्यक्रम के ज़रिए उजागर डेटा की सूचना देता है।[2]
Capital One घटना की घोषणा करता है और FBI सिएटल में एक संदिग्ध को गिरफ़्तार करता है।[1]
हमले का चरण-दर-चरण प्रवाह
फ़ायरवॉल एक गढ़ा हुआ अनुरोध आगे भेजता है
आपराधिक शिकायत में आरोप है कि गलत कॉन्फ़िगर WAF से हमलावर द्वारा चुने गए पतों, जिनमें आंतरिक पते भी शामिल थे, पर अनुरोध भेजे जा सकते थे।[10]
डेटा बड़े पैमाने पर बाहर जाता है
2005 से 2019 की शुरुआत तक के क्रेडिट कार्ड आवेदनों का डेटा कॉपी हुआ: अमेरिका में लगभग 10 करोड़ और कनाडा में 60 लाख लोग, जिनमें क़रीब 1,40,000 अमेरिकी सोशल सिक्योरिटी नंबर और 80,000 जुड़े बैंक खाता नंबर शामिल थे।[2]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
यह उदाहरण Flask कोड है, Capital One का कॉन्फ़िगरेशन नहीं। होस्ट allowlist अनुप्रयोग का मुख्य नियंत्रण है। आवश्यक egress proxy को कनेक्शन के समय DNS से मिले पते पर नीति लागू करनी चाहिए, instance metadata सहित private और link-local रेंज रोकनी चाहिए, और हर अनुरोध और retry पर यही जाँच दोहरानी चाहिए; proxy configuration से इस व्यवहार की पुष्टि करें। Redirect का अनुसरण नहीं किया जाता। ऐप में अलग से DNS जाँच करके बाद में कनेक्ट करने पर DNS rebinding की race बनी रहती है।[9], [5], [6]
import requests
from flask import Flask, request
app = Flask(__name__)
@app.get("/fetch")
def fetch():
# सर्वर कॉल करने वाले द्वारा दिया गया कोई भी URL प्राप्त करता है।
url = request.args["target"]
resp = requests.get(url, timeout=5)
return resp.text
from urllib.parse import urlsplit
import requests
from flask import Flask, abort, request
app = Flask(__name__)
ALLOWED_HOSTS = {"images.example-cdn.com", "api.partner.example"}
EGRESS_PROXY = "http://egress-proxy.internal:3128"
# इस प्रॉक्सी को DNS समाधान के बाद गंतव्य नीति लागू करने के लिए कॉन्फ़िगर करें।
@app.get("/fetch")
def fetch():
parts = urlsplit(request.args.get("target", ""))
if parts.scheme != "https" or parts.hostname not in ALLOWED_HOSTS:
abort(400, "destination not allowed")
if parts.port not in (None, 443) or parts.username or parts.password:
abort(400, "destination not allowed")
resp = requests.get(parts.geturl(), timeout=(2, 5), allow_redirects=False, proxies={"https": EGRESS_PROXY}, trust_env=False)
if resp.is_redirect:
abort(502, "upstream redirect refused")
return resp.text
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓URL अनुरोध egress proxy से भेजें और connection सीमा पर host allowlist तथा IP-range नीति लागू करें: केवल जाँचे गए पते से कनेक्ट करें और retries पर भी नीति लागू करें। Redirect बंद करें या हर hop को फिर से जाँचें; केवल 169.254.169.254 स्ट्रिंग रोकना पर्याप्त नहीं है।[9], [4]
- ✓हर लागू इंस्टेंस पर
HttpTokens=requiredसेट करें और मौजूदा इंस्टेंस भी जाँचें, क्योंकि अकाउंट के डिफ़ॉल्ट हर इंस्टेंस को अपने-आप अपडेट नहीं करते। वर्कलोड के नेटवर्क-पथ के अनुसारHttpPutResponseHopLimitचुनें; AWS चेतावनी देता है कि 1 का मान कंटेनरों में समस्या पैदा कर सकता है। टोकन की अनिवार्यता IMDSv1 अनुरोधों को अस्वीकार करती है; hop limit अलग नेटवर्क सेटिंग है, बिना टोकन वाले GET को रोकने वाला नियंत्रण नहीं।[6], [7] - ✓आपराधिक शिकायत में आरोप है कि SSRF पथ से इंस्टेंस भूमिका उजागर हुई। भूमिका को वर्कलोड के लिए आवश्यक कार्रवाइयों और संसाधनों तक सीमित रखें, ताकि क्रेडेंशियल उजागर होने पर असंबंधित S3 पहुँच न मिले।[10], [8]
- ✓FlawOpen की पहचान सलाह: इंस्टेंस नेटवर्क के बाहर अस्थायी भूमिका-क्रेडेंशियल उपयोग होने पर अलर्ट दें और वर्कलोड तथा क्लाउड ऑडिट संदर्भ के साथ जाँच करें।
- ✓कोड समीक्षा में हर उस रास्ते को, जहाँ उपयोगकर्ता सर्वर द्वारा फ़ेच किए जाने वाले URL को प्रभावित कर सके, उस रास्ते जितना ही गंभीर मानें जहाँ वह SQL क्वेरी को प्रभावित कर सके, और उसके लिए अनुमति-सूची परीक्षण अनिवार्य करें।[9], [5]
स्रोत
- अमेरिकी न्याय विभाग — बड़ी वित्तीय सेवा कंपनी के डेटा की चोरी में सिएटल की टेक कर्मचारी गिरफ़्तार (29 जुलाई 2019)
- Capital One — 2019 की साइबर सुरक्षा घटना की जानकारी
- OCC — 2019 की घटना पर Capital One पर दीवानी जुर्माना (अगस्त 2020)
- क्लाउड वातावरण में SSRF इतना ख़तरनाक क्यों है?
- क्या fetch() से SSRF हो सकता है?
- AWS — Configure the Instance Metadata Service options
- AWS — Use the Instance Metadata Service to access instance metadata
- AWS — Retrieve security credentials from instance metadata
- OWASP — Server Side Request Forgery Prevention Cheat Sheet
- DOJ — United States v. Paige Thompson, criminal complaint (29 July 2019)