
Apache Spark 4.2.0 - उच्च - रिमोट - विशेषाधिकार अवशेष - proxy-user defaultExtraClassPath
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-proxyuser-classpath
राइट-अप: https://abraxaslabs.tech/research/spark-proxyuser-classpath
वर्ग: विशेषाधिकार अवशेष (CVE-2023-22946 / SPARK-41958 का अवशेष) पहुँच: रिमोट
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
CVE-2023-22946 / SPARK-41958 अभी भी spark.submit.proxyUser.allowCustomClasspathInClusterMode को डिफ़ॉल्ट रूप से false रखता है और --proxy-user क्लस्टर सबमिट पर अभी भी childClasspath.clear() चलाता है। यह सार्वजनिक YARN --jars पथ है। फिर Spark 4.0 ने spark.driver.defaultExtraClassPath जोड़ा। लॉन्चर हमेशा उस कुंजी को spark-submit JVM -cp में पहले जोड़ता है, जिसमें क्लस्टर मोड भी शामिल है। SPARK-41958 इसे कभी नहीं देखता।
Livy-शैली का टेनेंट अभी भी गेटवे spark-submit JVM के अंदर एक स्टेज किया गया jar लोड कर सकता है। Hadoop UserGroupInformation.doAs उस Unix UID को नहीं बदलता।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष (CVE-2023-22946 / SPARK-41958 का अवशेष) |
| पहुँच | रिमोट (गेटवे के माध्यम से Livy-शैली --proxy-user जॉब सबमिट) |
| CWE | CWE-269, CWE-427 |
| CVSS | उच्च: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| उत्पाद | Apache Spark |
| प्रभावित | Apache Spark 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) |
| प्रमाणीकरण | Livy / Kyuubi / Oozie-शैली गेटवे का प्रमाणीकृत टेनेंट जो --conf और स्टेज किए गए --jars को spark-submit --proxy-user ... --deploy-mode cluster में अग्रेषित करता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1:18950। साक्षी फ़ाइल। उद्धृत लॉन्चर / सबमिट वॉक का गैजेट। |
एक मल्टी-टेनेंट Spark गेटवे (Livy, Kyuubi, Oozie, और समान) पर टेनेंट खाता रखें जो सुपरयूज़र UID के रूप में spark-submit --proxy-user <tenant> --deploy-mode cluster चलाता है। एक jar स्टेज करें जिसे गेटवे JVM खोल सके। --conf spark.driver.defaultExtraClassPath=<staged jar> भेजें। SPARK-41958 गेट false रह सकता है। निर्मित spark-submit -cp फिर भी उस jar से शुरू होता है। इसमें मौजूद क्लासें गेटवे Unix UID के रूप में लोड होती हैं।
--conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true एक दूसरा रास्ता है: .internal() केवल दस्तावेज़ों के लिए है, --conf फिर भी कुंजी लिखता है, और तब YARN क्लस्टर --jars को childClasspath पर रखता है। सार्वजनिक CVE-2023-22946 YARN डिफ़ॉल्ट --jars पथ बना हुआ है जिसे clear() पहले से कवर करता है। यह अवशेष अनगेटेड defaultExtraClassPath है।
स्वच्छ सबमिट के बाद Hadoop प्रतिरूपण अभी भी YARN AM / k8s ड्राइवर के लिए प्रॉक्सी उपयोगकर्ता है। यह अवशेष केवल गेटवे JVM है।
| विधि | सिंक | रेकॉन | अखंडता | उपलब्धता | उद्गम |
|---|---|---|---|---|---|
Livy-शैली सबमिट --proxy-user + yarn/k8s/standalone क्लस्टर + --conf spark.driver.defaultExtraClassPath=<staged local jar>, SPARK-41958 फ़्लैग false छोड़ा गया | SparkSubmitCommandBuilder.buildSparkSubmitCommand SparkSubmitCommandBuilder.java:317-327 -cp पहली प्रविष्टि | गेटवे UID जिन फ़ाइलों को पढ़ सकता है उन्हें सूचीबद्ध/पढ़ें (keytab डिर, spark-defaults, स्थानीय स्टेजिंग)। बाद के RPC का Hadoop पहचान अभी भी प्रॉक्सी उपयोगकर्ता है। | spark-submit JVM के अंदर टेनेंट क्लास लोड करें। Unix UID गेटवे (Hadoop प्रॉक्सी सुपरयूज़र) ही रहता है। लैब: defaultExtraClassPath-on-cp=yes childClasspath-cleared=yes lab.WitnessMain ने SPARK-PROXYUSER-CLASSPATH-WITNESS लिखा। सार्वजनिक CVE वर्ग से अनुमानित: उस UID के रूप में Hadoop Configuration संसाधन ओवरले / FileSystem impl लुकअप। | यदि ओवरले थ्रो करता है तो सबमिट JVM क्रैश। क्लास नहीं। | लैब-प्रमाणित लोड + निर्मित -cp के रूप में witness लेखन। Hadoop ओवरले अनुमानित। Livy/Kyuubi --conf पासथ्रू अनुमानित (वे ट्री इस पिन के नहीं हैं)। |
वही सबमिट --conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true के साथ साथ --jars / प्राथमिक संसाधन | SparkSubmit.prepareSubmitEnvironment SparkSubmit.scala:333-336,738-743,917-924 फिर runMain :980-987 | वॉक A जैसा ही रेकॉन, सिस्टम लोडर के बजाय चाइल्ड URLClassLoader पर। | --jars को childClasspath पर रखें ताकि addJarToClasspath चले। लैब: conf-flag-keeps-jars=yes। | वही। | लैब-प्रमाणित childClasspath रखरखाव। सार्वजनिक YARN --jars पथ की पुनः-फाइलिंग नहीं जिसे फ़्लैग false रहने पर clear() कवर करता है। |
लैब-प्रमाणित बनाम अनुमानित: निर्मित -cp में क्लस्टर मोड में defaultExtraClassPath शामिल है; डिफ़ॉल्ट फ़्लैग पर childClasspath.clear() अभी भी चलता है; क्लस्टर में spark.driver.extraClassPath छोड़ा गया है; फ़्लैग false के साथ --jars साफ़ किया जाता है; उस -cp पर एक witness क्लास ऑरेकल लिखती है। Hadoop config-class निष्पादन सार्वजनिक CVE-2023-22946 तंत्र है, यहाँ पुनः नहीं चलाया गया। Livy/Kyuubi द्वारा --conf अग्रेषण वही आर्किटेक्चर है जिसे वे प्रोजेक्ट दस्तावेज़ित करते हैं।
| विधि | सिंक | बंद रहता है |
|---|---|---|
क्लस्टर मोड में --driver-class-path / spark.driver.extraClassPath | SparkSubmitCommandBuilder.java:318-319 | spark-submit -cp में नहीं जोड़ा गया। लैब: extraClassPath-omitted=yes। क्लस्टर ड्राइवर को जाता है, जिसे YARN/K8s प्रॉक्सी उपयोगकर्ता के रूप में शुरू करते हैं। |
डिफ़ॉल्ट क्लस्टर + --proxy-user + --jars बिना फ़्लैग पलटे और बिना defaultExtraClassPath | SparkSubmit.scala:917-918 childClasspath.clear() | YARN/standalone/k8s क्लस्टर चाइल्ड क्लासपाथ खाली। लैब: नियंत्रण वॉक पर childClasspath-cleared=yes। सार्वजनिक CVE-2023-22946 यही पथ बना हुआ है। |
गेटवे पर --proxy-user क्लाइंट मोड ड्राइवर | docs/security.md प्रॉक्सी उपयोगकर्ता अनुभाग | दस्तावेज़ित: क्लाइंट-मोड ड्राइवर JVM सुपरयूज़र है। विक्रेता कहता है CVE नहीं। Livy/Kyuubi को क्लस्टर मोड बाध्य करने के लिए कहा गया है। |
K8s क्लस्टर-मोड ड्राइवर कंटेनर (spark.kubernetes.submitInDriver=true) क्लासपाथ में . जोड़ता है | SparkSubmit.scala:420-431 SPARK-43540 | ड्राइवर पॉड के अंदर दूसरा spark-submit, Livy होस्ट नहीं। पॉड UID कंटेनर उपयोगकर्ता है। |
क्लस्टर मोड में spark.driver.extraJavaOptions | SparkSubmitCommandBuilder.java:341-357 | spark-submit JVM पर लागू नहीं। SPARK_SUBMIT_OPTS गेटवे env है, टेनेंट --conf नहीं। |
| सबमिट किए गए ऐप का YARN AM / k8s ड्राइवर | स्वच्छ सबमिट के बाद Hadoop प्रतिरूपण | क्लस्टर लॉन्च के लिए अभी भी प्रॉक्सी उपयोगकर्ता। यह अवशेष केवल गेटवे JVM है। |
| अनॉथ जॉब सबमिट / Connect SQL / ML मॉडल लोड | SECURITY.md FAQ / docs/ml-security.md | डिज़ाइन से। यह अवशेष नहीं। |