-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Fix URL validator incorrectly blocking domains starting with 'fd' or 'fc' #25531
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Co-authored-by: chirag-madlani <12962843+chirag-madlani@users.noreply.github.com>
Code Review
|
| Auto-apply | Compact |
|
|
Was this helpful? React with 👍 / 👎 | Gitar
| private static final Pattern PRIVATE_IP_PATTERN = | ||
| Pattern.compile( | ||
| "^(127\\.|10\\.|172\\.(1[6-9]|2[0-9]|3[0-1])\\.|192\\.168\\.|169\\.254\\.|::1|[fF][cCdD]|[fF][eE][80-9a-fA-F]:).*"); | ||
| "^(127\\.|10\\.|172\\.(1[6-9]|2[0-9]|3[0-1])\\.|192\\.168\\.|169\\.254\\.|\\[?::1\\]?|\\[?[fF][cCdD][0-9a-fA-F]{0,2}:|\\[?[fF][eE][80-9a-bA-B][0-9a-fA-F]:).*"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Details
The regex pattern for matching fe80::/10 link-local IPv6 addresses is malformed. The pattern [80-9a-bA-B] is incorrect because:
- In regex character classes,
80-9means the character '8', the range '0' to '9', not '8' to '9'. This effectively matches[0-9]plus '8' redundantly. - This causes the pattern to incorrectly match addresses like
fe00::,fe10::, etc., which are NOT in the link-local range. - Conversely, addresses like
fe8f::which ARE link-local would be matched, but due to incorrect logic.
The fe80::/10 range covers fe80:: through febf::, meaning:
- The third hex digit should be: 8, 9, a, or b
- The fourth hex digit can be: 0-f
Suggested fix:
Change [80-9a-bA-B] to [89aAbB] to correctly match only the third hex digit in the valid range:
Pattern.compile(
"^(127\\.|10\\.|172\\.(1[6-9]|2[0-9]|3[0-1])\\.|192\\.168\\.|169\\.254\\.|\\[?::1\\]?|\\[?[fF][cCdD][0-9a-fA-F]{0,2}:|\\[?[fF][eE][89aAbB][0-9a-fA-F]:).*");Alternatively, if you want to accept the entire /10 block exactly, you could simplify to just check for [fF][eE][89aAbB] (third char only) since the colon follows.
Was this helpful? React with 👍 / 👎
Describe your changes:
The URL validator's SSRF protection regex was rejecting legitimate Okta domains like
fdxxx.okta.combecause the IPv6 private address pattern[fF][cCdD]matched any hostname starting with "fd" or "fc".Changes:
PRIVATE_IP_PATTERNto require IPv6 format markers (colons) after prefixes:\[?[fF][cCdD][0-9a-fA-F]{0,2}:[fd00::1]and[::1]URLValidatorTestwith 9 test cases covering legitimate domains and all private IP rangesPattern comparison:
SSRF protection unchanged: all private IPv4/IPv6 ranges still blocked.
Type of change:
Checklist:
Fixes <issue-number>: <short explanation>Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
dev-96705996-admin.okta.com/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java -Xmx1G -jar /home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service/target/surefire/surefirebooter-20260126151826724_3.jar /home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service/target/surefire 2026-01-26T15-18-26_471-jvmRun1 surefire-20260126151826724_1tmp surefire_0-20260126151826724_2tmp lidateUrl ecoratorTest.jav--norc /home/REDACTED/.lo--noprofile grep -l lidateUrl a/sdk/BaseSDKTest.java ndor/bin/grep eps/opensearch-dbash t.java ndor/bin/grep grep(dns block)dev-example.auth0.com/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java -Xmx1G -jar /home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service/target/surefire/surefirebooter-20260126151945913_3.jar /home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service/target/surefire 2026-01-26T15-19-45_703-jvmRun1 surefire-20260126151945913_1tmp surefire_0-20260126151945913_2tmp lidateUrl ntegrationTest.jrev-parse rgo/bin/grep grep -l lidateUrl test/java/org/openmetadata/operator/unit/CronOMJobReconcilerTest.java /home/REDACTED/.local/bin/grep lidateUrl andlerTest.java /home/REDACTED/.lo. grep(dns block)invalid.com/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java -Xmx1G -jar /home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service/target/surefire/surefirebooter-20260126151945913_3.jar /home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service/target/surefire 2026-01-26T15-19-45_703-jvmRun1 surefire-20260126151945913_1tmp surefire_0-20260126151945913_2tmp lidateUrl ntegrationTest.jrev-parse rgo/bin/grep grep -l lidateUrl test/java/org/openmetadata/operator/unit/CronOMJobReconcilerTest.java /home/REDACTED/.local/bin/grep lidateUrl andlerTest.java /home/REDACTED/.lo. grep(dns block)repository.apache.org/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.12/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.12 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.12/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata org.codehaus.plexus.classworlds.launcher.Launcher test -Dtest=URLValidatorTest -pl openmetadata-service lidateUrl lModelMockTest.java nfig/composer/vendor/bin/grep lidateUrl TClientIntegrati--unit=collect-logs.scope nfig/composer/ve--slice=azure-walinuxagent-logcollector.slice grep(dns block)/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.12/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.12 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.12/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata org.codehaus.plexus.classworlds.launcher.Launcher compile -pl openmetadata-service -l lidateUrl t.java ep lidateUrl java ep grep(dns block)/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.12/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.12 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.12/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata org.codehaus.plexus.classworlds.launcher.Launcher clean install -DskipTests -pl openmetadata-shaded-deps/elasticsearch-dep,openmetadata-shaded-deps/opensearch-dep,openmetadata-sdk,openmetadata-service -am rgo/bin/grep lidateUrl yTest.java rgo/bin/grep grep(dns block)s3.amazonaws.com/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.12/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.12 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.12/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata org.codehaus.plexus.classworlds.launcher.Launcher test -Dtest=URLValidatorTest -pl openmetadata-service lidateUrl lModelMockTest.java nfig/composer/vendor/bin/grep lidateUrl TClientIntegrati--unit=collect-logs.scope nfig/composer/ve--slice=azure-walinuxagent-logcollector.slice grep(dns block)/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.12/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.12 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.12/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata org.codehaus.plexus.classworlds.launcher.Launcher compile -pl openmetadata-service -l lidateUrl t.java ep lidateUrl java ep grep(dns block)/usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.12/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.12 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.12/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata org.codehaus.plexus.classworlds.launcher.Launcher clean install -DskipTests -pl openmetadata-shaded-deps/elasticsearch-dep,openmetadata-shaded-deps/opensearch-dep,openmetadata-sdk,openmetadata-service -am rgo/bin/grep lidateUrl yTest.java rgo/bin/grep grep(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.