Compare commits
	
		
			2 Commits
		
	
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | d49556d966 | |
|  | f5f1348176 | 
							
								
								
									
										19
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										19
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -6,8 +6,27 @@ | ||||||
| 
 | 
 | ||||||
| ## Breaking Changes | ## 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 | ## 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 | # v5.1.0 | ||||||
| 
 | 
 | ||||||
| ## Release Hightlights | ## Release Hightlights | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ A list of changes can be seen in the [CHANGELOG](CHANGELOG.md). | ||||||
| 
 | 
 | ||||||
| 1.  Choose how to deploy: | 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` |     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 | 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) | 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 | ## 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 | ## Docs | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ nav_order: 1 | ||||||
| 
 | 
 | ||||||
| 1.  Choose how to deploy: | 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` |     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 | $ 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) | 2.  [Select a Provider and Register an OAuth Application with a Provider](auth-configuration) | ||||||
|  |  | ||||||
|  | @ -57,6 +57,10 @@ var SignatureHeaders = []string{ | ||||||
| var ( | var ( | ||||||
| 	// ErrNeedsLogin means the user should be redirected to the login page
 | 	// ErrNeedsLogin means the user should be redirected to the login page
 | ||||||
| 	ErrNeedsLogin = errors.New("redirect to 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
 | // OAuthProxy is the main authentication proxy
 | ||||||
|  | @ -571,7 +575,7 @@ func validOptionalPort(port string) bool { | ||||||
| // IsValidRedirect checks whether the redirect URL is whitelisted
 | // IsValidRedirect checks whether the redirect URL is whitelisted
 | ||||||
| func (p *OAuthProxy) IsValidRedirect(redirect string) bool { | func (p *OAuthProxy) IsValidRedirect(redirect string) bool { | ||||||
| 	switch { | 	switch { | ||||||
| 	case strings.HasPrefix(redirect, "/") && !strings.HasPrefix(redirect, "//") && !strings.HasPrefix(redirect, "/\\"): | 	case strings.HasPrefix(redirect, "/") && !strings.HasPrefix(redirect, "//") && !invalidRedirectRegex.MatchString(redirect): | ||||||
| 		return true | 		return true | ||||||
| 	case strings.HasPrefix(redirect, "http://") || strings.HasPrefix(redirect, "https://"): | 	case strings.HasPrefix(redirect, "http://") || strings.HasPrefix(redirect, "https://"): | ||||||
| 		redirectURL, err := url.Parse(redirect) | 		redirectURL, err := url.Parse(redirect) | ||||||
|  |  | ||||||
|  | @ -323,6 +323,61 @@ func TestIsValidRedirect(t *testing.T) { | ||||||
| 			Redirect:       "http://a.sub.anyport.bar:8081/redirect", | 			Redirect:       "http://a.sub.anyport.bar:8081/redirect", | ||||||
| 			ExpectedResult: true, | 			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 { | 	for _, tc := range testCases { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue