CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-71307

CVE-2026-71307: Plaintext Credential Exposure in Netflix Lemur Destinations API

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 19, 2026·6 min read·38 visits

Executive Summary (TL;DR)

Low-privilege users can query Lemur's destination API endpoints to harvest plaintext SFTP passwords and SSH key passphrases due to missing endpoint authorization and lack of output serialization filters.

An authorization bypass and information disclosure vulnerability in Netflix Lemur before version 1.9.3 allows authenticated, low-privilege users to retrieve raw destination configurations, exposing plaintext credentials such as SFTP passwords and private key passphrases.

Vulnerability Overview

Netflix Lemur is an orchestration engine designed to manage the creation, renewal, and deployment of TLS certificates. To facilitate certificate installation, Lemur relies on destination plugins that automatically push certificates and private keys to target hosting systems. These destinations typically include load balancers, web servers, and remote file systems connected via secure channels.

Prior to version 1.9.3, Lemur suffered from an authorization and sanitization flaw within its destinations resource. The system enforced administrative access controls on state-changing operations, such as creating, updating, or deleting a destination. However, the queries retrieving destination details relied solely on basic user authentication. This lack of restriction meant that any user with a standard, read-only session could access the registration configurations of external deployment endpoints.

Additionally, the serialization logic used to build API responses did not filter the properties passed to clients. For plugins that store credentials locally to authenticate to destination systems, such as the SFTP destination plugin, these configuration parameters were exposed in plaintext. Consequently, low-privilege actors could extract target host passwords and SSH key passphrases from standard API responses.

Root Cause Analysis

The vulnerability is a combination of Missing Authorization (CWE-862) and Cleartext Storage of Sensitive Information (CWE-312). The access control gap lies in lemur/destinations/views.py. While POST, PUT, and DELETE handlers for the destinations resource were restricted using decorators that require admin permissions, the GET handlers lacked this enforcement. Standard authenticated sessions, such as those assigned to read-only auditors, were allowed to query the endpoints directly.

The endpoints affected by this authorization gap are:

  • GET /api/1/destinations (handled by DestinationsList.get)
  • GET /api/1/destinations/<destination_id> (handled by Destinations.get)
  • GET /api/1/certificates/<certificate_id>/destinations (handled by CertificateDestinations.get)

The serialization gap resides in lemur/destinations/schemas.py, where Lemur utilizes Marshmallow schemas to validate and serialize data. The DestinationOutputSchema was designed to serialize the data models directly. When building the output, the post-dump hook fill_object would copy options into the pluginOptions dictionary without performing inspection or redaction. If a plugin registered an authentication credential within its options, that credential was passed directly into the serialized JSON payload.

Finally, the SFTP destination plugin (SFTPDestinationPlugin in lemur/plugins/lemur_sftp/plugin.py) defined option parameters such as password and privateKeyPass without marking them as sensitive. Because the core serialization architecture had no mechanism to recognize these fields as confidential, it delivered the plaintext credentials to any authorized API reader.

Code-Level Analysis and Patch Review

To resolve the vulnerability, the development team modified both the endpoint access controls and the serialization schemas. In lemur/destinations/views.py, the @admin_permission.require(http_exception=403) decorator was added to all GET methods. This establishes a uniform permission model, ensuring that only administrators can read the destination definitions.

In lemur/destinations/schemas.py, a redaction block was added to the fill_object post-dump processor of the DestinationOutputSchema. This block iterates over the options and sets any option marked as sensitive to None prior to output generation.

# lemur/destinations/schemas.py
class DestinationOutputSchema(LemurOutputSchema):
    @post_dump
    def fill_object(self, data):
        if data:
            # Fixed logic: Redact option values marked as sensitive before serialization
            for option in data.get("options", []):
                if option.get("sensitive"):
                    option["value"] = None
            data["plugin"]["pluginOptions"] = data["options"]
            for option in data["plugin"]["pluginOptions"]:
                if "export-plugin" in option["type"]:
                    pass

The SFTP destination plugin options were also updated to specify the sensitive property:

# lemur/plugins/lemur_sftp/plugin.py
class SFTPDestinationPlugin(DestinationPlugin):
    options = [
        # ... other options ...
        {
            "name": "password",
            "type": "str",
            "required": False,
            "helpMessage": "The SFTP password (optional when the private key is used).",
            "default": None,
            "sensitive": True,
        },
        {
            "name": "privateKeyPass",
            "type": "str",
            "required": False,
            "helpMessage": "The password for the encrypted RSA private key (optional).",
            "default": None,
            "sensitive": True,
        },
    ]

Exploitation Methodology

Exploitation of this vulnerability requires an authenticated session with low-privilege access, such as a read-only role or a compromise of a standard API key. The attacker can identify the network coordinates of internal deployment destinations by performing a standard query against the destination API endpoints. Because the GET handlers did not require administrative privileges, the server processed the request and executed the vulnerable serialization schema.

An attacker would perform the following steps:

  1. Authenticate to the Lemur instance as a standard user.
  2. Query the destinations list:
    GET /api/1/destinations HTTP/1.1
    Host: lemur.internal
    Authorization: Bearer <low_privilege_token>
  3. Extract sensitive parameters from the JSON response payload.

An example of the vulnerable JSON output structure showing the exposed credentials before the patch was applied:

{
  "id": 12,
  "label": "prod-sftp-server",
  "options": [
    {"name": "host", "type": "str", "value": "10.10.42.15"},
    {"name": "user", "type": "str", "value": "cert-deployer"},
    {"name": "password", "type": "str", "value": "UnprotectedPassword123", "sensitive": true}
  ]
}

Impact Assessment

The impact of this vulnerability is significant because Lemur is designed to operate inside a secure network boundary to manage sensitive cryptographic keys. By obtaining the credentials stored within the destination options, an attacker can bypass Lemur's access controls completely. The attacker can use the harvested passwords or key passphrases to establish out-of-band connections directly to the deployment endpoints.

If the deployment endpoints are SFTP servers, the attacker could read or modify sensitive files, including private keys and certificates stored outside Lemur's control. In environments where the same credentials are reused across multiple administrative interfaces, the impact could extend to broader network lateral movement.

The CVSS v3.1 score is calculated as 7.7. The Scope metric is set to Changed (S:C) because compromising the destination credentials allows the attacker to access systems outside of Lemur's application boundaries. Confidentiality is rated High (C:H) due to the direct extraction of raw authentication parameters.

Remediation and Mitigation

The primary remediation strategy is upgrading Netflix Lemur to version 1.9.3 or higher. This update restricts all GET operations on the destinations endpoint to administrators and implements the schema redaction logic. If an immediate upgrade is not possible, security teams must deploy network-level mitigations or policy changes.

Workarounds include implementing strict URL routing rules at the reverse proxy or Web Application Firewall (WAF) layer. Organizations should block GET requests to /api/1/destinations and /api/1/certificates/*/destinations originating from any user agent or IP address that does not belong to a designated administrative administrator.

Additionally, organizations using custom or proprietary destination plugins must audit their codebase. Any custom options containing API tokens, passwords, or cryptographic key passphrases must have the "sensitive": True property added to their configuration schemas to ensure they are handled properly by the new serialization redaction engine.

Official Patches

NetflixGit repository fix commit
NetflixOfficial GitHub Security Advisory

Fix Analysis (1)

Technical Appendix

CVSS Score
7.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

Affected Systems

Netflix Lemur

Affected Versions Detail

Product
Affected Versions
Fixed Version
Lemur
Netflix
< 1.9.31.9.3
AttributeDetail
CWE IDCWE-862, CWE-312, CWE-200
Attack VectorNetwork
CVSS v3.1 Score7.7
Exploit StatusPoC Available
CISA KEV StatusNo
ScopeChanged

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-862
Missing Authorization

Missing Authorization on destination API read endpoints coupled with Cleartext Storage and inadequate output serialization sanitization.

Vulnerability Timeline

Remediation patch commit pushed to Netflix Lemur repository
2026-06-29
Official security advisory GHSA-6c8m-q6g9-vrw3 published and version 1.9.3 released
2026-08-18
CVE-2026-71307 registered in NVD
2026-08-18

References & Sources

  • [1]Fix Plaintext Credential Exposure Commit
  • [2]GitHub Security Advisory GHSA-6c8m-q6g9-vrw3
  • [3]NVD - CVE-2026-71307

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•44 minutes ago•CVE-2026-114132
6.3

CVE-2026-114132: Case-Sensitivity Route Rule Bypass in Nuxt Framework

Nuxt versions prior to 4.6.2 suffer from a route rule bypass vulnerability caused by an architectural mismatch in case-sensitivity handling between the Nitro server runtime and the Vue page router. An unauthenticated remote attacker can bypass server-enforced route directives—such as redirects, security headers, and SSR controls—by altering character casing in HTTP request paths.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 2 hours ago•GHSA-78G4-XQWV-Q3G8
7.5

GHSA-78G4-XQWV-Q3G8: Heap-Based Buffer Overflow in Pillow (libopenjp2)

A heap-based buffer overflow vulnerability in Pillow PyPI binary wheels (versions 11.1.0 to 12.x) allows remote code execution or application crash via crafted JPEG 2000 files processed by the bundled libopenjp2 library.

Alon Barad
Alon Barad
14 views•4 min read
•about 3 hours ago•CVE-2026-109618
9.8

CVE-2026-109618: Remote Code Execution in PHP Core via Out-of-Memory longjmp() Uninitialized Memory Access

CVE-2026-109618 (dubbed PHP2Shell) is a critical vulnerability in the PHP engine core resulting from improper out-of-memory exception handling via longjmp(). When request allocation fails mid-processing, non-local control flow bypasses cleanup procedures, leaving memory structures uninitialized or in a use-after-free state during request shutdown.

Amit Schendel
Amit Schendel
10 views•5 min read
•about 3 hours ago•CVE-2026-109619
9.2

CVE-2026-109619: Remote Code Execution in PHP Core via Stale Global State Memory Corruption (PHP2Shell)

CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.

Alon Barad
Alon Barad
12 views•6 min read
•about 3 hours ago•CVE-2026-113721
4.5

CVE-2026-113721: Unsafe Link Resolution in virtualenv File Generation

In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.

Amit Schendel
Amit Schendel
4 views•5 min read
•10 days ago•CVE-2026-87697
8.8

CVE-2026-87697: Untrusted Deserialization in .NET PresentationCore Clipboard Handling

A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.

Alon Barad
Alon Barad
31 views•5 min read