Severity by source
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N
DNS rebinding requires controlling authoritative DNS and winning a timing race, justifying AC:H over the vendor's AC:L; PR:L retained as webhook creation requires authentication.
Primary rating from Vendor (TuranSec).
CVSS VectorVendor: TuranSec
Lifecycle Timeline
2DescriptionCVE.org
Memos' webhook dispatch function safeDialContext() (internal/webhook/webhook.go) resolves the target hostname via net.DefaultResolver.LookupHost() and validates the resulting IPs against reserved ranges, but then dials net.JoinHostPort(host, port) using the original hostname rather than the already-validated IP address. Because net.Dialer.DialContext() performs its own independent DNS resolution, an attacker controlling DNS for the webhook's hostname (e.g. via a short TTL) can return a public, allowed IP during validation and a different, internal IP at dial time - a classic time-of-check/time-of-use DNS-rebinding bypass of the SSRF protection.
AnalysisAI
DNS rebinding bypass of SSRF protection in Memos' webhook dispatcher allows a low-privileged authenticated attacker to reach internal network resources by exploiting a time-of-check/time-of-use race in hostname resolution. The safeDialContext() function in internal/webhook/webhook.go validates the resolved IP against reserved ranges but then re-dials using the original hostname, allowing the underlying net.Dialer.DialContext() to perform a second, independent DNS lookup that the attacker controls. By setting a short TTL on an attacker-controlled domain and swapping the DNS response between validation and dial, an attacker can cause Memos to connect to arbitrary internal addresses. No public exploit or CISA KEV listing has been identified at time of analysis, but the scope change (S:C) and high confidentiality impact reflect the risk of internal service enumeration and data exfiltration.
Technical ContextAI
Memos is an open-source, self-hosted note and memo application (cpe:2.3:a:usememos:memos:*:*:*:*:*:*:*:*). Its webhook feature dispatches HTTP requests to user-configured URLs via a Go function safeDialContext() located at internal/webhook/webhook.go. The function attempts to enforce an SSRF safeguard by calling net.DefaultResolver.LookupHost() on the target hostname and comparing the returned IPs against RFC-1918 and other reserved ranges. However, after validation, it reconstructs the dial target using net.JoinHostPort(host, port) - the original hostname string - and passes this to net.Dialer.DialContext(), which performs its own fresh DNS resolution. This constitutes a classic CWE-367 (Time-of-Check Time-of-Use) race condition: the DNS answer used for the security check is not guaranteed to match the answer used at dial time. An attacker controlling a domain's DNS (e.g., via a short TTL and a custom authoritative nameserver) can exploit this gap to cause Memos to connect to an internal address that was never validated.
RemediationAI
The definitive fix requires that after the initial DNS validation resolves a hostname to an approved IP, the application must dial that specific validated IP address directly rather than re-passing the original hostname to the dialer. In Go, this means substituting the validated IP for the hostname in the dial target (e.g., using net.JoinHostPort(validatedIP, port) rather than net.JoinHostPort(host, port)) so that net.Dialer.DialContext() cannot perform an independent DNS lookup. No patched release version was confirmed in the available references - the upstream fix status should be tracked at https://github.com/usememos/memos. As a compensating control pending a patch, operators can restrict webhook creation permissions to fully trusted administrators only, reducing the PR:L attack surface. Additionally, deploying Memos behind a network egress filter (e.g., an HTTP proxy with an allowlist or an iptables rule blocking outbound connections to RFC-1918 ranges from the Memos process) would limit what internal resources are reachable even if the SSRF bypass is triggered. Note that egress filtering at the network layer is a defense-in-depth measure and does not address the root cause.
elestio memos v0.23.0 is vulnerable to Server-Side Request Forgery (SSRF) due to insufficient validation of user-supplie
Authorization Bypass Through User-Controlled Key in GitHub repository usememos/memos prior to 0.9.0. Rated critical seve
Cross-site Scripting (XSS) - Stored in GitHub repository usememos/memos prior to 0.9.1. Rated critical severity (CVSS 9.
Cross-site Scripting (XSS) - Stored in GitHub repository usememos/memos prior to 0.9.1. Rated critical severity (CVSS 9.
Cross-Site Request Forgery (CSRF) in GitHub repository usememos/memos prior to 0.15.1. Rated high severity (CVSS 8.8), t
Improper Privilege Management in GitHub repository usememos/memos prior to 0.13.2. Rated high severity (CVSS 8.8), this
Cross-Site Request Forgery (CSRF) in GitHub repository usememos/memos prior to 0.9.1. Rated high severity (CVSS 8.8), th
Improper Access Control in GitHub repository usememos/memos prior to 0.9.1. Rated high severity (CVSS 8.8), this vulnera
Improper Privilege Management in GitHub repository usememos/memos prior to 0.9.1. Rated high severity (CVSS 8.8), this v
Authorization Bypass Through User-Controlled Key in GitHub repository usememos/memos prior to 0.9.1. Rated high severity
Improper Access Control in GitHub repository usememos/memos prior to 0.9.0. Rated high severity (CVSS 8.8), this vulnera
Improper Authorization in GitHub repository usememos/memos prior to 0.9.0. Rated high severity (CVSS 8.8), this vulnerab
Share
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-53357
GHSA-w8cc-xr9f-mrh7