
تدقيقات تُهزم ذاتيًا: مختبر قابل لإعادة الإنتاج يُظهر كيف يمكن لدور PostgreSQL منخفض الامتياز أن يُعمي مُدقّقًا قائمًا على المشغّلات بشكل قابل للعكس + تسميم الإسناد (PG14/16)، مع الدفاعات. بيانات اصطناعية؛ تم الاستشهاد ببدائيات CVE-2018-1058.
الترخيص: MIT (الكود) / CC BY 4.0 (الوثائق)
بحث في الأمن الدفاعي يختبر ما إذا كان دور قاعدة بيانات منخفض الامتياز، يعتمد على الحقن فقط يمكنه تعمية مدقّق يعتمد على المشغّلات بشكل عكسي وتسميم الإسناد على PostgreSQL القياسي — وأي الدفاعات توقفه فعلًا. كل شيء يعمل داخل حاويات Docker محلية وقابلة للتخلص مع بيانات اصطناعية بالكامل (عناوين IP توثيقية RFC 5737، هويات مخترعة). لا تُستخدم أي أنظمة أو بيانات اعتماد أو بيانات حقيقية.
انظر موجز المختبر في self-defeating-audits-lab.md.
يبني الضحية "مشغّل التدقيق" المنسوخ على نطاق واسع من ويكي PostgreSQL، ثم يعمل عبر مصفوفة الجدوى خليةً خليةً على PostgreSQL 14 و16، ليقيس — خارج النطاق — ما إذا كان كل متجه هجوم يوقف فعلًا كتابةً ما عن أن تُدقَّق، وما إذا كان قابلاً للعكس دون أي أثر متبقٍّ، وأي الدفاعات تحيده.
cd scripts
./00_up.sh 16 # bring up postgres:16-alpine on localhost:55432
./run_matrix.sh 16 # run every matrix cell + defenses -> ../results/RESULTS_pg16.md
docker rm -f sda_pg16 # free the port between versions
./00_up.sh 14
./run_matrix.sh 14 # -> ../results/RESULTS_pg14.md
./teardown.sh # remove all lab containers
يتطلب Docker. يستخدم صور -alpine (محرك مطابق وظيفيًا).
أُعيدت الدراسة على عائلتين إضافيتين من المحركات. عائلة MySQL (MariaDB، نموذج مشغّل DEFINER) ضمن scripts/mysql/:
cd scripts/mysql
./00_up.sh 10.11 && ./run_matrix_mysql.sh 10.11 # -> results/RESULTS_mariadb_10.11.md
docker rm -f sda_maria_10_11 && ./00_up.sh 10.6 && ./run_matrix_mysql.sh 10.6
SQL Server (نموذج سلسلة الملكية) ضمن scripts/mssql/ — يعمل على مثيل LocalDB محلي عبر sqlcmd المضيف (بدون Docker؛ المهاجم منخفض الامتياز مُنمذَج بانتحال EXECUTE AS USER):
cd scripts/mssql
./run_matrix_mssql.sh # -> results/RESULTS_mssql.md ; then ./teardown.sh
ملاحظة حول قابلية إعادة الإنتاج (SQL Server). بخلاف محركات Docker، يعتمد الجزء الثالث الخاص بـ SQL Server على المضيف: فهو يعمل على مثيل SQL Server LocalDB محلي عبر
sqlcmd(المسار مثبّت فيrun_matrix_mssql.sh)، لذا فهو مخصص لنظام Windows فقط ولا يمكن تثبيته على بصمة صورة. المهاجم منخفض الامتياز مُنمذَج بانتحالEXECUTE AS USER(يدعم LocalDB مصادقة Windows فقط). نتائج سلوك المحرك (DISABLE دون أثر متبقٍّ؛ حارس DDL يفوته DISABLE) مستقلة عن نوع الجلسة وستنطبق على تسجيل دخول حقيقي؛ نتائج منح الكائنات تُفرض بأمانة عبر الانتحال. وهو الأقل قابلية للنقل بين المحركات الثلاثة — مُشار إليه بصراحة.
النتيجة الرئيسية عبر المحركات: فئة تظليل search_path (1A/1B) لا تنتقل إلى MySQL ولا SQL Server (لا يوجد search_path)، لكن استبدال المشغّل والالتفاف الخامل وتسميم الإسناد تنتقل. ربط امتيازات DEFINER في MySQL يجعل التعمية أكثر قابلية للاكتشاف؛ بينما SQL Server، مثل PostgreSQL، يتيح استعادة مطابقة بايتًا ببايت ويضيف أولية DISABLE TRIGGER دون أثر متبقٍّ يفوته دفاع DDL الخاص به. المقارنة الكاملة للمحركات الثلاثة في FINDINGS.md.
CREATE SCHEMA)، ليس لأن "pg_catalog يفوز". الزرع في public القابل للكتابة مسبقًا يُحدث تظليلًا فعلًا: كلٌّ من 1S (نفس التوقيع، ترتيب المخططات) و1T (التحميل الزائد المطابق يغلب المدمج حتى عندما يكون pg_catalog أولًا — يعزل خصوصية النوع) يعمّي (بتفريغ الحمولة).row_to_json بنوع مركّب — يعمّي المدقّق عندما يكون public قابلاً للكتابة وsearch_path الخاص بالمشغّل غير مثبّت. قابل للوصول على PostgreSQL القياسي ≤14؛ مشروط بسوء الإعداد على 15+. تثبيت search_path يهزمه في كل مكان.pgaudit/log_statement) + هما الدفاعان اللذان يُغلقان المجموعة.أُعيد إنتاج الدراسة على PostgreSQL قياسي في مختبر محلي ببيانات مجهولة/اصطناعية. نطاق SQL الهجومي مقصور على مخطط المختبر المبني هنا؛ هذه دراسة جدوى/دفاعات، وليست حمولة مُسلّحة. الأوليات الأساسية علنية أصلًا (CVE-2018-1058؛ تصعيد SECURITY DEFINER عبر search_path) — المساهمة هي التركيبة وتقييم الدفاعات. لم يُحدَّد أي نظام حقيقي.
| المسار | الوصف |
|---|
scripts/00_up.sh | حاوية مؤقتة مثبتة على إصدار محدد (PostgreSQL) |
scripts/mysql/ | ضحية عائلة MySQL (MariaDB)، والهجمات، والدفاعات، ومنسّق التشغيل |
scripts/mssql/ | ضحية SQL Server (LocalDB)، والهجمات، والدفاعات، ومنسّق التشغيل |
results/RESULTS_mariadb_*.md | مصفوفات جدوى عائلة MySQL + الدفاعات |
results/RESULTS_mssql.md | مصفوفة جدوى SQL Server + الدفاعات |
scripts/10_victim.sql | ضحية التدقيق بنمط الويكي (مشغّل SECURITY DEFINER)؛ مقابض: pub_create, pin_path, app_owns |
scripts/20_attacks.sql | كل متجهات الهجوم (1A/1B/1C، خمول GUC، تسميم الإسناد)، حارس \if واحد لكل خلية |
scripts/30_defenses.sql | حارس مشغّل أحداث DDL + مصرف للإلحاق فقط بسلسلة تجزئة |
scripts/40_snapshot.sql | لقطة كتالوج لفرق كائنات RQ2 |
scripts/run_matrix.sh | منسّق التشغيل: يبني كل خلية، ويقيس، ويكتب results/RESULTS_pg<VER>.md |
scripts/teardown.sh | إزالة الحاويات |
results/RESULTS_pg14.md, results/RESULTS_pg16.md | مصفوفات الجدوى + الدفاعات معبأة لكل إصدار |
results/_evidence_pg*.log, results/_snap_1C_*.txt | أدلة أولية للأوامر/المخرجات |
FINDINGS.md | حكم RQ1–RQ5 بلغة إنجليزية بسيطة، مصفوفة دفاع×هجوم، تحديد موقع الجدة، ملخص |