Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Update dependency cryptography to v50 [SECURITY] - autoclosed by renovate[bot] · Pull Request #385 · finos/symphony-bdk-python · GitHub
Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Update dependency cryptography to v50 [SECURITY] - autoclosed by renovate[bot] · Pull Request #385 · finos/symphony-bdk-python · GitHub
Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Update dependency cryptography to v50 [SECURITY] - autoclosed by renovate[bot] · Pull Request #385 · finos/symphony-bdk-python · GitHub
Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Update dependency cryptography to v50 [SECURITY] - autoclosed by renovate[bot] · Pull Request #385 · finos/symphony-bdk-python · GitHub
Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Update dependency cryptography to v50 [SECURITY] - autoclosed by renovate[bot] · Pull Request #385 · finos/symphony-bdk-python · GitHub
Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Update dependency cryptography to v50 [SECURITY] - autoclosed by renovate[bot] · Pull Request #385 · finos/symphony-bdk-python · GitHub
Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Update dependency cryptography to v50 [SECURITY] - autoclosed by renovate[bot] · Pull Request #385 · finos/symphony-bdk-python · GitHub
Skip to content

Update dependency cryptography to v50 [SECURITY] - autoclosed - #385

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability
Closed

Update dependency cryptography to v50 [SECURITY] - autoclosed#385
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-cryptography-vulnerability

Conversation

@renovate

@renovaterenovateBot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

PackageChangeAgeConfidence
cryptography (changelog)>=48.0.1,<49.0.0>=50.0.0,<50.1.0ageconfidence

cryptography: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle through distinguishable errors and timing

CVE-2026-69247 / GHSA-g6cj-pr64-35w5

More information

Details

Summary

pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime reported the
outcome of decrypting a RecipientInfo's encryptedKey in several
distinguishable ways, one of which disclosed the exact length recovered from the
RSA operation. The same distinction was also observable by timing. An
application that decrypts attacker-supplied EnvelopedData and reflects the
outcome gives the attacker a Bleichenbacher oracle against the
content-encryption key.

Introduced in 44.0.0. Fixed in 50.0.0.

Details

Decryption ran as: RSA PKCS#1 v1.5 decrypt of encryptedKey → build an AES
cipher from the result → AES-CBC decrypt and PKCS#7 unpad. Each stage failed
differently, with no RFC 3218 mitigation:

  1. invalid RSA padding → Decryption failed
  2. valid padding, bad key length → Invalid key size (N) for AES., disclosing N
  3. correct length, wrong key → Invalid padding bytes.
  4. the real key → plaintext

Case 1 is reachable only where the linked library lacks implicit rejection:
OpenSSL 3.0 and 3.1, LibreSSL, and BoringSSL. On OpenSSL 3.2+, used in our wheels,
invalid padding instead returns a synthetic plaintext of
pseudorandom length, so the error channel does not distinguish conforming
ciphertexts.

Exploitation requires a service that auto-decrypts untrusted EnvelopedData
matching the victim certificate and answers adaptively at high volume, such as
an S/MIME gateway or mail filter.

Fix

Per RFC 3218, the content-encryption algorithm is now resolved before the
private key is used, so the expected key length is known in advance. If the RSA
decryption fails or recovers a key of the wrong length, a random key of the
expected length is substituted and decryption continues down an identical path.
All failures now report identically and perform the same work.

Not addressed by this fix

EnvelopedData does not authenticate its content. Tampering with
encryptedContent alone yields a CBC padding oracle that recovers plaintext at
roughly 256 queries per byte, without recovering any key, on every backend. This
is a property of PKCS#7 rather than of this implementation, cannot be fixed in
the library, and is now documented.

Credit

Reported by @​X1AOxiang.

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

pyca/cryptography (cryptography)

v50.0.0

Compare Source

v49.0.0

Compare Source


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

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 was generated by Mend Renovate. View the repository job log.

@renovaterenovateBot changed the title Update dependency cryptography to v46.0.6 [SECURITY]Update dependency cryptography to v46.0.7 [SECURITY]Apr 15, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from a20d695 to 885de26CompareApril 15, 2026 11:02
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 885de26 to 749dabdCompareJune 20, 2026 11:28
@renovaterenovateBot changed the title Update dependency cryptography to v46.0.7 [SECURITY]Update dependency cryptography to v48 [SECURITY]Jun 20, 2026
@renovaterenovateBot changed the title Update dependency cryptography to v48 [SECURITY]Update dependency cryptography to v50 [SECURITY]Aug 7, 2026
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 749dabd to 510b734CompareAugust 7, 2026 00:12
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch 2 times, most recently from a1424bc to 3186bcdCompareAugust 23, 2026 04:08
@renovate
renovateBotforce-pushed the renovate/pypi-cryptography-vulnerability branch from 3186bcd to 5c42405CompareAugust 26, 2026 09:29
@renovaterenovateBot changed the title Update dependency cryptography to v50 [SECURITY]Update dependency cryptography to v50 [SECURITY] - autoclosedAug 31, 2026
@renovaterenovateBot closed this Aug 31, 2026
@renovate
renovateBot deleted the renovate/pypi-cryptography-vulnerability branch August 31, 2026 16:30
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants