
كاشف سلوكي لحالة التصحيح لثغرة Citrix NetScaler CVE-2026-8452. يرسل طلبات SAML مُعدّة خصيصًا لتحديد ما إذا كان فحص حجم قائمة PrefixList موجودًا، دون استغلال الذاكرة أو إتلافها.
فحص آمن وغير تدميري لحالة التصحيح لـ CVE-2026-8452، وهو تجاوز سعة الكومة قبل المصادقة
في مُطبيع توقيع SAML الخاص بـ Citrix NetScaler ADC / NetScaler Gateway
(CTX696604،
CVSS 8.8). تؤدي قائمة PrefixList كبيرة الحجم في التوحيد الحصري إلى تجاوز سعة مخزن ثابت الحجم أثناء
التطبيع، وهو ما ينفذه NetScaler قبل التحقق من التوقيع الذي يحملها — لذا
فإن المسار بأكمله يمكن الوصول إليه دون بيانات اعتماد، دون جلسة، ودون توقيع صالح. أُبلغ عنه مايكل
تاكر من فريق XOR في JPMorgan Chase؛ ويعود الفضل في تحليل السبب الجذري والاستغلال إلى
مختبرات watchTowr.
لا يستغل هذا السكربت الثغرة ولا يفسد الذاكرة. إنه يجيب عن سؤال واحد لكل هدف: هل التصحيح موجود على هذا الجهاز؟ — يُحدد سلوكيًا، عبر ملاحظة التصحيح بدلاً من تخمين الإصدار.
نعم. صُمم للاستخدام في الإنتاج والتقييم:
PrefixList بحجم 512 بايت وترفض 513 أو أكثر. تم تحديد هذا الحد بدقة البايت،
وهو مطابق في فرعي الدعم، ولا يتغير مع تكوين الجهاز أو
مع شكل رسالة SAML المحيطة — كما تأكد من خلال اختبار المسارين، اللذين يغلّفان القيمة
بكميات مختلفة جوهريًا من XML، وتبيّن أنهما يغيران السلوك عند نفس
البايت. 575 يتجاوز الحد بـ63 بايتًا، لذا لا يعتمد الحكم على كيفية إعداد الهدف
بالصدفة.PrefixList تحديدًا. تضخيم الحقول الأخرى لتتجاوزه — عناوين خدمة مستهلك التأكيد،
أسماء المُصدر، معرّفات الخوارزمية، قيم التلخيص والتوقيع — لا يغيّر شيئًا في إصدار مصلّح، لذا
فإن تطبيق الإصلاح لا ينبغي أن يتسبب في فشل تكوين SAML عامل.إذا عدّلت المسبار، فلا تغيّر
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.59 | 14.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 حيث تتوفر لديك
بيانات اعتماد.
./cve_2026_8452_check.py https://gateway.example.com
./cve_2026_8452_check.py https://gateway.example.com:9443
./cve_2026_8452_check.py -f targets.txt --brief
./cve_2026_8452_check.py -f targets.txt --json > results.json
وجّه الأداة إلى **الخادم الافتراضي 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)
RESULT: PATCHED
https://vpn.example.com via IDP [size-check-present]
**الرجوع إلى مسار 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
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.
**فحص أسطول** (`--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)"
]
}
]
## الأحكام
يحمل كل حكم وسم `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 > نظيف. لذلك فإن المضيف غير القابل للوصول لا يخفي أبدًا
نتيجة ثغرة في رمز الخروج.
PATCHED ورمز الخروج 0 يعنيان أن
فحص الحجم الخاص بـ CVE-2026-8452 موجود على المسار الذي بلغه المسبار. وهما لا يقولان شيئًا عن أي ثغرة أخرى
في NetScaler، بما في ذلك تلك التي أُعلنت بعد هذا الخطأ وصُحِّحت في إصدارات لاحقة. لا تعتبر
الخروج 0 من هذه الأداة شهادة سلامة كاملة للجهاز.UNAFFECTED تعني "غير قابل للوصول من هنا"، وليس "هذا الجهاز آمن"./saml/login على مستوى الجهاز بالكامل، لكن على خادم افتراضي
لا توجد عليه سياسة IdP مرتبطة، يستجيب بـ Matching policy not found ويختصر الإجراء قبل
الـ canonicalizer. أي IdP تستخدم سياسته قاعدة تعبير لا يلبيها طلب المسبار
سيقع في INCONCLUSIVE بدلًا من إعطاء إجابة.INCONCLUSIVE ليست شهادة سلامة كاملة. هي مُميَّزة عمدًا عن PATCHED
برمز خروج منفصل بحيث لا يُخلَط أبدًا بين الصمت ونتيجة ناجحة.INCONCLUSIVE. عندما تكون سياسة SAML
في تسمية سياسة يُوصَل إليها عبر nextFactor بدلًا من ربطها مباشرة بالخادم الافتراضي، فإن
تأكيدًا غير مطلوب لا يجد سياسة مطابقة ويختصر الإجراء قبل الـ canonicalizer.
تم التحقق من ذلك على إصدار ثغرة، وقد أبلغ عن INCONCLUSIVE. وبما أن SAML خلف عامل أول
مثل device-posture أو login-schema نمط شائع، تعامل مع INCONCLUSIVE على بوابة nFactor
على أنها "على الأرجح قابلة للوصول، تأكد باستخدام show ns version"، وليس أمرًا غريبًا.VULNERABLE يؤكد غياب فحص الحجم، وهو
حالة التصحيح. وهو لا يقيس إلى أي مدى يمكن لمهاجم أن يستغل التلف في إصدارك.قم بالترقية إلى 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.
استخدام هذه الأداة لمهاجمة أهداف دون موافقة مسبقة متبادلة غير قانوني. وتقع على عاتق المستخدم النهائي مسؤولية الامتثال لجميع القوانين المحلية والولائية والاتحادية المعمول بها. لا يتحمل المطوّرون أي مسؤولية ولا يُعتبرون مسؤولين عن أي إساءة استخدام أو ضرر يسببه هذا البرنامج.