
AWS SAM CLI के साथ समस्या (CVE-2025-3047, CVE-2025-3048)
यह README AWS सर्वरलेस एप्लिकेशन मॉडल CLI (AWS SAM CLI) में पाई गई दो सुरक्षा कमजोरियों – CVE-2025-3047 और CVE-2025-3048 – के साथ-साथ कोड-स्तरीय समस्याओं और समाधानों का विस्तृत विश्लेषण प्रदान करता है। दोनों कमजोरियों में डॉकर कंटेनरों का उपयोग करके बिल्ड प्रक्रिया के दौरान प्रतीकात्मक लिंक (सिमलिंक) का अनुचित संचालन शामिल है। नीचे प्रत्येक अनुभाग एक CVE को कवर करता है जिसमें सारांश, प्रभावित कोड (SAM CLI स्रोत के संदर्भों के साथ), पैच और यह समस्या को कैसे हल करता है, और उपचार पर मार्गदर्शन शामिल है।
ये दोष sam build --use-container प्रक्रिया के दौरान प्रतीकात्मक लिंक (सिमलिंक) के अनुचित संचालन से संबंधित हैं। दोनों मुद्दे स्थानीय विकास वातावरण को प्रभावित करते हैं (वे तैनात AWS सेवाओं या संसाधनों को प्रभावित नहीं करते), लेकिन AWS SAM CLI द्वारा सिमलिंक के प्रसंस्करण के तरीके का दुरुपयोग करके होस्ट मशीन पर फ़ाइलों तक अनधिकृत पहुंच की अनुमति दे सकते हैं। AWS SAM CLI को पैच किए गए संस्करणों (CVE-2025-3047 के लिए 1.133.0+, और CVE-2025-3048 के लिए 1.134.0+) में अपग्रेड करने की दृढ़ता से अनुशंसा की जाती है।
GHSA-px37-jpqx-97q9 AWS SAM CLI <= v1.132.0 में एक पथ ट्रैवर्सल भेद्यता है जो sam build --use-container के दौरान होस्ट मशीन पर अनधिकृत फ़ाइल एक्सेस की अनुमति देती है। डॉकर कंटेनर के अंदर एक सर्वरलेस एप्लिकेशन बनाते समय, SAM CLI डिफ़ॉल्ट रूप से प्रोजेक्ट में सिमलिंक का अनुसरण करेगा। एक हमलावर जो प्रोजेक्ट में एक दुर्भावनापूर्ण सिमलिंक (एक संवेदनशील होस्ट फ़ाइल की ओर इशारा करते हुए) लगा सकता है, वह डॉकर कंटेनर के उन्नत विशेषाधिकारों का लाभ उठाकर उस फ़ाइल को कंटेनर में माउंट करवा सकता है और कंटेनर के अंदर सुलभ स्थान पर कॉपी कर सकता है। प्रभाव में, इसका मतलब था कि विशेषाधिकार प्राप्त होस्ट फ़ाइलें (प्रोजेक्ट निर्देशिका के बाहर) बिल्ड कंटेनर के माध्यम से पढ़ी और बाहर निकाली जा सकती थीं। यह मुद्दा v1.133.0 में ठीक किया गया था। (वैध मामलों के लिए पिछड़ी संगतता बनाए रखने के लिए, SAM CLI v1.133.0 ने आवश्यकता पड़ने पर पुराने व्यवहार को फिर से सक्षम करने के लिए एक ऑप्ट-इन फ़्लैग --mount-symlinks पेश किया।)
मूल कारण और प्रभावित घटक: मुख्य मुद्दा इस बात में निहित है कि AWS SAM CLI बिल्ड के लिए उपयोग किए जाने वाले डॉकर कंटेनर में प्रोजेक्ट निर्देशिकाओं और उनके सिमलिंक को कैसे माउंट करता है। AWS SAM CLI कोड (मॉड्यूल samcli.local.docker.container) में, फिक्स से पहले, प्रोजेक्ट निर्देशिका में सभी शीर्ष-स्तरीय सिमलिंक स्वचालित रूप से हल किए जाते थे और कंटेनर प्रक्रिया के समान उन्नत विशेषाधिकारों के साथ कंटेनर में बाइंड-माउंट किए जाते थे। कंटेनर डिफ़ॉल्ट रूप से root के रूप में चलता है, इसलिए एक संवेदनशील होस्ट पथ की ओर इशारा करने वाले सिमलिंक को हल करना और माउंट करना कंटेनर को उस फ़ाइल तक पहुंच प्रदान करेगा, जिस तक एक अविशेषाधिकार प्राप्त होस्ट उपयोगकर्ता सामान्य रूप से नहीं पहुंच सकता। कमजोर कोड ने पर्याप्त रूप से प्रतिबंधित नहीं किया कि किन सिमलिंक का अनुसरण/माउंट किया जाए।
विशेष रूप से, बिल्ड के लिए डॉकर वॉल्यूम माउंट बनाने वाले फ़ंक्शन में, SAM CLI बिना शर्त सिमलिंक को माउंट करने के लिए वास्तविक फ़ाइलों/निर्देशिकाओं के रूप में मानता था। यह भेद्यता SAM CLI के कंटेनर ऑर्केस्ट्रेशन तर्क में रहती थी, विशेष रूप से samcli/local/docker/container.py में Container.create विधि में। कमजोर संस्करणों में, यह विधि हमेशा संदर्भ की परवाह किए बिना प्रोजेक्ट से डॉकर कंटेनर में सिमलिंक लक्ष्यों को हल करने और माउंट करने का प्रयास करती थी। समस्याग्रस्त कोड नीचे दिखाया गया है, SAM CLI v1.132.0 से:
# samcli/local/docker/container.py (v1.132.0 - कमजोर स्निपेट)
if self._host_dir:
mount_mode = "rw,delegated" if self._mount_with_write else "ro,delegated"
LOG.info("Mounting %s as %s:%s, inside runtime container", self._host_dir, self._working_dir, mount_mode)
_volumes = {
self._host_dir: {
"bind": self._working_dir,
"mode": mount_mode,
},
**self._create_mapped_symlink_files(), # हमेशा सिमलिंक को हल करें और माउंट करें (कमजोर)
}
उपरोक्त कोड में, _create_mapped_symlink_files() प्रोजेक्ट निर्देशिका के अंतर्गत सिमलिंक को स्कैन करता है और उन्हें माउंट करने के लिए तैयार करता है। चूंकि इसे बिना शर्त शामिल किया गया था, सभी सिमलिंक (प्रोजेक्ट के बाहर इशारा करने वाले सहित) कंटेनर में माउंट हो जाते थे। (देखें aws/aws-sam-cli#7865)
यहाँ दोष यह है कि sam build --use-container के दौरान, SAM CLI सिमलिंक को कंटेनर में माउंट करने के लिए फ़ाइलों के रूप में मानता है। यदि कोई सिमलिंक होस्ट पर /etc/shadow की ओर इशारा करता है, तो डॉकर कंटेनर (जो उन्नत विशेषाधिकारों के साथ चल सकता है) उस फ़ाइल को बाइंड-माउंट करेगा। यह एक क्लासिक सिमलिंक-आधारित पथ ट्रैवर्सल है, जिसके परिणामस्वरूप विशेषाधिकार वृद्धि होती है – होस्ट फ़ाइलें जिन तक उपयोगकर्ता की सामान्य रूप से पहुंच नहीं होती, उन्हें कंटेनर द्वारा पढ़ा जा सकता है और फिर बिल्ड आउटपुट में समाप्त किया जा सकता है।
पैच (v1.133.0 में फिक्स्ड कोड): फिक्स बिल्ड संदर्भ की धारणा का परिचय देता है और कंटेनर बिल्ड के दौरान सिमलिंक रिज़ॉल्यूशन को अक्षम करता है। पैच किए गए संस्करण में, Container.create एक अतिरिक्त पैरामीटर लेता है जो संदर्भ (BUILD बनाम INVOKE) को इंगित करता है, और यह केवल तभी सिमलिंक को हल करेगा जब संदर्भ आह्वान (इनवोकेशन) हो (जब फ़ंक्शन स्थानीय रूप से चल रहे हों), बिल्ड के दौरान नहीं। नीचे पैच किए गए संस्करण का सही कोड है:
# samcli/local/docker/container.py (v1.133.0+ - पैच किया गया स्निपेट)
if self._host_dir:
mount_mode = "rw,delegated" if self._mount_with_write else "ro,delegated"
LOG.info("Mounting %s as %s:%s, inside runtime container", self._host_dir, self._working_dir, mount_mode)
mapped_symlinks = self._create_mapped_symlink_files() if self._resolve_symlinks(context) else {}
_volumes = {
self._host_dir: {
"bind": self._working_dir,
"mode": mount_mode,
},
**mapped_symlinks, # केवल तभी सिमलिंक माउंट करें यदि संदर्भ द्वारा स्पष्ट रूप से अनुमति दी गई हो (बिल्ड में नहीं)
}
पैच किए गए कोड में, _create_mapped_symlink_files() एक संदर्भ जांच के पीछे लपेटा गया है। नया ContainerContext एनम BUILD और INVOKE जैसे संदर्भों को परिभाषित करता है, और _resolve_symlinks(context) बिल्ड संदर्भ के लिए False लौटाता है। इस प्रकार, बिल्ड के दौरान mapped_symlinks एक खाली डिक्ट होगा, जिसका अर्थ है कि डिफ़ॉल्ट रूप से कोई सिमलिंक कंटेनर में माउंट नहीं किया जाता।
कोड परिवर्तन संदर्भ: फिक्स को पुल रिक्वेस्ट#7865 (“fix: Resolve symlinks on local invoke only”) में लागू किया गया था और इसे v1.133.0 के भाग के रूप में जारी किया गया था। GitHub डिफ़ ContainerContext के परिचय और सशर्त माउंटिंग तर्क को दर्शाता है। बिल्ड के दौरान सिमलिंक लक्ष्यों को माउंट न करके, कंटेनर अब प्रोजेक्ट निर्देशिका के बाहर फ़ाइलों तक पहुंच प्राप्त नहीं करता है। (यदि कोई उपयोगकर्ता होस्ट पथों के लिए सिमलिंक की अनुमति देना चाहता है, तो उन्हें अब --mount-symlinks फ़्लैग के माध्यम से ऑप्ट इन करना होगा, जो इस फिक्स के बाद जोड़ा गया था।)