Refuse an IPv6 address that holds an internal IPv4 address (closes #297)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
The check that keeps pixa from fetching internal addresses read an IPv6 address as IPv4 only in the mapped form (::ffff:a.b.c.d), so the IPv4-compatible form, such as ::127.0.0.1, was judged as IPv6 and passed. An address in ::/96 is now judged by the IPv4 address it holds, so one holding a private, loopback or link-local address is refused on both image routes before any upstream request. The NAT64 range 64:ff9b::/96 stays blocked whole, as it was on next. Model: opus-5-5
This commit was merged in pull request #298.
This commit is contained in:
@@ -30,6 +30,14 @@ P2: security: per-origin rate limiting
|
||||
|
||||
# Completed Steps
|
||||
|
||||
- 2026-10-16 P1 security bug: the check that keeps pixa from fetching internal
|
||||
addresses judges an IPv6 address in the IPv4-compatible form (`::/96`), such
|
||||
as `::127.0.0.1` or `::10.0.0.1`, by the IPv4 address in its last four bytes
|
||||
(closes #297). It read only the mapped form (`::ffff:a.b.c.d`) as IPv4, so a
|
||||
source host such as `[::127.0.0.1]` was checked as a public IPv6 address and
|
||||
fetched, which on a network that routes it reaches the internal IPv4 host; it
|
||||
is now refused with 403. The NAT64 form (`64:ff9b::/96`) was already refused
|
||||
as a whole, as one of the built-in blocked ranges, and still is.
|
||||
- 2026-10-16 a source host that is an IPv6 address in brackets with no port,
|
||||
such as `[2001:db8::a]`, is fetched like one with a port, through `/v1/image/`
|
||||
and through an encrypted URL (closes #295). The fetcher's check of the source
|
||||
|
||||
Reference in New Issue
Block a user