Skip to content

SSRF via DNS Resolution Bypass in `url_manual` Fetch

High
gantoine published GHSA-8x54-qc7x-c8c4 Jun 17, 2026

Package

rommapp/romm

Affected versions

>=4.8.1

Patched versions

>=4.9.0

Description

SSRF via DNS Resolution Bypass in url_manual Fetch

Summary

RomM's server-side URL fetch for ROM manual resources (PUT /api/roms/{id}, field url_manual) validates only literal IP addresses and a fixed set of reserved hostname strings. The validator explicitly skips DNS resolution [REDACTED], so any attacker-controlled hostname that resolves to a private, loopback, or link-local IP address passes validation unchallenged. After validation succeeds, the server issues a real outbound GET request via httpx to the attacker-supplied URL and stores the response body as a static file that is then served publicly through nginx. This constitutes a non-blind Server-Side Request Forgery (SSRF): an authenticated user with only roms.write permission can exfiltrate data from internal HTTP services by reading the saved file from the public /assets/romm/resources/ path.

Details

[REDACTED]

PoC

[REDACTED]

Impact

This is a non-blind Server-Side Request Forgery (SSRF). An attacker who holds a valid RomM account with roms.write permission (the default permission for any editor-role user) can:

  1. Exfiltrate data from internal HTTP services — any service on the RomM host's loopback interface (127.0.0.x), its Docker network, or the broader private network that returns application/octet-stream, application/pdf, or application/force-download content. The response body is persisted to disk and served via a public nginx static path, making the exfiltration non-blind and repeatable.
  2. Enumerate internal network topology — HTTP 200/4xx/5xx status codes and file sizes differ by host/port, enabling port and service scanning.
  3. Interact with internal APIs — any internal service reachable as a GET endpoint (metadata services, health APIs, internal dashboards) is reachable, subject to the content-type filter.

The attacker does not need administrator privileges; the roms.write scope is available to editor accounts. No server-side configuration change is required to expose the vulnerability; it is present in the default installation.

The confidentiality impact is high because sensitive internal data (cloud instance metadata, internal credentials, configuration files served over HTTP) can be exfiltrated and read by the attacker through the public static file endpoint.

Reproduction artifacts

[REDACTED]

Severity

High

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Network
Attack complexity
Low
Privileges required
Low
User interaction
None
Scope
Changed
Confidentiality
High
Integrity
None
Availability
None

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

CVE ID

No known CVE

Weaknesses

Reliance on Reverse DNS Resolution for a Security-Critical Action

The product performs reverse DNS resolution on an IP address to obtain the hostname and make a security decision, but it does not properly ensure that the IP address is truly associated with the hostname. Learn more on MITRE.

Server-Side Request Forgery (SSRF)

The web server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but it does not sufficiently ensure that the request is being sent to the expected destination. Learn more on MITRE.

Credits