
Apache Spark 4.2.0 - उच्च - रिमोट - फ़ाइल लेखन - Connect सत्र SET copyFromLocalToFs.allowDestLocal
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-connect-copy-local
वर्ग: फ़ाइल लेखन (SPARK-58531 का अवशेष; केवल 4.3.0 पर स्थिर) पहुँच: रिमोट
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
spark.sql.artifact.copyFromLocalToFs.allowDestLocal इस पिन पर अभी भी buildConf (सत्र-सेट करने योग्य) है। SPARK-58531 ने इसे 4.3.0 में StaticSQLConf में स्थानांतरित कर दिया। एक Connect सत्र केवल-परीक्षण वाले local-dest गेट को SET कर सकता है, फिर copyFromLocalToFs / AddArtifacts forward_to_fs/<abs> Spark UID के रूप में ड्राइवर-स्थानीय पथ को अधिलेखित कर देता है।
Connect सत्र SET फिर forward_to_fs ड्राइवर-स्थानीय फ़ाइलें लिखता है। गंतव्य LocalFileSystem होना चाहिए। RCE नहीं।
| ID | अभी तक कोई CVE नहीं (SPARK-58531 का अवशेष) |
| वर्ग | फ़ाइल लेखन (SPARK-58531 का अवशेष; केवल 4.3.0 पर स्थिर) |
| पहुँच | रिमोट (Spark Connect Config + AddArtifacts) |
| CWE | CWE-22, CWE-732 |
| CVSS | उच्च: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H |
| उत्पाद | Apache Spark (ASF) |
| प्रभावित | Apache Spark 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8)। 4.3.0 स्थिर है। |
| प्रमाणीकरण | Connect क्लाइंट जो ConfigRequest.SET और AddArtifacts कर सकता है। डिफ़ॉल्ट Connect में कोई PSK नहीं। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1:18920 |
एक Spark Connect क्लाइंट जो gRPC तक पहुँच सकता है (डिफ़ॉल्ट बाइंड पोर्ट 15002, कोई PSK नहीं जब तक ऑपरेटर ने spark.connect.authenticate.token सेट न किया हो) ड्राइवर को शुरू करते समय सेट किए गए केवल-परीक्षण वाले गेट को बंद कर सकता है, फिर Spark UID के रूप में ड्राइवर पर चुने गए स्थानीय पथ को अधिलेखित कर सकता है।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
gRPC Config SET spark.sql.artifact.copyFromLocalToFs.allowDestLocal=true (या SQL SET) | SparkConnectConfigHandler.handleSet -> RuntimeConfig.set -> SQLConf.setConfString | अखंडता (सत्र कॉन्फ़, लैब-प्रमाणित): प्रति-सत्र local-dest गेट को बदल देता है। स्वयं कोई फ़ाइल नहीं लिखता। अन्य सत्रों को नहीं बदलता। लैब: SET HTTP 200, modifiable=True। |
gRPC AddArtifacts नाम forward_to_fs + पूर्ण गंतव्य, CRC ठीक | ArtifactManager.uploadArtifactToFs -> LocalFileSystem.copyFromLocalFile(delSrc=false, overwrite=true) | अखंडता (फ़ाइल अधिलेखन, लैब-प्रमाणित): artifactRootDirectory/<sessionUUID>/ के बाहर Spark UID के रूप में ड्राइवर-स्थानीय पथ लिखें/अधिलेखित करें। लैब: गंतव्य /oracle/SPARK-CONNECT-COPY-LOCAL-WITNESS, uid 185, सामग्री WITNESS। |
| वही AddArtifacts HDFS/S3/ABFS गंतव्य पर | प्रलेखित copyFromLocalToFs | अखंडता (क्लस्टर FS, डिज़ाइन द्वारा): यह अवशेष नहीं। जो गंतव्य LocalFileSystem नहीं है वह कभी परीक्षण फ़्लैग की जाँच नहीं करता। |
लैब-प्रमाणित बनाम अनुमानित: buildConf कुंजी का सत्र SET, फिर uid 185 के रूप में आर्टिफ़ैक्ट सैंडबॉक्स के बाहर LocalFileSystem गंतव्य लेखन, लैब है। उस पथ का Spark UID अधिलेखन जिसे प्रक्रिया लिख सकती है (ड्राइवर कार्य निर्देशिका, विश्व-लेखन योग्य ड्रॉप, पहले से निष्पादन योग्य स्क्रिप्ट जिसे ऑपरेटर बाद में चलाता है) अनुमानित है। कोई RIP नियंत्रण नहीं। फ़ाइल लेखन को RCE तक न बढ़ाएँ।
आवश्यक: Spark Connect सुन रहा हो। क्लाइंट जो सत्र SQL कॉन्फ़ SET और AddArtifacts कर सके। गंतव्य Hadoop LocalFileSystem होना चाहिए। डिफ़ॉल्ट Connect में कोई PSK नहीं; यदि ऑपरेटर ने टोकन सेट किया है, तो अवशेष को अभी भी वह साझा Bearer चाहिए। यह local-dest नियंत्रण का बायपास है, PSK बायपास नहीं।
| सतह | लैब |
|---|---|
| SET के बिना कॉपी | 400 _LEGACY_ERROR_TEMP_3161, गंतव्य अनुपस्थित |
पुरानी स्थिर spark.connect.copyFromLocalToFs.allowDestLocal SET करें | 400 CANNOT_MODIFY_STATIC_CONFIG |
आर्टिफ़ैक्ट नाम .. / पूर्ण स्टेजिंग (ArtifactUtils.concatenatePaths) | INVALID_ARTIFACT_PATH |
गैर-forward_to_fs आर्टिफ़ैक्ट | artifactRootDirectory/<sessionUUID>/ के अंतर्गत रहते हैं |
| फ़्लैग के बिना HDFS/क्लाउड गंतव्य | प्रलेखित API, यह अवशेष नहीं |
खुले Connect पर अनधिकृत SQL / Python UDF / Scala UdfPacket | विक्रेता FAQ जॉब सबमिट; DROP |
| SPARK-52122 ML DefaultParamsReader | इस पिन पर allowlist + safeMLClassLoader |
कोई शेल नहीं। कोई हीप डंप नहीं। कोई Connect PSK स्किप नहीं। गंतव्य अभी भी LocalFileSystem होना चाहिए। लेखन Spark UID के रूप में है, root के रूप में नहीं।
uploadArtifactToFs LocalFileSystem गंतव्य को अस्वीकार करता है जब तक परीक्षण फ़्लैग चालू न हो, इस स्पष्ट टिप्पणी के साथ कि अन्यथा उपयोगकर्ता ड्राइवर पर मनमानी फ़ाइल अधिलेखित कर देता है:
if (fs.isInstanceOf[LocalFileSystem]) {
val allowDestLocalConf =
session.sessionState.conf.getConf(SQLConf.ARTIFACT_COPY_FROM_LOCAL_TO_FS_ALLOW_DEST_LOCAL)
.getOrElse(
session.conf.get("spark.connect.copyFromLocalToFs.allowDestLocal").contains("true"))
if (!allowDestLocalConf) {
throw new SparkUnsupportedOperationException("_LEGACY_ERROR_TEMP_3161")
}
}
fs.copyFromLocalFile(false, true, new FSPath(localPath.toString), destFSPath)
3.5 कुंजी स्थिर है, डिफ़ॉल्ट false। 4.0 प्रतिस्थापन buildConf वैकल्पिक है:
val ARTIFACT_COPY_FROM_LOCAL_TO_FS_ALLOW_DEST_LOCAL =
buildConf("spark.sql.artifact.copyFromLocalToFs.allowDestLocal")
.internal()
...
.booleanConf
.createOptional
buildConf registerStaticConfigKey को कॉल नहीं करता। isModifiable containsConfigKey && !isStaticConfigKey है। RuntimeConfig.set केवल स्थिर कुंजियों को अस्वीकार करता है। Internal अभी भी सेट करने योग्य है। SET के बाद, getConf(ARTIFACT_...) Some(true) लौटाता है और स्थिर पुराने कॉन्फ़ पर getOrElse फ़ॉलबैक छोड़ दिया जाता है।
SPARK-58531 / PR 57730 "Convert spark.sql.artifact.copyFromLocalToFs.allowDestLocal to a static conf" 2026-08-05 को हल किया गया, Fix Version 4.3.0। JIRA: कॉन्फ़ "नियंत्रित करता है कि कॉलर ड्राइवर के स्थानीय फ़ाइलसिस्टम पर मनमाने पथ पर लिख सकता है या नहीं, इसलिए इसे ड्राइवर शुरू करने वाले द्वारा सेट किया जाना चाहिए।" 4.2.0 को Affects में सूचीबद्ध किया गया है। इस पिन में अभी भी रनटाइम कॉन्फ़ है।
पहले से दर्ज गलत मोड़: Connect SQL को निष्कर्ष मानना (FAQ); पुरानी स्थिर कुंजी का SET (CANNOT_MODIFY_STATIC_CONFIG); यह दावा करना कि Unix पूर्ण गंतव्य पैरेंट को अनदेखा करता है (यह root के अंतर्गत जुड़ता है); फ़ाइल लेखन को RCE तक बढ़ाना; JIRA हल होने के कारण 4.3.0 RC को पिन करना।
cd lab
./run.sh
लूपबैक 127.0.0.1:18920। सत्र-कॉन्फ़ गेट और LocalFileSystem गंतव्य कॉपी का गैजेट (पिन v4.2.0 32f72996)। सर्वर UID 185। नियंत्रण no-SET: 400 _LEGACY_ERROR_TEMP_3161, गंतव्य अनुपस्थित। पुरानी स्थिर कुंजी का नियंत्रण SET: CANNOT_MODIFY_STATIC_CONFIG। buildConf कुंजी का सत्र SET फिर कॉपी: गंतव्य /oracle/SPARK-CONNECT-COPY-LOCAL-WITNESS /opt/spark/work/artifacts/<sessionUUID>/ के बाहर, uid 185, सामग्री WITNESS।