تحليل ثغرة CVE-2026-88779 في Citrix NetScaler

تحليل ثغرة CVE-2026-88779 في Citrix NetScaler

Avatar
cyberpunk SUPER ADMIN
Super Admin
2026/10/08 2 0

نظرة عامة على الثغرة

CVE-2026-88779 هي ثغرة Memory Overflow (تجاوز سعة الذاكرة المؤقتة) من نوع CWE-119 (القيود غير الصحيحة على العمليات داخل حدود المخزن المؤقت للذاكرة)، تؤثر على أجهزة Citrix NetScaler ADC و NetScaler Gateway التي تم تكوينها للعمل مع SAML Authentication (إما كـ SAML Service Provider أو SAML Identity Provider) .

تم إضافة هذه الثغرة إلى قائمة CISA KEV (Known Exploited Vulnerabilities) في 4 أكتوبر 2026، مما يؤكد استغلالها الفعلي في هجمات حقيقية .

التفاصيل التقنية

آلية الثغرة

تقع الثغرة في nsaaad daemon (خدمة المصادقة والترخيص والتدقيق)، وتحديداً في XML parser الذي يعالج بيانات SAML الواردة. المشكلة أن parser لا يتحقق من طول البيانات قبل نسخها إلى buffers محدودة الحجم، مما يسمح بكتابة بيانات خارج حدود المخزن المؤقت .

المتطلبات الأساسية للاستغلال

لتكون الجهاز عرضة للاستغلال، يجب أن يكون مُكوَّناً كـ:

  • SAML Service Provider (SP): يظهر في التكوين add authentication samlAction

  • SAML Identity Provider (IdP): يظهر في التكوين add authentication samlIdPProfile

التأثير

  • Denial of Service (DoS): انهيار خدمة nsaaad وإعادة تشغيل الجهاز

  • في بيئات High Availability (HA): حدوث cascading failover loop — الجهاز النشط ينهار، يتولى الجهاز الاحتياطي، يُستهدف هو الآخر، وهكذا في حلقة لا نهائية

  • CVSS v4.0 Score: 8.7 (High)

ملاحظة مهمة: على الرغم من أن Citrix تصنف الثغرة كـ DoS، إلا أن باحثين لاحظوا shell commands في حقل username أثناء محاولات الاستغلال، مما قد يشير إلى إمكانية Remote Code Execution (RCE) — لكن هذا لم يُؤكَّد رسمياً بعد .

الإصدارات المتأثرة والإصلاحات

المنتجالإصدارات المتأثرةالإصدار المُصلَّحNetScaler ADC & Gateway 14.1قبل 14.1-73.4114.1-73.41 أو أحدثNetScaler ADC & Gateway 13.1قبل 13.1-64.2813.1-64.28 أو أحدثNetScaler ADC 14.1-FIPSقبل 14.1-73.41 FIPS14.1-73.41 FIPS أو أحدثNetScaler ADC 13.1-FIPS & NDcPPقبل 13.1-37.28213.1-37.282 أو أحدث

تحذير حاسم: إذا قمت بتحديث أجهزتك سابقاً لمعالجة الثغرات CVE-2026-88771 حتى CVE-2026-88778، فأنت لا تزال معرضاً للخطر — يجب التحديث مرة أخرى إلى الإصدارات المذكورة أعلاه .

مؤشرات الاختراق (IoCs)

  • عنوان IP ضار: 213.209.159.55 — يُستخدم لتنزيل payload

  • أوامر مشبوهة: shell commands في حقل username أثناء مصادقة SAML

  • سلوك الجهاز: انهيارات متكررة في nsaaad، إعادة تشغيل غير متوقعة، وصول Pitboss إلى حد إعادة التشغيل

  • ملفات مشبوهة: /v (script تم تنزيله)


سكربت الفحص

bash

#!/bin/bash
# CVE-2026-88779 Exposure Checker
# للاستخدام التعليمي والدفاعي فقط
# يعمل على NetScaler ADC/Gateway أو مع نسخة من ns.conf

set -euo pipefail

# ========== الإعدادات ==========
NS_CONF_PATH="${1:-/nsconfig/ns.conf}"
EXPORTED_CONF="${2:-}"
CHECK_IOC="${3:-false}"

# الإصدارات المُصلَّحة
FIXED_14_1="14.1-73.41"
FIXED_13_1="13.1-64.28"
FIXED_FIPS_14_1="14.1-73.41 FIPS"
FIXED_FIPS_13_1="13.1-37.282"

