Addressable display_uri can show misleading hosts with invalid Punycode A-labels
🔗 CVE IDs covered (1)
📋 Description
Impact
Addressable::IDNA.to_unicode, in the pure-Ruby IDNA implementation, decodes Punycode labels (labels beginning with xn--) that are not valid A-labels. Those labels are returned in decoded form, when they should be returned unchanged. That includes:
- labels that decode to only ASCII characters, e.g.
xn--google-decodes togoogle; - labels that decode to text that doesn't convert back to the same label (RFC 3490 §4.2), e.g. text that isn't in normalized form.
Addressable::URI#display_uri uses to_unicode, so for https://xn--google-.example.org/ it displays the host google.example.org, while #host, #normalized_host and any connection made from the URI use xn--google-.example.org. An attacker who controls a domain can therefore have a URI displayed as a host they don't control. Applications that compare the result of to_unicode against a list of trusted names can likewise treat two different hosts as the same.
The native IDNA implementation, used when libidn and the idn-ruby gem are installed, is not affected. to_ascii and normalized_host are not affected.
Affected Versions
This vulnerability affects Addressable >= 2.0.0, the first version with the pure-Ruby IDNA implementation, when that implementation is in use. It is fixed in 2.9.1, where such labels are returned unchanged, as with libidn.
Workarounds
- Install libidn and the
idn-rubygem, so that Addressable uses the native IDNA implementation. - Don't make security decisions on
display_uriorto_unicodeoutput. Compare hosts usingnormalized_host.
Credits
Reported by @tonghuaroot.
For more information
If there are any questions or comments about this advisory:
🎯 Affected products1
- rubygems/addressable:>= 2.0.0, < 2.9.1
🔗 References (5)
- https://github.com/sporkmonger/addressable/security/advisories/GHSA-9crm-g4mf-wc5j
- https://github.com/sporkmonger/addressable/commit/b8a59cc0e03f8704f1d7c8122fc8f7ef8548362d
- https://github.com/rubysec/ruby-advisory-db/blob/master/gems/addressable/GHSA-9crm-g4mf-wc5j.yml
- https://github.com/sporkmonger/addressable/releases/tag/addressable-2.9.1
- https://github.com/advisories/GHSA-9crm-g4mf-wc5j