Sep 24, 2026·7 min read·16 visits
An authenticated backend SSRF vulnerability in the Contao CMS Feed Reader module allows users with module-editing privileges to force the host server to scan or interact with private internal networks and cloud metadata endpoints.
A Server-Side Request Forgery (SSRF) vulnerability exists in the Contao Open Source Content Management System (CMS) within the Feed Reader front-end module. When processing RSS feed configurations, the module initiates outbound HTTP connections using a default HTTP client that lacks loopback and private network controls. Authenticated backend users with permissions to configure frontend modules can exploit this flaw to coerce the server into sending requests to internal endpoints, loopback addresses, and cloud instance metadata services.
CVE-2026-57232 describes a Server-Side Request Forgery (SSRF) vulnerability in the Contao Open Source Content Management System (CMS). The defect resides within the Feed Reader front-end module, which is designed to fetch, parse, and display RSS feeds from external sources. Because the network architecture of the module did not restrict target destinations, the application represents an exposed attack surface to anyone capable of editing frontend module configurations.
The vulnerability is classified under CWE-918 (Server-Side Request Forgery). The scope of this issue allows an attacker to direct HTTP requests from the hosting server to arbitrary external hosts, internal local networks, loopback addresses, or cloud-specific instance metadata endpoints. This dynamic allows adversaries to bypass boundary protection systems that restrict direct external access to internal infrastructure.
While the baseline impact on confidentiality is low, the vulnerability introduces operational risks depending on the network environment in which Contao is deployed. The system acts as an open proxy for internal services, rendering administrative panels, microservices, and management daemons vulnerable to targeted enumeration.
The root cause of this vulnerability lies in the implementation of the RSS rendering logic within core-bundle/src/Controller/FrontendModule/FeedReaderController.php. The controller uses a third-party feed-reading library named FeedIo to handle the downloading and formatting of RSS feeds. When fetching external documents, the FeedReaderController::getResponse() function processes user-configured feed URLs and executes the network request using the statement $this->feedIo->read($url, new Feed()).
The underlying HTTP client injected into the feed-reading service was wired directly to the @psr18.http_client service, which maps to Symfony's standard HttpClient wrapper. By default, this HTTP client contains no inherent filters to validate or block destination IP addresses. As a result, the client handles requests targeting internal IP address blocks, such as loopback interfaces (127.0.0.1, [::1]), private subnets (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), and link-local addresses (169.254.169.254) with no validation checks.
Additionally, the Data Container Array (DCA) field definition for rss_feed in tl_module.php did not enforce strict schema or protocol verification on the input values. Administrators or users with restricted module-editing permissions could save arbitrary URI schemes and targets. The combination of unvalidated backend database configuration fields and an unfiltered outbound HTTP client directly enabled the SSRF state.
To resolve the vulnerability, the Contao maintainers introduced a decorated HTTP client named NoPrivateNetworkExceptRootPagesHttpClient to wrap Symfony's HTTP client structure. Below is a simplified representation of how the patch inspects and blocks requests to private ranges while permitting legitimate loopback calls to root pages of the CMS.
// Contao\CoreBundle\HttpClient\NoPrivateNetworkExceptRootPagesHttpClient
private function ipCheck(string $ip, string|null $host, string $url): void
{
$ipFlags = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6;
if (!\defined('STREAM_PF_INET6')) {
$ipFlags &= ~FILTER_FLAG_IPV6;
}
$ipFlags |= FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
// Verify if the resolved IP belongs to a public space
if (false !== filter_var($ip, FILTER_VALIDATE_IP, $ipFlags) && !IpUtils::checkIp($ip, IpUtils::PRIVATE_SUBNETS)) {
return;
}
// Allow private IPs only if the request targets a pre-configured CMS root page
if ($this->originAllowed($url)) {
return;
}
throw new TransportException(\sprintf('IP "%s" is blocked for "%s".', $ip, $url));
}The implementation is robust against DNS Rebinding attacks. Many simple SSRF filters perform a single DNS resolution at the start of the request lifecycle, creating a Time-of-Check to Time-of-Use (TOCTOU) bug. Contao mitigates this risk by registering an on_progress callback with Symfony's HTTP transport, validating the connection's primary_ip during the actual socket connection phase:
$options['on_progress'] = function (int $dlNow, int $dlSize, array $info) use ($onProgress): void {
static $lastPrimaryIpUrl = '';
if (!empty($info['primary_ip']) && $info['primary_ip']."\0".$info['url'] !== $lastPrimaryIpUrl) {
$this->ipCheck($info['primary_ip'], null, $info['url']);
$lastPrimaryIpUrl = $info['primary_ip']."\0".$info['url'];
}
null !== $onProgress && $onProgress($dlNow, $dlSize, $info);
};Furthermore, the patch disables automatic HTTP redirects (max_redirects = 0) at the native library layer. Instead, it processes each redirect link manually within the decorator loop, running the resolved IP check on every hop in the redirection chain. This structure prevents attackers from using a public domain to trigger an internal redirect to loopback services.
Exploitation of CVE-2026-57232 requires low-privileged administrative access to the Contao backend. The attacker must possess credentials belonging to a role permitted to modify frontend modules, specifically those of the Feed Reader type.
Once logged in, the exploitation steps proceed as follows:
First, the attacker creates or edits a Feed Reader module within the administrative interface. In the "RSS feeds" form field, instead of entering a legitimate external feed, they input an address pointing to a restricted internal network resource, such as http://169.254.169.254/latest/meta-data/.
Second, the module configuration is saved to the database. The attacker then ensures this module is assigned to a published page. When the attacker or an unsuspecting visitor requests the page containing the Feed Reader module, the server-side application processes the page and executes FeedReaderController::getResponse().
Third, the web server initiates an outbound HTTP request directly to the specified target. If the service on the targeted IP returns structured XML, the module may render parts of the data. Even if the service returns non-XML data resulting in a parsing error, the attacker can verify connectivity, perform blind SSRF, or measure response times to map active ports and internal network infrastructure.
The impact of CVE-2026-57232 is quantified by its CVSS v3.1 vector string of CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N, yielding a base score of 3.1 (Low). The low score is primarily influenced by the privilege requirement, as an attacker must have a backend account with module modification rights (PR:L), and the high attack complexity (AC:H) due to the parser expecting valid RSS syntax to display response data.
In environments where Contao is deployed on cloud hosting solutions such as AWS, Google Cloud, or Azure, the vulnerability poses a risk of metadata exposure. If the cloud instance is configured with older metadata endpoint formats (such as AWS IMDSv1, which does not require a custom HTTP header), an attacker could query local endpoints to extract sensitive data, instance credentials, or API keys.
In standard enterprise environments, the server-side request capability allows adversaries to bypass perimeter security. An attacker can scan internal corporate networks, map accessible ports on the local host, and trigger arbitrary GET requests against unauthenticated administrative services running within the loopback boundary.
The primary remediation strategy is to upgrade the Contao CMS installation to a fixed version. Maintainers have released patches addressing this vulnerability across all supported branches. System administrators must upgrade immediately to Contao version 5.3.48 (LTS) or version 5.7.9.
If patching cannot be executed immediately, administrators should implement the following mitigating controls:
169.254.169.254 and limit outbound egress on ports 80 and 443 to known external gateways).rss_feed fields containing private or loopback IP structures.CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Contao core-bundle Contao | >= 5.3.35, <= 5.3.47 | 5.3.48 |
Contao core-bundle Contao | >= 5.7.0-RC1, <= 5.7.8 | 5.7.9 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-918 (Server-Side Request Forgery) |
| Attack Vector | Network (AV:N) |
| CVSS v3.1 Score | 3.1 (Low) |
| EPSS Score | 0.0029 (0.29% percentile: 19.12%) |
| Impact | Low Confidentiality (C:L), No Integrity (I:N), No Availability (A:N) |
| Exploit Status | No public exploits or weaponized PoCs available |
| KEV Status | Not listed in CISA KEV Catalog |
Server-Side Request Forgery (SSRF) occurs when a web application fetches a remote resource without validating the user-supplied URL. This allows an attacker to coerce the application into sending a crafted request to an unexpected destination, often bypassing security controls such as firewalls.
CVE-2026-16454 is an object-level authorization bypass vulnerability (CWE-284, CWE-862) in Eclipse hawkBit versions 1.0.3 and prior. The flaw exists within the Direct Device Integration (DDI) REST controller (hawkbit-ddi-resource), where endpoints responsible for enumerating software module metadata and serving firmware binaries fail to verify whether the requested software module is assigned to the authenticated device. Consequently, any device with valid credentials (such as a TargetToken or GatewayToken) can enumerate software module identifiers and download arbitrary firmware artifacts across the entire tenant namespace.
CVE-2026-62284 (GHSA-5w5g-j6hw-6p8f) is a code injection and server-side request forgery vulnerability in the console-proxy component of the OSAC Operator. The RemoteConfigResolver parses Kubernetes Secrets containing kubeconfig files via clientcmd.RESTConfigFromKubeConfig without sanitizing execution-related fields. An attacker with RBAC permissions to create or modify labeled Secrets in monitored namespaces can supply a malicious exec credential plugin, resulting in arbitrary command execution within the console-proxy pod.
CVE-2026-62361 (GHSA-xgjr-7j9q-2h4r) is an authenticated SQL injection and authorization bypass vulnerability in listmonk, an open-source, self-hosted newsletter and mailing list manager written in Go. In versions prior to 6.2.0, the subscriber export endpoint (GET /api/subscribers/export) directly interpolates user-supplied SQL filter expressions into a PostgreSQL query without invoking the table allowlist validation function (validateQueryTables). Consequently, authenticated users possessing the subscribers:sql_query and subscribers:get_all permissions can bypass relational access controls, execute arbitrary subqueries against restricted tables such as users and settings, and modify database state via writable Common Table Expressions (CTEs).
CVE-2026-28385 (GHSA-3gq2-x4qg-p4g6) is a Server-Side Request Forgery (SSRF) vulnerability in Canonical LXD versions 4.12 through 6.9. An authenticated user possessing the can_create_images entitlement can force the LXD daemon to execute arbitrary outbound HTTP and HTTPS requests via the /1.0/images API endpoint. Due to the absence of egress destination validation, an attacker can probe host loopback services, RFC 1918 private network segments, and cloud Instance Metadata Services (IMDS) from the network position of the privileged LXD daemon.
Canonical LXD and LXC Incus contain an arbitrary file write vulnerability (CWE-73 / CWE-59) in the `/1.0/instances/<name>/exec` REST API endpoint. When an instance is unpacked from an image archive, top-level symbolic links are extracted directly onto the host filesystem within the instance storage directory. If a crafted image includes a symbolic link named `exec-output` pointing to an arbitrary host path, invoking the execution endpoint with `record-output: true` causes the privileged host daemon to follow the symlink and write command output files directly to the target host directory. An authenticated attacker with permissions to import images and execute commands can exploit this flaw to write controlled content to sensitive host directories such as `/etc/cron.d`, resulting in arbitrary code execution on the host as `root`.
CVE-2026-48749 (tracked as GHSA-vghh-5rfx-xhq8 for LXD and GHSA-2q3f-q5pq-g8wv for Incus) is a critical container escape vulnerability in the Canonical LXD and Linux Containers Incus system container managers. By importing a specially crafted container image archive containing duplicate tar member headers, an authenticated attacker can replace the instance rootfs directory with a symbolic link pointing to the underlying host root filesystem. When performing file operations on a stopped container, the privileged forkfile helper binary resolves the symbolic link without confinement and chroots directly into the host filesystem, granting arbitrary root-level file read and write access.