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