
ماسح ضوئي دون اتصال لاختراق مفتاح CA الخاص بـ eMudhra/emSign في أكتوبر 2026، يكتشف الشهادات المتأثرة عبر مخازن الثقة في أنظمة التشغيل، وحزم CA، وJava cacerts، وNSS، وصور الحاويات.
أدوات كشف لـ اختراق المفتاح الخاص لسلطة الشهادة الوسيطة eMudhra / emSign في أكتوبر 2026. صدرت ثماني سلطات شهادات وسيطة بمفاتيح P-384 كانت قيمها العددية الخاصة أعدادًا صحيحة صغيرة (القيم المستعادة 4, 56, 66, 115, 155, 156, 230, 237)، لذا يمكن لأي شخص تزوير شهادات تتسلسل إليها بسهولة بالغة. دفعت المتصفحات ومخازن الثقة في أنظمة التشغيل إلى عدم الثقة بسرعة - لكن معظم مخازن الثقة غير الخاصة بالمتصفحات لا تُحدَّث تلقائيًا، وهذا ما تكتشفه هذه الأداة.
الحالة: الحادثة جارية، لذا تعامل مع مؤشرات الاختراق (IOCs) المضمّنة على أنها لقطة (كل تشغيل يطبع تاريخ
generatedالخاص بها). لتحديثها، حدّثtools/sources/*.jsonمن المتتبع المصدر وأعد تشغيل المولّد (أدناه).
trustscan (Python) و**trustscan.ps1** (Windows/PowerShell) يجردان
مخازن الثقة وحزم سلطات الشهادات على المضيف ويشيران إلى أي شيء يطابق الشهادات
المتأثرة. مكتبة قياسية خالصة + cryptography؛ لا تبعيات أخرى.
يتطلب Python 3 وcryptography (التبعية الوحيدة):
pip install -r requirements.txt
# scan this host's trust stores and CA bundles
python trustscan.py
# machine-readable for ticketing
python trustscan.py --format csv > findings.csv
# Windows-native: cert stores (both scopes) + GPO roots + env bundles
pwsh -File trustscan.ps1
رموز الخروج: 0 = سليم، 1 = نتيجة/نتائج، 2 = خطأ. النتائج التي تحتوي على INFO فقط (انظر
--flag-aaa أدناه) تُرجع رمز الخروج 0.
كل تشغيل ينتهي بسطر تنبيه واحد حول مسار التوقيع المتقاطع AAA (انظر
النطاق والقيود). في وضع text يكون جزءًا
من التقرير؛ وفي وضع json/csv يُكتب إلى stderr حتى يبقى المخرَج
القابل للقراءة آليًا نظيفًا.
كل شهادة تُعثر عليها في أي موقع أدناه تُؤخذ لها بصمة ويُتحقق منها بأربع طرق:
| المطابقة | الخطورة | المعنى |
|---|---|---|
compromised_ca_cert | CRITICAL | الشهادة الوسيطة المخترقة نفسها (SHA-256 للشهادة) |
compromised_key_reuse | CRITICAL | شهادة مختلفة تحمل مفتاحًا مخترقًا (SPKI SHA-256) - يلتقط التوقيعات المتقاطعة من Sectigo وأي إعادة إصدار |
issued_by_compromised_ca | HIGH | شهادة طرفية/CA فرعية يشير AuthorityKeyIdentifier الخاص بها إلى شهادة وسيطة مخترقة - قابلة للتزوير |
distrust_root_present | CRITICAL | جذر emSign غير الموثوق ما زال موثوقًا هنا. مفتاحه نفسه سليم - لكن المفاتيح الوسيطة عامة، فطالما هذا الجذر موثوق فإن شهادة مزوّرة لأي نطاق تُتحقق لكل عميل لا يفحص الإبطال (معظم العملاء غير المتصفحات). أزله / حدّث الحزمة. بحد ذاته لا يغلق مسار التوقيع المتقاطع AAA (أدناه) |
هناك فحص إضافي اختياري (--flag-aaa / -FlagAaa):
| المطابقة | الخطورة | المعنى |
|---|---|---|
cross_sign_root_present | INFO | جذر Sectigo الشرعي AAA Certificate Services موجود. لقد وقّع توقيعًا متقاطعًا للشهادات الوسيطة الثماني، فهو يرسّخ مسار الثقة الثاني لها؛ ومفتاحه نفسه سليم. أسقطته Mozilla وChrome في أبريل 2025، لكن Windows وApple وحزم Linux الأقدم والعديد من مخازن مفاتيح Java ما زالت تثق به. يُبلَّغ عنه عند الطلب فقط، للفرق التي تقرر ما إذا كانت ستزيله (تحديث Debian لهذا الحادث يزيله)؛ لا يؤثر أبدًا على رمز الخروج |
افتراضيًا لا يُعلَّم AAA Certificate Services: مفتاحه نفسه سليم وإسقاطه خيار متعمد، وليس معالجة افتراضية. انظر القيود أدناه لمعرفة سبب أهمية ذلك.
trustscan| المصدر | ما هو | المواقع التي تم فحصها |
|---|---|---|
certifi | حزمة CA الخاصة بـ Python | certifi.where() (يُحلّ في وقت التشغيل) |
bundles → distro | تجميعات ca-certificates الخاصة بنظام التشغيل | Debian/Arch/Alpine /etc/ssl/certs/ca-certificates.crt · RHEL /etc/pki/tls/certs/ca-bundle.crt، /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem، cacerts الموحّد لـ Java، دليل المسؤول anchors/ · SUSE /etc/ssl/ca-bundle.pem، /var/lib/ca-certificates/ca-bundle.pem · دليل مصدر Debian /usr/share/ca-certificates/ · /etc/ssl/cert.pem |
bundles → FreeBSD | ca_root_nss | /usr/local/share/certs/ca-root-nss.crt · /usr/local/etc/ssl/cert.pem |
bundles → Homebrew / MacPorts | brew / port ca-certificates، openssl | /opt/homebrew/etc/ca-certificates/cert.pem · /opt/homebrew/etc/openssl*/cert.pem · /usr/local/etc/... (Intel) · /opt/local/etc/{openssl,ssl}/cert.pem |
bundles → curl | حزمة curl المستقلة | /usr/local/share/curl/curl-ca-bundle.crt · /opt/local/share/curl/curl-ca-bundle.crt · C:\Program Files\Git\...\ca-bundle.crt |
bundles → conda | ssl/cacert.pem لكل بيئة | $CONDA_PREFIX · /opt/conda · ~/anaconda3، ~/miniconda3، ~/miniforge3 (بما في ذلك envs/*) |
bundles → AWS CLI v2 | botocore المضمّن | /usr/local/aws-cli/.../botocore/cacert.pem · C:\Program Files\Amazon\AWSCLIV2\... |
bundles → حزم SDK السحابية / السجل / النظام البيئي | المزيد من الحزم المضمّنة | gcloud / Azure CLI third_party/certifi · سجل الحاويات /etc/{docker,containers}/certs.d/*/ · Perl Mozilla::CA · Erlang/Elixir certifi |
bundles → pip | certifi المضمّن في pip | <pip>/_vendor/certifi/cacert.pem (يُحلّ عبر import pip) |
nss | Firefox / Thunderbird / Chrome-Linux + قاعدة بيانات NSS للنظام | ~/.mozilla/firefox/*/cert9.db · ~/.thunderbird/*/cert9.db · ~/snap/firefox/common/.mozilla/firefox/*/cert9.db · ~/.pki/nssdb/cert9.db · /etc/pki/nssdb/cert9.db · %APPDATA%\Mozilla\Firefox\Profiles\*\cert9.db · %APPDATA%\Thunderbird\Profiles\*\cert9.db |
| المصدر | المواقع التي تم فحصها |
|---|---|
os (Linux) | /etc/ssl/certs · /usr/local/share/ca-certificates · /etc/pki/tls/certs · /etc/pki/ca-trust/extracted/pem (بشكل تكراري)، بالإضافة إلى Android/AOSP /system/etc/security/cacerts، /apex/com.android.conscrypt/cacerts، cacerts-added/ (ملفات بأسماء تجزئة) |
os (macOS) | security find-certificate -a -p على سلاسل المفاتيح الافتراضية + SystemRootCertificates.keychain |
os (Windows، Python) | ssl.enum_certificates لـ ROOT، CA، MY، TrustedPublisher، AuthRoot + جذور LocalMachine المدفوعة عبر نهج المجموعة (السجل) |
java | $JAVA_HOME + جذور JVM (/usr/lib/jvm/*، /opt/java/*، /Library/Java/JavaVirtualMachines/*، C:\Program Files\Java\*، Adoptium، Corretto، Microsoft) → .../lib/security/cacerts |
env | الملفات في SSL_CERT_FILE، REQUESTS_CA_BUNDLE، CURL_CA_BUNDLE، NODE_EXTRA_CA_CERTS؛ الدليل في SSL_CERT_DIR |
containers (اختياري) | Docker /var/lib/docker/overlay2/*/diff، podman (الجذر + بدون جذر، بما في ذلك المستخدمون الآخرون)، لقطات overlayfs الخاصة بـ containerd - يفحص الحزمة المجمّعة لكل طبقة؛ يتطلب صلاحيات الجذر، ويحدد اسم الموقع الطبقة |
apptrust (اختياري) | مخازن ثقة Java لخوادم التطبيقات والبنية التحتية للبيانات (Tomcat، WildFly/JBoss، Kafka، Elasticsearch) وبيئات JRE المضمّنة في التطبيقات تحت /opt/*/jre/.../cacerts، C:\Program Files\*\jre\... - بيئات JRE الخاصة المضمّنة من البائعين التي يفوتها فحص Java على المضيف |
أهداف --path | المخازن المشار إليها في الإعدادات (nginx، Apache، HAProxy، Oracle sqlnet.ora، LDAP)، والحزم الخاصة بكل مشروع (Composer vendor/composer/ca-bundle/...) - وجّه --path إليها |
paths | أي ملفات/أدلة تمررها |
--rootfs <dir> | مواقع مخازن distro / curl / Java / Android داخل صورة مستخرجة أو rootfs للبرنامج الثابت |
متغيرات
envتحتوي على مسار، وليس بيانات شهادة - يقرأtrustscanالملف (الملفات) الموجودة في ذلك المسار.
--pathcertifi ليست الحزمة الوحيدة في Python التي تُرفق جذور CA الخاصة بها. هذه الحزم تُضمّن ملف *.pem الخاص بها داخل site-packages، بشكل مستقل عن كل من certifi ومخزن نظام التشغيل:
| الحزمة | الملف المُضمَّن |
|---|---|
| botocore (AWS CLI / boto3) | botocore/cacert.pem |
| grpcio (gRPC) | grpc/_cython/_credentials/roots.pem |
| httplib2 | httplib2/cacerts.txt (امتداد غريب - مرّر الملف مباشرةً) |
| requests (legacy <2.16) | requests/cacert.pem |