Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-8452-check — كاشف سلوكي لحالة التصحيح لثغرة Citrix NetScaler CVE-2026-8452. يرسل طلبات SAML مُعدّة خصيصًا لتحديد ما إذا كان فحص حجم قائمة PrefixList موجودًا، دون استغلال الذاكرة أو إتلافها. | Kitploit
أدوات/GitHubGitHub/bishopfox/cve-2026-8452-check
ماسحات الثغرات الأمنيةتحليل الثغرات الأمنيةأمن الويبأمن الشبكات
GitHubbishopfox/cve-2026-8452-check

CVE-2026-8452-check

كاشف سلوكي لحالة التصحيح لثغرة Citrix NetScaler CVE-2026-8452. يرسل طلبات SAML مُعدّة خصيصًا لتحديد ما إذا كان فحص حجم قائمة PrefixList موجودًا، دون استغلال الذاكرة أو إتلافها.

عرض المستودع
1منذ 4 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

تجاوز سعة الكومة في قائمة بادئات SAML في Citrix NetScaler — سكربت كشف حالة التصحيح

فحص آمن وغير تدميري لحالة التصحيح لـ CVE-2026-8452، وهو تجاوز سعة الكومة قبل المصادقة في مُطبيع توقيع SAML الخاص بـ Citrix NetScaler ADC / NetScaler Gateway (CTX696604، CVSS 8.8). تؤدي قائمة PrefixList كبيرة الحجم في التوحيد الحصري إلى تجاوز سعة مخزن ثابت الحجم أثناء التطبيع، وهو ما ينفذه NetScaler قبل التحقق من التوقيع الذي يحملها — لذا فإن المسار بأكمله يمكن الوصول إليه دون بيانات اعتماد، دون جلسة، ودون توقيع صالح. أُبلغ عنه مايكل تاكر من فريق XOR في JPMorgan Chase؛ ويعود الفضل في تحليل السبب الجذري والاستغلال إلى مختبرات watchTowr.

لا يستغل هذا السكربت الثغرة ولا يفسد الذاكرة. إنه يجيب عن سؤال واحد لكل هدف: هل التصحيح موجود على هذا الجهاز؟ — يُحدد سلوكيًا، عبر ملاحظة التصحيح بدلاً من تخمين الإصدار.

هل من الآمن تشغيله؟

نعم. صُمم للاستخدام في الإنتاج والتقييم:

  • يظل المسبار دون عتبة التلف. 575 بايتًا كافية لأن تجيب الإصدارات المصلّحة وغير المصلّحة بشكل مختلف، وهي أقل بكثير من الطول الذي يبدأ عنده تلف الذاكرة على جهاز غير مصلّح. تم التحقق من ذلك بالقياس على أجهزة تغطي فرعي الدعم وحالتي التصحيح، بما في ذلك إصدارا الإصلاح.
  • العتبة التي يتجاوزها هي ثابت كود ثابت، وليست خاصية لنشر معين. الإصدارات المصلّحة تقبل PrefixList بحجم 512 بايت وترفض 513 أو أكثر. تم تحديد هذا الحد بدقة البايت، وهو مطابق في فرعي الدعم، ولا يتغير مع تكوين الجهاز أو مع شكل رسالة SAML المحيطة — كما تأكد من خلال اختبار المسارين، اللذين يغلّفان القيمة بكميات مختلفة جوهريًا من XML، وتبيّن أنهما يغيران السلوك عند نفس البايت. 575 يتجاوز الحد بـ63 بايتًا، لذا لا يعتمد الحكم على كيفية إعداد الهدف بالصدفة.
