Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Update module github.com/lestrrat-go/jwx to v1.2.29 [SECURITY] #78

Merged

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Mar 8, 2024

Mend Renovate

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
github.com/lestrrat-go/jwx v1.2.28 -> v1.2.29 age adoption passing confidence

GitHub Vulnerability Alerts

CVE-2024-28122

Summary

This vulnerability allows an attacker with a trusted public key to cause a Denial-of-Service (DoS) condition by crafting a malicious JSON Web Encryption (JWE) token with an exceptionally high compression ratio. When this token is processed by the recipient, it results in significant memory allocation and processing time during decompression.

Details

The attacker needs to obtain a valid public key to compress the payload. It needs to be valid so that the recipient can use to successfully decompress the payload. Furthermore in context JWT processing in the v2 versions, the recipient must explicitly allow JWE handling .

The attacker then crafts a message with high compression ratio, e.g. a payload with very high frequency of repeating patterns that can decompress to a much larger size. If the payload is large enough, recipient who is decompressing the data will have to allocate a large amount of memory, which then can lead to a denial of service.

The original report includes a reference to [1], but there are some very subtle differences between this library and the aforementioned issue. The most important aspect is that the referenced issue focuses on JWT processing, whereas this library is intentionally divided into parts that comprise JOSE, i.e. JWT, JWS, JWE, JWK. In particular, v2 of this library does not attempt to handle JWT payload enveloped in a JWE message automatically (v1 attempted to do this automatically, but it was never stable).

Reflecting this subtle difference, the approach taken to mitigate this vulnerability is slightly different from the referenced issue. The referenced issue limits the size of JWT when parsing, but the fixes for this library limits the maximum size of the decompressed data when decrypting JWE messages. Therefore the fix in this library is applicable regardless of the usage context, and a limit is now imposed on the size of the message that our JWE implementation can handle.

Proof of Concept

Modified from the original report to fit the vulnerability better:

// The value below just needs to be "large enough" so that the it puts enough strain on the
// recipient's environment. The value below is a safe size on my machine to run the test
// without causing problems. When you increase the payload size, at some point the processing
// will be slow enough to virtually freeze the program or cause a memory allocation error
const payloadSize = 1 << 31

privkey, err := rsa.GenerateKey(rand.Reader, 2048)
require.NoError(t, err, `rsa.GenerateKey should succeed`)
pubkey := &privkey.PublicKey
payload := strings.Repeat("x", payloadSize)

encrypted, err := jwe.Encrypt([]byte(payload), jwe.WithKey(jwa.RSA_OAEP, pubkey), jwe.WithContentEncryption("A128CBC-HS256"), jwe.WithCompress(jwa.Deflate))
require.NoError(t, err, `jwe.Encrypt should succeed`)
_, err = jwe.Decrypt(encrypted, jwe.WithKey(jwa.RSA_OAEP, privkey)) // Will be allocating large amounts of memory
require.Error(t, err, `jwe.Decrypt should fail`)

References

[1] CVE-2024-21319


Release Notes

lestrrat-go/jwx (github.com/lestrrat-go/jwx)

v1.2.29

Compare Source

v1.2.29 07 Mar 2024

[Security]

  • [jwe] Added jwe.Settings(jwe.WithMaxDecompressBufferSize(int64)) to specify the
    maximum size of a decompressed JWE payload. The default value is 10MB. If you
    are compressing payloads greater than this, you need to explicitly set it.

    Unlike in v2, there is no way to set this globally. Please use v2 if this is required.


Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Enabled.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate. View repository job log here.

