pkcs12: limit PBKDF iteration count to prevent CPU exhaustion#343
pkcs12: limit PBKDF iteration count to prevent CPU exhaustion#343mohammadmseet-hue wants to merge 3 commits intogolang:masterfrom
Conversation
|
This PR (HEAD: 008f0a8) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/crypto/+/759900. Important tips:
|
|
Message from Gopher Robot: Patch Set 1: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Gopher Robot: Patch Set 1: Congratulations on opening your first change. Thank you for your contribution! Next steps: Most changes in the Go project go through a few rounds of revision. This can be During May-July and Nov-Jan the Go project is in a code freeze, during which Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
The PKCS#12 PBKDF iteration count is read directly from the input file with no upper bound. A crafted .p12 file (83 bytes) with iterations set to MaxInt32 causes pkcs12.Decode() to block indefinitely. Add a maximum iteration count of 1 million. This is well above typical values (2048-10000) used by real PKCS#12 implementations while preventing malicious files from causing CPU exhaustion. The check is applied in both verifyMac (MAC verification) and pbDecrypterFor (content decryption), which are the two entry points that call pbkdf with the attacker-controlled iteration count. Change-Id: I38e327b3ef566631e6d5f27098efd3bc61b87d1e
008f0a8 to
bc14ef1
Compare
|
Message from Mohammad Seet: Patch Set 1: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
This PR (HEAD: 1e033b1) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/crypto/+/759900. Important tips:
|
|
Message from Ian Lance Taylor: Patch Set 2: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Mohammad Seet: Patch Set 2: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Daniel McCarney: Patch Set 3: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
Tests verifyMac and pbDecrypterFor at the limit, over the limit, with negative values, and with max int. Updates golang/go#78524
This comment was marked as outdated.
This comment was marked as outdated.
|
This PR (HEAD: a0370d4) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/crypto/+/759900. Important tips:
|
|
Message from Mohammad Seet: Patch Set 3: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Daniel McCarney: Patch Set 4: Code-Review+2 Commit-Queue+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Go LUCI: Patch Set 4: Dry run: CV is trying the patch. Bot data: {"action":"start","triggered_at":"2026-04-06T20:14:30Z","revision":"e781e99d193a6ad9e661d551cbaba0e9f5b40e01"} Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Daniel McCarney: Patch Set 4: -Commit-Queue (Performed by <GERRIT_ACCOUNT_60063> on behalf of <GERRIT_ACCOUNT_26879>) Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Go LUCI: Patch Set 4: This CL has passed the run Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Go LUCI: Patch Set 4: LUCI-TryBot-Result+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from David Chase: Patch Set 4: Code-Review+2 Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
|
Message from Junyang Shao: Patch Set 4: Code-Review+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/759900. |
The PKCS#12 PBKDF iteration count is read directly from
the input file with no upper bound. A crafted 83-byte .p12
file can set iterations to 2^31-1 (2147483647), causing
Decode() to block a CPU core permanently.
This change adds a maximum iteration limit of 1000000 in
both verifyMac and pbDecrypterFor. Any file that specifies
more iterations than this cap is rejected with an error.
For reference, OpenSSL caps PBKDF2 at 10000000 iterations,
and scrypt is bounded by its memory-hardness parameters.
The 1000000 limit is generous for legitimate PKCS#12 files
while still preventing denial of service.
Fixes golang/go#78524