From 4439a920e454a82565e445e4376c669e3b89591c Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Mon, 4 Mar 2024 11:52:03 -0600 Subject: [PATCH] Merge pull request from GHSA-7cc2-r658-7xpf This fixes a vulnerability with the `CODER_OIDC_EMAIL_DOMAIN` option, where users with a superset of the allowed email domain would be allowed to login. For example, given `CODER_OIDC_EMAIL_DOMAIN=google.com`, a user would be permitted entry if their email domain was `colin-google.com`. --- coderd/userauth.go | 12 ++++++++++-- coderd/userauth_test.go | 11 +++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/coderd/userauth.go b/coderd/userauth.go index 188a877e51..a028ebf4c2 100644 --- a/coderd/userauth.go +++ b/coderd/userauth.go @@ -929,15 +929,23 @@ func (api *API) userOIDC(rw http.ResponseWriter, r *http.Request) { if len(api.OIDCConfig.EmailDomain) > 0 { ok = false + emailSp := strings.Split(email, "@") + if len(emailSp) == 1 { + httpapi.Write(ctx, rw, http.StatusForbidden, codersdk.Response{ + Message: fmt.Sprintf("Your email %q is not in domains %q!", email, api.OIDCConfig.EmailDomain), + }) + return + } + userEmailDomain := emailSp[len(emailSp)-1] for _, domain := range api.OIDCConfig.EmailDomain { - if strings.HasSuffix(strings.ToLower(email), strings.ToLower(domain)) { + if strings.EqualFold(userEmailDomain, domain) { ok = true break } } if !ok { httpapi.Write(ctx, rw, http.StatusForbidden, codersdk.Response{ - Message: fmt.Sprintf("Your email %q is not in domains %q !", email, api.OIDCConfig.EmailDomain), + Message: fmt.Sprintf("Your email %q is not in domains %q!", email, api.OIDCConfig.EmailDomain), }) return } diff --git a/coderd/userauth_test.go b/coderd/userauth_test.go index db23432440..4432710c28 100644 --- a/coderd/userauth_test.go +++ b/coderd/userauth_test.go @@ -798,6 +798,17 @@ func TestUserOIDC(t *testing.T) { "kwc.io", }, StatusCode: http.StatusOK, + }, { + Name: "EmailDomainSubset", + IDTokenClaims: jwt.MapClaims{ + "email": "colin@gmail.com", + "email_verified": true, + }, + AllowSignups: true, + EmailDomain: []string{ + "mail.com", + }, + StatusCode: http.StatusForbidden, }, { Name: "EmptyClaims", IDTokenClaims: jwt.MapClaims{},