# ========== الألوان ==========
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# ========== دوال مساعدة ==========
log_info()  { echo -e "${GREEN}[INFO]${NC} $*"; }
log_warn()  { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*"; }

# ========== تحديد مصدر التكوين ==========
get_config() {
    if [ -n "$EXPORTED_CONF" ] && [ -f "$EXPORTED_CONF" ]; then
        echo "$EXPORTED_CONF"
    elif [ -f "$NS_CONF_PATH" ]; then
        echo "$NS_CONF_PATH"
    elif [ -f "/nsconfig/ns.conf" ]; then
        echo "/nsconfig/ns.conf"
    else
        log_error "لم يتم العثور على ملف ns.conf"
        exit 1
    fi
}

# ========== استخراج الإصدار ==========
get_version() {
    local config_file="$1"
    local version=""
    
    # محاولة استخراج من رأس الملف
    version=$(grep -m1 -E "^#NS_VERSION|^# VERSION|^# Version" "$config_file" 2>/dev/null | \
              sed -E 's/^#\s*(NS_VERSION|VERSION|Version)\s*[=:]\s*//' | tr -d ' \r\n' || true)
    
    # إذا لم ينجح، البحث عن أي سطر يحتوي على إصدار
    if [ -z "$version" ]; then
        version=$(grep -m1 -oE "[0-9]+\.[0-9]+-[0-9]+\.[0-9]+" "$config_file" 2>/dev/null || true)
    fi
    
    echo "$version"
}

# ========== فحص شرط SAML ==========
check_saml_precondition() {
    local config_file="$1"
    local saml_sp=false
    local saml_idp=false
    
    if grep -qE "^\s*add\s+authentication\s+samlAction\b" "$config_file" 2>/dev/null; then
        saml_sp=true
    fi
    
    if grep -qE "^\s*add\s+authentication\s+samlIdPProfile\b" "$config_file" 2>/dev/null; then
        saml_idp=true
    fi
    
    if $saml_sp || $saml_idp; then
        echo "PRESENT"
        [ "$saml_sp" = true ] && echo "  - SAML Service Provider (samlAction) detected" >&2
        [ "$saml_idp" = true ] && echo "  - SAML Identity Provider (samlIdPProfile) detected" >&2
    else
        echo "ABSENT"
    fi
}

# ========== مقارنة الإصدارات ==========
version_lt() {
    # مقارنة إصدارات بأسلوب: 1 إذا $1 < $2
    [ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ] && [ "$1" != "$2" ]
}

check_vulnerable_version() {
    local current_ver="$1"
    local major_minor=""
    
    # استخراج السلسلة الرئيسية (14.1 أو 13.1)
    major_minor=$(echo "$current_ver" | grep -oE "^[0-9]+\.[0-9]+" || true)
    
    case "$major_minor" in
        14.1)
            if echo "$current_ver" | grep -qi "fips"; then
                if version_lt "${current_ver// /}" "${FIXED_FIPS_14_1// /}"; then
                    return 0  # vulnerable
                fi
            else
                if version_lt "$current_ver" "$FIXED_14_1"; then
                    return 0  # vulnerable
                fi
            fi
            ;;
        13.1)
            if echo "$current_ver" | grep -qiE "fips|ndcpp"; then
                if version_lt "$current_ver" "$FIXED_FIPS_13_1"; then
                    return 0  # vulnerable
                fi
            else
                if version_lt "$current_ver" "$FIXED_13_1"; then
                    return 0  # vulnerable
                fi
            fi
            ;;
        *)
            # إصدار غير معروف - نعتبره غير قابل للتحديد
            return 2
            ;;
    esac
    
    return 1  # not vulnerable
}

# ========== فحص IoC (اختياري، على الجهاز فقط) ==========
check_iocs() {
    log_warn "بدء فحص مؤشرات الاختراق (يتطلب صلاحيات root)..."
    
    # فحص ملفات مشبوهة
    if [ -f "/v" ]; then
        log_error "تم العثور على ملف مشبوه: /v"
    fi
    
    # فحص عمليات مشبوهة
    if ps aux 2>/dev/null | grep -qE "nobody|www-data" | grep -qv grep; then
        log_warn "عمليات مشبوهة تحت مستخدم nobody"
    fi
    
    # فحص crontab
    if crontab -l 2>/dev/null | grep -qvE "^#|^$"; then
        log_warn "إدخالات crontab غير متوقعة"
    fi
    
    # فحص سجلات HTTP لوجود b64decode أو shell commands
    if [ -d "/var/log" ]; then
        if zgrep -qE "b64decode|eval|base64" /var/log/ns.log* 2>/dev/null; then
            log_error "أنماط مشبوهة في السجلات (b64decode/eval)"
        fi
    fi
    
    log_info "اكتمل فحص IoC (النتائج تحتاج مراجعة بشرية)"
}

