FlawOpen

flawopen.com/Teardowns/cve-2026-87913-aws-security-agent-mcp-s3-bucket-ownership

● CVE-2026-87913 · CVSS 5.1 · मध्यम
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-87913: AWS MCP S3 डेटा लीक

अनुमानित bucket निजी scan archive को दूसरे खाते में भेज सकता था। 0.2.0 पर अपडेट करें और मालिक सत्यापित करें।[1], [2], [4]

💡 आसान भाषा में (ELI5)

एक ऐसे कूरियर की कल्पना करें जो पते पर इमारत होने की जाँच करता है, मालिक की नहीं। कोई और पहले पता दर्ज करके पार्सल पा सकता है। सुधार में S3 से जाँच और upload, दोनों के समय अपेक्षित मालिक की पुष्टि कराई जाती है।[2], [1]

इस पेज के मुख्य शब्द

MCP सर्वर
AI सहायक को tools देने वाली स्थानीय सेवा; संचालन सर्वर प्रक्रिया की permissions से चलते हैं।[3]
S3 bucket
वैश्विक नाम वाला Amazon S3 container; नाम से AWS खाते का मालिकाना सिद्ध नहीं होता।[2], [3]
ExpectedBucketOwner
S3 parameter जो operation से पहले अपेक्षित मालिक का AWS account ID जाँचता है।[2], [8], [9]
CWE-283 और CWE-341
MITRE वर्गीकरण: स्वामित्व सत्यापित न होना और दिखने वाली जानकारी से मान अनुमानित होना; advisory दोनों बताती है।[8], [9]

फ्रेमवर्क मैपिंग

मूल कारण विश्लेषण (Root Cause)

AWS Security Agent MCP सर्वर ग्राहक के AWS account ID और क्षेत्र से scan bucket का नाम बनाता है: security-agent-scans-<account-id>-<region>। AWS और maintainer advisory कहती हैं कि प्रभावित संस्करण ने bucket का मौजूद होना जाँचा, ग्राहक खाते का स्वामित्व नहीं। S3 नाम वैश्विक रूप से अद्वितीय और account ID सार्वजनिक हैं। अनुमानित नाम पहले पंजीकृत करने वाला तीसरा पक्ष सर्वर का निजी source archive पा सकता था; उसमें code, credentials और infrastructure state हो सकती है। यह cloud-resource ownership और अनुमानित नाम की कमजोरी है, AI मॉडल का prompt-injection दोष नहीं। संस्करण 0.1.0–0.1.5 प्रभावित हैं; 0.2.0 S3 संचालन में ExpectedBucketOwner जोड़ता है और mismatch पर रुकता है। अपडेट पहले से पंजीकृत नाम को मुक्त नहीं करता: वास्तविक मालिक जाँचें और bucket तीसरे पक्ष का हो तो scan फिर शुरू न करें।

Bucket का नाम उसके मालिकाना हक़ का प्रमाण नहीं

सीमादस्तावेज़ित शर्तऑपरेटर की कार्रवाई
प्रभावित संस्करणawslabs.security-agent-mcp-server के 0.1.0 से 0.1.5 संस्करण प्रभावित हैं; 0.2.0 में मालिकाना हक़ की जाँच जोड़ी गई।0.2.0 या नए संस्करण पर अपडेट करें और चल रहे पैकेज संस्करण की पुष्टि करें।
अनुमानित Bucket नामस्कैन Bucket का नाम account ID और Region से बनता है; कोई दूसरा AWS account इसे पहले पंजीकृत कर सकता है।मिलते हुए नाम को पता समझें, मालिकाना हक़ का प्रमाण नहीं।
अलग खातों के बीच अपलोडकमज़ोर सर्वर मालिक की पुष्टि किए बिना नाम से Bucket स्वीकार कर सकता था और निजी स्कैन आर्काइव वहाँ अपलोड कर सकता था।स्कैन या अपलोड से पहले पुष्टि करें कि Bucket अपेक्षित खाते का है।
ठीक की गई स्वामित्व सीमाExpectedBucketOwner से S3 जाँच और अपलोड—दोनों समय मालिक की तुलना करता है।अपडेट करें, वास्तविक मालिक जाँचें और तीसरे पक्ष का स्वामित्व मिलने पर स्कैन रोकें; अपडेट से Bucket का मालिक नहीं बदलता।

हमले का चरण-दर-चरण प्रवाह

चरण 1

Scan अनुरोध source लेता है

AI client code scan माँगता है; स्थानीय सर्वर workspace archive करके configured AWS identity उपयोग करता है।[3], [2]

चरण 2

गंतव्य नाम अनुमानित है

नाम account ID और region से बनता है; ID secret नहीं और S3 नाम वैश्विक हैं।[1], [2]

चरण 3

जाँच केवल मौजूदगी देखती है

प्रभावित सर्वर ने नाम से bucket स्वीकार किया, लेकिन ग्राहक खाते का मालिकाना नहीं जाँचा।[2], [1]

चरण 4

Archive दूसरे खाते तक पहुँच सकता है

यदि कोई और पहले नाम दर्ज करे तो उसे निजी archive मिल सकता है, जिसमें संवेदनशील जानकारी हो सकती है।[2], [1]

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

यह सुरक्षित रूपरेखा है, पूर्ण स्रोत की हूबहू प्रति नहीं। केवल मौजूदगी पर्याप्त नहीं: S3 को जाँच और write दोनों समय अपेक्षित owner मिलाना चाहिए। Owner को authenticated AWS identity से लें और mismatch पर प्रक्रिया रोकें। Update के बाद भी owner अलग से जाँचें, क्योंकि इससे पहले से registered नाम transfer या release नहीं होता। AWS के अनुसार HeadBucket और PutObject दोनों में ExpectedBucketOwner उपलब्ध है; mismatch होने पर request 403 से विफल होती है। इसे fail-closed सुरक्षा के रूप में रखें, लेकिन bucket को किसी और का मानने से पहले अधिकृत ownership-check रास्ते से access-denied त्रुटि की जाँच करें।[2], [8], [9]

सोर्स अंश: Advisory पर आधारित AWS SDK उदाहरण; यह स्रोत कोड का हूबहू diff नहीं है।

कमज़ोर कार्यान्वयन
# सरल vulnerable रूप: नाम जाँचा जाता है, लेकिन उसके owner की नहीं।
s3.head_bucket(Bucket=bucket_name)
s3.put_object(
    Bucket=bucket_name,
    Key=object_key,
    Body=archive_bytes,
)
सुरक्षित और सुदृढ़ फ़िक्स
# हर operation को bucket के अपेक्षित owner account से बाँधें।
expected_owner = sts.get_caller_identity()["Account"]
s3.head_bucket(
    Bucket=bucket_name,
    ExpectedBucketOwner=expected_owner,
)
s3.put_object(
    Bucket=bucket_name,
    Key=object_key,
    Body=archive_bytes,
    ExpectedBucketOwner=expected_owner,
)

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत