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.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-71417
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 4 Nov 2026, 03:41 UTC · Revision 1
Source evidence
Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it
core-osv · Original sourcePublished 18 Aug 2026, 19:12 UTC
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.
osv:CVE-2026-71417
Complete source record
{
"id": "951b143fddbda6e04a0698e88cf41b593cb20ebe32a7d7da7e230f41f9eeaf6d",
"url": "https://osv.dev/vulnerability/CVE-2026-71417",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Lemur: Any user can revoke arbitrary certificates at the CA by uploading a duplicate record and revoking it",
"summary": "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.",
"evidence": "osv:CVE-2026-71417",
"products": [],
"severity": "high",
"structured": {
"id": "CVE-2026-71417",
"aliases": [
"CVE-2026-71417",
"GHSA-pxmc-2ffp-8j67",
"PYSEC-2026-3678"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:L/A:H"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/netflix/lemur",
"type": "GIT",
"events": [
{
"introduced": "0"
},
{
"fixed": "726506d15a6da8d9bcf5c39b4dc0c95535cf03c0"
},
{
"fixed": "851389ae737a6d6bf16c1f9ca64a2ce56c1cc5c6"
}
],
"database_specific": {
"extracted_events": [
{
"range": [
{
"introduced": "0"
},
{
"fixed": "1.9.3"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"range": [
{
"fixed": "851389ae737a6d6bf16c1f9ca64a2ce56c1cc5c6"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "726506d15a6da8d9bcf5c39b4dc0c95535cf03c0"
}
],
"source": "REFERENCES_TAG",
"original_tag": "v1.9.3"
}
]
}
}
],
"versions": [
"v1.9.2",
"v1.9.1",
"v1.9.0",
"v1.8.2",
"v1.8.1",
"v1.8.0",
"v1.7.0",
"v1.6.0",
"v1.5.0",
"v1.4.0",
"v1.3.2",
"v1.3.1",
"v1.3.0",
"v1.2.0",
"v1.1.0",
"v1.0.0",
"v0.11.0",
"v0.10.0",
"v0.9.0",
"v0.8.1",
"0.8.0",
"0.7.0",
"0.6.0",
"0.5.0",
"0.4.0",
"0.3.0",
"0.2.2",
"0.2.1",
"0.2",
"0.1.5",
"0.1.4",
"0.1.3",
"0.1.2",
"0.1"
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-71417.json"
}
}
],
"modified": "2026-10-28T02:30:32.803281501Z",
"provider": "osv",
"references": [
"https://github.com/Netflix/lemur/releases/tag/v1.9.3",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/71xxx/CVE-2026-71417.json",
"https://github.com/Netflix/lemur/security/advisories/GHSA-pxmc-2ffp-8j67",
"https://nvd.nist.gov/vuln/detail/CVE-2026-71417",
"https://github.com/Netflix/lemur/commit/851389ae737a6d6bf16c1f9ca64a2ce56c1cc5c6"
],
"provider_metadata": {
"cwe_ids": [
"CWE-639"
],
"cna_assigner": "GitHub_M",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/71xxx/CVE-2026-71417.json"
}
},
"related_cves": [
{
"value": "CVE-2026-71417",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 500080,
"published_at": "2026-08-18T19:12:16.427+00:00"
}