{"affected":[{"package":{"ecosystem":"Hex","name":"hackney","purl":"pkg:hex/hackney"},"ranges":[{"events":[{"introduced":"0.13.0"},{"fixed":"4.0.1"}],"type":"SEMVER"}],"versions":["0.13.1","0.14.0","0.14.1","0.14.2","0.14.3","0.15.0","0.15.2","1.0.1","1.0.2","1.0.5","1.0.6","1.1.0","1.2.0","1.3.0","1.3.1","1.3.2","1.4.0","1.4.1","1.4.2","1.4.3","1.4.4","1.4.5","1.4.6","1.4.7","1.4.8","1.4.10","1.5.0","1.5.1","1.5.2","1.5.3","1.5.4","1.5.5","1.5.6","1.5.7","1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.6.5","1.6.6","1.7.0","1.7.1","1.8.0","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.9.0","1.10.0","1.10.1","1.11.0","1.12.0","1.12.1","1.13.0","1.14.0","1.14.2","1.14.3","1.15.0","1.15.1","1.15.2","1.16.0","1.17.0","1.17.1","1.17.2","1.17.3","1.17.4","1.18.0","1.18.1","1.18.2","1.19.0","1.19.1","1.20.0","1.20.1","1.21.0","1.22.0","1.23.0","1.24.0","1.24.1","1.25.0","2.0.0-beta.1","2.0.0","2.0.1","3.0.0","3.0.1","3.0.2","3.0.3","3.1.0","3.1.1","3.1.2","3.2.0","3.2.1","4.0.0"]},{"ranges":[{"events":[{"introduced":"4d725507588942fd00efca15b86da3273656510a"},{"fixed":"452620a92ec1da2e6b4862a049a2a4f04b42068f"}],"repo":"https://github.com/benoitc/hackney","type":"GIT"}]}],"aliases":["GHSA-pj7v-xfvx-wmjq","CVE-2026-47076"],"credits":[{"name":"Ganbagana","type":"FINDER"},{"name":"Benoit Chesneau","type":"REMEDIATION_DEVELOPER"},{"name":"Jonatan Männchen","type":"ANALYST"}],"database_specific":{"capec_ids":["CAPEC-664"],"cpe_ids":["cpe:2.3:a:benoitc:hackney:*:*:*:*:*:*:*:*"],"cwe_ids":["CWE-436","CWE-918"]},"details":"## Summary\n\nInterpretation Conflict vulnerability in benoitc hackney allows Server Side Request Forgery. hackney_url:normalize/2 URL-decodes the host component after the URL has been parsed into a #hackney_url{} record. OTP's uri_string:parse/1 and inet:parse_address/1 do not decode percent-escapes in the host, so a URL such as http://%31%32%37%2E%30%2E%30%2E%31/ is seen by a caller's allowlist validator with host %31%32%37%2E%30%2E%30%2E%31 (not an IP address), which passes the allowlist check. hackney's normalizer then decodes the host to 127.0.0.1 and opens a TCP connection to loopback. Because hackney:request/5 always calls hackney_url:normalize/2 with no opt-out, every request that takes a binary or list URL is affected. The same technique reaches cloud instance metadata services (169.254.169.254), RFC1918 networks, and any admin interface listening on localhost.\n\nThis issue affects hackney: from 0.13.0 before 4.0.1.","id":"EEF-CVE-2026-47076","modified":"2026-05-25T14:00:46.707Z","published":"2026-05-25T14:00:46.707Z","references":[{"type":"ADVISORY","url":"https://github.com/benoitc/hackney/security/advisories/GHSA-pj7v-xfvx-wmjq"},{"type":"WEB","url":"https://cna.erlef.org/cves/CVE-2026-47076.html"},{"type":"FIX","url":"https://github.com/benoitc/hackney/commit/452620a92ec1da2e6b4862a049a2a4f04b42068f"},{"type":"PACKAGE","url":"https://hex.pm/packages/hackney"}],"related":[],"schema_version":"1.7.3","severity":[{"score":"CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N","type":"CVSS_V4"}],"summary":"SSRF allowlist bypass via percent-encoded host in hackney","upstream":[]}