VYPR
Moderate severityNVD Advisory· Published Mar 16, 2026· Updated Mar 16, 2026

SSRF bypass via IPv4-mapped IPv6 literals

CVE-2026-2455

Description

Mattermost versions 11.3.x <= 11.3.0, 11.2.x <= 11.2.2, 10.11.x <= 10.11.10 fail to canonicalize IPv4-mapped IPv6 addresses before reserved IP validation which allows an attacker to perform SSRF attacks against internal services via IPv4-mapped IPv6 literals (e.g., [::ffff:127.0.0.1]).. Mattermost Advisory ID: MMSA-2026-00585

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/mattermost/mattermost/server/v8Go
< 8.0.0-20260129133647-5d787969c2d58.0.0-20260129133647-5d787969c2d5
github.com/mattermost/mattermost-serverGo
< 5.3.2-0.20260129133647-5d787969c2d55.3.2-0.20260129133647-5d787969c2d5
github.com/mattermost/mattermost-serverGo
>= 10.11.0-rc1, < 10.11.1110.11.11
github.com/mattermost/mattermost-serverGo
>= 11.2.0-rc1, < 11.2.311.2.3
github.com/mattermost/mattermost-serverGo
>= 11.3.0-rc1, < 11.3.111.3.1

Affected products

1

Patches

1
5d787969c2d5

MM-67268: Fix SSRF bypass via IPv4-mapped IPv6 literals (#35097)

https://github.com/mattermost/mattermostJesse HallamJan 29, 2026via ghsa
2 files changed · +16 0
  • server/public/shared/httpservice/client.go+5 0 modified
    @@ -28,6 +28,11 @@ var reservedIPRanges []*net.IPNet
     // IsReservedIP checks whether the target IP belongs to reserved IP address ranges to avoid SSRF attacks to the internal
     // network of the Mattermost server
     func IsReservedIP(ip net.IP) bool {
    +	// Canonicalize IPv4-mapped IPv6 addresses (e.g., ::ffff:127.0.0.1) to their
    +	// native IPv4 form so that IPv4 CIDR ranges match correctly.
    +	if ip4 := ip.To4(); ip4 != nil {
    +		ip = ip4
    +	}
     	for _, ipRange := range reservedIPRanges {
     		if ipRange.Contains(ip) {
     			return true
    
  • server/public/shared/httpservice/client_test.go+11 0 modified
    @@ -211,6 +211,17 @@ func TestIsReservedIP(t *testing.T) {
     		{"127.120.6.3", net.IPv4(127, 120, 6, 3), true},
     		{"8.8.8.8", net.IPv4(8, 8, 8, 8), false},
     		{"9.9.9.9", net.IPv4(9, 9, 9, 8), false},
    +		// IPv4-mapped IPv6 addresses should be detected as reserved
    +		{"::ffff:127.0.0.1", net.ParseIP("::ffff:127.0.0.1"), true},
    +		{"::ffff:192.168.1.1", net.ParseIP("::ffff:192.168.1.1"), true},
    +		{"::ffff:10.0.0.1", net.ParseIP("::ffff:10.0.0.1"), true},
    +		{"::ffff:169.254.169.254", net.ParseIP("::ffff:169.254.169.254"), true},
    +		{"::ffff:8.8.8.8", net.ParseIP("::ffff:8.8.8.8"), false},
    +		// Pure IPv6 reserved addresses
    +		{"::1", net.ParseIP("::1"), true},
    +		{"fe80::1", net.ParseIP("fe80::1"), true},
    +		// Public IPv6
    +		{"2607:f8b0:4004:800::200e", net.ParseIP("2607:f8b0:4004:800::200e"), false},
     	}
     	for _, tt := range tests {
     		t.Run(tt.name, func(t *testing.T) {
    

Vulnerability mechanics

Synthesis attempt was rejected by the grounding validator. Re-run pending.

References

4

News mentions

0

No linked articles in our index yet.