# ========== التنفيذ الرئيسي ==========
main() {
    echo "=========================================="
    echo "  CVE-2026-88779 Exposure Checker"
    echo "  Citrix NetScaler SAML Memory Overflow"
    echo "=========================================="
    echo ""
    
    local config_file
    config_file=$(get_config)
    log_info "ملف التكوين: $config_file"
    
    # 1. استخراج الإصدار
    local version
    version=$(get_version "$config_file")
    
    if [ -z "$version" ]; then
        log_error "تعذر تحديد إصدار NetScaler من ملف التكوين"
        exit 1
    fi
    
    log_info "الإصدار المكتشف: $version"
    
    # 2. فحص شرط SAML
    local saml_status
    saml_status=$(check_saml_precondition "$config_file")
    
    if [ "$saml_status" = "PRESENT" ]; then
        log_warn "تم اكتشاف تكوين SAML - الشرط الأساسي للثغرة متحقق"
    else
        log_info "لم يتم اكتشاف تكوين SAML"
    fi
    
    # 3. فحص الإصدار
    local vuln_status=1
    if check_vulnerable_version "$version"; then
        vuln_status=0
    else
        local ret=$?
        if [ "$ret" -eq 2 ]; then
            vuln_status=2
        fi
    fi
    
    echo ""
    echo "=========================================="
    echo "              النتيجة"
    echo "=========================================="
    
    if [ "$saml_status" = "PRESENT" ]; then
        if [ "$vuln_status" -eq 0 ]; then
            log_error "الجهاز عرضة للخطر (VULNERABLE)"
            echo ""
            echo "  السبب:"
            echo "  - إصدار قديم غير مُصلَّح"
            echo "  - تكوين SAML نشط"
            echo ""
            echo "  الإجراء المطلوب:"
            echo "  - الترقية إلى: 14.1-73.41 أو 13.1-64.28"
            echo "  - أو أحدث FIPS/NDcPP المطابق"
            echo ""
            echo "  حتى الترقية:"
            echo "  - فعّل Global Deny List في NetScaler Console"
            echo "  - احجب IP: 213.209.159.55"
            echo "  - راقب سجلات nsaaad و Pitboss"
            exit 2
        elif [ "$vuln_status" -eq 1 ]; then
            log_info "الجهاز غير معرض للخطر (PATCHED)"
            echo "  الإصدار الحالي مُصلَّح لهذه الثغرة."
            exit 0
        else
            log_warn "حالة غير معروفة (UNKNOWN VERSION)"
            echo "  تحقق يدوياً من الإصدار مقابل الإصدارات المُصلَّحة."
            exit 3
        fi
    else
        log_info "الجهاز غير معرض (SAML غير مُكوَّن)"
        echo "  الشرط الأساسي (SAML SP/IdP) غير متحقق."
        exit 0
    fi
}

# ========== نقطة الدخول ==========
# الاستخدام:
#   ./check_cve_2026_88779.sh [مسار ns.conf]
#   ./check_cve_2026_88779.sh /path/to/exported_ns.conf /path/to/exported_ns.conf true

if [ "${BASH_SOURCE[0]}" = "$0" ]; then
    main "$@"
fi

طريقة الاستخدام

bash

# على جهاز NetScaler نفسه (مع صلاحيات nsroot)
chmod +x check_cve_2026_88779.sh
./check_cve_2026_88779.sh

# باستخدام نسخة مصدّرة من ns.conf
./check_cve_2026_88779.sh /path/to/ns.conf /path/to/ns.conf

# مع فحص IoC (على الجهاز فقط)
./check_cve_2026_88779.sh /nsconfig/ns.conf "" true

ملاحظات مهمة حول السكربت

  1. نتيجة الفحص: إذا كان الجهاز VULNERABLE، قم بالترقية فوراً إلى الإصدار المُصلَّح، حتى لو كنت قد رقّيت سابقاً لثغرات أخرى.

  2. فحص IoC: يتطلب صلاحيات root ويعمل على الجهاز نفسه؛ النتائج تحتاج مراجعة بشرية.

  3. إذا كان SAML غير مُكوَّن: الجهاز غير عرضة لهذه الثغرة تحديداً، لكن قد يكون عرضة لثغرات أخرى.

توصيات إضافية للدفاع

  • التصحيح الفوري: الترقية إلى الإصدارات المذكورة أعلاه حتى لو قمت بالترقية سابقاً لثغرات CTX697096 .

  • Global Deny List: تفعيل التوقيعات (v24+) في NetScaler Console لمنع عناوين IP الضارة .

  • مراقبة السجلات: راقب انهيارات nsaaad، وأحداث إعادة تشغيل Pitboss، والطلبات المتكررة على نقاط نهاية SAML.

  • حجب IP: احجب 213.209.159.55 على الأجهزة المحيطة بآجهزة NetScaler.

  • التحقق من السلامة: بعد الترقية، تحقق من عدم وجود ملفات مشبوهة (مثل /v) أو عمليات غير معتادة.

الردود والمناقشات التقنية 0

لا توجد ردود بعد

كن أول من يشارك رأيه أو استفساره التقني حول هذا الموضوع

إضافة رد أو استفسار تقني

يجب تسجيل الدخول لإضافة ردود ومشاركة الأكواد في هذا الموضوع.