The 2.4.20.x versions use a backwards incompatible session encryption key so existing sessions (created by versions <=2.4.19.x) are invalid.
Security
- config: the
exec:prefix ofOIDCClientSecretandOIDCClientTokenEndpointKeyPasswordis honored only in the configuration directive; since 2.4.16 it was also applied to the same values when read from metadata (a Dynamic Client Registration response,.client/.conffiles), so a provider could have a command executed on the host (GHSA-j3g4-73w8-p842, reported by @ivantsepp) - OAuth 2.0 RS (deprecated): cached access token validation results are bound to the verifier that produced them (introspection endpoint and client ID, or JWKs URI and verification keys); vhosts sharing a cache and
OIDCCryptoPassphrasecould accept a token from the cache that they would reject themselves (GHSA-gwg9-pmp9-m6wv, reported by @lyhtheori) - authentication: the user is no longer recycled from the main/previous request in sub-requests and internal redirects, so an unauthenticated user could no longer read or overwrite separately protected content via e.g.
DirectoryIndexor WebDAVCOPY/MOVE(GHSA-98m5-m556-8684, reported by @lyhtheori); NB: a sub-request or internal redirect into a differently configured location now re-validates the session or access token, soOIDCStripCookieson the session cookie, or an access token passed only in a POST body or query parameter, will trigger (re-)authentication there - redirect validation: only
http/httpsURLs are accepted as redirect targets; a same-hostjavascript:URL passed as thetarget_link_uriof a 3rd-party initiated login was executed by the POST-restore page after authentication - logout: an unauthenticated front-channel logout request could terminate another user's session by passing that user's
subas thesid, when back-channel logout was enabled or the ID token carried nosid; thesublogout index now has a cache section of its own that only a back-channel logout token without asidconsults - hostname validation: hostnames (same-host redirect check, session cookie domain binding, cookie domain and discovery/request URI suffix checks) and HTTP response header names are compared byte for byte, folding ASCII case only; whitespace was ignored, so e.g.
www.exam ple.commatchedwww.example.com - HTTP responses: memory use while receiving a response from a provider or other remote endpoint was quadratic in its size, e.g. 3 GB for a 10 MB response; with dynamic discovery and no
OIDCDiscoverIssuersAlloweda client could direct such a fetch to a host of its choosing and exhaust the server's memory
Features
- access token refresh: add
OIDCRefreshAccessTokenIntervalto refresh the access token once it is older than the configured number of seconds, regardless of its expiry; combines withOIDCRefreshAccessTokenBeforeExpiryas "whichever comes first" and does not need anexpires_inhint from the OP - metrics: add
cache.hit,cache.missandcache.evictioncounters; labelcache.errorwith the cache backend name - log correlation: export a non-reversible fingerprint of the session identifier and the generated trace-id as
OIDC_SESSION_ID/OIDC_TRACE_IDrequest notes/environment variables, for use inLogFormat/ErrorLogFormat - metrics: report subsystem self-health in the Prometheus output (
oidc_build_info,oidc_metrics_flush_errors,oidc_metrics_last_flush_timestamp_seconds) and add theOIDCMetricsCacheStorageInterval/OIDCMetricsCacheJsonMaxdirectives - metrics: turn
format=statusinto a real readiness probe: cache backend write/read round-trip, answering 503 on failure - metrics: label the
authn.response.error.protocolandauthz.error.oauth20counters with the specific validation failure reason - tracing: propagate an incoming
tracestateheader alongsidetraceparent - metrics: Prometheus timing histograms are additionally emitted as idiomatic
_secondsfamilies (le= and sum in seconds, with new 10s/30s buckets); the legacy millisecond families are deprecated and will be removed in a future release - tracing: generated traceparent headers always carry the "
sampled" flag
Bugfixes
- metrics: check the counter/timing type parsed out of a metrics key against the info tables and skip entries of an unknown type, instead of indexing the tables with the raw value, so a corrupt or stale shared-memory segment cannot drive an out-of-bounds read
- metrics:
format=jsonno longer resets the collected metrics by default; passreset=trueexplicitly - metrics: reclaim the process-local counter/timing allocations after each successful flush, instead of leaking them in every server process for as long as it lives (with
OIDCMetricsDataenabled; present since 2.4.15) - metrics: abort metrics operations when their mutex cannot be acquired, escape Prometheus label values, and treat histogram
leboundaries as inclusive - implicit flow: the script that posts a
response_mode=fragmentresponse to the redirect URI computed and discarded its "+" to space conversion, so form-encoded spaces were posted as literal plus signs - config:
OIDCRefreshAccessTokenBeforeExpiryandOIDCRefreshAccessTokenIntervalaccept-1to switch the refresh off in a nested<Location>/<Directory>; a value inherited from an enclosing one could not be overridden with "off" before - jose: ES256/ES384/ES512 signed tokens failed to verify ("could not find key with kid") when built against cjose 0.8.0 or later, whose headers no longer pull in OpenSSL; a regression in 2.4.20; thanks @cyrilst
Other
- userinfo: aggregated and distributed claims (
_claim_names/_claim_sources) are no longer resolved: the resolver accepted the aggregated JWTs without verifying their signatures and fetched distributed claims from whatever endpoint the response named; such responses are now passed on unresolved and a warning is logged - test: the libcheck unit test suites are portable (system temp dir,
srcdirand environment helpers); the fork, symlink, permission and rlimit tests stay POSIX-only
Commercial
- commercial subscription based support for large enterprise businesses is available via sales@openidc.com
- licensed binary packages for various other platforms such as Microsoft Windows, Red Hat Enterprise Linux 7, older Ubuntu and Debian distros, Oracle HTTP Server 12.x/14.x and IBM HTTP Server 9.x, are available under a commercial license and agreement via sales@openidc.com
- support for Redis/Valkey over TLS, Redis/Valkey (TLS) Sentinel, and Redis/Valkey (TLS) Cluster is available under a commercial license and agreement via sales@openidc.com
The RPM packages below are signed with the following RSA PGP key:
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBGh53lgBCADCyoOkfnE5h5rBLlf02oFpI/z2vUXK5W4T56xnNPu0/iIOxbBk
YX9rSypZFhfjv28lhGgelWEg28Ab/Yxs6l0obCgDEuFUDQ5Dv+N+YSMy67vtLwYW
9LM5p9fMN9bXOa62PwvtzRzh+xRyRBcIfMacGJC+SqUK6QhzC0lNwCsr1OaWjzon
mkaodwrloNMxEZVvFn63PvuQDZ3wwQty+0XpYiiChMssGBn6nmPDQJ7pDtQDkhfD
Z5FKY6K7AQJ4fneiVCLGngPBwTXBGcfWa+Y0HCS2ghQwDO6jYXd5GjowVDTjfMK3
QJ3e26Ox9X3V0Fl04R1i5EthEkAWGfy1lksvABEBAAG0HU9wZW5JREMgPHN1cHBv
cnRAb3BlbmlkYy5jb20+iQFRBBMBCgA7FiEEFdjWJA1IGDkAITSxnyZY1L0OSOMF
Amh53lgCGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQnyZY1L0OSONG
Jgf+II0wG96R0g28Kp+R4AYzSdX0CEqr6OhwHHw4cFpLsHxZNhojo7I4OnLKEdfc
lFl37rE+hG3QpzD/b4S/fpPjd4hcLkguBQxtdxqZZVAIT8HWbveHRkI8MNnjOPwv
Hy6jBncMs1IT/URV2si/Q34+PLo8tvo/lXNa16svVl2DoYXO8MCszgCE1bx055EF
XPh4Teu5Y4OLHECSicMxrmN746dAD121zy4bLLx9mZ0erhLjvkj1vkFmlHFKyvwY
/pbSqXs9hW/wweW1oQ/xEIJWWS71PeoutUBjr0WC4sILnR5PBPZplgNh297Qex6g
qaW3io0tCH9KxU1tXYn/iL/hbQ==
=mlOy
-----END PGP PUBLIC KEY BLOCK-----