Per von Zweigbergk created GUACAMOLE-2038:
---------------------------------------------

             Summary: Outbound connections to JWKS endpoint fails in IPv6-only 
environment, causing a redirect loop
                 Key: GUACAMOLE-2038
                 URL: https://issues.apache.org/jira/browse/GUACAMOLE-2038
             Project: Guacamole
          Issue Type: Bug
          Components: guacamole-auth-openid
    Affects Versions: 1.5.5
            Reporter: Per von Zweigbergk


If you are running guacamole (server) in an ipv6-only environment, with the 
OIDC plugin for authentication, authentication will fail, causing a redirect 
loop.

The following message appears repeatedly in the guacamole application log 
(truncated for privacy and brevity) while the client is stuck in a redirect 
loop:

{{guacamole_compose           | 09:45:03.595 [http-nio-8080-exec-8] INFO  
o.a.g.a.o.t.TokenValidationService - Rejected invalid OpenID token: JWT 
processing failed. Additional details: [[17] Unable to process JOSE object 
(cause: org.jose4j.lang.UnresolvableKeyException: Unable to find a suitable 
verification key for JWS w/ header 
\{"typ":"JWT","alg":"RS256","kid":"<REDACTED>"} due to an unexpected exception 
(java.net.ConnectException: Network is unreachable (connect failed)) while 
obtaining or using keys from JWKS endpoint at 
https://login.microsoftonline.com/...... <REST OF LINE REDACTED>}}

The error above suggests a failure to connect to the backend server (in this 
case login.microsoftonline.com).

The root cause of this seems to be that Java doesn't have a great algorithm for 
address selection, as documented in this OpenJDK bug, but it's not clear where 
the correct place to fix this is. Reference: 
[https://bugs.openjdk.org/browse/JDK-8170568]

Briefly, what seems to happen is that a connection to login.microsoftonline.com 
is attempted with IPv4 first, which fails (because there's no IPv4 address 
configured in my container), and that makes the connection give up completely 
instead of re-trying using IPv6.

The workaround for this is to set the JAVA_OPTS environment variable in the 
docker container to:

-Djava.net.preferIPv6Addresses=true

(I'm sure there are ways to set these options too if you're not running docker.)

I'm not sure, but I think this would affect any outgoing connections from the 
guacamole server itself, not just outbound connections for OIDC.

Not sure what the solution to this should be, but ideally I'd expect a 
well-behaved application making HTTP requests to try connecting using IPv6 
first (if available) and then fall back to IPv4, and not, which is what seems 
to happen now, just try IPv4 and then fail if it doesn't work. Perhaps this 
should be documented and a more "user friendly" method to enable this flag 
should be set?

(Also, and I'm not sure if this is a seperate bug, or if it's even a bug at 
all, but causing a redirect loop because of a problem like this doesn't really 
seem like a great failure more. It appears to stop after a while, but only 
because the IdP stops redirecting after a while after repeated failures, not 
because of anything Guacamole does.)



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to