Repository navigation
Conversation
Many applications (like browsers, curl, and wget) and even Ruby's own Net::HTTP library accepts shorthand IPv4 addresses like 127.1 or 2130706433 for 127.0.0.1. It is confusing that IPAddr can't accept them.
9da923b to
70ef24a
Compare
|
Hi All! I created "pull request to this pull request" - Envek#1 (because my changes based on this PR changes) to support for IP addresses represented in hexadecimal, octal or even a combination, instead of the decimal encoding. This PR supports all of this formats: (Take any representation and use it in commands such as More info about IPFuscation - https://vincentyiu.co.uk/red-team/cve-exploitation/ipfuscation |
* upstream/master: (118 commits) Warn on bracketed IPv6 address with a prefix length Bump the version to 1.3.0 Respect explicit address families for decorated IPv6 literals Add IPAddr#to_hex Bump step-security/harden-runner from 2.21.1 to 2.22.1 Append the zone ID after compressing the address in IPAddr#to_s Fix false positives in private?/link_local?/multicast?/link_local_multicast? for supernets of the target address blocks Fix link_local_multicast? mask for IPv4-mapped addresses Bump step-security/harden-runner from 2.21.0 to 2.21.1 Bump rubygems/release-gem from 1.4.0 to 1.4.1 Bump step-security/harden-runner from 2.20.0 to 2.21.0 Follow up on ruby#114: update tests for `multicast?` and `link_local_multicast?` extra multicast/unicast predicates Bump step-security/harden-runner from 2.19.4 to 2.20.0 Bump actions/checkout from 6 to 7 Bump rubygems/release-gem from 1.2.0 to 1.4.0 Bump step-security/harden-runner from 2.19.3 to 2.19.4 Bump step-security/harden-runner from 2.19.1 to 2.19.3 Bump step-security/harden-runner from 2.19.0 to 2.19.1 Bump step-security/harden-runner from 2.18.0 to 2.19.0 ...
|
@taketo1113, following our talk at Kaigi on Rails, I've updated this pull request and resolved merge conflicts. Here is also additional context on why we needed this change: Back in 2019 security auditors found a possible security flaw in one of apps that allowed users to import pictures by URL. Malicious user could send pointing to localhost or local network and force our picture importer to hit private resources and hence there is possibility for making a (D)DoS attack. So we needed a way to filter out non-public addresses: nonpublic_address =
ip.private? || # 10.0.0.0/8, 192.168.0.0/16 – local networks
ip.loopback? || # 127.0.0.1 or [::1] – localhost
ip.link_local? || # 169.254.0.0 – autoconfigured local networks
ip.to_i.zero? # 0.0.0.0 or [::] – any address, effectively localhostThe problem is that user (either malicious or not) can send an URL like |
Implementation for Feature request #15734 from Ruby bug tracker.
Many applications (like browsers,
curl, andping) and even Ruby's ownNet::HTTPlibrary accepts shorthand IPv4 addresses like127.1or2130706433that both stands for127.0.0.1.But IPAddr can't accept such addresses, and it is really confusing:
This pull request makes parsing IPv4 to match the behavior of most well-known applications despite that isn't a standardized extension, but there is an RFC draft: Textual Representation of IPv4 and IPv6 Addresses.
Moreover, that mismatch in behavior could cause security vulnerabilities in Ruby applications that use network, allow users to provide URLs to access (like “Upload picture from URL”), and have incorrectly configured URL filtering. A malicious user then could provide a link like
http://2130706433/private_filewhich currently will not be recognized as loopback IP address butNet::HTTP.getwill happily query local host's web server for theprivate_file. This called an SSRF attack. Actually, I created this pull request because our security auditors reported such vulnerability in one of our applications.NOTE: There is no security flaw in ipaddr itself! It is just possible to create it when you're developing your own application.
See also:
inet_atonman page: https://linux.die.net/man/3/inet_aton