تنزيل الأداة
  • التصحيح لا يجعل الأجهزة ترفض قيم SAML الطويلة بشكل عام. ينطبق الحد على سمة PrefixList تحديدًا. تضخيم الحقول الأخرى لتتجاوزه — عناوين خدمة مستهلك التأكيد، أسماء المُصدر، معرّفات الخوارزمية، قيم التلخيص والتوقيع — لا يغيّر شيئًا في إصدار مصلّح، لذا فإن تطبيق الإصلاح لا ينبغي أن يتسبب في فشل تكوين SAML عامل.
  • لا يتم إفساد أي ذاكرة ولا إعادة تشغيل أي عملية. في إصدار مصلّح يُرفض المسبار عند فحص الحجم؛ وفي إصدار غير مصلّح يفشل بشكل آمن داخل المحلل. لا يصل أي منهما إلى التجاوز.
  • لا يدخل أي شيء حساس إلى مخرجات الفحص. يحمل المسبار رموز بادئات نطاق اصطناعية فقط، وتقوم الأداة بالإبلاغ عن حكم، وليس عن أجسام الاستجابة.
  • طولان ثابتان، وليس مسحًا. مسبار 575 بايتًا، بالإضافة إلى عنصر تحكم بحجم 35 بايتًا على المسار الذي يجيب. لا تقوم الأداة أبدًا بمسح نطاق من الأطوال ولا ترسل أي طول آخر.
  • إذا عدّلت المسبار، فلا تغيّر PROBE_PREFIXES ولا تمسح الأطوال. 575 بايتًا أمر جوهري. يمكن لأطوال PrefixList الأخرى أن تزعزع استقرار الجهاز، في حالة واحدة على الأقل على إصدار يحمل هذا الإصلاح، لذا فإن مسح الأطوال ليس طريقة آمنة لاستكشاف هذه الثغرة، والأقصر ليس أكثر أمانًا.

    كيف يعمل

    الإصدارات المصلّحة ترفض PrefixList كبير الحجم بشكل نظيف، مع رسالة مميزة. الإصدارات غير المصلّحة تعبر عبر المحلل وتُرجع خطأ داخليًا عامًا. طلب واحد متطابق، إجابتان مختلفتان:

    PrefixList بحجم 575 بايتالاستجابة
    غير مصلّح500 Internal Server Error 43549
    مصلّح200 Malformed Assertion sent to Netscaler

    يتم تجريب مسارين، مسار IdP أولاً، ويتوقفان بمجرد أن يعطي أحدهما إجابة. أي منهما كافٍ بمفرده، ويغطيان معًا دورَي SAML:

    المسارالطلبيتطلب
    1 (الأول)POST /saml/login — AuthnRequest موقّع، PrefixList في ds:SignedInfoسياسة SAML IdP مرتبطة بـ vserver المستهدف
    2 (احتياطي)POST /cgi/samlauth — SAMLResponse، PrefixList في توقيع التأكيدخدمة مستهلك تأكيد SAML SP على vserver المستهدف

    مسار IdP يأتي أولاً لأنه الأكثر متانة من الاثنين. إنه غير حساس لقيمة Issuer ولـ AssertionConsumerServiceURL، ولانحراف الساعة — فقيمة IssueInstant خارج نطاق تحمّل الجهاز لانحراف الساعة ما زالت تميّز بشكل صحيح، لأن التطبيع يسبق فحص الوقت وكذلك فحص التوقيع.

    يجب أن يكون طلب AuthnRequest في المسار 1 موقّعًا. الطلب غير الموقّع يُرجع 200 Malformed Assertion sent to Netscaler على الإصدارات المصلّحة وغير المصلّحة، وهو ما يطابق إشارة المصلّح بايتًا ببايت، لذا فإن المسبار الذي يحذف كتلة التوقيع يبلّغ عن كل جهاز على أنه مصلّح. لا يلزم أن يكون التوقيع صالحًا، وتوقيع هذه الأداة ليس صالحًا؛ يكفي فقط أن يكون موجودًا، لأن SignedInfo الخاص به هو ما يحمل PrefixList إلى المُطبيع.

    السلوك عند حد الإصلاح

    يغيّر فرعا الدعم سلوكهما تمامًا عند إصدار الإصلاح، على كلا المسارين:

    الإصدارالحكم
    13.1-63.16آخر 13.1 معرّض للثغرةVULNERABLE
    13.1-63.18أول 13.1 مُصلَّحPATCHED
    14.1-66.5914.1 معرّض للثغرةVULNERABLE
    14.1-72.61أول 14.1 مُصلَّحPATCHED

    13.1-63.16 و63.18 إصداران متتاليان، لذا يُعزى التغيير إلى التصحيح نفسه وليس إلى الانجراف عبر الإصدارات الوسيطة.

    تلك هي الإصدارات التي ظهر فيها هذا الإصلاح بالذات أولاً، ويكتشف المسبار هذا الانتقال بدقة. لم تعُد هي الإصدارات التي يُنصح بالترقية إليها: فالنشرات اللاحقة استبدلتها، لذا فإن 13.1-63.18 و 14.1-72.61 يُجيبان بـ PATCHED هنا بينما يظلان معرّضين لمشكلات أحدث. انظر الإصلاح لمعرفة الإصدارات المصلّحة الحالية.

    لماذا لا نأخذ بصمة الإصدار؟

    لأنها لا يمكن أن تعمل مع هذه الثغرة، حتى من حيث المبدأ. 13.1-63.16 و13.1-63.18، الإصداران اللذان يقعان مباشرة على جانبي الإصلاح، يخدمان tmindex.html وbase.css و resources.js متطابقة بايتًا ببايت — فالإصلاح لا يمس أي أصل ويب. كما تتطابق تجزئات الأصول الثابتة عبر الفروع، لذا يمكن لنهج قائم على التجزئة أن يحل جهازًا معرّضًا للثغرة إلى إصدار مصلّح ويُبلغ عنه كنظيف، وهو أسوأ نمط فشل يمكن أن تتعرض له أداة كشف. لذلك، فإن أخذ بصمة الإصدار غير مُطبَّق عمدًا. تأتي حالة التصحيح من المسبار، أو من show ns version حيث تتوفر لديك بيانات اعتماد.

    المتطلبات

    • Python 3.8+، المكتبة القياسية فقط — لا حزم خارجية.

    الاستخدام```bash

    single target

    ./cve_2026_8452_check.py https://gateway.example.com

    a specific AAA / Gateway virtual server

    ./cve_2026_8452_check.py https://gateway.example.com:9443

    scan a list, one target per line ('#' comments allowed), compact output

    ./cve_2026_8452_check.py -f targets.txt --brief

    machine-readable output for pipelines

    ./cve_2026_8452_check.py -f targets.txt --json > results.json

    root@kitploit:~
    وجّه الأداة إلى **الخادم الافتراضي Gateway أو AAA**، وليس إلى واجهة الإدارة. الشرط المسبق ينطبق لكل خادم افتراضي، لذا فإن الجهاز الذي يحتوي على عدة VIPs يتطلب اختبار كل واحد منها.
    
    ### الخيارات
    
    | الخيار | الوصف |
    | --- | --- |
    | `URL` | هدف واحد أو أكثر بصيغة `https://HOST[:PORT]` |
    | `-f, --targets-file FILE` | قراءة الأهداف من ملف (هدف واحد لكل سطر؛ تعليقات `#`) |
    | `-b, --brief` | سطر واحد محاذى لكل هدف — الحكم، الهدف، وسم السبب — لفحص العديد من المضيفين |
    | `--json` | إخراج نتائج JSON منظمة |
    | `--no-color` | تعطيل الإخراج الملون (يحترم أيضاً `NO_COLOR` وغير TTY) |
    | `--timeout SECS` | مهلة زمنية لكل طلب (الافتراضي: 15) |
    
    ### أمثلة
    
    **جهاز غير محدث،** استجاب على مسار IdP وتم تأكيده مقابل عنصر التحكم:```console
    $ ./cve_2026_8452_check.py https://gateway.example.com:9443
    ====================================================================
      CVE-2026-8452 - NetScaler SAML PrefixList patch-state check
      https://gateway.example.com:9443
    ====================================================================
    
    >> Identifying the appliance
         [ OK ]  NetScaler indicators: 5 (CSP contains citrixng://)
    >> Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control)
         idp /saml/login      HTTP 500 / 43549: no size check present
         idp /saml/login      35-byte control: HTTP 200 "message timestamp outside the appliance's skew tolerance": a different SAML condition, not the size check
         [FAIL]  Size check absent (via the IDP route)
    
    ====================================================================
                             RESULT: VULNERABLE
    ====================================================================
    
      https://gateway.example.com:9443 via IDP  [size-check-absent]
    
      The size check is absent. This appliance is unpatched for
      CVE-2026-8452. Upgrade to 13.1-63.21+ / 14.1-73.32+ (12.1 and
      13.0 are EOL and never fixed).
    
    ====================================================================
    

    سطر التحكم جدير بالقراءة عن كثب: طلب الـ35 بايت يتجاوز فحص الحجم ثم يُرفض بسبب IssueInstant القديم، بينما مسبار الـ575 بايت لم يبلغ تلك المرحلة أصلًا. هذا هو الترتيب الذي يستند إليه المنهج بأكمله — التطبيع يُنفَّذ قبل فحص الوقت، تمامًا كما يُنفَّذ قبل فحص التوقيع.

    جهاز مصحح، نفس الطلب ضد البناء المُصحَّح. فقط سطر المسبار يختلف — PrefixList الضخم يُرفض بالاسم بدلًا من الوصول إلى الخطأ الداخلي:```console

    Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control) idp /saml/login HTTP 200 "Malformed Assertion": size check rejected the probe idp /saml/login 35-byte control: HTTP 200 "message timestamp outside the appliance's skew tolerance": a different SAML condition, not the size check [ OK ] Size check present (via the IDP route)

    root@kitploit:~
                          RESULT: PATCHED
    

    https://vpn.example.com via IDP [size-check-present]

    root@kitploit:~
    **الرجوع إلى مسار SP.** هنا تكون نقطة نهاية IdP قابلة للوصول ولكن لا توجد سياسة IdP مرتبطة بهذا
    الخادم الافتراضي، لذا يمتنع المسار 1 ويستجيب المسار 2. عندما لا يطابق *أي* مسار سياسةً ما،
    تكون النتيجة `INCONCLUSIVE` موسومة بـ `no-policy-match` — وليست `PATCHED` أبدًا، وهذا هو السبب الكامل
    لوجود هذه النتيجة:```console
    >> Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control)
         idp /saml/login      HTTP 200 "Matching policy not found": parser not reached
         sp  /cgi/samlauth    HTTP 500 / 43549: no size check present
         sp  /cgi/samlauth    35-byte control: HTTP 200 "assertion rejected before the size check": a different SAML condition, not the size check
         [FAIL]  Size check absent (via the SP route)
    
                             RESULT: VULNERABLE
    

    لقد التقطه التحكم. هنا استجابت نقطة النهاية بالرسالة المرقّعة عند كلا الطولين، لذلك لم يتم تفعيل فحص الحجم أبدًا، ويُسحَب الجواب الذي يبدو حاسمًا. هذا هو انطلاق حارس الإيجابية الكاذبة، والسبب في انطلاقه مذكور بدلًا من تركه للاستنتاج:```console

    Probing patch state (64 prefixes / 575 bytes, confirmed against a 35-byte control) idp /saml/login HTTP 200 "Malformed Assertion": size check rejected the probe idp /saml/login 35-byte control: HTTP 200 "Malformed Assertion": size check rejected the probe [WARN] Probe and control answered alike, so the size check was never exercised

    root@kitploit:~
                        RESULT: INCONCLUSIVE
    

    https://sp-strict.example.com via IDP [flat-response]

    The 575-byte probe and the 35-byte control got the same answer, so this endpoint replies the same way whatever it is sent and the size check was never exercised. Unknown, not patched.

    root@kitploit:~
    **فحص أسطول** (`--brief`)، سطر واحد محاذى لكل هدف ينتهي بوسم السبب. رمز الخروج هو
    `1` إذا كان أي هدف `VULNERABLE`:```console
    $ ./cve_2026_8452_check.py -f targets.txt --brief; echo "exit: $?"
    VULNERABLE       https://gateway.example.com:9443   size-check-absent
    VULNERABLE       https://gateway.example.com:9444   size-check-absent
    PATCHED          https://vpn.example.com            size-check-present
    INCONCLUSIVE     https://sp-strict.example.com      flat-response
    INCONCLUSIVE     https://gw-nopolicy.example.com    no-policy-match
    UNAFFECTED       https://mgmt.example.com           no-saml-endpoint
    ERROR            https://offline.example.com        not-identified
    exit: 1
    

    مخرجات قابلة للقراءة آليًا (--json)، والتي تسجّل كل مسار تمت محاولته. verdict و reason و detail هي الحقول المعتمدة؛ بينما attempts هي الأدلة الخام، لذا قد يقرأ المسار الفردي patched على هدفٍ حكمُه INCONCLUSIVE:```console $ ./cve_2026_8452_check.py https://vpn.example.com --json [ { "target": "https://vpn.example.com", "verdict": "PATCHED", "reason": "size-check-present", "route": "idp", "detail": "HTTP 200 "Malformed Assertion": size check rejected the probe", "attempts": [ { "route": "idp", "path": "/saml/login", "state": "patched", "detail": "HTTP 200 "Malformed Assertion": size check rejected the probe" }, { "route": "idp", "path": "/saml/login", "state": "control:known-error", "detail": "35-byte control: HTTP 200 "message timestamp outside the appliance's skew tolerance": a different SAML condition, not the size check" } ], "netscaler_indicators": [ "CSP contains citrixng://", "CSP contains com.citrix.nsgclient://", "CSP contains nsgcepa://", "CSP report-uri /nscsp_violation/report_uri", "/vpn/js/rdx/ present (HTTP 404)" ] } ]

    root@kitploit:~
    ## الأحكام
    
    يحمل كل حكم وسم `reason` قصيرًا يسمّي الحالة الكامنة خلفه. يطبع `--brief` الوسم كعموده الثالث، ويحمله `--json` كحقل `reason`.
    
    | الحكم | وسم السبب | المعنى |
    | --- | --- | --- |
    | `VULNERABLE` | `size-check-absent` | تحقق الحجم غائب. هذا الجهاز غير مصحوب — قم بتصحيحه. |
    | `PATCHED` | `size-check-present` | تحقق الحجم اشتغل على مسار الكود الذي بلغه المسبار. **مقتصر على هذا CVE:** لا يعني أن الجهاز يعمل بإصدار حالي. |
    | `UNAFFECTED` | `no-saml-endpoint` | لم يستجب أي نقطة نهاية SAML على هذا الخادم الافتراضي، لذا فالمسار القابل للاستغلال غير قابل للوصول هنا. **لكل vserver، وليس لكل جهاز:** قد يكون SAML مُهيأ على vserver أو VIP آخر على نفس الصندوق. |
    | `INCONCLUSIVE` | `flat-response` | استجابت نقطة النهاية لمسبار 575 بايت وللضبط 35 بايت بالطريقة نفسها، لذا لم يُجرَ تحقق الحجم أبدًا. تُسحب الإجابة التي تبدو حاسمة — هذه هي آلية الحماية من الموجب الكاذب وهي تعمل. |
    | `INCONCLUSIVE` | `no-policy-match` | استجابت نقطة نهاية SAML لكن لم تطابق أي سياسة مرتبطة بالمسبار، لذا لم يبلغ أي من المسارين المُطبِّع. |
    | `INCONCLUSIVE` | `other-saml-error` | حالة SAML معروفة لكنها غير تشخيصية رفضت المسبار قبل تحقق الحجم — حد طول مختلف، أو سياسة توقيع، أو طابع زمني. |
    | `INCONCLUSIVE` | `unrecognized-reply` | استجاب سطح SAML بشيء خارج المجموعة المعروفة. |
    | `ERROR` | `not-identified` | لم يُعرَف كـ NetScaler، أو غير قابل للوصول. |
    
    جميع أسباب `INCONCLUSIVE` الأربعة تعني الشيء نفسه عند اتخاذ القرار — **غير معروف، وليس مصحوبًا.** تأكد باستخدام `show ns version`. وُجد الوسم ليخبر المشغّل *أي* حالة يجب إصلاحها قبل إعادة التشغيل: وجّه المسبار إلى خادم افتراضي مختلف، أو اربط سياسة مطابقة.
    
    يوجد `INCONCLUSIVE` كحكم مستقل، بكود خروج خاص به، لأن الجهاز القابل للاستغلال يمكن أن يرفض الإجابة على المسبار. إذا لم تطابق سياسة SAML المرتبطة بخادم افتراضي طلب المسبار، يقوم الجهاز باختصار المسار قبل المُطبِّع ولا يعيد أي شيء تشخيصي. الماسح الذي يفشل في المطابقة فقط يصبح صامتًا على مثل هذا المضيف، والصمت يُقرأ على أنه "مصحوب". هذه الأداة تبلغ عنه كغير معروف بدلًا من ذلك.
    
    ### كل حكم مؤكَّد مقابل عنصر تحكم
    
    يعتمد كل من `PATCHED` و `VULNERABLE` على استجابة *واحدة* مميّزة، لذلك تتحقق الأداة من أن الاستجابة تعتمد فعلًا على ما أُرسل. بعد إجابة حاسمة، تعيد تكرار الطلب باستخدام `PrefixList` قصير بحجم 35 بايت — أقل من أي تحقق حجم — ولا يثبت الحكم إلا إذا اختلفت الإجابتان. إذا تطابقتا، ترد نقطة النهاية بالطريقة نفسها مهما استقبلت، ولم يُجرَ تحقق الحجم أبدًا، وتكون النتيجة `INCONCLUSIVE`.
    
    هذا ليس افتراضيًا. مزوّد خدمة مُهيأ بـ `samlRejectUnsignedAssertion STRICT` يرفض المسبار بسبب توقيع مفقود *قبل* التحويل إلى الصيغة الأساسية، ويجيب برسالة مصحوبة عند كل طول. بدون عنصر التحكم، يبلّغ هذا الجهاز بـ `PATCHED` مع كود خروج 0 — لوحظ ذلك على إصدار قابل للاستغلال حقًا. الآن يبلّغ بـ `INCONCLUSIVE` مع وسم السبب `flat-response`، ويذكر التشغيل بعبارات صريحة أن تحقق الحجم لم يُجرَ أبدًا. يلتقط عنصر التحكم نفسه الحالة المرآتية، حيث تعيد نقطة النهاية الخطأ الداخلي العام للطلبات التي لم تُحلَّل أبدًا.
    
    ### إجابات معروفة غير تشخيصية
    
    تمتلك نقطة نهاية SAML في NetScaler مجموعة كبيرة من الردود المحتملة، وواحدتان فقط منهما تثبتان حالة التصحيح. تتعرف الأداة على 20 من البقية وتسمّي الحالة في سطر المسار المعني بدلًا من إعادة صدى نص الاستجابة، على سبيل المثال:```text
         idp /saml/login      HTTP 200 "post body over the appliance's maximum": a different length limit rejected the probe first
         sp  /cgi/samlauth    HTTP 200 "assertion rejected before the size check": a different SAML condition, not the size check
    

    ثلاثة منها قيود على الطول — جسم طلب POST ضخم الحجم، وقيمة RelayState ضخمة، واسم مستخدم مستخرج طويل جدًا. هذه هي الأكثر أهمية، لأنها تعني أن الطلب رُفض بفحص مختلف للطول قبل الوصول إلى الفحص الذي يميّز حالة التصحيح. وهذا يعني عادةً أن المسبار يحتاج إلى توجيهه إلى خادم افتراضي مختلف، لا أن الجهاز سليم.

    أحد العشرين يظهر في كل تشغيل عبر مسار IdP: حالة الاختبار الضابط message timestamp outside the appliance's skew tolerance. يحمل المسبار IssueInstant ثابتًا، لذا فإن اختبارًا ضابطًا يتجاوز فحص الحجم يُرفض بعد ذلك بسبب عمره — وهي خاصية للمسبار، لا للجهاز. أي رد خارج مجموعة العشرين يُطبع كسطر أول خاص به بدلًا من شرط مُسمّى.

    كلها ما زالت تُنتج INCONCLUSIVE، موسومة بـ other-saml-error. إن التعرّف على استجابة لا يرقّيها أبدًا إلى PATCHED: فقط إجابة صريحة من إصدار مُصحَّح تفعل ذلك، وكل رد غير معروف يقع أيضًا في INCONCLUSIVE — باعتباره unrecognized-reply. الغرض من التعرّف هو إخبار المشغّل لماذا لم يمكن تصنيف الهدف، وليس تصنيفه.

    رموز الخروج

    الرمزالمعنى
    0مُصحَّح، أو غير متأثّر على الخادم الافتراضي المستهدف
    1هدف واحد على الأقل هو VULNERABLE
    2خطأ في الاستخدام (وسائط خاطئة / ملف أهداف غير قابل للقراءة)
    3هدف واحد على الأقل هو INCONCLUSIVE، ولا يوجد أي هدف ثغرة
    4هدف واحد على الأقل حدث فيه خطأ، ولا يوجد أي هدف ثغرة أو غير محسوم

    2 هو رمز خروج argparse نفسه للاستدعاء الخاطئ، لذلك تتخطاه رموز الحكم. وبناءً عليه، يمكن لسكربت غلاف أن يميّز بين "تعذّر تصنيف هذا الجهاز" (3) و"استدعيت الأداة بشكل خاطئ" (2)، وهو ما لا يستطيع مخطط يفرط في تحميل الرمز 2 فعله.

    عبر مسح متعدد الأهداف، يُختار الرمز وفقًا للأولوية، وليس وفقًا لأسوأ حالة: VULNERABLE > INCONCLUSIVE > ERROR > نظيف. لذلك فإن المضيف غير القابل للوصول لا يخفي أبدًا نتيجة ثغرة في رمز الخروج.

    القيود

    • هذا يفحص ثغرة CVE واحدة، وليس مستوى تصحيح الجهاز. PATCHED ورمز الخروج 0 يعنيان أن فحص الحجم الخاص بـ CVE-2026-8452 موجود على المسار الذي بلغه المسبار. وهما لا يقولان شيئًا عن أي ثغرة أخرى في NetScaler، بما في ذلك تلك التي أُعلنت بعد هذا الخطأ وصُحِّحت في إصدارات لاحقة. لا تعتبر الخروج 0 من هذه الأداة شهادة سلامة كاملة للجهاز.
    • الحكم بعدم وجود ثغرة يقتصر على نقطة النهاية التي فحصتها. الشرط المسبق هو لكل خادم افتراضي. UNAFFECTED تعني "غير قابل للوصول من هنا"، وليس "هذا الجهاز آمن".
    • مطابقة السياسة تتحكم في المحلِّل (parser). المسار /saml/login على مستوى الجهاز بالكامل، لكن على خادم افتراضي لا توجد عليه سياسة IdP مرتبطة، يستجيب بـ Matching policy not found ويختصر الإجراء قبل الـ canonicalizer. أي IdP تستخدم سياسته قاعدة تعبير لا يلبيها طلب المسبار سيقع في INCONCLUSIVE بدلًا من إعطاء إجابة.
    • INCONCLUSIVE ليست شهادة سلامة كاملة. هي مُميَّزة عمدًا عن PATCHED برمز خروج منفصل بحيث لا يُخلَط أبدًا بين الصمت ونتيجة ناجحة.
    • نشر nFactor مع SAML خلف عامل أول يُبلِّغ عن INCONCLUSIVE. عندما تكون سياسة SAML في تسمية سياسة يُوصَل إليها عبر nextFactor بدلًا من ربطها مباشرة بالخادم الافتراضي، فإن تأكيدًا غير مطلوب لا يجد سياسة مطابقة ويختصر الإجراء قبل الـ canonicalizer. تم التحقق من ذلك على إصدار ثغرة، وقد أبلغ عن INCONCLUSIVE. وبما أن SAML خلف عامل أول مثل device-posture أو login-schema نمط شائع، تعامل مع INCONCLUSIVE على بوابة nFactor على أنها "على الأرجح قابلة للوصول، تأكد باستخدام show ns version"، وليس أمرًا غريبًا.
    • ليس فحص استغلال. حكم VULNERABLE يؤكد غياب فحص الحجم، وهو حالة التصحيح. وهو لا يقيس إلى أي مدى يمكن لمهاجم أن يستغل التلف في إصدارك.
    • الوصول فقط. النتيجة تعكس ما يكشفه الجهاز لموقع الشبكة الذي تشغّل منه الأداة. ووجود WAF أمام الجهاز يمكن أن يُخفي الاستجابة.

    المعالجة

    قم بالترقية إلى 13.1-63.21 أو أحدث، أو 14.1-73.32 أو أحدث (FIPS وNDcPP: 14.1-73.32 FIPS، أو 13.1-37.277 لـ 13.1-FIPS و13.1-NDcPP).

    الإصلاح الخاص بـ CVE-2026-8452 نفسه شُحن لأول مرة في 13.1-63.18 / 14.1-72.61 وفقًا CTX696604، وهذا هو الانتقال الذي تكشفه هذه الأداة. وقد استُبدلت هذه الإصدارات منذ ذلك الحين بـ CTX696939 (2026-08-19)، الذي يضيف CVE-2026-19489 وCVE-2026-19490، الأخيرة منها عبارة عن تجاوز للمصادقة قبل المصادقة، بتقييم CVSS 9.3. شرطها المسبق على إصدارات من 14.1-43.56 / 13.1-61.28 فصاعدًا هو وجود إجراء SAML مُهيأ — لذا فإن الجهاز الذي يقع ضمن نطاق هذا الخطأ الذي تفحصه الأداة من المرجح أن يقع أيضًا في نطاق تلك الثغرة، وحكم PATCHED هنا ليس سببًا لتأجيل الترقية. كلا النشرتين تُعالجان بالإصدارات المذكورة أعلاه.

    أجهزة 12.1 أو 13.0 لا تملك إصلاحًا ولن تحصل على واحد — هذه الفروع منتهية الدعم ويجب التعامل معها على أنها ثغرة دائمة وترحيلها إلى فرع مدعوم.

    ملاحظتان إضافيتان:

    • طبّق التصحيح على عقدتي زوج HA معًا. العقدة الثانوية غير المُصحَّحة هي جهاز مكشوف بالكامل في اللحظة التي تتولى فيها العمل.

    • حدّد نطاق مخزونك بناءً على إعداد SAML، وليس على نوع الخادم الافتراضي. صياغة نشرة البائع (خادم Gateway أو AAA الافتراضي) أوسع من شرط التشغيل. افحص الإعداد الحالي بحثًا عن add authentication samlAction وadd authentication samlIdPProfile بالإضافة إلى add authentication vserver وadd vpn vserver.

      هذا مُختبر، وليس مستنتَجًا. على جهاز مؤكَّد إصابته بالثغرة، أزلنا كل كائنات SAML، وربطنا عامل مصادقة غير SAML مكانها، وتركنا خوادم AAA الافتراضية تعمل وتقدّم الخدمة: بعدها أعادت نقاط نهاية SAML 404 لكل طلب. ليست هذه النقاط مجرد مقيّدة بسياسة دون إعداد SAML — بل إنها غير موجودة. لذا فإن الخادم الافتراضي الذي لا يحتوي على SAML خارج نطاق هذا الخطأ فعلًا، وUNAFFECTED على مثل هذا الهدف إجابة حقيقية وليست نقطة عمياء. الملاحظة التحذيرية التي ما تزال سارية هي تحديد النطاق أعلاه: فهو لكل خادم افتراضي، لذا أكّد كل VIP بدلًا من استنتاج أي شيء بشأن الجهاز.

    CVE-2026-8452 صدر جنبًا إلى جنب مع خمس ثغرات شقيقة في نفس النشرة. الثغرة التي تستحق التتبع بجانبه هي CVE-2026-8451، وهي قراءة زائدة للذاكرة قبل المصادقة في مسار SAML IdP شهدت استغلالًا نشطًا في البرية. تشترك الثغرتان في سطح هجوم واحد، لذا فإن نفس مراجعة الإعداد تغطيهما معًا.

    الترخيص

    يُوزَّع هذا الكود بموجب رخصة MIT.

    إخلاء المسؤولية القانوني

    استخدام هذه الأداة لمهاجمة أهداف دون موافقة مسبقة متبادلة غير قانوني. وتقع على عاتق المستخدم النهائي مسؤولية الامتثال لجميع القوانين المحلية والولائية والاتحادية المعمول بها. لا يتحمل المطوّرون أي مسؤولية ولا يُعتبرون مسؤولين عن أي إساءة استخدام أو ضرر يسببه هذا البرنامج.

    انظر أيضًا

    • Citrix CTX696604 — نشرة أمان NetScaler
    • Citrix CTX696939 — نشرة NetScaler لاحقة تستبدل تلك الإصدارات المُصحَّحة
    • watchTowr Labs — تحليل تقني لـ CVE-2026-8452
    • NVD — CVE-2026-8452