CVE-2026-71417
Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it
Lemur manages TLS certificate creation. Prior to 1.9.3, POST /api/1/certificates/upload allowed a non-read-only user to create a duplicate row using another certificate body, authority_id, serial, or external_id without requiring permission on the underlying authority. PUT /api/1/certificates//revoke authorized the caller against only the selected Lemur row, so the creator of the duplicate bypassed CertificatePermission. The duplicate had no cert.endpoints, which also bypassed the safeguard that prevents revocation of deployed certificates. Issuer plugins then revoked the real CA-side certificate using certificate.body or external_id under the stored authority credentials. An attacker could therefore revoke arbitrary managed certificates and cause fleet-wide TLS denial of service. The fix rejects duplicate authority_id and serial identities, requires authority access on upload, and checks every matching row during revocation. This issue is fixed in version 1.9.3.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- Low
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
7.3
Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it
Lemur manages TLS certificate creation. Prior to 1.9.3, POST /api/1/certificates/upload allowed a non-read-only user to create a duplicate row using another certificate body, authority_id, serial, or external_id without requiring permission on the underlying authority. PUT /api/1/certificates//revoke authorized the caller against only the selected Lemur row, so the creator of the duplicate bypassed CertificatePermission. The duplicate had no cert.endpoints, which also bypassed the safeguard that prevents revocation of deployed certificates. Issuer plugins then revoked the real CA-side certificate using certificate.body or external_id under the stored authority credentials. An attacker could therefore revoke arbitrary managed certificates and cause fleet-wide TLS denial of service. The fix rejects duplicate authority_id and serial identities, requires authority access on upload, and checks every matching row during revocation. This issue is fixed in version 1.9.3.
- Record
CVE-2026-71417- CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H - Weakness
- CWE-639
- Updated
- 2026-11-02
EUVDEUVD-2026-61161
7.3
Lemur manages TLS certificate creation. Prior to 1.9.3, POST /api/1/certificates/upload allowed a non-read-only user to create a duplicate row using another certificate body, authority_id, serial, or external_id without requiring permission on the underlying authority. PUT /api/1/certificates//revoke authorized the caller against only the selected Lemur row, so the creator of the duplicate bypassed CertificatePermission. The duplicate had no cert.endpoints, which also bypassed the safeguard that prevents revocation of deployed certificates. Issuer plugins then revoked the real CA-side certificate using certificate.body or external_id under the stored authority credentials. An attacker could therefore revoke arbitrary managed certificates and cause fleet-wide TLS denial of service. The fix rejects duplicate authority_id and serial identities, requires authority access on upload, and checks every matching row during revocation. This issue is fixed in version 1.9.3.
- Record
EUVD-2026-61161- CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-pxmc-2ffp-8j67
7.3
Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it
Summary
Repo under test: https://github.com/Netflix/lemur
PUT /api/1/certificates/<id>/revoke authorizes the caller against the Lemur database row (creator == current user, or CertificatePermission over the row's roles) rather than the underlying CA-side certificate identity. Separately, POST /api/1/certificates/upload lets any user passing StrictRolePermission create a new Certificate row while freely supplying body, authority (resolved by id/name with no AuthorityPermission check) and external_id; there is no uniqueness constraint on body, serial, or external_id.
An attacker can therefore read a target certificate's public body, authority.id, and external_id via GET /certificates/<id>, upload a duplicate row, and revoke that duplicate. The creator-bypass skips CertificatePermission, the empty-endpoints check passes because the duplicate has none, and service.revoke() then revokes at the CA using the attacker-supplied body (ACME) or external_id (DigiCert/Entrust/Google CA/CFSSL) under the authority's stored CA credentials — revoking the real production certificate.
Affected route
POST /api/1/certificates/upload → PUT /api/1/certificates/<dup_id>/revoke
Affected code
lemur/certificates/views.py:651— onlyStrictRolePermission().can()gates upload; noAuthorityPermissionchecklemur/certificates/schemas.py:391—CertificateUploadInputSchemaaccepts caller-suppliedauthorityandexternal_idlemur/schemas.py:107—AssociatedAuthoritySchemaresolves any authority by id/name with no permission checklemur/certificates/service.py:489—upload()binds the caller-supplied authority onto the new rowlemur/certificates/models.py:119— onlynameis unique;body/serial/external_idare not, andget_or_increase_name()auto-suffixes on collisionlemur/certificates/views.py:1677—if g.current_user != cert.user: ... CertificatePermission ...— creator of the duplicate row bypasses the owner checklemur/certificates/views.py:1687—if cert.endpoints: ...— duplicate row has no endpoints, so the deployed-cert safeguard is bypassedlemur/certificates/service.py:1120—plugin = plugins.get(certificate.authority.plugin_name); plugin.revoke_certificate(certificate, reason)lemur/plugins/lemur_acme/acme_handlers.py:268— ACME revokes bycertificate.bodylemur/plugins/lemur_digicert/plugin.py:477,lemur/plugins/lemur_entrust/plugin.py:321— commercial CAs revoke bycertificate.external_idlemur/certificates/schemas.py:290—CertificateOutputSchemaexposesexternal_id,body,authorityto any authenticated user
Impact
A low-privileged authenticated insider (or holder of a stolen non-admin token/API key) can revoke any certificate managed by Lemur — including high-value certificates they do not own and certificates currently attached to live endpoints — directly at the issuing CA. Iterating over `GET…
- Record
GHSA-pxmc-2ffp-8j67- CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H - Weakness
- CWE-639
- Updated
- 2026-11-02
NVD
7.3
Lemur manages TLS certificate creation. Prior to 1.9.3, POST /api/1/certificates/upload allowed a non-read-only user to create a duplicate row using another certificate body, authority_id, serial, or external_id without requiring permission on the underlying authority. PUT /api/1/certificates//revoke authorized the caller against only the selected Lemur row, so the creator of the duplicate bypassed CertificatePermission. The duplicate had no cert.endpoints, which also bypassed the safeguard that prevents revocation of deployed certificates. Issuer plugins then revoked the real CA-side certificate using certificate.body or external_id under the stored authority credentials. An attacker could therefore revoke arbitrary managed certificates and cause fleet-wide TLS denial of service. The fix rejects duplicate authority_id and serial identities, requires authority access on upload, and checks every matching row during revocation. This issue is fixed in version 1.9.3.
- Record
CVE-2026-71417- CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H - Weakness
- CWE-639
- Updated
- 2026-11-02
OSV
7.3
Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it
Lemur manages TLS certificate creation. Prior to 1.9.3, POST /api/1/certificates/upload allowed a non-read-only user to create a duplicate row using another certificate body, authority_id, serial, or external_id without requiring permission on the underlying authority. PUT /api/1/certificates//revoke authorized the caller against only the selected Lemur row, so the creator of the duplicate bypassed CertificatePermission. The duplicate had no cert.endpoints, which also bypassed the safeguard that prevents revocation of deployed certificates. Issuer plugins then revoked the real CA-side certificate using certificate.body or external_id under the stored authority credentials. An attacker could therefore revoke arbitrary managed certificates and cause fleet-wide TLS denial of service. The fix rejects duplicate authority_id and serial identities, requires authority access on upload, and checks every matching row during revocation. This issue is fixed in version 1.9.3.
- Record
CVE-2026-71417- CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H - Weakness
- CWE-639
- Updated
- 2026-11-02
OSVGHSA-pxmc-2ffp-8j67
7.3
Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it
Summary
Repo under test: https://github.com/Netflix/lemur
PUT /api/1/certificates/<id>/revoke authorizes the caller against the Lemur database row (creator == current user, or CertificatePermission over the row's roles) rather than the underlying CA-side certificate identity. Separately, POST /api/1/certificates/upload lets any user passing StrictRolePermission create a new Certificate row while freely supplying body, authority (resolved by id/name with no AuthorityPermission check) and external_id; there is no uniqueness constraint on body, serial, or external_id.
An attacker can therefore read a target certificate's public body, authority.id, and external_id via GET /certificates/<id>, upload a duplicate row, and revoke that duplicate. The creator-bypass skips CertificatePermission, the empty-endpoints check passes because the duplicate has none, and service.revoke() then revokes at the CA using the attacker-supplied body (ACME) or external_id (DigiCert/Entrust/Google CA/CFSSL) under the authority's stored CA credentials — revoking the real production certificate.
Affected route
POST /api/1/certificates/upload → PUT /api/1/certificates/<dup_id>/revoke
Affected code
lemur/certificates/views.py:651— onlyStrictRolePermission().can()gates upload; noAuthorityPermissionchecklemur/certificates/schemas.py:391—CertificateUploadInputSchemaaccepts caller-suppliedauthorityandexternal_idlemur/schemas.py:107—AssociatedAuthoritySchemaresolves any authority by id/name with no permission checklemur/certificates/service.py:489—upload()binds the caller-supplied authority onto the new rowlemur/certificates/models.py:119— onlynameis unique;body/serial/external_idare not, andget_or_increase_name()auto-suffixes on collisionlemur/certificates/views.py:1677—if g.current_user != cert.user: ... CertificatePermission ...— creator of the duplicate row bypasses the owner checklemur/certificates/views.py:1687—if cert.endpoints: ...— duplicate row has no endpoints, so the deployed-cert safeguard is bypassedlemur/certificates/service.py:1120—plugin = plugins.get(certificate.authority.plugin_name); plugin.revoke_certificate(certificate, reason)lemur/plugins/lemur_acme/acme_handlers.py:268— ACME revokes bycertificate.bodylemur/plugins/lemur_digicert/plugin.py:477,lemur/plugins/lemur_entrust/plugin.py:321— commercial CAs revoke bycertificate.external_idlemur/certificates/schemas.py:290—CertificateOutputSchemaexposesexternal_id,body,authorityto any authenticated user
Impact
A low-privileged authenticated insider (or holder of a stolen non-admin token/API key) can revoke any certificate managed by Lemur — including high-value certificates they do not own and certificates currently attached to live endpoints — directly at the issuing CA. Iterating over `GET…
- Record
GHSA-pxmc-2ffp-8j67- CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H - Weakness
- CWE-639
- Updated
- 2026-11-02
OSVPYSEC-2026-3678
7.3
Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it
Summary
Repo under test: https://github.com/Netflix/lemur
PUT /api/1/certificates/<id>/revoke authorizes the caller against the Lemur database row (creator == current user, or CertificatePermission over the row's roles) rather than the underlying CA-side certificate identity. Separately, POST /api/1/certificates/upload lets any user passing StrictRolePermission create a new Certificate row while freely supplying body, authority (resolved by id/name with no AuthorityPermission check) and external_id; there is no uniqueness constraint on body, serial, or external_id.
An attacker can therefore read a target certificate's public body, authority.id, and external_id via GET /certificates/<id>, upload a duplicate row, and revoke that duplicate. The creator-bypass skips CertificatePermission, the empty-endpoints check passes because the duplicate has none, and service.revoke() then revokes at the CA using the attacker-supplied body (ACME) or external_id (DigiCert/Entrust/Google CA/CFSSL) under the authority's stored CA credentials — revoking the real production certificate.
Affected route
POST /api/1/certificates/upload → PUT /api/1/certificates/<dup_id>/revoke
Affected code
lemur/certificates/views.py:651— onlyStrictRolePermission().can()gates upload; noAuthorityPermissionchecklemur/certificates/schemas.py:391—CertificateUploadInputSchemaaccepts caller-suppliedauthorityandexternal_idlemur/schemas.py:107—AssociatedAuthoritySchemaresolves any authority by id/name with no permission checklemur/certificates/service.py:489—upload()binds the caller-supplied authority onto the new rowlemur/certificates/models.py:119— onlynameis unique;body/serial/external_idare not, andget_or_increase_name()auto-suffixes on collisionlemur/certificates/views.py:1677—if g.current_user != cert.user: ... CertificatePermission ...— creator of the duplicate row bypasses the owner checklemur/certificates/views.py:1687—if cert.endpoints: ...— duplicate row has no endpoints, so the deployed-cert safeguard is bypassedlemur/certificates/service.py:1120—plugin = plugins.get(certificate.authority.plugin_name); plugin.revoke_certificate(certificate, reason)lemur/plugins/lemur_acme/acme_handlers.py:268— ACME revokes bycertificate.bodylemur/plugins/lemur_digicert/plugin.py:477,lemur/plugins/lemur_entrust/plugin.py:321— commercial CAs revoke bycertificate.external_idlemur/certificates/schemas.py:290—CertificateOutputSchemaexposesexternal_id,body,authorityto any authenticated user
Impact
A low-privileged authenticated insider (or holder of a stolen non-admin token/API key) can revoke any certificate managed by Lemur — including high-value certificates they do not own and certificates currently attached to live endpoints — directly at the issuing CA. Iterating over `GET…
- Record
PYSEC-2026-3678- CVSS 3.1
- 7.3 High
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H - Updated
- 2026-11-02
Affected products
Affected packages
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-71417 is a high vulnerability (CVSS 7.3) in Netflix Lemur, published August 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.10%, the 1st percentile. Fixed in lemur 1.9.3.
References
github.com/Netflix/lemur/security/advisories/GHSA-pxmc-2ffp-8j67
github.com/Netflix/lemur/commit/851389ae737a6d6bf16c1f9ca64a2ce56c1cc5c6
github.com/Netflix/lemur/releases/tag/v1.9.3
github.com/advisories/GHSA-pxmc-2ffp-8j67
github.com/CVEProject/cvelistV5/tree/main/cves/2026/71xxx/CVE-2026-71417.json
nvd.nist.gov/vuln/detail/CVE-2026-71417
github.com/Netflix/lemur
pypi.org/project/lemur
Left out here: the rest of 3 source descriptions. The JSON record has them.