<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Tue, 29 Sep 2026 21:36:21 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-71303 — Lemur: Incomplete fix for CVE-2026-55166 -- ACME authority update endpoint allows non-admin to replace `acme_url` with…</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-71303</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Netflix lemur&lt;/p&gt;
&lt;p&gt;Lemur manages TLS certificate creation. Prior to 1.9.3, _validate_acme_url enforced ACME_DIRECTORY_HOST_ALLOWLIST when an authority was created, but PUT /api/1/authorities/ passed options to lemur/authorities/service.py without applying the same check. A user holding an authority role could replace the stored acme_url with an internal service or instance-metadata URL such as 169.254.169.254. The next issuance operation loaded that value and passed it to ClientV2.get_directory, causing an outbound request from the Lemur backend. This bypassed the creation-time mitigation for CVE-2026-55166 and could expose internal services or cloud metadata. The fix revalidates acme_url whenever authority options are updated. This issue is fixed in version 1.9.3.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Netflix lemur&lt;/p&gt;
&lt;p&gt;Lemur manages TLS certificate creation. Prior to 1.9.3, _validate_acme_url enforced ACME_DIRECTORY_HOST_ALLOWLIST when an authority was created, but PUT /api/1/authorities/ passed options to lemur/authorities/service.py without applying the same check. A user holding an authority role could replace the stored acme_url with an internal service or instance-metadata URL such as 169.254.169.254. The next issuance operation loaded that value and passed it to ClientV2.get_directory, causing an outbound request from the Lemur backend. This bypassed the creation-time mitigation for CVE-2026-55166 and could expose internal services or cloud metadata. The fix revalidates acme_url whenever authority options are updated. This issue is fixed in version 1.9.3.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-71303</guid>
    </item>
    <item>
      <title>PYSEC-2026-3679 — Lemur: Incomplete fix for GHSA-v2wp-frmc-5q3v -- ACME authority update endpoint allows non-admin to replace `acme_url`…</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3679</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: lemur&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The fix for GHSA-v2wp-frmc-5q3v added `_validate_acme_url()` to reject `acme_url` values not in `ACME_DIRECTORY_HOST_ALLOWLIST`, but the validation is only called at **authority creation time** (POST). The authority **update** endpoint (`PUT /api/1/authorities/&amp;lt;id&amp;gt;`) accepts and stores arbitrary `options` -- including a modified `acme_url` -- without invoking the allowlist check. Any user with an authority role (granted by an admin to allow issuing certificates via that authority) can therefore overwrite the stored `acme_url` with an internal IP or IMDS endpoint. The next certificate issuance via that authority causes Lemur&amp;#39;s backend to fetch the attacker-controlled URL, achieving SSRF.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;**Where the fix lives (POST path -- protected):**&lt;/p&gt;
&lt;p&gt;`lemur/plugins/lemur_acme/plugin.py` lines 333-337 (ACMEIssuerPlugin.create_authority):
```python
for option in plugin_options:
    if option.get(&amp;#34;name&amp;#34;) == &amp;#34;certificate&amp;#34;:
        acme_root = option.get(&amp;#34;value&amp;#34;)
    if option.get(&amp;#34;name&amp;#34;) == &amp;#34;acme_url&amp;#34;:
        _validate_acme_url(option.get(&amp;#34;value&amp;#34;, &amp;#34;&amp;#34;))   # allowlist enforced
```&lt;/p&gt;
&lt;p&gt;`_validate_acme_url` at line 35:
```python
def _validate_acme_url(url):
    &amp;#34;&amp;#34;&amp;#34;Reject acme_url values that are not in the configured allowlist.&lt;/p&gt;
&lt;p&gt;Called at authority creation time only -- existing authorities in the DB
    were already trusted when they were created and are not re-validated.
    &amp;#34;&amp;#34;&amp;#34;
    allowed_hosts = current_app.config.get(
        &amp;#34;ACME_DIRECTORY_HOST_ALLOWLIST&amp;#34;,…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: lemur&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;The fix for GHSA-v2wp-frmc-5q3v added `_validate_acme_url()` to reject `acme_url` values not in `ACME_DIRECTORY_HOST_ALLOWLIST`, but the validation is only called at **authority creation time** (POST). The authority **update** endpoint (`PUT /api/1/authorities/&amp;lt;id&amp;gt;`) accepts and stores arbitrary `options` -- including a modified `acme_url` -- without invoking the allowlist check. Any user with an authority role (granted by an admin to allow issuing certificates via that authority) can therefore overwrite the stored `acme_url` with an internal IP or IMDS endpoint. The next certificate issuance via that authority causes Lemur&amp;#39;s backend to fetch the attacker-controlled URL, achieving SSRF.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;**Where the fix lives (POST path -- protected):**&lt;/p&gt;
&lt;p&gt;`lemur/plugins/lemur_acme/plugin.py` lines 333-337 (ACMEIssuerPlugin.create_authority):
```python
for option in plugin_options:
    if option.get(&amp;#34;name&amp;#34;) == &amp;#34;certificate&amp;#34;:
        acme_root = option.get(&amp;#34;value&amp;#34;)
    if option.get(&amp;#34;name&amp;#34;) == &amp;#34;acme_url&amp;#34;:
        _validate_acme_url(option.get(&amp;#34;value&amp;#34;, &amp;#34;&amp;#34;))   # allowlist enforced
```&lt;/p&gt;
&lt;p&gt;`_validate_acme_url` at line 35:
```python
def _validate_acme_url(url):
    &amp;#34;&amp;#34;&amp;#34;Reject acme_url values that are not in the configured allowlist.&lt;/p&gt;
&lt;p&gt;Called at authority creation time only -- existing authorities in the DB
    were already trusted when they were created and are not re-validated.
    &amp;#34;&amp;#34;&amp;#34;
    allowed_hosts = current_app.config.get(
        &amp;#34;ACME_DIRECTORY_HOST_ALLOWLIST&amp;#34;,…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3679</guid>
    </item>
  </channel>
</rss>
