CVE-2016-4428
Medium · 5.4CVSS
5.4
EPSS
2.1%
Published
Jul 12, 2016
CISA due date
—
Cloudanix analysis
A flaw in the OpenStack management dashboard lets certain logged-in users trick the interface into running harmful code inside other users' browsers.
- Exploitation
- Remote Authenticated
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Data Exposure
- Component
- Application
- Class
- XSS
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Authenticated users can inject malicious AngularJS templates into Horizon dashboard forms, bypassing sanitization and executing arbitrary script in other users' browsers with the victim's session context.
Why it matters to the business
Attackers with low-privilege dashboard access could steal session tokens, modify displayed data, or perform actions on behalf of other administrators, increasing risk of unauthorized cloud resource changes or data exposure in OpenStack environments.
How an attack unfolds
An attacker authenticates to the Horizon dashboard, locates a form that accepts AngularJS template input, embeds a malicious expression that triggers on render, and waits for other users to load the affected page so the script executes under their privileges.
How to fix it
Upgrade OpenStack Horizon to a version beyond 9.0.1 that includes input sanitization for AngularJS templates; apply vendor patches for affected OpenStack and Red Hat distributions; enforce strict content security policies and disable unnecessary template rendering features until patched.
How to confirm the fix worked
Review Horizon release notes and package versions against known fixed releases; test forms for template injection by submitting safe Angular expressions and confirming they are escaped; scan dashboard source for updated sanitization logic around user-supplied templates.
Typical attack path
- Obtain valid credentials for a Horizon user account
- Navigate to a vulnerable dashboard form accepting template input
- Submit an AngularJS expression containing malicious JavaScript
- Induce other authenticated users to view the injected content
- Execute actions such as token theft or UI manipulation in victim context
How to detect it
Inspect web server and Horizon application logs for unusual form submissions containing AngularJS syntax such as double curly braces or ng- directives; monitor for unexpected script execution events or changes to dashboard content viewed by multiple users.
- {{constructor.constructor
- ng-app
- ng-bind-html
- angular.module
What your security team should do
- Prioritize patching Horizon instances given the authenticated attack surface
- Audit all custom or third-party dashboard plugins for similar template handling
- Implement web application firewall rules to block common AngularJS expression patterns
- Review logs for anomalous form submissions containing template syntax
The record
Cross-site scripting (XSS) vulnerability in OpenStack Dashboard (Horizon) 8.0.1 and earlier and 9.0.0 through 9.0.1 allows remote authenticated users to inject arbitrary web script or HTML by injecting an AngularJS template in a dashboard form.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | horizon | 0 | 8.0.2 |
| PyPI | horizon | 9.0.0 | 9.1.0 |
| Debian:11 | horizon | 0 | 3:9.0.1-2 |
| Debian:12 | horizon | 0 | 3:9.0.1-2 |
| Debian:13 | horizon | 0 | 3:9.0.1-2 |
| Debian:7 | horizon | 0 | 2012.1.1-10+deb7u1 |
| Debian:8 | horizon | 0 | 2014.1.3-7+deb8u2 |
| Red Hat:openstack:5::el6 | openstack-dashboard | 0 | 0:2014.1.5-4.el6ost |
| Red Hat:openstack:5::el6 | openstack-dashboard-theme | 0 | 0:2014.1.5-4.el6ost |
| Red Hat:openstack:5::el6 | python-django-horizon | 0 | 0:2014.1.5-4.el6ost |
| Red Hat:openstack:5::el6 | python-django-horizon-doc | 0 | 0:2014.1.5-4.el6ost |
| Red Hat:openstack:5::el7 | openstack-dashboard | 0 | 0:2014.1.5-4.el7ost |
| Red Hat:openstack:5::el7 | openstack-dashboard-theme | 0 | 0:2014.1.5-4.el7ost |
| Red Hat:openstack:5::el7 | python-django-horizon | 0 | 0:2014.1.5-4.el7ost |
| Red Hat:openstack:5::el7 | python-django-horizon-doc | 0 | 0:2014.1.5-4.el7ost |
| Red Hat:openstack:6::el7 | openstack-dashboard | 0 | 0:2014.2.3-9.el7ost |
| Red Hat:openstack:6::el7 | openstack-dashboard-theme | 0 | 0:2014.2.3-9.el7ost |
| Red Hat:openstack:6::el7 | python-django-horizon | 0 | 0:2014.2.3-9.el7ost |
| Red Hat:openstack:6::el7 | python-django-horizon-doc | 0 | 0:2014.2.3-9.el7ost |
| Red Hat:openstack:7::el7 | openstack-dashboard | 0 | 0:2015.1.4-1.el7ost |
| Red Hat:openstack:7::el7 | openstack-dashboard-theme | 0 | 0:2015.1.4-1.el7ost |
| Red Hat:openstack:7::el7 | python-django-horizon | 0 | 0:2015.1.4-1.el7ost |
| Red Hat:openstack:7::el7 | python-django-horizon-doc | 0 | 0:2015.1.4-1.el7ost |
| Red Hat:openstack:8::el7 | openstack-dashboard | 0 | 1:8.0.1-4.el7ost |
| Red Hat:openstack:8::el7 | openstack-dashboard-theme | 0 | 1:8.0.1-4.el7ost |
| Red Hat:openstack:8::el7 | python-django-horizon | 0 | 1:8.0.1-4.el7ost |
| SUSE:OpenStack Cloud 6 | openstack-ceilometer | 0 | 5.0.4~a0~dev6-6.1 |
| SUSE:OpenStack Cloud 6 | openstack-ceilometer-doc | 0 | 5.0.4~a0~dev6-6.2 |
| SUSE:OpenStack Cloud 6 | openstack-cinder | 0 | 7.0.3~a0~dev2-7.1 |
| SUSE:OpenStack Cloud 6 | openstack-cinder-doc | 0 | 7.0.3~a0~dev2-7.1 |
| SUSE:OpenStack Cloud 6 | openstack-dashboard | 0 | 8.0.2~a0~dev34-8.1 |
| SUSE:OpenStack Cloud 6 | openstack-glance | 0 | 11.0.2~a0~dev13-7.1 |
| SUSE:OpenStack Cloud 6 | openstack-glance-doc | 0 | 11.0.2~a0~dev13-7.1 |
| SUSE:OpenStack Cloud 6 | openstack-heat | 0 | 5.0.2~a0~dev93-9.1 |
| SUSE:OpenStack Cloud 6 | openstack-heat-doc | 0 | 5.0.2~a0~dev93-9.3 |
| SUSE:OpenStack Cloud 6 | openstack-keystone | 0 | 8.1.1~a0~dev13-3.1 |
| SUSE:OpenStack Cloud 6 | openstack-keystone-doc | 0 | 8.1.1~a0~dev13-3.2 |
| SUSE:OpenStack Cloud 6 | openstack-manila | 0 | 1.0.2~a0~dev11-9.1 |
| SUSE:OpenStack Cloud 6 | openstack-manila-doc | 0 | 1.0.2~a0~dev11-9.2 |
| SUSE:OpenStack Cloud 6 | openstack-neutron | 0 | 7.1.2~a0~dev29-10.1 |
| SUSE:OpenStack Cloud 6 | openstack-neutron-doc | 0 | 7.1.2~a0~dev29-10.1 |
| SUSE:OpenStack Cloud 6 | openstack-neutron-fwaas | 0 | 7.1.2~a0~dev1-6.1 |
| SUSE:OpenStack Cloud 6 | openstack-neutron-fwaas-doc | 0 | 7.1.2~a0~dev1-6.1 |
| SUSE:OpenStack Cloud 6 | openstack-neutron-lbaas | 0 | 7.1.2~a0~dev1-6.1 |
| SUSE:OpenStack Cloud 6 | openstack-neutron-lbaas-doc | 0 | 7.1.2~a0~dev1-6.1 |
| SUSE:OpenStack Cloud 6 | openstack-nova | 0 | 12.0.5~a0~dev2-7.1 |
| SUSE:OpenStack Cloud 6 | openstack-nova-doc | 0 | 12.0.5~a0~dev2-7.1 |
| SUSE:OpenStack Cloud 6 | openstack-resource-agents | 0 | 1.0+git.1467079370.4f2c49d-7.1 |
| SUSE:OpenStack Cloud 6 | python-networking-cisco | 0 | 2.1.1-6.1 |
| SUSE:OpenStack Cloud 6 | python-openstackclient | 0 | 1.7.2-4.1 |
| Ubuntu:14.04:LTS | horizon | 0 | 1:2014.1.5-0ubuntu2.1 |
| Ubuntu:16.04:LTS | horizon | 0 | 2:9.1.2-0ubuntu1 |
| pypi | horizon | 9.0.0 | No fix |
Related vulnerabilities
- CVE-2014-3473 Cross-site scripting (XSS) vulnerability in the Orchestration/Stack section in the… Also affects horizon
- CVE-2026-96379 Improper Neutralization of Input During Web Page Generation ("Cross-site Scripting")… CWE-79
- CVE-2026-96382 Improper Neutralization of Input During Web Page Generation ("Cross-site Scripting")… CWE-79
- CVE-2026-96368 Improper Neutralization of Input During Web Page Generation ("Cross-site Scripting")… CWE-79
- CVE-2026-96361 Improper Neutralization of Input During Web Page Generation ("Cross-site Scripting")… CWE-79
- CVE-2026-96362 Improper Neutralization of Input During Web Page Generation ("Cross-site Scripting")… CWE-79
- CVE-2026-96360 Improper Neutralization of Input During Web Page Generation ("Cross-site Scripting")… CWE-79
- CVE-2026-96357 Improper Neutralization of Input During Web Page Generation ("Cross-site Scripting")… CWE-79