
Apache Spark 4.2.0 - उच्च - रिमोट - फ़ाइल पढ़ना - unauth RPC StreamRequest फ़ाइल जॉइन
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-rpc-stream-unauth
वर्ग: विशेषाधिकार अवशेष / फ़ाइल पठन पहुँच: रिमोट
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
CVE-2020-9480 ने RPC नियंत्रण तल पर अनधिप्रमाणित RequestSubmitDriver / RegisterApplication को बंद कर दिया। AbstractAuthRpcHandler receive() और receiveStream() को नियंत्रित करता है। यह getStreamManager() को नियंत्रित नहीं करता। TransportRequestHandler अभी भी SASL से पहले StreamRequest को उस प्रबंधक पर भेजता है। NettyStreamManager.openStream बिना किसी रूट-के-अंदर-रहने जाँच के new File(dir, fname) करता है।
अनधिप्रमाणित StreamRequest classes/../../path Spark-UID फ़ाइलों को पढ़ता है। Unix निरपेक्ष चाइल्ड पंजीकृत डिर में ही रहते हैं (लैब 404)। files/ एक मैप गेट है (404)। receive() / receiveStream() 401 रहते हैं। यह 9480 RCE नहीं है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष / फ़ाइल पठन (CVE-2020-9480 का अनियंत्रित RPC डेटा तल अवशेष) |
| पहुँच | रिमोट (spark.authenticate=true के साथ ड्राइवर RpcEnv / ESS / BlockManager पर अनधिप्रमाणित TCP) |
| CWE | CWE-862, CWE-22 |
| CVSS | उच्च: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| उत्पाद | Apache Spark |
| प्रभावित | 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8)। ऑपरेटर-सक्षम spark.authenticate=true। होस्ट-फ़ाइल पठन के लिए एक पंजीकृत डिरेक्टरी आवश्यक है (spark.repl.class.outputDir /classes और/या Connect artifacts)। |
| प्रमाणीकरण | StreamRequest / getStreamManager() पर कोई नहीं |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
एक Spark RPC पोर्ट पर TCP जिसमें spark.authenticate=true और एक पंजीकृत डिरेक्टरी है। कोई साझा रहस्य नहीं। कोई spark.network.crypto.enabled नहीं। streamId classes/../../<path> के साथ एक ट्रांसपोर्ट StreamRequest (संदेश प्रकार 6) भेजें। TransportRequestHandler.processStreamRequest कभी RpcHandler.receive को कॉल नहीं करता। यह getStreamManager().openStream को कॉल करता है। 9480 रैपर वास्तविक प्रबंधक लौटाता है। new File(dir, "../../oracle/secret") REPL/आर्टिफैक्ट रूट के बाहर कैनोनिकलाइज़ होता है और FileSegmentManagedBuffer के रूप में वापस आता है।
यह Spark UID के रूप में एक होस्ट-फ़ाइल पठन है। यह जॉब सबमिट नहीं है। यह RequestSubmitDriver नहीं है। यह शेल नहीं है।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
अनधिप्रमाणित StreamRequest classes/../../<path> | NettyStreamManager.openStream new File(dir, fname) फिर FileSegmentManagedBuffer | ड्राइवर द्वारा खोली जा सकने वाली Spark-UID फ़ाइलें पढ़ें। लैब-प्रमाणित: opened /opt/repl-classes/../../oracle/secret, कैनोनिकल /oracle/secret, बॉडी SPARK-RPC-STREAM-UNAUTH-WITNESS, x-auth-gated=false, x-authenticated=false। |
अनधिप्रमाणित StreamRequest classes/hello.txt (इन-डिर नियंत्रण) | वही जॉइन, पंजीकृत डिर के अंदर रहता है | एक फ़ाइल पढ़ें जो वास्तव में /classes के अंतर्गत है। लैब-प्रमाणित 200 IN-DIR-OK, कोई विटनेस नहीं। पुष्टि करता है कि फ़ाइल सर्वर SASL के बिना भी काम करता है, यहाँ तक कि एक सीमित नाम के लिए भी। |
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
लाइव ESS streamId का अनधिप्रमाणित ChunkFetchRequest / StreamRequest | OneForOneStreamManager.getChunk / openStream। checkAuthorization तब छोड़ देता है जब client.getClientId() == null | किसी अन्य ऐप के इन-फ़्लाइट शफल / डिस्क-RDD बाइट्स पढ़ें। उपलब्धता: ड्रेन curChunk को आगे बढ़ाता है। एक लाइव streamId आवश्यक है (रैंडम स्टार्ट, फिर +1)। गैजेट लाइव ESS से बात नहीं करता था। |
अनधिप्रमाणित MergedBlockMetaRequest | AbstractAuthRpcHandler.getMergedBlockMetaReqHandler() भी अनियंत्रित | जब ESS में मर्ज्ड शफल हो तो चुने गए appId के लिए मर्ज्ड-शफल चंक बिटमैप पढ़ें। वही null-clientId छूट। अभ्यास नहीं किया गया। |
| विधि | सिंक | बंद रहता है |
|---|---|---|
अनधिप्रमाणित StreamRequest classes//oracle/secret (Unix निरपेक्ष चाइल्ड) | new File(dir, "/oracle/secret") | 404। खोला गया पथ /opt/repl-classes/oracle/secret है। Unix File संयोजित करता है; यह पैरेंट को अनदेखा नहीं करता। यह दावा कि एक निरपेक्ष चाइल्ड रूट को गिरा देता है, Unix पर गलत है। |
अनधिप्रमाणित StreamRequest files//oracle/secret | files मैप गेट | 404। files/ और jars/ बेसनेम लुकअप हैं, जॉइन नहीं। |
अनधिप्रमाणित receive() / OneWayMessage | AbstractAuthRpcHandler.receive | 401 Unauthenticated call to receive(). x-auth-gated=true। |
अनधिप्रमाणित receiveStream() / UploadStream | AbstractAuthRpcHandler.receiveStream | 401 Unauthenticated call to receiveStream(). |
लैब सीक्रेट के साथ प्रमाणित receiveStream() | doAuthChallenge के बाद वही गेट | 200 receiveStream-ok। नियंत्रण कि सीक्रेट अभी भी 9480 पथ खोलता है। |
लैब-प्रमाणित बनाम अनुमानित: अनधिप्रमाणित .. फ़ाइल पठन, Unix निरपेक्ष 404, files/ 404, गेटेड receive / receiveStream लैब हैं। ESS शफल ड्रेन अनुमानित है।
निकटवर्ती बंद (बढ़ा-चढ़ाकर न बताएँ):
RequestSubmitDriver / RegisterApplication। अभी भी साझा रहस्य की आवश्यकता है।spark.authenticate=false अनधिप्रमाणित शफल और जॉब सबमिट (SECURITY.md FAQ, प्रलेखित विश्वसनीय-नेटवर्क डिफ़ॉल्ट)। यह अवशेष नहीं।AppIsolationSuite / SPARK-57889 गैर-null clientId)।/classes या artifacts पंजीकृत नहीं होता, इसलिए यह होस्ट-फ़ाइल वॉक ड्राइवर / REPL / Connect है, master:7077 नहीं।spark.authenticate.secret को डंप नहीं करता।मैंने apache/spark v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) को पिन किया, master नहीं और 4.3 RC नहीं। अट्ठाईस स्रोत खोजें। खुले क्लस्टर पर जॉब सबमिट डिज़ाइन से है। ML मॉडल लोड निष्पादन योग्य कोड है। सार्वजनिक Jackson History RCE, UI id -Gn शेल, PySpark स्थानीय प्रतिरूपण, और 9480 रिसीव-पथ इस पील पर बंद हैं।
RPC-auth खोज 9480 का पुनः-फ़ाइल जाँच होनी थी। AuthServerBootstrap अभी भी हैंडलर को रैप करता है। अनधिप्रमाणित receive अभी भी थ्रो करता है। फिर मैंने getStreamManager() पढ़ा। तीन पंक्तियाँ। यह डेलिगेट लौटाता है। TransportRequestHandler.handle StreamRequest को receive के चारों ओर रूट करता है। डिफ़ॉल्ट StreamManager.checkAuthorization एक नो-ऑप है। SPARK-57889 ने StreamRequest पर एक स्ट्रिंग-id जाँच जोड़ी और उस null-clientId छूट को रखा जिसका उपयोग ESS "auth off" के लिए करता है, जो "इस कनेक्शन ने कभी प्रमाणीकरण नहीं किया" भी है।
SparkContext /classes को पंजीकृत करता है जब spark.repl.class.outputDir सेट होता है। Connect ArtifactManager artifacts को पंजीकृत करता है। NettyStreamManager.openStream ftype/fname को विभाजित करता है। गैर-files/jars प्रकार बिना किसी कैनोनिकल-प्रीफ़िक्स जाँच के new File(dir, fname) करते हैं।