Compare commits
	
		
			2 Commits
		
	
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | d49556d966 | |
|  | f5f1348176 | 
							
								
								
									
										19
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										19
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -6,8 +6,27 @@ | |||
| 
 | ||||
| ## Breaking Changes | ||||
| 
 | ||||
| ## Changes since v5.1.1 | ||||
| 
 | ||||
| # v5.1.1 | ||||
| 
 | ||||
| ## Release Highlights | ||||
| 
 | ||||
| N/A | ||||
| 
 | ||||
| ## Important Notes | ||||
| 
 | ||||
| - (Security) Fix for [open redirect vulnerability](https://github.com/oauth2-proxy/oauth2-proxy/security/advisories/GHSA-j7px-6hwj-hpjg). | ||||
|   - A bad actor using encoded whitespace in redirect URIs can redirect a session to another domain | ||||
| 
 | ||||
| ## Breaking Changes | ||||
| 
 | ||||
| N/A | ||||
| 
 | ||||
| ## Changes since v5.1.0 | ||||
| 
 | ||||
| - [GHSA-j7px-6hwj-hpjg](https://github.com/oauth2-proxy/oauth2-proxy/security/advisories/GHSA-j7px-6hwj-hpjg) Fix Open Redirect Vulnerability with encoded Whitespace characters (@JoelSpeed) | ||||
| 
 | ||||
| # v5.1.0 | ||||
| 
 | ||||
| ## Release Hightlights | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ A list of changes can be seen in the [CHANGELOG](CHANGELOG.md). | |||
| 
 | ||||
| 1.  Choose how to deploy: | ||||
| 
 | ||||
|     a. Download [Prebuilt Binary](https://github.com/pusher/oauth2_proxy/releases) (current release is `v5.0.0`) | ||||
|     a. Download [Prebuilt Binary](https://github.com/pusher/oauth2_proxy/releases) (current release is `v5.1.1`) | ||||
| 
 | ||||
|     b. Build with `$ go get github.com/pusher/oauth2_proxy` which will put the binary in `$GOROOT/bin` | ||||
| 
 | ||||
|  | @ -28,7 +28,7 @@ Prebuilt binaries can be validated by extracting the file and verifying it again | |||
| 
 | ||||
| ``` | ||||
| sha256sum -c sha256sum.txt 2>&1 | grep OK | ||||
| oauth2_proxy-4.0.0.linux-amd64: OK | ||||
| oauth2_proxy-5.1.1.linux-amd64: OK | ||||
| ``` | ||||
| 
 | ||||
| 2.  [Select a Provider and Register an OAuth Application with a Provider](https://pusher.github.io/oauth2_proxy/auth-configuration) | ||||
|  | @ -38,7 +38,8 @@ oauth2_proxy-4.0.0.linux-amd64: OK | |||
| 
 | ||||
| ## Security | ||||
| 
 | ||||
| If you are running a version older than v5.0.0 we **strongly recommend you please update** to a current version. RE: [open redirect vulnverability](https://github.com/pusher/oauth2_proxy/security/advisories/GHSA-qqxw-m5fj-f7gv) | ||||
| If you are running a version older than v5.1.0 we **strongly recommend you please update** to a current version. | ||||
| See [open redirect vulnverability](https://github.com/oauth2-proxy/oauth2-proxy/security/advisories/GHSA-j7px-6hwj-hpjg) for details. | ||||
| 
 | ||||
| ## Docs | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ nav_order: 1 | |||
| 
 | ||||
| 1.  Choose how to deploy: | ||||
| 
 | ||||
|     a. Download [Prebuilt Binary](https://github.com/pusher/oauth2_proxy/releases) (current release is `v4.0.0`) | ||||
|     a. Download [Prebuilt Binary](https://github.com/pusher/oauth2_proxy/releases) (current release is `v5.1.1`) | ||||
| 
 | ||||
|     b. Build with `$ go get github.com/pusher/oauth2_proxy` which will put the binary in `$GOROOT/bin` | ||||
| 
 | ||||
|  | @ -19,7 +19,7 @@ Prebuilt binaries can be validated by extracting the file and verifying it again | |||
| 
 | ||||
| ``` | ||||
| $ sha256sum -c sha256sum.txt 2>&1 | grep OK | ||||
| oauth2_proxy-4.0.0.linux-amd64: OK | ||||
| oauth2_proxy-5.1.1.linux-amd64: OK | ||||
| ``` | ||||
| 
 | ||||
| 2.  [Select a Provider and Register an OAuth Application with a Provider](auth-configuration) | ||||
|  |  | |||
|  | @ -57,6 +57,10 @@ var SignatureHeaders = []string{ | |||
| var ( | ||||
| 	// ErrNeedsLogin means the user should be redirected to the login page
 | ||||
| 	ErrNeedsLogin = errors.New("redirect to login page") | ||||
| 
 | ||||
| 	// Used to check final redirects are not susceptible to open redirects.
 | ||||
| 	// Matches //, /\ and both of these with whitespace in between (eg / / or / \).
 | ||||
| 	invalidRedirectRegex = regexp.MustCompile(`^/(\s|\v)?(/|\\)`) | ||||
| ) | ||||
| 
 | ||||
| // OAuthProxy is the main authentication proxy
 | ||||
|  | @ -571,7 +575,7 @@ func validOptionalPort(port string) bool { | |||
| // IsValidRedirect checks whether the redirect URL is whitelisted
 | ||||
| func (p *OAuthProxy) IsValidRedirect(redirect string) bool { | ||||
| 	switch { | ||||
| 	case strings.HasPrefix(redirect, "/") && !strings.HasPrefix(redirect, "//") && !strings.HasPrefix(redirect, "/\\"): | ||||
| 	case strings.HasPrefix(redirect, "/") && !strings.HasPrefix(redirect, "//") && !invalidRedirectRegex.MatchString(redirect): | ||||
| 		return true | ||||
| 	case strings.HasPrefix(redirect, "http://") || strings.HasPrefix(redirect, "https://"): | ||||
| 		redirectURL, err := url.Parse(redirect) | ||||
|  |  | |||
|  | @ -323,6 +323,61 @@ func TestIsValidRedirect(t *testing.T) { | |||
| 			Redirect:       "http://a.sub.anyport.bar:8081/redirect", | ||||
| 			ExpectedResult: true, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirect1", | ||||
| 			Redirect:       "/\\evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectSpace1", | ||||
| 			Redirect:       "/ /evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectSpace2", | ||||
| 			Redirect:       "/ \\evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectTab1", | ||||
| 			Redirect:       "/\t/evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectTab2", | ||||
| 			Redirect:       "/\t\\evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectVerticalTab1", | ||||
| 			Redirect:       "/\v/evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectVerticalTab2", | ||||
| 			Redirect:       "/\v\\evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectNewLine1", | ||||
| 			Redirect:       "/\n/evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectNewLine2", | ||||
| 			Redirect:       "/\n\\evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectCarriageReturn1", | ||||
| 			Redirect:       "/\r/evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Desc:           "openRedirectCarriageReturn2", | ||||
| 			Redirect:       "/\r\\evil.com", | ||||
| 			ExpectedResult: false, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, tc := range testCases { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue