{"id":"CVE-2026-115700","kind":"vulnerability","aliases":["CVE-2026-115700"],"related":[],"title":"Erlang hackney: encoded IP literals bypass SSRF allowlists in URL parsing","description":"Interpretation Conflict vulnerability in hackney_url in benoitc hackney allows Server Side Request Forgery via a percent-encoded bracketed IPv6 literal or an IP literal with a trailing dot. A host such as %5B%3A%3Affff%3A127%2E0%2E0%2E1%5D (decoding to [::ffff:127.0.0.1]) or 127.0.0.1. is not an IP address to a caller's allowlist built on uri_string:parse/1 and inet:parse_address/1, while hackney connects to the address it denotes. The same applies to a Location target when redirects are followed.\n\nThe IP-literal gate that hackney_url:normalize/2 applies to a percent-decoded host, added to close the percent-encoded IP bypass of CVE-2026-47076, passes the decoded value to inet_parse:address/1 as is. The connect path in hackney_happy:parse_address/1 drops a surrounding bracket pair, and the resolver ignores a trailing dot, so both forms pass the gate and still reach the literal address. Domain names with a trailing dot and unencoded IPv6 literals are not affected.\n\nThis issue affects hackney: from 4.0.1 before 4.9.0.","summary":"hackney, an Erlang HTTP client, connects to IP addresses written in forms that an application's allowlist does not recognize, such as a percent-encoded bracketed IPv6 literal or an IPv4 address with a trailing dot. An attacker who can supply a URL or a redirect target can therefore reach internal addresses such as 127.0.0.1 and make server-side requests there.","severity":"medium","cvss":6.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["elixir","erlang","hackney","package","self-hosted"],"not_affected_if":["fixed-destination-hosts","hackney-below-4.0.1-or-4.9.0-plus","no-user-supplied-urls"],"how_to_check":"- Check the hackney version in the project lock file (rebar.lock or the mix.lock/rebar config) for `hackney` versions from `4.0.1` up to but not including `4.9.0`\n- Search application code for calls to `uri_string:parse/1` or `inet:parse_address/1` used as an SSRF allowlist on URLs passed to hackney\n- unknown whether the sources list any further detection step","fix":"- Upgrade hackney to `4.9.0` or later\n- Until upgraded, validate the resolved address of the final connection target rather than the raw URL host, and reject redirects to untrusted hosts","status":"open","published_at":"2026-10-26T14:16:32+00:00","first_seen_at":"2026-10-26T14:30:36+00:00","triaged_at":"2026-10-26T14:32:34+00:00","updated_at":"2026-10-26T14:32:34+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-26T14:32:34Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade hackney to `4.9.0` or later\n- Until upgraded, validate the resolved address of the final connection target rather than the raw URL host, and reject redirects to untrusted hosts","reach":"internet","title":"Erlang hackney: encoded IP literals bypass SSRF allowlists in URL parsing","impact":"medium","summary":"hackney, an Erlang HTTP client, connects to IP addresses written in forms that an application's allowlist does not recognize, such as a percent-encoded bracketed IPv6 literal or an IPv4 address with a trailing dot. An attacker who can supply a URL or a redirect target can therefore reach internal addresses such as 127.0.0.1 and make server-side requests there.","category":"package","nicknames":[],"who_cares":["erlang","hackney","elixir","self-hosted"],"confidence":0.7,"needs_auth":"unknown","worst_case":"Server requests reach internal addresses, exposing internal services to the attacker","analyst_note":"","how_to_check":"- Check the hackney version in the project lock file (rebar.lock or the mix.lock/rebar config) for `hackney` versions from `4.0.1` up to but not including `4.9.0`\n- Search application code for calls to `uri_string:parse/1` or `inet:parse_address/1` used as an SSRF allowlist on URLs passed to hackney\n- unknown whether the sources list any further detection step","needs_analyst":false,"not_affected_if":["hackney-below-4.0.1-or-4.9.0-plus","fixed-destination-hosts","no-user-supplied-urls"],"who_is_affected":"Applications that use hackney 4.0.1 before 4.9.0 to fetch URLs supplied or influenced by users, and that rely on a string or parse-based allowlist of IP addresses to block internal targets. Applications that only connect to fixed hosts, use domain names without a trailing dot, or use unencoded IPv6 literals are not affected by the trailing-dot and encoded-bracket forms described here.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000731,"input_tokens":3629,"output_tokens":736,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-115700':14A,17A '-2026':13A,16A,200C '-47076':201C '127.0.0.1':80B,132C,134C '2e0':125C,126C '2e1':127C '3a':122C '3a127':124C '3affff':123C '4.0.1':262C '4.9.0':264C '5b':121C '5d':128C 'add':189C 'address':33B,57B,77B,139C,159C,243C 'address/1':153C,209C,219C 'affect':256C,259C 'allow':96C 'allowlist':8A,41B,144C 'appli':164C,182C 'applic':39B 'attack':63B 'benoitc':94C 'bracket':51B,106C,223C 'built':145C 'bypass':6A,197C 'caller':142C 'client':29B 'close':191C 'conflict':88C 'connect':30B,156C,213C 'cve':12A,15A,199C 'decod':129C,187C,204C 'denot':161C 'domain':244C 'dot':61B,116C,231C,249C 'drop':220C 'elixir':18B 'encod':3A,50B,105C,195C 'erlang':1A,19B,27B 'ffff':131C 'follow':172C 'forgeri':100C 'form':36B,234C 'gate':177C,237C 'hackney':2A,20B,25B,91C,95C,155C,179C,216C,260C 'happi':217C 'host':24B,118C,188C 'http':28B 'ignor':228C 'inet':151C,207C 'intern':76B 'interpret':87C 'ip':4A,32B,111C,138C,175C,196C 'ip-liter':174C 'ipv4':56B 'ipv6':52B,107C,252C 'issu':258C 'liter':5A,53B,108C,112C,176C,242C,253C 'locat':167C 'make':82B 'name':245C 'normalize/2':181C 'packag':21B 'pair':224C 'pars':11A,152C,208C,218C 'parse/1':149C 'pass':202C,235C 'path':214C 'percent':49B,104C,186C,194C 'percent-decod':185C 'percent-encod':48B,103C,193C 'reach':75B,240C 'recogn':44B 'redirect':71B,170C 'request':86B,99C 'resolv':227C 'self':23B 'self-host':22B 'server':84B,97C 'server-sid':83B 'side':85B,98C 'ssrf':7A 'still':239C 'string':148C 'suppli':66B 'surround':222C 'target':72B,168C 'therefor':74B 'trail':60B,115C,230C,248C 'unencod':251C 'uri':147C 'url':10A,68B,92C,180C 'valu':205C 'via':101C 'vulner':89C 'written':34B","nicknames":[],"mitigations":[],"who_affected":"Applications that use hackney 4.0.1 before 4.9.0 to fetch URLs supplied or influenced by users, and that rely on a string or parse-based allowlist of IP addresses to block internal targets. Applications that only connect to fixed hosts, use domain names without a trailing dot, or use unencoded IPv6 literals are not affected by the trailing-dot and encoded-bracket forms described here.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-26T14:16:32+00:00","kev":null,"cvss_vector":"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/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-115700","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-115700","severity":null,"published_at":"2026-10-26T14:16:32+00:00","modified_at":"2026-10-26T14:16:32+00:00","first_seen_at":"2026-10-26T14:30:36+00:00","fetched_at":"2026-10-26T14:30:36+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}