From 400dc65ffbdcb6d5fc29c3dc3cd04bd605dc4f2e Mon Sep 17 00:00:00 2001 From: alejandrobailo Date: Tue, 21 Jul 2026 18:30:32 +0200 Subject: [PATCH] fix(ui): filter IPv6 Lighthouse context values --- .../lighthouse/context/contributions.test.ts | 1 + ui/lib/lighthouse/context/pages.test.ts | 7 ++++++- ui/lib/lighthouse/context/pages.ts | 21 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/ui/lib/lighthouse/context/contributions.test.ts b/ui/lib/lighthouse/context/contributions.test.ts index 4e5ad7b39b..68e9b30d24 100644 --- a/ui/lib/lighthouse/context/contributions.test.ts +++ b/ui/lib/lighthouse/context/contributions.test.ts @@ -156,6 +156,7 @@ describe("Lighthouse page contributions", () => { query: "MATCH (n) RETURN n", ownerEmail: "security@example.com", sourceIp: "10.0.0.1", + sourceIpv6: "2001:db8::1", authHeader: "Bearer sensitive-value", }, nodeCount: 12, diff --git a/ui/lib/lighthouse/context/pages.test.ts b/ui/lib/lighthouse/context/pages.test.ts index 24f2a335df..d764b8ed58 100644 --- a/ui/lib/lighthouse/context/pages.test.ts +++ b/ui/lib/lighthouse/context/pages.test.ts @@ -131,13 +131,18 @@ describe("buildLighthousePageContext", () => { const searchParams = new URLSearchParams(); searchParams.append("filter[search]", "security@example.com"); searchParams.append("filter[search]", "10.0.0.1"); + searchParams.append("filter[search]", "2001:db8::1"); searchParams.append("filter[search]", "Bearer sensitive-value"); + searchParams.append("filter[search]", "arn:aws:s3:::example"); + searchParams.append("filter[search]", "12:30:00"); searchParams.append("filter[search]", "public bucket"); // When const context = buildLighthousePageContext("/findings", searchParams); // Then - expect(context.filters).toEqual({ search: ["public bucket"] }); + expect(context.filters).toEqual({ + search: ["arn:aws:s3:::example", "12:30:00", "public bucket"], + }); }); }); diff --git a/ui/lib/lighthouse/context/pages.ts b/ui/lib/lighthouse/context/pages.ts index 420d78fe90..6f917dd34c 100644 --- a/ui/lib/lighthouse/context/pages.ts +++ b/ui/lib/lighthouse/context/pages.ts @@ -342,12 +342,33 @@ export function containsSensitiveLighthouseContextValue( return ( /\b[^\s@]+@[^\s@]+\.[^\s@]+\b/.test(value) || /\b(?:\d{1,3}\.){3}\d{1,3}\b/.test(value) || + containsIpv6Address(value) || /\bAKIA[A-Z0-9]{16}\b/.test(value) || /\bbearer\s+\S+/i.test(value) || /\b(?:password|secret|token|credential)\s*[:=]/i.test(value) ); } +function containsIpv6Address(value: string): boolean { + return value + .split(/[^0-9A-Fa-f:]+/) + .some((candidate) => isIpv6AddressCandidate(candidate)); +} + +function isIpv6AddressCandidate(candidate: string): boolean { + if (!candidate.includes(":") || candidate.includes(":::")) return false; + + const compressedParts = candidate.split("::"); + if (compressedParts.length > 2) return false; + + const segments = candidate.split(":").filter(Boolean); + if (segments.some((segment) => segment.length > 4)) return false; + + return compressedParts.length === 2 + ? segments.length < 8 + : segments.length === 8; +} + function toTitleCase(value: string): string { if (!value) return "Current page"; return value