@renovate renovate bot requested a review from nieomylnieja as a code owner March 8, 2024 18:20
@renovate renovate bot enabled auto-merge (squash) March 8, 2024 18:20
@renovate renovate bot merged commit 3c63ed4 into main Mar 8, 2024
5 checks passed
@renovate renovate bot deleted the renovate_go-github.com/lestrrat-go/jwx-vulnerability branch March 8, 2024 18:21
BSski pushed a commit that referenced this pull request May 7, 2024
…#78)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [github.com/lestrrat-go/jwx](https://togithub.com/lestrrat-go/jwx) |
`v1.2.28` -> `v1.2.29` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2flestrrat-go%2fjwx/v1.2.29?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2flestrrat-go%2fjwx/v1.2.29?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2flestrrat-go%2fjwx/v1.2.28/v1.2.29?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2flestrrat-go%2fjwx/v1.2.28/v1.2.29?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2024-28122](https://togithub.com/lestrrat-go/jwx/security/advisories/GHSA-hj3v-m684-v259)

### Summary
This vulnerability allows an attacker with a trusted public key to cause
a Denial-of-Service (DoS) condition by crafting a malicious JSON Web
Encryption (JWE) token with an exceptionally high compression ratio.
When this token is processed by the recipient, it results in significant
memory allocation and processing time during decompression.

### Details

**The attacker needs to obtain a valid public key to compress the
payload**. It needs to be valid so that the recipient can use to
successfully decompress the payload. Furthermore in context JWT
processing in the v2 versions, the recipient must explicitly allow JWE
handling .

The attacker then crafts a message with high compression ratio, e.g. a
payload with very high frequency of repeating patterns that can
decompress to a much larger size. If the payload is large enough,
recipient who is decompressing the data will have to allocate a large
amount of memory, which then can lead to a denial of service.

The original report includes a reference to [1], but there are some very
subtle differences between this library and the aforementioned issue.
The most important aspect is that the referenced issue focuses on JWT
processing, whereas this library is intentionally divided into parts
that comprise JOSE, i.e. JWT, JWS, JWE, JWK. In particular, v2 of this
library does not attempt to handle JWT payload enveloped in a JWE
message automatically (v1 attempted to do this automatically, but it was
never stable).

Reflecting this subtle difference, the approach taken to mitigate this
vulnerability is slightly different from the referenced issue. The
referenced issue limits the size of JWT when parsing, but the fixes for
this library limits the maximum size of the decompressed data when
decrypting JWE messages. Therefore the fix in this library is applicable
regardless of the usage context, and a limit is now imposed on the size
of the message that our JWE implementation can handle.

### Proof of Concept

Modified from the original report to fit the vulnerability better:

```go
// The value below just needs to be "large enough" so that the it puts enough strain on the
// recipient's environment. The value below is a safe size on my machine to run the test
// without causing problems. When you increase the payload size, at some point the processing
// will be slow enough to virtually freeze the program or cause a memory allocation error
const payloadSize = 1 << 31

privkey, err := rsa.GenerateKey(rand.Reader, 2048)
require.NoError(t, err, `rsa.GenerateKey should succeed`)
pubkey := &privkey.PublicKey
payload := strings.Repeat("x", payloadSize)

encrypted, err := jwe.Encrypt([]byte(payload), jwe.WithKey(jwa.RSA_OAEP, pubkey), jwe.WithContentEncryption("A128CBC-HS256"), jwe.WithCompress(jwa.Deflate))
require.NoError(t, err, `jwe.Encrypt should succeed`)
_, err = jwe.Decrypt(encrypted, jwe.WithKey(jwa.RSA_OAEP, privkey)) // Will be allocating large amounts of memory
require.Error(t, err, `jwe.Decrypt should fail`)
```

###  References

[1]
[CVE-2024-21319](https://togithub.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/security/advisories/GHSA-8g9c-28fc-mcx2)

---

### Release Notes

<details>
<summary>lestrrat-go/jwx (github.com/lestrrat-go/jwx)</summary>

###
[`v1.2.29`](https://togithub.com/lestrrat-go/jwx/releases/tag/v1.2.29)

[Compare
Source](https://togithub.com/lestrrat-go/jwx/compare/v1.2.28...v1.2.29)

### v1.2.29 07 Mar 2024

#### \[Security]

- \[jwe] Added `jwe.Settings(jwe.WithMaxDecompressBufferSize(int64))` to
specify the
maximum size of a decompressed JWE payload. The default value is 10MB.
If you
are compressing payloads greater than this, you need to explicitly set
it.

Unlike in v2, there is no way to set this globally. Please use v2 if
this is required.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/nobl9/sloctl).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMzAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjIzMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant