<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: HOL (Hashgraph Online)</title>
    <description>The latest articles on DEV Community by HOL (Hashgraph Online) (hol).</description>
    <link>https://dev.to/hol</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12608%2Fcbc4252d-042e-4203-bcc5-f1a27d5b24e0.png</url>
      <title>DEV Community: HOL (Hashgraph Online)</title>
      <link>https://dev.to/hol</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hol"/>
    <language>en</language>
    <item>
      <title>CVE-2026-77774: Magento still needs APSB26-138 after the StyleSmuggler hotfix</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Tue, 08 Sep 2026 19:43:24 +0000</pubDate>
      <link>https://dev.to/hol/cve-2026-77774-magento-still-needs-apsb26-138-after-the-stylesmuggler-hotfix-3n93</link>
      <guid>https://dev.to/hol/cve-2026-77774-magento-still-needs-apsb26-138-after-the-stylesmuggler-hotfix-3n93</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-77774-adobe-commerce-magento-apsb26-138-authz" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you applied Adobe's StyleSmuggler hotfix yesterday and stopped there, Adobe Commerce and Magento Open Source still carry a separate September patch train.&lt;/strong&gt; APSB26-138 (Priority 2, published September 8, 2026) closes eight Critical issues, including unauthenticated authorization bypasses and stored XSS that can escalate privileges. Adobe states it is not aware of exploitation for these issues. That is not the same as "the StyleSmuggler hotfix covered it."&lt;/p&gt;

&lt;p&gt;The operator trap is explicit in Adobe's release notes: the APSB26-146 hotfix for &lt;a href="https://hol.org/blog/cve-2026-75650-adobe-commerce-stylesmuggler-template-rce?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-77774-adobe-commerce-magento-apsb26-138-authz" rel="noopener noreferrer"&gt;CVE-2026-75650&lt;/a&gt; is &lt;em&gt;not&lt;/em&gt; bundled into the September Isolated patch. Apply the hotfix first, then the September Isolated files (or the matching cloud-patches update). Merchants who only rotated keys and closed GraphQL styles still need APSB26-138.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke
&lt;/h2&gt;

&lt;p&gt;Adobe's bulletin lists eight CVEs. The ones that matter first for internet-facing stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-77774&lt;/strong&gt; - Incorrect Authorization, Critical (CVSS 8.6). No authentication required. Security feature bypass with unauthorized read access. Scope changed.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-76202&lt;/strong&gt; - Incorrect Authorization, Critical (CVSS 8.2). No authentication required. Privilege escalation with high confidentiality impact.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-76200&lt;/strong&gt; and &lt;strong&gt;CVE-2026-76201&lt;/strong&gt; - Stored XSS, Critical (CVSS 9.3 each). No authentication required, but user interaction is required. Privilege escalation with changed scope.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-77111&lt;/strong&gt; - Incorrect Authorization, Critical (CVSS 8.7). High privileges required. Write-side security feature bypass.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-77110&lt;/strong&gt; - Path traversal, Critical (CVSS 7.6). High privileges required. Limited security feature bypass outside intended paths.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-77109&lt;/strong&gt; and &lt;strong&gt;CVE-2026-77108&lt;/strong&gt; - Incorrect Authorization, Critical. Marked B2B in the bulletin. Privilege escalation on Adobe Commerce B2B lines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike StyleSmuggler, Adobe rates this bulletin Priority 2 and reports no known in-the-wild use. The damage modes are authz bypass and XSS-assisted privilege escalation, not unauthenticated template RCE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Stores that already installed the September 2026 security packages (&lt;code&gt;*-2026-sep&lt;/code&gt;) or the matching September Isolated patch files for every installed component, &lt;em&gt;and&lt;/em&gt; still have the APSB26-146 StyleSmuggler hotfix applied.&lt;/li&gt;
&lt;li&gt;  Magento Open Source without Adobe Commerce B2B: CVE-2026-77109 and CVE-2026-77108 are B2B-scoped in APSB26-138.&lt;/li&gt;
&lt;li&gt;  Adobe Campaign Classic OS command injection is a different product and bulletin (&lt;a href="https://helpx.adobe.com/security/products/campaign/apsb26-142.html" rel="noopener noreferrer"&gt;APSB26-142&lt;/a&gt; / CVE-2026-82004), not this Magento train.&lt;/li&gt;
&lt;li&gt;  High-privilege-only path traversal (CVE-2026-77110) and write bypass (CVE-2026-77111) are not unauthenticated storefront bugs; they still need the same September train.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One concrete check
&lt;/h2&gt;

&lt;p&gt;From the Commerce project root, after the July 2026 Isolated patch that ships Commerce Version Tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php vendor/bin/patch-status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read &lt;code&gt;applied_patches&lt;/code&gt;, &lt;code&gt;missing_patches&lt;/code&gt;, and per-CVE &lt;code&gt;vulnerability_status&lt;/code&gt;. You want PROTECTED for CVE-2026-77774 (and the siblings below), not only for CVE-2026-75650. If CVT is missing, &lt;code&gt;php vendor/bin/patch-status --version&lt;/code&gt; fails until the July Isolated file is present.&lt;/p&gt;

&lt;p&gt;Cloud merchants who cannot run CVT can confirm a specific Isolated file with Quality Patches Tool, for example grepping the September CE file id for their line after it is applied.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Upgrade Adobe Commerce / Magento Open Source to the September 2026 security builds, or apply the September Isolated patch files for your exact release line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Adobe Commerce: &lt;code&gt;2.4.9-2026-sep&lt;/code&gt;, &lt;code&gt;2.4.8-2026-sep&lt;/code&gt;, &lt;code&gt;2.4.7-2026-sep&lt;/code&gt;, &lt;code&gt;2.4.6-2026-sep&lt;/code&gt;, &lt;code&gt;2.4.5-2026-sep&lt;/code&gt;, &lt;code&gt;2.4.4-2026-sep&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Magento Open Source: &lt;code&gt;2.4.9-2026-sep&lt;/code&gt;, &lt;code&gt;2.4.8-2026-sep&lt;/code&gt;, &lt;code&gt;2.4.7-2026-sep&lt;/code&gt; (Open Source Isolated downloads start at 2.4.7+)&lt;/li&gt;
&lt;li&gt;  Adobe Commerce B2B: matching &lt;code&gt;*-2026-sep&lt;/code&gt; lines in APSB26-138&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operational order from Adobe's FAQ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Apply APSB26-146 / VULN-39341 StyleSmuggler hotfix if it is not already on the box (actively exploited; not included in the September Isolated zip).&lt;/li&gt;
&lt;li&gt; Confirm August 2026 Isolated patches for your line are already applied. September builds on August.&lt;/li&gt;
&lt;li&gt; Apply the September Isolated component files in CE → EE → B2B order when those components are installed, or take the cloud-patches path if Magento Cloud Patches already carries the fix.&lt;/li&gt;
&lt;li&gt; Re-run &lt;code&gt;php vendor/bin/patch-status&lt;/code&gt; and confirm the September CVE set shows PROTECTED.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Adobe is shipping these September fixes as Isolated patch files only (no Composer security packages for this drop). That is intentional for speed, but it means you cannot treat "composer update finished" as proof for APSB26-138.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not another StyleSmuggler-class unauthenticated RCE advisory, and Adobe is not reporting active exploitation for APSB26-138. It is also not optional if you already hotfixed CVE-2026-75650: the September authz and XSS cluster is a second train.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://helpx.adobe.com/security/products/magento/apsb26-138.html" rel="noopener noreferrer"&gt;Adobe Security Bulletin APSB26-138&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://experienceleague.adobe.com/en/docs/experience-cloud-kcs/kbarticles/ka-44020" rel="noopener noreferrer"&gt;September 2026 Isolated patch release notes (KA-44020)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://helpx.adobe.com/security/products/magento/apsb26-146.html" rel="noopener noreferrer"&gt;Adobe Security Bulletin APSB26-146 (StyleSmuggler)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  HOL Guard evidence packs: &lt;a href="https://hol.org/guard/security/cves/CVE-2026-77774?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-77774-adobe-commerce-magento-apsb26-138-authz" rel="noopener noreferrer"&gt;CVE-2026-77774&lt;/a&gt;, &lt;a href="https://hol.org/guard/security/cves/CVE-2026-76202?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-77774-adobe-commerce-magento-apsb26-138-authz" rel="noopener noreferrer"&gt;CVE-2026-76202&lt;/a&gt;, &lt;a href="https://hol.org/guard/security/cves/CVE-2026-76200?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-77774-adobe-commerce-magento-apsb26-138-authz" rel="noopener noreferrer"&gt;CVE-2026-76200&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>adobecommerce</category>
      <category>magento</category>
      <category>authorization</category>
    </item>
    <item>
      <title>CVE-2026-75021: fastify-cli debug-host bind can expose Inspector RCE</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Tue, 08 Sep 2026 14:39:27 +0000</pubDate>
      <link>https://dev.to/hol/cve-2026-75021-fastify-cli-debug-host-bind-can-expose-inspector-rce-4fll</link>
      <guid>https://dev.to/hol/cve-2026-75021-fastify-cli-debug-host-bind-can-expose-inspector-rce-4fll</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-75021-fastify-cli-inspector-debug-host-rce" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You asked the Inspector to stay on loopback. Operator precedence put it on every interface instead.&lt;/strong&gt; &lt;code&gt;fastify-cli&lt;/code&gt; 1.5.0 through 8.0.0 starts Node's Inspector when debug mode is on, but the host selection expression is grouped wrong. Because &lt;code&gt;||&lt;/code&gt; binds tighter than &lt;code&gt;?:&lt;/code&gt;, any truthy &lt;code&gt;--debug-host&lt;/code&gt; (including &lt;code&gt;127.0.0.1&lt;/code&gt;) collapses into the Docker/Kubernetes branch and binds &lt;code&gt;0.0.0.0&lt;/code&gt;. The Inspector is an unauthenticated code-eval interface. If that port is reachable, a remote party can attach Chrome DevTools Protocol and run OS commands as the Fastify process.&lt;/p&gt;

&lt;p&gt;Upgrade to &lt;code&gt;fastify-cli&lt;/code&gt; 8.0.1. Debug mode is off by default. This is not a Fastify framework core bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;GitHub advisory &lt;a href="https://github.com/fastify/fastify-cli/security/advisories/GHSA-88v4-3ph7-r88m" rel="noopener noreferrer"&gt;GHSA-88v4-3ph7-r88m&lt;/a&gt; / CVE-2026-75021 rates this High CVSS 3.1 &lt;code&gt;AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H&lt;/code&gt;. Complexity is high: debug mode must be on, an explicit debug host must be set, and the Inspector port (default &lt;code&gt;9320&lt;/code&gt;) must be reachable.&lt;/p&gt;

&lt;p&gt;In affected &lt;code&gt;start.js&lt;/code&gt; (shown from 8.0.0) the host argument is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:inspector&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;debugPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;debugHost&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nf"&gt;isDocker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nf"&gt;isKubernetes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;listenAddressDocker&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because &lt;code&gt;||&lt;/code&gt; binds tighter than &lt;code&gt;?:&lt;/code&gt;, that parses as &lt;code&gt;(opts.debugHost || isDocker() || isKubernetes()) ? '0.0.0.0' : undefined&lt;/code&gt; (where &lt;code&gt;listenAddressDocker&lt;/code&gt; is &lt;code&gt;0.0.0.0&lt;/code&gt;). Any truthy &lt;code&gt;opts.debugHost&lt;/code&gt; therefore selects the Docker/Kubernetes branch.&lt;/p&gt;

&lt;p&gt;The README documents that Docker/Kubernetes default the Inspector host to &lt;code&gt;0.0.0.0&lt;/code&gt;. Operators pass &lt;code&gt;--debug-host 127.0.0.1&lt;/code&gt; or &lt;code&gt;FASTIFY_DEBUG_HOST=127.0.0.1&lt;/code&gt; to tighten that. Broken builds ignore the intended loopback and still bind every interface.&lt;/p&gt;

&lt;p&gt;8.0.1 fixes the grouping with nullish coalescing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:inspector&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;debugPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;debugHost&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isDocker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nf"&gt;isKubernetes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;listenAddressDocker&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Affected: &lt;code&gt;&amp;gt;=1.5.0 &amp;lt;8.0.1&lt;/code&gt;. Fixed: 8.0.1 (npm updated 2026-09-07). CVE published 2026-09-08. GHSA published 2026-09-07.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Processes that never enable CLI debug (&lt;code&gt;-d&lt;/code&gt; / &lt;code&gt;--debug&lt;/code&gt; / &lt;code&gt;FASTIFY_DEBUG&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  Apps that do not use &lt;code&gt;fastify-cli&lt;/code&gt; &lt;code&gt;start&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Installations already on &lt;code&gt;fastify-cli&lt;/code&gt; 8.0.1 or newer.&lt;/li&gt;
&lt;li&gt;  The Fastify framework package itself (this is CLI host selection only).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to check
&lt;/h2&gt;

&lt;p&gt;From the project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;ls &lt;/span&gt;fastify-cli
npx fastify version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If debug is enabled, confirm what the Inspector bound:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-lntp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;9320
&lt;span class="c"&gt;# or: lsof -iTCP:9320 -sTCP:LISTEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you passed &lt;code&gt;--debug-host 127.0.0.1&lt;/code&gt; (or set &lt;code&gt;FASTIFY_DEBUG_HOST=127.0.0.1&lt;/code&gt;) but still see &lt;code&gt;0.0.0.0:9320&lt;/code&gt;, the install is broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Upgrade the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;fastify-cli@8.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Until you can patch: do not enable &lt;code&gt;--debug&lt;/code&gt; on remotely reachable hosts, and firewall the Inspector port.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not an unauthenticated RCE on a default Fastify production listen. Debug mode must be turned on, and the widened bind only shows up when an explicit debug host is supplied. It is not a vuln in &lt;code&gt;fastify&lt;/code&gt; core request handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://github.com/fastify/fastify-cli/security/advisories/GHSA-88v4-3ph7-r88m" rel="noopener noreferrer"&gt;GHSA-88v4-3ph7-r88m&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://hol.org/guard/security/cves/CVE-2026-75021-fastify-cli-vulnerable-to-remote-code-execution?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-75021-fastify-cli-inspector-debug-host-rce" rel="noopener noreferrer"&gt;HOL Guard evidence pack for CVE-2026-75021&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>fastifycli</category>
      <category>node</category>
      <category>inspector</category>
    </item>
    <item>
      <title>BREAKING: CVE-2026-75650 lets unauth callers run code on Adobe Commerce and Magento</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Mon, 07 Sep 2026 21:01:28 +0000</pubDate>
      <link>https://dev.to/hol/breaking-cve-2026-75650-lets-unauth-callers-run-code-on-adobe-commerce-and-magento-53ao</link>
      <guid>https://dev.to/hol/breaking-cve-2026-75650-lets-unauth-callers-run-code-on-adobe-commerce-and-magento-53ao</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-75650-adobe-commerce-stylesmuggler-template-rce" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you run Adobe Commerce or Magento Open Source with GraphQL reachable, an unauthenticated caller can smuggle PHP into Magento's template engine through &lt;code&gt;styles&lt;/code&gt; properties and get that code executed when Magento renders its own "Payment Transaction Failed Reminder" email.&lt;/strong&gt; Adobe published APSB26-146 today (Priority 1) for CVE-2026-75650, scored CVSS 10.0 (AV:N/AC:L/PR:N/UI:N/S:C), and states the bug is already exploited in the wild. The fix is the VULN-39341 composer hotfix, not a full minor release. Sansec tracked the same chain as StyleSmuggler with confirmed exploitation since September 4, three days before the Adobe bulletin.&lt;/p&gt;

&lt;p&gt;This is the operator write-up. The HOL Guard evidence pack for &lt;a href="https://hol.org/guard/security/cves/CVE-2026-75650?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-75650-adobe-commerce-stylesmuggler-template-rce" rel="noopener noreferrer"&gt;CVE-2026-75650&lt;/a&gt; is the source record.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;Adobe's CVE text is short: improper neutralization of special elements used in a template engine (CWE-1336) that can yield arbitrary code execution in the context of the current user, without user interaction, with changed scope. The bulletin lists Adobe Commerce 2.4.4-2026-aug through 2.4.9-2026-aug and earlier on those trains, Magento Open Source 2.4.6-2026-aug through 2.4.9-2026-aug and earlier, and Adobe Commerce B2B 1.3.3-2026-aug through 1.5.3-2026-aug and earlier. Authentication required to exploit: &lt;strong&gt;No&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sansec's public StyleSmuggler write-up fills in the mechanism Adobe's advisory does not spell out. Attackers plant malicious PHP into a file Magento itself writes (for example a payment-failure report) by stuffing hostile content into GraphQL &lt;code&gt;styles&lt;/code&gt; properties that skip existing sanitization. A second stage deliberately triggers Magento's standard Payment Transaction Failed Reminder email. The poisoned code runs while Magento renders that message server-side, so nobody has to open or receive the email. Sansec reproduced the full unauthenticated chain on clean Magento Open Source 2.4.7, 2.4.8, and 2.4.9, and reported a victim on 2.4.6-p15 with July and August 2026 security patches applied and &lt;code&gt;security:patch-status&lt;/code&gt; clean. Patch train currency was not a defense before VULN-39341.&lt;/p&gt;

&lt;p&gt;Post-exploitation payloads Sansec published include Rust implants that rename themselves across &lt;code&gt;[kworker/...]&lt;/code&gt;, &lt;code&gt;fc-cache&lt;/code&gt;, and &lt;code&gt;chronyd&lt;/code&gt;, plus PHP droppers and web shells under &lt;code&gt;pub/media&lt;/code&gt;. A second, unrelated actor was already dropping PHP webshells on September 7. Treat any store that was internet-facing between September 4 and hotfix application as compromise-suspect until scanned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Stores that are not Adobe Commerce / Magento Open Source (or Commerce B2B). WooCommerce, Shopify, BigCommerce, and custom storefronts are outside this CVE.&lt;/li&gt;
&lt;li&gt;  Magento 1.x / Adobe Commerce 1.x. Affected trains in APSB26-146 are the 2.4.x (and B2B 1.3–1.5) lines listed above.&lt;/li&gt;
&lt;li&gt;  Merchants who already applied Adobe's VULN-39341 hotfix &lt;em&gt;and&lt;/em&gt; completed the encryption-key plus credential rotation checklist in the Experience League article. Hotfix alone closes the hole; rotation is required for full remediation if secrets may have been read.&lt;/li&gt;
&lt;li&gt;  Headless frontends are not a free pass. Sansec notes Redis/DB session moves and classic vs Hyvä storefront choices do not stop the GraphQL/template path. If GraphQL is reachable on an affected Magento backend, you are in scope until patched.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not a browser XSS bug and it is not "only" email phishing. It is unauthenticated remote code execution on the Magento/Adobe Commerce application process via template injection, confirmed by Adobe as exploited in the wild. It is also not fixed by upgrading to 2.4.9 alone: Adobe's affected table includes 2.4.9-2026-aug and earlier until the hotfix is applied.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Lead with Adobe's Priority 1 path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Download &lt;code&gt;VULN-39341-composer-patches.zip&lt;/code&gt; from &lt;a href="https://repo.magento.com/patch/VULN-39341-composer-patches.zip" rel="noopener noreferrer"&gt;repo.magento.com&lt;/a&gt; (Adobe Commerce credentials required).&lt;/li&gt;
&lt;li&gt; Unzip and apply the composer patch per Adobe's "How to apply a composer patch provided by Adobe" KB. The patch file name in Adobe's example is &lt;code&gt;VULN-39341_Hotfix_COMPOSER.patch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Adobe tested the hotfix on the 2026-aug builds of Commerce 2.4.4–2.4.9, Magento Open Source 2.4.6–2.4.9, and B2B 1.3.3–1.5.3. Older builds on those branches are still listed as affected; Adobe says the patch is unverified there.&lt;/li&gt;
&lt;li&gt; Rotate credentials after the patch. Adobe's Experience League article is explicit: rotating the encryption key alone does not invalidate anything an attacker already read. Rotate admin passwords, REST/SOAP/GraphQL integration tokens, OAuth client secrets, payment gateway API credentials at the provider, database credentials, SSH/deploy keys, and third-party extension API keys at their source.&lt;/li&gt;
&lt;li&gt; Scan for compromise before you declare the store clean. Patching does not remove implants dropped between September 4 and hotfix day.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Operator check (Adobe Commerce on Cloud / Quality Patches Tool path Adobe documents):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# After installing the Quality Patches Tool and placing the hotfix:&lt;/span&gt;
vendor/bin/magento-patches &lt;span class="nt"&gt;-n&lt;/span&gt; status | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"39341&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;Status"&lt;/span&gt;
&lt;span class="c"&gt;# Expect VULN-39341 / …/m2-hotfixes/VULN-39341_Hotfix_COMPOSER.patch → Applied&lt;/span&gt;

Host IOCs Sansec published &lt;span class="k"&gt;for &lt;/span&gt;StyleSmuggler implants &lt;span class="o"&gt;(&lt;/span&gt;run on the Magento host&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you cannot patch immediately and you do not need GraphQL for a headless or PWA storefront, Sansec's interim guidance was to disable GraphQL until the official fix landed. Prefer the Adobe hotfix now that APSB26-146 exists; do not treat GraphQL disable as a substitute for VULN-39341 plus credential rotation and a malware scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  CISA KEV (added 2026-09-08)
&lt;/h2&gt;

&lt;p&gt;CISA added CVE-2026-75650 to the Known Exploited Vulnerabilities catalog on &lt;strong&gt;2026-09-08&lt;/strong&gt; (catalog version 2026.09.08). Federal and BOD 26-04 covered operators have until &lt;strong&gt;2026-09-11&lt;/strong&gt;. The KEV row requires &lt;strong&gt;forensic triage&lt;/strong&gt; (Yes). Ransomware use is listed as Unknown. Adobe already called this Priority 1 and exploited in the wild on 2026-09-07; the KEV listing is the federal must-patch clock, not a new technical finding.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2026-75650" rel="noopener noreferrer"&gt;CISA KEV: CVE-2026-75650 (added 8 Sep 2026, due 11 Sep 2026, forensic triage Yes)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk" rel="noopener noreferrer"&gt;CISA BOD 26-04 Prioritizing Security Updates Based on Risk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://helpx.adobe.com/security/products/magento/apsb26-146.html" rel="noopener noreferrer"&gt;Adobe APSB26-146&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://experienceleague.adobe.com/en/docs/commerce-knowledge-base/kb/announcements/commerce-apsb26-146" rel="noopener noreferrer"&gt;Adobe Experience League: apply hotfix + rotate credentials&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://repo.magento.com/patch/VULN-39341-composer-patches.zip" rel="noopener noreferrer"&gt;VULN-39341-composer-patches.zip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://sansec.io/research/stylesmuggler" rel="noopener noreferrer"&gt;Sansec: StyleSmuggler (CVE-2026-75650)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-75650" rel="noopener noreferrer"&gt;CVE-2026-75650 record&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>adobecommerce</category>
      <category>magento</category>
      <category>rce</category>
    </item>
    <item>
      <title>BREAKING: CVE-2026-75650 is unauthenticated RCE in Adobe Commerce and Magento, already exploited</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Mon, 07 Sep 2026 21:01:25 +0000</pubDate>
      <link>https://dev.to/hol/breaking-cve-2026-75650-is-unauthenticated-rce-in-adobe-commerce-and-magento-already-exploited-4pa9</link>
      <guid>https://dev.to/hol/breaking-cve-2026-75650-is-unauthenticated-rce-in-adobe-commerce-and-magento-already-exploited-4pa9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-75650-adobe-commerce-magento-template-rce" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you run Adobe Commerce or Magento Open Source and you have not applied today's emergency hotfix, an attacker who can reach your storefront can run PHP as your web user with no login.&lt;/strong&gt; Adobe published APSB26-146 for CVE-2026-75650 on September 7, 2026, scored it 10.0 (AV:N/AC:L/PR:N/UI:N/S:C), Priority 1, and says it is already being exploited in the wild. The fix is a hotfix named VULN-39341, not a full minor release. Stores on the latest &lt;code&gt;2026-aug&lt;/code&gt; builds are still vulnerable until that patch is applied and credentials are rotated.&lt;/p&gt;

&lt;p&gt;This is the operator write-up. The HOL Guard evidence pack for &lt;a href="https://hol.org/guard/security/cves/CVE-2026-75650-adobe-commerce-improper-neutralization-of-special?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-75650-adobe-commerce-magento-template-rce" rel="noopener noreferrer"&gt;CVE-2026-75650&lt;/a&gt; is the source record.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;Adobe's CNA description is short: improper neutralization of special elements in a template engine (CWE-1336) that yields arbitrary code execution in the current user context, no user interaction required, scope changed. Sansec publicly tracked the in-the-wild chain as StyleSmuggler before the CVE landed. Their write-up matches Adobe's urgency: attackers poison Magento's template path through &lt;code&gt;styles&lt;/code&gt; properties that slip past existing safeguards, then get Magento itself to execute the payload while rendering the standard "Payment Transaction Failed Reminder" email. Nobody has to open the mail. The render path is enough, and the chain still works when delivery fails.&lt;/p&gt;

&lt;p&gt;Sansec reproduced the unauthenticated chain on clean Magento Open Source 2.4.7, 2.4.8, and 2.4.9. Their first confirmed victim was on 2.4.6-p15 with the July and August 2026 Commerce security updates already applied and &lt;code&gt;security:patch-status&lt;/code&gt; clean. Being current on APSB26-92 / APSB26-73 is not a substitute for VULN-39341. Adobe's bulletin lists Adobe Commerce through &lt;code&gt;2.4.9-2026-aug&lt;/code&gt;, Magento Open Source through the same train, and Adobe Commerce B2B through &lt;code&gt;1.5.3-2026-aug&lt;/code&gt; as affected.&lt;/p&gt;

&lt;p&gt;After code execution, Sansec has been documenting implant turnover in the same campaign window: background processes disguised as &lt;code&gt;[kworker/u:8:0]&lt;/code&gt;, then &lt;code&gt;fc-cache&lt;/code&gt;, then &lt;code&gt;chronyd&lt;/code&gt;, plus a second actor dropping a PHP web shell under &lt;code&gt;pub/media&lt;/code&gt;. Treat "we patched" as incomplete until you have also hunted those hosts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Stores that have already applied Adobe's &lt;code&gt;VULN-39341&lt;/code&gt; hotfix and completed the credential rotation Adobe documents. Confirm with the Quality Patches Tool status below rather than assuming a deploy succeeded.&lt;/li&gt;
&lt;li&gt;  Adobe Experience Manager, ColdFusion, and other Adobe products outside Commerce / Magento Open Source / Commerce B2B. APSB26-146 is a Commerce bulletin.&lt;/li&gt;
&lt;li&gt;  Frontends that only talk to Magento over a tightly locked integration and never expose a Magento/Adobe Commerce storefront, GraphQL, or payment callback surface to untrusted networks. You still want the hotfix on the Commerce host; you are not in the internet-exposed emergency class Sansec describes.&lt;/li&gt;
&lt;li&gt;  Non-Magento carts (Shopify, WooCommerce, custom storefronts with no Magento PHP runtime). The CWE-1336 sink is in Adobe Commerce / Magento's template engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not an admin-only bug, not a "click a crafted link" XSS story, and not fixed by upgrading to the newest &lt;code&gt;2.4.9-2026-aug&lt;/code&gt; tag alone. Adobe's own table says authentication required to exploit is &lt;strong&gt;No&lt;/strong&gt;, and the CVSS vector is PR:N. It is unauthenticated remote code execution via the template engine, with confirmed in-the-wild use before the hotfix existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Apply Adobe's hotfix, then rotate secrets. Do not stop at the composer patch.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Download &lt;code&gt;VULN-39341-composer-patches.zip&lt;/code&gt; from Adobe (linked from the APSB26-146 Experience League article) and apply it with Adobe's composer-patch workflow for your version line.&lt;/li&gt;
&lt;li&gt; Adobe tested the hotfix on the &lt;code&gt;2026-aug&lt;/code&gt; builds of Commerce 2.4.4–2.4.9, Magento Open Source 2.4.6–2.4.9, and Commerce B2B 1.3.3–1.5.3. Older builds in those branches are still listed as affected; the patch may work there but Adobe has not officially verified it.&lt;/li&gt;
&lt;li&gt; Put the store in maintenance mode, disable cron, rotate the Magento encryption key, then rotate every credential that key protected at the &lt;em&gt;source&lt;/em&gt;: Admin passwords, REST/SOAP/GraphQL integration tokens, OAuth client secrets, payment-gateway API keys, database credentials, SSH/deploy keys, and third-party extension API keys. Adobe is explicit that rotating the encryption key alone does not invalidate anything an attacker already read.&lt;/li&gt;
&lt;li&gt; Flush cache, re-enable cron, leave maintenance mode. Then scan for compromise before you declare victory.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Operator check that the hotfix is actually live (Cloud example from Adobe; on-prem use the same Quality Patches Tool against your local hotfix file):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# After installing Quality Patches Tool and applying VULN-39341:&lt;/span&gt;
vendor/bin/magento-patches &lt;span class="nt"&gt;-n&lt;/span&gt; status | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"39341&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;Status"&lt;/span&gt;
&lt;span class="c"&gt;# Expect an Applied row for .../m2-hotfixes/VULN-39341_Hotfix_COMPOSER.patch&lt;/span&gt;

Sanity on the running tree:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compromise hunt Sansec recommends after the three-day pre-patch window (treat hits as incident response, not as "noise"):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps &lt;span class="nt"&gt;-eo&lt;/span&gt; pid,comm,args | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s1"&gt;'kworker/u:8:0|fc-cache|chronyd'&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.cache/fontconfig/fc-cache /tmp/.fc-&lt;span class="k"&gt;*&lt;/span&gt; /tmp/.chrony-&lt;span class="k"&gt;*&lt;/span&gt; /tmp/.kw_&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null
crontab &lt;span class="nt"&gt;-l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="s2"&gt;"fc-cache&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;chronyd&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;gvfsd"&lt;/span&gt; /var/spool/cron 2&amp;gt;/dev/null
find pub/media &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.php'&lt;/span&gt; 2&amp;gt;/dev/null
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-ril&lt;/span&gt; &lt;span class="s1"&gt;'x_trace_'&lt;/span&gt; var/report/ 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sansec Shield customers still need the Adobe hotfix. WAF rules reduce exposure; they do not replace VULN-39341 or credential rotation on a store that may already have been hit between September 4 and the September 7 bulletin.&lt;/p&gt;

&lt;h2&gt;
  
  
  CISA KEV (added 2026-09-08)
&lt;/h2&gt;

&lt;p&gt;CISA added CVE-2026-75650 to the Known Exploited Vulnerabilities catalog on &lt;strong&gt;2026-09-08&lt;/strong&gt; (catalog version 2026.09.08). Federal and BOD 26-04 covered operators have until &lt;strong&gt;2026-09-11&lt;/strong&gt;. The KEV row requires &lt;strong&gt;forensic triage&lt;/strong&gt; (Yes). Ransomware use is listed as Unknown. Adobe already called this Priority 1 and exploited in the wild on 2026-09-07; the KEV listing is the federal must-patch clock, not a new technical finding.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog?field_cve=CVE-2026-75650" rel="noopener noreferrer"&gt;CISA KEV: CVE-2026-75650 (added 8 Sep 2026, due 11 Sep 2026, forensic triage Yes)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk" rel="noopener noreferrer"&gt;CISA BOD 26-04 Prioritizing Security Updates Based on Risk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://helpx.adobe.com/security/products/magento/apsb26-146.html" rel="noopener noreferrer"&gt;Adobe Security Bulletin APSB26-146&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://experienceleague.adobe.com/en/docs/commerce-knowledge-base/kb/announcements/commerce-apsb26-146" rel="noopener noreferrer"&gt;Adobe Commerce: apply hotfix for CVE-2026-75650 (VULN-39341)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-75650" rel="noopener noreferrer"&gt;CVE-2026-75650&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://sansec.io/research/stylesmuggler" rel="noopener noreferrer"&gt;Sansec: StyleSmuggler (CVE-2026-75650) under active attack&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>adobecommerce</category>
      <category>magento</category>
      <category>rce</category>
    </item>
    <item>
      <title>HOL Guard 3.0: Rust authority, extension-first controls, honest harness contracts</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Mon, 07 Sep 2026 13:24:37 +0000</pubDate>
      <link>https://dev.to/hol/hol-guard-30-puts-managed-controls-in-front-of-every-agent-tool-call-4mdb</link>
      <guid>https://dev.to/hol/hol-guard-30-puts-managed-controls-in-front-of-every-agent-tool-call-4mdb</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/hol-guard-3-0-extension-first-managed-controls" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your agent proposes &lt;code&gt;aws s3 rb s3://prod-artifacts --force&lt;/code&gt; in the same session where it was helpful five minutes ago.&lt;/strong&gt; You are mid-review. YOLO is on somewhere. The bucket name looks right enough that a tired operator might hit allow. That is the failure mode Guard 3.0 is built around: not abstract model risk, but a concrete shell string that empties production before anyone finishes reading the diff.&lt;/p&gt;

&lt;p&gt;Stable &lt;code&gt;v3.0.0&lt;/code&gt; cut on August 27, 2026. Current tip to pin is &lt;code&gt;3.0.113&lt;/code&gt; (Production/Stable). PyPI yanked &lt;code&gt;3.0.0&lt;/code&gt;, so do not put that cut tag in a lockfile, Dockerfile, or CI pin. Use a living 3.0.x tip.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke in the 2.x mental model
&lt;/h2&gt;

&lt;p&gt;Pre-3.0 Guard already intercepted harnesses, paused on new artifacts, routed approvals, and wrote receipts. Cloud stayed optional. Teams still bounced between three half-answers when something destructive showed up: which editor owned the detector, which surface owned the allow memory, and which harness hook folklore was currently true.&lt;/p&gt;

&lt;p&gt;We kept Local Extensions and Cloud policy language looking like parallel systems. Capability identity drifted from governance objects. Operators could not tell whether a deny came from a floor, a remembered approval, or a workspace rule. That ambiguity is what we killed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Extensions define what HOL Guard can protect. Guard Cloud Control Sets define how that protection is governed across people, devices, agents, environments, and time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the ADR 0011 product sentence, quoted once. Local owns capability identity and detector facts. Cloud owns Control Sets, Deployments, acknowledgement, drift, pause, rollback, and audit. ADR also rejected paywalling Local Extensions and rejected giving every Cloud rule absolute precedence in the 3.0 release. Contextual policy precedence stays unless a separately negotiated contract says otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rust owns the authority path
&lt;/h2&gt;

&lt;p&gt;Every supported harness routes PreToolUse security semantics through a bundled, version-matched Rust runtime. Supported PostToolUse output review does too. There is no Python semantic fallback on that path in 3.x. That is the hard boundary, not a performance footnote.&lt;/p&gt;

&lt;p&gt;The flow is boring on purpose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;harness tool call
  -&amp;gt; Guard hook (PreToolUse)
  -&amp;gt; version-matched Rust runtime
  -&amp;gt; CanonicalCommand parse-once
  -&amp;gt; Extension permission detectors (evidence only)
  -&amp;gt; local floors + device settings + remembered rules
  -&amp;gt; optional Cloud Control Set (managed-restrictive)
  -&amp;gt; allow | ask | deny (fail closed on authority faults)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shell text becomes a CanonicalCommand once: segments, wrappers, pipelines, redirects, security identity. Detectors emit evidence. They do not grant authority. A safe preview segment such as &lt;code&gt;git clean -ndx&lt;/code&gt; does not wash away a later destructive segment on the same line. Help and describe forms suppress only their owning rule and segment. Cloud matrices match executable and subcommand structure rather than English words like delete. Reordered global flags do not change recognition, which matters when an agent rewrites &lt;code&gt;aws s3 rb --force s3://...&lt;/code&gt; into a flag order you have not memorized.&lt;/p&gt;

&lt;p&gt;Identity, protocol, rule-digest, policy-snapshot, overload, timeout, transport, and response failures fail closed on the authority path. Soft-allow on those faults is not a degraded mode we keep. The v3.0.0 notes put the resident Rust runtime at roughly 29,000 lines shipped in-wheel. Version-matched wheels live inside the Guard package so the native binary and the Python package cannot silently drift.&lt;/p&gt;

&lt;p&gt;Python still handles authenticated transport, harness-specific rendering, approval coordination, the dashboard control plane, and bounded non-authoritative evidence. The ownership gate exists specifically to stop someone from reintroducing Python command evaluation as PreToolUse authority when Rust is inconvenient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extension-first controls and the cloud matrices
&lt;/h2&gt;

&lt;p&gt;An Extension is a stable Local capability boundary for a tool or domain. A Permission is an independently configurable capability inside that Extension. Detector rules recognize evidence for a Permission. Local settings and remembered rules may tighten protection. They cannot lower required floors or weaken managed restrictions.&lt;/p&gt;

&lt;p&gt;Authority modes are &lt;code&gt;personal-shared&lt;/code&gt;, &lt;code&gt;workspace-shared&lt;/code&gt;, and &lt;code&gt;managed-restrictive&lt;/code&gt;. The product-decision contract sets &lt;code&gt;local_registry_authoritative&lt;/code&gt; and &lt;code&gt;cloud_must_not_redefine_detector_matchers&lt;/code&gt;. Cloud targets Extension and permission identities published by the local registry. It does not become a second matcher editor.&lt;/p&gt;

&lt;p&gt;In release 3.0, managed-restrictive actions are only &lt;code&gt;disable-extension&lt;/code&gt;, &lt;code&gt;disable-permission&lt;/code&gt;, and &lt;code&gt;global-lockdown&lt;/code&gt;. Exceptions are time-bounded and cannot weaken those blocks. Composition is monotonic for non-weakenable authority. That is narrower than a full Cloud policy language, and that narrowness is intentional.&lt;/p&gt;

&lt;p&gt;Built-in cloud destructive-operation matrices at the v3.0.0 cut: 200 AWS, 100 gcloud, and 100 Azure matrix-reviewed operations. The AWS matrix ships as two non-overlapping 100-operation batches. Directory UIs may show 1 rule on a &lt;code&gt;command.cloud.*&lt;/code&gt; Extension. That column is not the operation count. The Extension wraps a matrix. Confirm on your tip with &lt;code&gt;hol-guard command extensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Required core Extensions cover filesystem, git, system, windows, and guard-self-protection. They are built-in capability boundaries over the same parser used by harness hooks, not downloadable regex bundles.&lt;/p&gt;

&lt;p&gt;External community contribs (blitcp, Noodle, Probe, repo2nb, Skill Sunset) stay off until a local-admin enable. Cloud cannot flip External on by itself.&lt;/p&gt;

&lt;p&gt;Delegated package-manager protection points at the package-firewall contract rather than duplicated command-policy rules.&lt;/p&gt;

&lt;p&gt;Install intent, package metadata, and the final pre-execution Guard result ride the shared runtime envelope before an approval is queued. Saved artifact-level package blocks stay sticky until a new allow rule or exception exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hol-guard &lt;span class="nb"&gt;command test&lt;/span&gt; &lt;span class="s1"&gt;'aws s3 rb s3://prod-bucket --force'&lt;/span&gt;
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;explain &lt;span class="s1"&gt;'gcloud sql instances delete my-db --quiet'&lt;/span&gt;
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;extensions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;command test&lt;/code&gt; and &lt;code&gt;command explain&lt;/code&gt; are side-effect-free. They do not execute the command, create an approval, or write a receipt. Use them after every upgrade before you trust muscle memory on &lt;code&gt;az group delete&lt;/code&gt; or &lt;code&gt;php artisan migrate:fresh&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protection Center, Test Lab, Core vs Desktop
&lt;/h2&gt;

&lt;p&gt;Protection Center is the operator control plane for command protection modules. Open it from Modules in the local dashboard. Compatibility routes for &lt;code&gt;/extensions&lt;/code&gt; remain. Posture choices are Protected, Extra careful, or Watch. Default is Protected.&lt;/p&gt;

&lt;p&gt;Protected stops theft, wipes, and Guard bypass, then remembers ordinary first-seen decisions. Extra careful also asks on first new site or tool install. Watch records without stopping. Use Watch only while debugging false positives. If Watch becomes your standing posture, you are collecting receipts while the blast radius stays live.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hol-guard settings &lt;span class="nb"&gt;set &lt;/span&gt;protection protected
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;controls status
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;controls list
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;controls show command.git
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;controls patterns &lt;span class="nt"&gt;--tool&lt;/span&gt; command.git
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;controls preview command.git &lt;span class="nt"&gt;--target-kind&lt;/span&gt; extension &lt;span class="nt"&gt;--state&lt;/span&gt; disabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those inspect or preview local state. They do not contact Cloud. Writes still go through preview, proof, approval, and apply. A device setting can preserve or tighten protection. It cannot lower an immutable floor, override Emergency Lockdown, or weaken a workspace managed restriction.&lt;/p&gt;

&lt;p&gt;Test Lab rehearses a bounded command against current local protection without executing it. No subprocess. No activity row. No approval. No Cloud upload. No raw command in the response payload. Same contract as &lt;code&gt;command explain&lt;/code&gt;: explanatory, not a sandbox.&lt;/p&gt;

&lt;p&gt;We moved the menu-bar tray to &lt;a href="https://github.com/hashgraph-online/hol-guard-desktop" rel="noopener noreferrer"&gt;hashgraph-online/hol-guard-desktop&lt;/a&gt;. Guard Core stays headless and owns enforcement: policy, approvals, receipts, daemon, browser dashboard, updates, repair, diagnostics. Desktop is optional. If the tray vanished after upgrade, you lost a UI process, not the authority path. Desktop is not required for blocking.&lt;/p&gt;

&lt;p&gt;Protection Center is presentation over the same extension-control catalog, effective state, preview, proof, apply, and runtime evaluation contracts used by the CLI. It must not invent separate enforcement semantics. Simple mode is the default; Advanced and Developer modes reveal implementation detail. Organization-managed settings stay read-only on the device. Settings history comes from the authenticated local authority transition chain: picking an earlier version prepares only the historical device layer as a draft against the current revision, with the organization layer still in force, and still requires the normal proof-bound approval flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local decision integrity and evidence privacy
&lt;/h2&gt;

&lt;p&gt;Saved local decisions are verified against Guard-maintained integrity key material before they become authoritative again. Coming from older local memory, migrate deliberately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hol-guard policies integrity-status
hol-guard policies migrate-local-integrity &lt;span class="nt"&gt;--preserve-all-local&lt;/span&gt;
hol-guard policies verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tampered or recovery-required authority state goes through the approval-bound Settings integrity repair flow in Protection Center. Do not hand-edit the authority database. Unsigned, unknown-key, or tampered local decision rows should fail closed until an operator repairs them.&lt;/p&gt;

&lt;p&gt;Command activity is a local security-evidence domain. It records bounded facts about Guard decisions and proof metadata, not command content. Opaque activity references, harness, phase, status, proof level, bounded reason classes, extension and rule identities: yes. Raw commands, arguments, paths, workspace names, package names, environment values, credentials, matcher free-text with user input: no. Positive field allowlists enforce that. Redaction alone is not the contract.&lt;/p&gt;

&lt;p&gt;Correlation handles use a local HMAC-SHA-256 over length-framed harness identifiers with an installation-local random key. Session-only correlation never proves execution. Default egress is local-only. Optional Cloud egress, when opted in, accepts only rare-cell-suppressed daily aggregate counts, not activity rows or receipt payloads. Catalog and control status stay bounded security metadata for the same reason: support evidence must not become a side channel for shell text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Harness contracts, stated honestly
&lt;/h2&gt;

&lt;p&gt;Support is not identical across harnesses. Treat the matrix as contracts, not slogans. Guard's own authority path fails closed on the faults listed above. Harness adapters still differ when Guard itself is unreachable or a hook crashes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Codex:&lt;/strong&gt; Guard-owned PreToolUse and PermissionRequest hooks are authoritative, including deny in YOLO mode. Wrapper launch refuses when native hooks are missing or disabled. Thread resume works when a live binding exists.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Grok:&lt;/strong&gt; waits on the original PreToolUse after queuing approval, then returns allow so Grok resumes the same tool call. Fails open if a hook crashes or times out.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Kimi:&lt;/strong&gt; fails open on crash or timeout so Kimi Code keeps working when Guard is unreachable.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;ZCode:&lt;/strong&gt; fails open on crash or timeout.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cline:&lt;/strong&gt; evaluates PreToolUse synchronously and fails closed when Guard is unavailable or payloads are contradictory.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Harness     | Guard crash / unavail          | Resume note
Codex       | refuses missing native hooks   | thread resume when bound
Grok        | fail-open on crash/timeout     | same-call resume
Kimi        | fail-open on crash/timeout     | keeps working
ZCode       | fail-open on crash/timeout     | keeps working
Cline       | fail-closed on unavail/bad payload | sync PreToolUse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex refusing a launch without native hooks is a feature. Grok, Kimi, and ZCode failing open means Guard unreachable is not the same as Guard deny. Cline failing closed means an unavailable Guard stops action-bearing tools. Read &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/harness-support.md" rel="noopener noreferrer"&gt;harness-support.md&lt;/a&gt; for the harness you actually run, then prove it with &lt;code&gt;status&lt;/code&gt; and &lt;code&gt;command explain&lt;/code&gt; on that machine.&lt;/p&gt;

&lt;p&gt;No VS Code Copilot extension-host claim. A VS Code inline permission sheet alone is not Guard proof. No Goose adapter in this repository. No Cisco AIBOM runtime policy in this pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local floor stays up when Cloud pauses
&lt;/h2&gt;

&lt;p&gt;Local Guard without sign-in still intercepts, blocks on supported actions, writes receipts, and resolves approvals. Cloud outage, trial end, past due, or never connected must not be translated into protection expired. That mistranslation is a product bug.&lt;/p&gt;

&lt;p&gt;Sync paused is not unprotected. Codes like &lt;code&gt;feature_not_in_plan&lt;/code&gt;, &lt;code&gt;device_limit_reached&lt;/code&gt;, and &lt;code&gt;cloud_sync_paused_plan_limit&lt;/code&gt; describe Cloud state only. Solo's two-device limit is a Cloud-sync limit. A third machine still installs and protects locally.&lt;/p&gt;

&lt;p&gt;Team Cloud is where managed-restrictive Control Sets become interesting: shared workspaces, simulation, staged rollout, acknowledgement, drift, rollback, RBAC, and evidence exports. Deployment is a signed Control Set version delivered to an eligible runtime cohort. Stages fail closed independently. Compatibility evaluation and atomic application have to land before managed restrictions are enabled on a cohort; unsupported clients must not receive a fallback that silently drops Extension enforcement semantics.&lt;/p&gt;

&lt;p&gt;Cloud adds sync, history, Control Sets, simulation, staged rollout, acknowledgement, drift, rollback, and shared review. A paused sync stage does not mean Local Guard stopped protecting the shell. A catalog mismatch excludes a device from that Cloud rollout; local enforcement continues. Invalid signed bundles follow the incident runbook; do not describe local protection as disabled merely because Cloud sync failed.&lt;/p&gt;

&lt;p&gt;Day one on a laptop still looks familiar: install Guard Core, run &lt;code&gt;init&lt;/code&gt; or &lt;code&gt;install&lt;/code&gt; for the harness you use, confirm &lt;code&gt;status&lt;/code&gt;, then rehearse a destructive class with &lt;code&gt;command explain&lt;/code&gt; before you trust muscle memory. Decision-integrity tooling and receipts continue offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade once, prove four green bars
&lt;/h2&gt;

&lt;p&gt;Prefer the current tip. Do not pin yanked &lt;code&gt;3.0.0&lt;/code&gt;. Repair the harnesses you use. Prove recognition with &lt;code&gt;command explain&lt;/code&gt;. Migrate local decision integrity if you are coming from older local memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="s2"&gt;"hol-guard[cisco]==3.0.113"&lt;/span&gt;
hol-guard &lt;span class="nt"&gt;--version&lt;/span&gt;
hol-guard init
hol-guard &lt;span class="nb"&gt;install &lt;/span&gt;codex
hol-guard apps repair grok
hol-guard status
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;explain &lt;span class="s1"&gt;'aws s3 rb s3://prod-bucket --force'&lt;/span&gt;
hol-guard &lt;span class="nb"&gt;command test&lt;/span&gt; &lt;span class="s1"&gt;'az vm delete -g rg -n vm1 --yes'&lt;/span&gt;
hol-guard &lt;span class="nb"&gt;command &lt;/span&gt;controls status
hol-guard policies integrity-status
hol-guard policies migrate-local-integrity &lt;span class="nt"&gt;--preserve-all-local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  Package reports a 3.0.x version at or above &lt;code&gt;3.0.113&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;status&lt;/code&gt; shows the harness protected with hooks present.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;command explain&lt;/code&gt; names a built-in Extension and permission evidence for a destructive class you care about.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;policies integrity-status&lt;/code&gt; is clean or successfully migrated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then open Protection Center once and set posture deliberately. Do not inherit 2.x muscle memory for Watch. After that, the product model is simple enough to hold in one head: Extensions name what can be protected, Rust decides before the shell starts, Control Sets govern those identities across people and devices, and Cloud sync state never gets to redefine whether the local floor is still standing.&lt;/p&gt;

&lt;p&gt;If marketing surfaces or an old README still talk early 3.x language, ignore them for pins. Treat the installed package version, the v3.0.0 release notes, ADR 0011, and &lt;code&gt;product-decision.json&lt;/code&gt; as the operator sources of truth. After the four green bars, skip changelog side quests until you have actually watched one destructive class land as Extension permission evidence on your harness.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://hol.org/guard?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=hol-guard-3-0-extension-first-managed-controls" rel="noopener noreferrer"&gt;HOL Guard product&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/releases/tag/v3.0.0" rel="noopener noreferrer"&gt;Guard 3.0.0 release notes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/adr/0011-extension-first-managed-controls.md" rel="noopener noreferrer"&gt;ADR 0011&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/contracts/managed-controls/v1/product-decision.json" rel="noopener noreferrer"&gt;product-decision.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/extensions/README.md" rel="noopener noreferrer"&gt;Extension directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/command-extension-architecture.md" rel="noopener noreferrer"&gt;Command Extension architecture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/managed-controls-local-extensions.md" rel="noopener noreferrer"&gt;Local Extensions settings&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/protection-center.md" rel="noopener noreferrer"&gt;Protection Center&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/command-activity-privacy.md" rel="noopener noreferrer"&gt;Command activity privacy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/local-vs-cloud.md" rel="noopener noreferrer"&gt;Local vs Cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/harness-support.md" rel="noopener noreferrer"&gt;Harness support matrix&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard/blob/main/docs/guard/get-started.md" rel="noopener noreferrer"&gt;Get started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/hashgraph-online/hol-guard-desktop" rel="noopener noreferrer"&gt;hol-guard-desktop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://pypi.org/project/hol-guard/" rel="noopener noreferrer"&gt;PyPI hol-guard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>holguard</category>
      <category>guard3</category>
      <category>managedcontrols</category>
      <category>agentsecurity</category>
    </item>
    <item>
      <title>BREAKING: CVE-2026-76578 lets an unauthenticated LDAP client become a FreeIPA admin</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Mon, 07 Sep 2026 12:58:23 +0000</pubDate>
      <link>https://dev.to/hol/breaking-cve-2026-76578-lets-an-unauthenticated-ldap-client-become-a-freeipa-admin-5b1k</link>
      <guid>https://dev.to/hol/breaking-cve-2026-76578-lets-an-unauthenticated-ldap-client-become-a-freeipa-admin-5b1k</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-76578-freeipa-unauth-ldap-admin-aci" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your FreeIPA or Red Hat IdM LDAP ports are reachable without a login, an unauthenticated client can forge a Kerberos principal into the administrators group and run the directory as an admin.&lt;/strong&gt; Red Hat scored CVE-2026-76578 at 9.8 (AV:N/AC:L/PR:N/UI:N) and says it reproduced the chain on a default, unmodified FreeIPA install. No fixed RPM is listed yet. Upstream FreeIPA master landed the ACI hardening today with &lt;code&gt;Fixes: CVE-2026-76578&lt;/code&gt; in the commit messages. Until your vendor package ships, treat open 389/636 from untrusted networks as an emergency.&lt;/p&gt;

&lt;p&gt;This is the operator write-up. The HOL Guard evidence pack for &lt;a href="https://hol.org/guard/security/cves/CVE-2026-76578?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-76578-freeipa-unauth-ldap-admin-aci" rel="noopener noreferrer"&gt;CVE-2026-76578&lt;/a&gt; is the source record.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;FreeIPA ships a self-service ACI named &lt;code&gt;Users can create self-managed tokens&lt;/code&gt; under &lt;code&gt;cn=otp&lt;/code&gt;. It allowed &lt;code&gt;add&lt;/code&gt; when &lt;code&gt;ipatokenOwner&lt;/code&gt; and &lt;code&gt;managedBy&lt;/code&gt; matched SELFDN, but it did not constrain which object classes or attributes the new entry could carry. Combined with how 389 Directory Server evaluates anonymous binds against self-referential allow rules, a credential-less LDAP client could create a token-shaped entry that also smuggled a Kerberos principal, key material, password, and SID, then land that principal in the administrators group.&lt;/p&gt;

&lt;p&gt;Red Hat's public statement is blunt: a prior uniqueness fix (CVE-2026-13097) blocked the literal &lt;code&gt;admin&lt;/code&gt; name-collision trick, but it did not close the unauthenticated write path. The attacker no longer needs to impersonate the literal admin account. They pick their own name, join administrators, and get genuine admin LDAP rights (user add/delete demonstrated in Red Hat's own tests). On SID-enabled deployments that access also reaches other IdM services.&lt;/p&gt;

&lt;p&gt;Upstream commit &lt;code&gt;316a3e45d2&lt;/code&gt; (Alexander Bokovoy) is the surgical OTP fix: the ADD ACI now carries a &lt;code&gt;targattrfilters&lt;/code&gt; clause that only permits OTP object classes (&lt;code&gt;top&lt;/code&gt;, &lt;code&gt;ipaToken&lt;/code&gt;, &lt;code&gt;ipatokenTOTP&lt;/code&gt;, &lt;code&gt;ipatokenHOTP&lt;/code&gt;) and forbids an injected &lt;code&gt;aci&lt;/code&gt;. Attributes that need Kerberos or password object classes fail that filter. The commit notes that 389-ds does not consult &lt;code&gt;targetattr&lt;/code&gt; on ADD, so &lt;code&gt;targattrfilters&lt;/code&gt; is the lever that actually works. Legitimate &lt;code&gt;ipa otptoken-add&lt;/code&gt; is unaffected.&lt;/p&gt;

&lt;p&gt;That OTP constraint alone is not the whole story. Companion upgrades add an absolute deny for anonymous modifications on the IPA suffix and on &lt;code&gt;o=ipaca&lt;/code&gt; when a CA exists (&lt;code&gt;21-deny-anonymous-modify.update&lt;/code&gt;), harden self-service bind rules, and deny anonymous SID reads. The absolute deny uses &lt;code&gt;userdn != "ldap:///all"&lt;/code&gt; because there is no ACI keyword that means "no credentials were sent"; empty-DN anonymous binds are the ones that fail &lt;code&gt;ldap:///all&lt;/code&gt;. The patch text also warns that &lt;code&gt;authmethod="none"&lt;/code&gt; means "do not check auth method" and would deny everyone if used as a deny clause, and that &lt;code&gt;nsslapd-allow-unauthenticated-binds&lt;/code&gt; should stay off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Hosts that are only FreeIPA/IdM &lt;em&gt;clients&lt;/em&gt; (SSSD against someone else's IPA). This is a server-side LDAP ACI issue on the IPA masters/replicas.&lt;/li&gt;
&lt;li&gt;  IPA servers where ports 389/636 are not reachable from any untrusted network &lt;em&gt;and&lt;/em&gt; anonymous binds are already rejected. You still want the package when it lands, but you are not in the emergency exposure class Red Hat describes.&lt;/li&gt;
&lt;li&gt;  Deployments that only applied the earlier CVE-2026-13097 uniqueness / canonical-name collision fix. Red Hat says that patch does not remediate this CVE.&lt;/li&gt;
&lt;li&gt;  CVE-2026-79678 (same-day FreeIPA Important): authenticated &lt;code&gt;idp-add&lt;/code&gt; reaches a constrained &lt;code&gt;eval()&lt;/code&gt; before the authz check for environment disclosure and memory DoS. Different bug, different preconditions. Not unauthenticated admin takeover.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not a remote code execution bug in the IPA host OS, and it is not a Kerberos wire-protocol flaw. It is unauthenticated directory privilege escalation to FreeIPA administrators via LDAP ACIs. Red Hat reproduced admin LDAP read and admin-only write/delete; that is full IdM admin, not a sandbox escape story.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;There is no fixed &lt;code&gt;ipa-server&lt;/code&gt; / IdM errata in the Red Hat CVE page yet (products still show affected / under investigation). Until the vendor package arrives:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Restrict LDAP to trusted hosts only: firewall TCP 389 and 636 so the internet and untrusted VLANs cannot reach IPA masters/replicas.&lt;/li&gt;
&lt;li&gt; Disable anonymous LDAP binds if your clients do not require them. Red Hat says that blocks this specific path; confirm NIS/compat and any legacy anonymous readers before flipping it in production.&lt;/li&gt;
&lt;li&gt; Confirm &lt;code&gt;nsslapd-allow-unauthenticated-binds&lt;/code&gt; is off on the 389-ds instances backing IPA.&lt;/li&gt;
&lt;li&gt; Watch for the FreeIPA / RHEL IdM update that ships &lt;code&gt;install/updates/40-otp.update&lt;/code&gt; with the constrained self-managed-token ACI and &lt;code&gt;21-deny-anonymous-modify.update&lt;/code&gt;. Upstream master already has those files; package that train when your distro publishes it, then re-run &lt;code&gt;ipa-server-upgrade&lt;/code&gt; / the normal IdM update path so the ACI update scripts apply.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Operator check you can run today from a host that should &lt;em&gt;not&lt;/em&gt; be able to speak LDAP anonymously to the IPA server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ldapsearch &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; ldap://ipa.example.com &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; base namingContexts
&lt;span class="c"&gt;# Expect bind failure or referral policy you already chose.&lt;/span&gt;
&lt;span class="c"&gt;# If this returns namingContexts from an untrusted network, treat LDAP as exposed.&lt;/span&gt;
rpm &lt;span class="nt"&gt;-q&lt;/span&gt; ipa-server 389-ds-base &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;# After the fix package: confirm the live ACI text includes&lt;/span&gt;
&lt;span class="c"&gt;# targattrfilters on "Users can create self-managed tokens"&lt;/span&gt;
&lt;span class="c"&gt;# and "Deny all modifications for anonymous binds".&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same-day sibling worth patching in the same window: CVE-2026-79678 (Important, CVSS 8.1). Any authenticated IPA principal can hit &lt;code&gt;ipa idp-add&lt;/code&gt; before authorization and read process environment variables or DoS via memory exhaustion. On container images that left Directory Manager / admin passwords in the environment after first boot, that disclosure is worse. Red Hat says the &lt;code&gt;eval()&lt;/code&gt; path cannot call functions (parentheses forbidden). Fix is still "upgrade when the package exists"; there is no config kill-switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://access.redhat.com/security/cve/CVE-2026-76578" rel="noopener noreferrer"&gt;Red Hat CVE-2026-76578&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=2519522" rel="noopener noreferrer"&gt;Bugzilla 2519522&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/freeipa/freeipa/commit/316a3e45d25c04d811aa4c6d5a573081f52818fb" rel="noopener noreferrer"&gt;freeipa otp: constrain self-managed-token ADD&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/freeipa/freeipa/commit/5f60d878b7130af1442bfff4e9017cc5028e5861" rel="noopener noreferrer"&gt;freeipa aci: deny anonymous modifications&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://access.redhat.com/security/cve/CVE-2026-79678" rel="noopener noreferrer"&gt;Red Hat CVE-2026-79678&lt;/a&gt; (sibling)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://access.redhat.com/security/cve/CVE-2026-13097" rel="noopener noreferrer"&gt;Red Hat CVE-2026-13097&lt;/a&gt; (prior collision fix; not sufficient alone)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>freeipa</category>
      <category>idm</category>
      <category>ldap</category>
    </item>
    <item>
      <title>BREAKING: CVE-2026-86259 lets unauth OpenMAIC callers pull cloud credentials via SSRF</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Sun, 06 Sep 2026 13:45:25 +0000</pubDate>
      <link>https://dev.to/hol/breaking-cve-2026-86259-lets-unauth-openmaic-callers-pull-cloud-credentials-via-ssrf-1g3f</link>
      <guid>https://dev.to/hol/breaking-cve-2026-86259-lets-unauth-openmaic-callers-pull-cloud-credentials-via-ssrf-1g3f</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-86259-openmaic-ssrf-imds-access-code" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenMAIC before 1.0.1 will fetch any URL you put in &lt;code&gt;x-base-url&lt;/code&gt; when the SSRF guard is skipped, and the default install has no access code.&lt;/strong&gt; On a cloud host that means an unauthenticated caller can pull Instance Metadata Service credentials through generation endpoints such as &lt;code&gt;POST /api/generate/image&lt;/code&gt;. Same-day GHSA-9m7h-vh2h-rc3w and release v1.0.1 ship today. CVE-2026-86259 is the lead. Three sibling advisories land in the same upgrade.&lt;/p&gt;

&lt;p&gt;This is the operator write-up. The HOL Guard &lt;a href="https://hol.org/guard/security/cves/CVE-2026-86259-openmaic-before-101-ssrf-via-environment-gated?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-86259-openmaic-ssrf-imds-access-code" rel="noopener noreferrer"&gt;evidence pack for CVE-2026-86259&lt;/a&gt; is the source record.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;Two defaults stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Fail-open auth.&lt;/strong&gt; &lt;code&gt;middleware.ts&lt;/code&gt; does &lt;code&gt;if (!accessCode) return NextResponse.next()&lt;/code&gt;. The shipped &lt;code&gt;.env.example&lt;/code&gt; leaves &lt;code&gt;ACCESS_CODE&lt;/code&gt; commented optional, so every API route is reachable with no cookie.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Environment-gated SSRF.&lt;/strong&gt; In 1.0.0, routes such as &lt;code&gt;app/api/generate/image/route.ts&lt;/code&gt; only called &lt;code&gt;validateUrlForSSRF(clientBaseUrl)&lt;/code&gt; when &lt;code&gt;NODE_ENV === 'production'&lt;/code&gt;. Development, staging, preview, and unset environments skipped the guard and fetched the client URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chain: unset &lt;code&gt;ACCESS_CODE&lt;/code&gt; + non-production &lt;code&gt;NODE_ENV&lt;/code&gt; + &lt;code&gt;x-base-url&lt;/code&gt; pointing at the cloud metadata service on an image, video, PDF, or extract route. The server returns IAM material in the response. The same pattern also reaches loopback services when those ports are open on the host.&lt;/p&gt;

&lt;p&gt;v1.0.1 removes the &lt;code&gt;NODE_ENV&lt;/code&gt; gate so &lt;code&gt;validateUrlForSSRF&lt;/code&gt; runs unconditionally, and adds a repository test that fails if a gated call site comes back. CHANGELOG 1.0.1 also lists three other fixes in the same tag: classroom path write (GHSA-p2wh-m28m-c5xw), stored slide HTML (GHSA-7rhf-2798-mvcj), and redirect credential drop (GHSA-725p-44hx-v52c).&lt;/p&gt;

&lt;h2&gt;
  
  
  The incomplete part of 1.0.1
&lt;/h2&gt;

&lt;p&gt;Read the patch, not only the advisory remediation list. GHSA-9m7h suggested fail-closed middleware when &lt;code&gt;ACCESS_CODE&lt;/code&gt; is missing. The shipped 1.0.1 tree does &lt;strong&gt;not&lt;/strong&gt; do that. &lt;code&gt;middleware.ts&lt;/code&gt; is byte-identical between v1.0.0 and v1.0.1; the fail-open &lt;code&gt;if (!accessCode) return NextResponse.next()&lt;/code&gt; remains. README and &lt;code&gt;.env.example&lt;/code&gt; still document &lt;code&gt;ACCESS_CODE&lt;/code&gt; as optional.&lt;/p&gt;

&lt;p&gt;So: upgrading closes the SSRF gate everywhere, including non-production. It does &lt;strong&gt;not&lt;/strong&gt; by itself stop unauthenticated callers from hitting your API surface. Set &lt;code&gt;ACCESS_CODE&lt;/code&gt; in &lt;code&gt;.env.local&lt;/code&gt; (or your deploy secrets) on every reachable instance.&lt;/p&gt;

&lt;p&gt;Breaking change after upgrade: client-supplied loopback or private provider base URLs (local Ollama or Lemonade entered in Settings) are now rejected in every environment unless you set &lt;code&gt;ALLOW_LOCAL_NETWORKS=true&lt;/code&gt;. Production already behaved that way; development did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Deployments that already run with &lt;code&gt;NODE_ENV=production&lt;/code&gt; (SSRF validation was already on) and a non-empty &lt;code&gt;ACCESS_CODE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Managed or server-configured providers that ignore client &lt;code&gt;x-base-url&lt;/code&gt; (OpenMAIC managed-provider path drops the client base URL).&lt;/li&gt;
&lt;li&gt;  Hosted open.maic.chat instances that enforce access codes.&lt;/li&gt;
&lt;li&gt;  Anyone not running OpenMAIC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operator check
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'^ACCESS_CODE='&lt;/span&gt; .env.local .env 2&amp;gt;/dev/null
node &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"require('./package.json').version"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expect &lt;code&gt;ACCESS_CODE&lt;/code&gt; set to a real secret and version 1.0.1 or newer. Empty grep output means the middleware still fail-opens even after you upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git checkout v1.0.1
pnpm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pnpm build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pnpm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then set a strong &lt;code&gt;ACCESS_CODE=...&lt;/code&gt; in &lt;code&gt;.env.local&lt;/code&gt; (or your secret store) and restart. If you point Settings at a local LLM endpoint, add &lt;code&gt;ALLOW_LOCAL_NETWORKS=true&lt;/code&gt;. Node must be 22.19.0 or newer after this release.&lt;/p&gt;

&lt;p&gt;Rotate any cloud credentials that lived on hosts that exposed OpenMAIC without an access code before you patched. Treat temporary IMDS tokens as compromised for the full window the instance was reachable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;Not a Next.js framework CVE. Not remote code execution by itself. Not wormable without a reachable OpenMAIC. Not fixed by only bumping the Next.js, undici, or lodash deps that also landed in 1.0.1.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://github.com/THU-MAIC/OpenMAIC/security/advisories/GHSA-9m7h-vh2h-rc3w" rel="noopener noreferrer"&gt;GHSA-9m7h-vh2h-rc3w&lt;/a&gt; (lead SSRF / unauth chain)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/THU-MAIC/OpenMAIC/releases/tag/v1.0.1" rel="noopener noreferrer"&gt;OpenMAIC v1.0.1 release&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/THU-MAIC/OpenMAIC/blob/main/CHANGELOG.md#101---2026-09-06" rel="noopener noreferrer"&gt;CHANGELOG 1.0.1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Patch observation: &lt;code&gt;app/api/generate/image/route.ts&lt;/code&gt; drops the &lt;code&gt;NODE_ENV === 'production'&lt;/code&gt; gate; &lt;code&gt;middleware.ts&lt;/code&gt; unchanged vs 1.0.0&lt;/li&gt;
&lt;li&gt;  Siblings in the same release: GHSA-p2wh-m28m-c5xw, GHSA-7rhf-2798-mvcj, GHSA-725p-44hx-v52c&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>openmaic</category>
      <category>ssrf</category>
      <category>ai</category>
    </item>
    <item>
      <title>BREAKING: CVE-2026-67276 and MikroTrick can take over MikroTik RouterOS with SSH exposed</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Sat, 05 Sep 2026 20:16:28 +0000</pubDate>
      <link>https://dev.to/hol/breaking-cve-2026-67276-and-mikrotrick-can-take-over-mikrotik-routeros-with-ssh-exposed-2m1l</link>
      <guid>https://dev.to/hol/breaking-cve-2026-67276-and-mikrotrick-can-take-over-mikrotik-routeros-with-ssh-exposed-2m1l</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-67276-mikrotik-routeros-mikrotrick-ssh-cluster" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CERT Polska confirmed active attacks against MikroTik RouterOS that chain SSH flaws into full device takeover when SSH is reachable from the internet.&lt;/strong&gt; They call that chain MikroTrick. CVE IDs landed today (2026-09-05). MikroTik already pushed silent fixes on 2026-09-03 in 7.24.2, 7.23.4, and 6.49.21. If you run RouterOS with management services on a public address, patch and hunt for compromise markers now. This post covers the six CERT-coordinated CVEs in one upgrade.&lt;/p&gt;

&lt;p&gt;This is the operator write-up. The HOL Guard evidence packs for each CVE ID are the source records.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;MikroTik's Sep 3 bulletin said only that a security update was important and that most configurations were not at risk. The binaries disclosed more than the prose. CERT Polska's Sep 5 write-up, plus independent binary diffs of 7.23.3 vs 7.23.4, map six issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-67276&lt;/strong&gt; (CVSS 9.2 per CERT) - SSH public-key auth compared RSA key type and modulus but not the exponent. An attacker who knows an authorized RSA modulus can supply a crafted key (commonly e=1 / low-exponent forgery paths) and open an SSH channel as that user without the private key.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-86060&lt;/strong&gt; (CVSS 9.2 per CERT) - usernames that begin with a prohibited character (field IoC: literal &lt;code&gt;-2&lt;/code&gt;) reach a legacy login helper that treats &lt;code&gt;-N&lt;/code&gt; as "read trusted name/policy fields from file descriptor N." That can replace the RouterOS policy mask and escalate to full admin. CERT pairs this with 67276 as MikroTrick.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-67279&lt;/strong&gt; - SSH rekey before authentication lets an unauthenticated client open a session and write or overwrite files in the managed file namespace (including support/config material).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-67281&lt;/strong&gt; - WebFig &lt;code&gt;/jsproxy&lt;/code&gt; unauthenticated file read via a stale principal pointer and path escape; can disclose config stores that hold credentials.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-67277&lt;/strong&gt; (CVSS 8.8 per CERT) - bandwidth-test (&lt;code&gt;btest&lt;/code&gt;) accepts a "related" connection before the primary session finishes auth, leaking kernel buffer data or crashing/restarting the device.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-67278&lt;/strong&gt; - malformed RSA/PKCS#1 v1.5 signatures accepted in X.509 validation; with an e=3 trust-store root this enables TLS server impersonation on outbound RouterOS TLS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixed trains (vendor + CERT): &lt;strong&gt;7.24.2&lt;/strong&gt; (stable), &lt;strong&gt;7.23.4&lt;/strong&gt; (long-term), &lt;strong&gt;6.49.21&lt;/strong&gt; (v6 long-term), and &lt;strong&gt;7.25beta3&lt;/strong&gt;+. Affected range per CERT: from 7.24 below 7.24.2, from 7.0.0 below 7.23.4, from 6.0.0 below 6.49.21.&lt;/p&gt;

&lt;p&gt;CERT reports observing internet-facing SSH devices taken over with this combination in recent days, and that the released patches stop the observed attacks. MikroTik's patched builds also set a &lt;code&gt;Flagged&lt;/code&gt; device-mode marker when known compromise fingerprints are present.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Devices already on 7.24.2, 7.23.4, 6.49.21, or any later build that contains these fixes (still run the Flagged / IoC checks below if SSH was ever public).&lt;/li&gt;
&lt;li&gt;  Boxes where SSH, WWW/WWW-SSL (WebFig), and the bandwidth-test server are not reachable from untrusted networks, and that do not initiate untrusted outbound TLS/SSH client sessions from the router. MikroTik's own bulletin still says regular home/default layouts are lower immediate risk; that is exposure scoping, not a skip.&lt;/li&gt;
&lt;li&gt;  This is not a claim that every RSA key on every RouterOS install is forgeable. The SSH auth bypass needs knowledge of an authorized RSA modulus (and the weak verifier behavior). Independent lab work reproduced public-key auth without the private key against authorized e=3 keys on 7.23.3; stock e=65537 is not a universal break.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operator check
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;# version&lt;/span&gt; (want 7.24.2+, 7.23.4+, or 6.49.21+)
&lt;span class="k"&gt;/system&lt;/span&gt; resource print

&lt;span class="k"&gt;Flagged&lt;/span&gt; marker after upgrade/reboot
&lt;span class="k"&gt;/system&lt;/span&gt; device-mode print
&lt;span class="k"&gt;IoCs&lt;/span&gt; CERT associates with the in-the-wild chain
&lt;span class="k"&gt;/log&lt;/span&gt; print where message~"-2"
&lt;span class="k"&gt;/user&lt;/span&gt; print where name="ops"
&lt;span class="k"&gt;management&lt;/span&gt; exposure (tighten if these listen on WAN)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log lines to treat as compromise attempts (CERT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;login failure for user -2 from &amp;lt;ip&amp;gt; via ssh
user &amp;lt;name&amp;gt; added by ssh:-2@&amp;lt;ip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also hunt unexpected full-policy accounts, scheduler entries that &lt;code&gt;fetch&lt;/code&gt; then &lt;code&gt;import&lt;/code&gt;, SOCKS proxies, and tunnels you did not create. Absence of &lt;code&gt;Flagged&lt;/code&gt; is not proof of cleanliness. MikroTik documents that the marker only catches selected fingerprints.&lt;/p&gt;

&lt;p&gt;If you use RADIUS / User Manager for SSH, review whether a username like &lt;code&gt;-2&lt;/code&gt; could ever be accepted from an external AAA path. Independent reverse-engineering of the silent patch reproduced post-auth policy injection once SSH accepted that username, and could not reproduce a stock local-user password path that accepts literal &lt;code&gt;-2&lt;/code&gt; without that precondition.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Upgrade RouterOS immediately to &lt;strong&gt;7.24.2&lt;/strong&gt;, &lt;strong&gt;7.23.4&lt;/strong&gt;, &lt;strong&gt;6.49.21&lt;/strong&gt;, or newer via System → Packages → Check for Updates (or your normal image pipeline). Prefer the channel you already run (stable vs long-term). Do not leave older "still listed as long-term" builds such as unpatched 7.20.x / 7.21.x in place: MikroTik's forum clarification is that the fix starts at the named releases, and many years of versions are affected.&lt;/p&gt;

&lt;p&gt;Until you can patch: remove SSH, WWW/WWW-SSL, and bandwidth-test from untrusted addresses; do not use &lt;code&gt;/system ssh&lt;/code&gt; / &lt;code&gt;/system ssh-exec&lt;/code&gt; or outbound TLS from an unpatched box across untrusted paths. Those are temporary exposure cuts only.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;Flagged&lt;/code&gt;, IoCs, or unknown users/scripts appear: isolate the device, preserve logs and config for IR, factory-reset, rebuild from a known-good config, and rotate passwords, keys, and RADIUS secrets. Do not blindly restore a full backup from a possibly compromised unit. CERT also warns against clearing the Flagged marker before evidence is secured.&lt;/p&gt;

&lt;p&gt;Extra hardening after patch (from the silent-patch analysis, not required by the CVE text alone): audit authorized SSH RSA keys for exponent 3 and prefer Ed25519/ECDSA or RSA e=65537; remove &lt;code&gt;test&lt;/code&gt; policy from accounts that do not need diagnostic tools (built-in &lt;code&gt;read&lt;/code&gt; includes &lt;code&gt;test&lt;/code&gt; and can reach unsafe helpers); restrict or disable MAC-Telnet on untrusted L2.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not a claim that every MikroTik on the internet is owned without SSH (or the other listed services) being reachable. It is not a silent worm against firewalled management planes. It is also not "CVE assignment of a years-old dead bug": the vendor patched on Sep 3, CERT published CVE detail and active-exploitation confirmation on Sep 5, and internet-exposed SSH is the live blast radius right now. Guard's &lt;code&gt;knownExploited&lt;/code&gt; flag may still read false until KEV/NVD catch up; believe CERT's operational confirmation over that lag.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://hol.org/guard/security/cves/CVE-2026-67276?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-67276-mikrotik-routeros-mikrotrick-ssh-cluster" rel="noopener noreferrer"&gt;HOL Guard evidence pack (CVE-2026-67276)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://cert.pl/en/posts/2026/09/vulnerabilities-in-mikrotik-routeros-actively-exploited/" rel="noopener noreferrer"&gt;CERT Polska: actively exploited MikroTrick advisory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://cert.pl/en/posts/2026/09/mikrotik-routeros-cve" rel="noopener noreferrer"&gt;CERT Polska: CVE table and per-ID descriptions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mikrotik.com/supportsec/september-2026-vulnerability/" rel="noopener noreferrer"&gt;MikroTik September 2026 vulnerability bulletin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://forum.mikrotik.com/t/important-security-update/272851" rel="noopener noreferrer"&gt;MikroTik forum: Important security update&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://npratley.net/reversing-mikrotiks-silent-patch-the-routeros-7-23-4-fix-they-wouldnt-explain/" rel="noopener noreferrer"&gt;Independent silent-patch reverse engineering (7.23.3 vs 7.23.4)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Sibling Guard packs: CVE-2026-86060, CVE-2026-67279, CVE-2026-67281, CVE-2026-67277, CVE-2026-67278&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>mikrotik</category>
      <category>routeros</category>
      <category>ssh</category>
    </item>
    <item>
      <title>BREAKING: CVE-2026-0799 lets crafted BPF filters walk libpcap process memory</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Sat, 05 Sep 2026 19:14:34 +0000</pubDate>
      <link>https://dev.to/hol/breaking-cve-2026-0799-lets-crafted-bpf-filters-walk-libpcap-process-memory-gde</link>
      <guid>https://dev.to/hol/breaking-cve-2026-0799-lets-crafted-bpf-filters-walk-libpcap-process-memory-gde</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-0799-libpcap-bpf-rpcap-1-10-7" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Tcpdump Group shipped libpcap 1.10.7 today with seven CVEs that hit the userspace BPF interpreter and the optional rpcap path.&lt;/strong&gt; CVE-2026-0799 is the lead: crafted BPF scratch-memory indexes can make the interpreter read and write process memory far outside the intended M[] registers. Six siblings land in the same upgrade. If you ship packet capture, offline BPF replay, or remote capture, treat 1.10.7 as today's floor.&lt;/p&gt;

&lt;p&gt;This is the operator write-up. The HOL Guard evidence packs for each CVE ID are the source records.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;libpcap's userspace BPF interpreter (&lt;code&gt;pcapint_filter_with_aux_data()&lt;/code&gt; in &lt;code&gt;bpf_filter.c&lt;/code&gt;) assumes programs look like ones libpcap itself compiled or validated. That assumption fails when an app feeds it attacker-controlled instructions through &lt;code&gt;pcap_offline_filter()&lt;/code&gt; or a similar path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-0799&lt;/strong&gt; - LD/ST scratch register index is not capped at 15, so the interpreter can walk a huge slice of process memory (Include Security / Mozilla SOS case from 2018, independently confirmed only recently).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-31912&lt;/strong&gt; - no program-bounds check on jumps or missing return, so the PC can leave the filter buffer.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-31911&lt;/strong&gt; - invalid opcode calls &lt;code&gt;abort()&lt;/code&gt; and kills the process.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-6244&lt;/strong&gt; - &lt;code&gt;div #k&lt;/code&gt; / &lt;code&gt;mod #k&lt;/code&gt; with k=0 is not rejected.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-6554&lt;/strong&gt; - backward &lt;code&gt;ja&lt;/code&gt; loops are unbounded (infinite loop DoS).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the remote-capture side (only when rpcap is built and used):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-18238&lt;/strong&gt; - rpcap client mishandles &lt;code&gt;RPCAP_MSG_PACKET&lt;/code&gt; headers; a malicious server can make the client treat up to 20 bytes past the buffer as packet data (affects 1.8.x through &amp;lt;1.10.7).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;CVE-2026-18313&lt;/strong&gt; - rpcapd leaks up to 64KB per filter/start-capture message and never frees it (1.9.x through &amp;lt;1.10.7).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Release tag &lt;code&gt;libpcap-1.10.7&lt;/code&gt; is dated 2026-09-05. Tarballs are on tcpdump.org. The same release also deprecates &lt;code&gt;bpf_filter()&lt;/code&gt; and, on Windows CMake builds, disables remote capture by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Apps that only compile filters with &lt;code&gt;pcap_compile()&lt;/code&gt; / &lt;code&gt;pcap_setfilter()&lt;/code&gt; and never hand untrusted BPF bytecode to the userspace interpreter. The Tcpdump Group's own advisories call the BPF bugs "particular uncommon use cases."&lt;/li&gt;
&lt;li&gt;  Hosts that never enable or link rpcap / rpcapd. Stock live &lt;code&gt;tcpdump -i&lt;/code&gt; against a local interface is not the rpcap client bug.&lt;/li&gt;
&lt;li&gt;  Already on libpcap 1.10.7 (or a distro build that clearly backports these seven commits).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operator check
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# linked libpcap version string&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import ctypes; print(ctypes.CDLL(None).pcap_lib_version().decode())"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; tcpdump &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tcpdump &lt;span class="nt"&gt;--version&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

Debian/Ubuntu package train
dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s1"&gt;'libpcap*'&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^ii/ {print $2, $3}'&lt;/span&gt;
RHEL/Fedora
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything reporting below 1.10.7 (or a vendor changelog that does not list these CVE IDs) is still on the vulnerable train. Confirm whether your binary was built with remote capture (&lt;code&gt;--enable-remote&lt;/code&gt; / CMake remote option) if you care about the rpcap pair.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Upgrade libpcap to &lt;strong&gt;1.10.7&lt;/strong&gt; or newer. Source release: &lt;a href="https://www.tcpdump.org/release/libpcap-1.10.7.tar.xz" rel="noopener noreferrer"&gt;libpcap-1.10.7.tar.xz&lt;/a&gt; (signed). Rebuild anything that statically links libpcap (custom tcpdump builds, NIDS sensors, appliance images). Prefer distro packages once they carry 1.10.7 or explicit backports of the seven commits.&lt;/p&gt;

&lt;p&gt;If you cannot upgrade yet and you expose rpcapd, shut remote capture off or put it behind mutual TLS and a tight allowlist. If you evaluate untrusted &lt;code&gt;.bpf&lt;/code&gt; / raw filter programs in-process, stop doing that until the library is current.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not a claim of wormable remote code execution against every host that has libpcap installed. The dangerous BPF paths need an application that runs crafted filter programs through the userspace interpreter. The rpcap issues need remote capture in the build and an attacker on that channel. No CVSS or KEV entry was published with the CVE records at assignment time.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://hol.org/guard/security/cves/CVE-2026-0799?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-0799-libpcap-bpf-rpcap-1-10-7" rel="noopener noreferrer"&gt;HOL Guard evidence pack (CVE-2026-0799)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.tcpdump.org/" rel="noopener noreferrer"&gt;tcpdump.org&lt;/a&gt; - libpcap 1.10.7 release&lt;/li&gt;
&lt;li&gt;  CHANGES for 1.10.7 (CVE lines for 0799 / 31912 / 31911 / 6244 / 6554 / 18313 / 18238)&lt;/li&gt;
&lt;li&gt;  Commits: &lt;a href="https://github.com/the-tcpdump-group/libpcap/commit/48e8960a7108e9e828f9d7bdc7e97bdab841aec7" rel="noopener noreferrer"&gt;0799&lt;/a&gt;, &lt;a href="https://github.com/the-tcpdump-group/libpcap/commit/d3f358d3cffbe1ecb94d5284b3e81f052a0adcb9" rel="noopener noreferrer"&gt;31912&lt;/a&gt;, &lt;a href="https://github.com/the-tcpdump-group/libpcap/commit/a715bcdde830299cba4171514385cb17ec19b6e9" rel="noopener noreferrer"&gt;31911&lt;/a&gt;, &lt;a href="https://github.com/the-tcpdump-group/libpcap/commit/98bb921b141aa642faedbf2ac510541c76499a19" rel="noopener noreferrer"&gt;6244&lt;/a&gt;, &lt;a href="https://github.com/the-tcpdump-group/libpcap/commit/ff3c83475ac303c6b681c52ad0b6e14795a8e0ce" rel="noopener noreferrer"&gt;6554&lt;/a&gt;, &lt;a href="https://github.com/the-tcpdump-group/libpcap/commit/b9590d482986d64673712460aae1d48d11fa0473" rel="noopener noreferrer"&gt;18238&lt;/a&gt;, &lt;a href="https://github.com/the-tcpdump-group/libpcap/commit/f9775af1a0ec76db60c7213241e6b48f1be10ac7" rel="noopener noreferrer"&gt;18313&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Sibling Guard packs: CVE-2026-31912, CVE-2026-31911, CVE-2026-6244, CVE-2026-6554, CVE-2026-18238, CVE-2026-18313&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>libpcap</category>
      <category>tcpdump</category>
      <category>bpf</category>
    </item>
    <item>
      <title>CVE-2026-85787: AWS postgres MCP read-only denylist missed set_config()</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Fri, 04 Sep 2026 20:48:05 +0000</pubDate>
      <link>https://dev.to/hol/cve-2026-85787-aws-postgres-mcp-read-only-denylist-missed-setconfig-1hjg</link>
      <guid>https://dev.to/hol/cve-2026-85787-aws-postgres-mcp-read-only-denylist-missed-setconfig-1hjg</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-85787-awslabs-postgres-mcp-sql-denylist-bypass" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read-only mode on AWS Labs' Postgres MCP server was enforced by a keyword denylist that missed several Postgres primitives.&lt;/strong&gt; Before &lt;code&gt;awslabs.postgres-mcp-server&lt;/code&gt; 1.1.7, an incomplete blocklist in &lt;code&gt;mutable_sql_detector.py&lt;/code&gt; could let SQL that rides an authenticated MCP session mutate data or session state even when the server was configured for read-only queries. AWS published this as CVE-2026-85787 / bulletin 2026-101-AWS on 2026-09-04.&lt;/p&gt;

&lt;p&gt;Upgrade to &lt;code&gt;awslabs.postgres-mcp-server&lt;/code&gt; 1.1.7 or newer (current PyPI tip is 1.2.0). Pair the bump with a least-privilege Postgres role. The application denylist is defense in depth, not the primary boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;The MCP server translates natural-language tool calls into SQL against Aurora/Postgres. In the default configuration &lt;code&gt;readonly_query&lt;/code&gt; is true unless you pass &lt;code&gt;--allow_write_query&lt;/code&gt;. Mutating statements are supposed to die in &lt;code&gt;detect_mutating_keywords&lt;/code&gt; / &lt;code&gt;check_sql_injection_risk&lt;/code&gt; before they hit the wire.&lt;/p&gt;

&lt;p&gt;The 1.1.6 → 1.1.7 patch (PyPI upload 2026-06-25) shows what the old denylist missed. Blocking the &lt;code&gt;SET&lt;/code&gt; keyword did not catch the function form &lt;code&gt;set_config(...)&lt;/code&gt;, because &lt;code&gt;set&lt;/code&gt; is not on a word boundary inside &lt;code&gt;set_config&lt;/code&gt;. A read query could therefore call &lt;code&gt;set_config('row_security','off',false)&lt;/code&gt; or &lt;code&gt;set_config('session_replication_role',...)&lt;/code&gt; and defeat RLS-style isolation or session hardening that operators thought the MCP could not touch. The same release also closed related gaps the bulletin only summarizes as an "incomplete list":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;SET_CONFIG&lt;/code&gt; added to mutating keywords (read-only mode) plus a dedicated &lt;code&gt;SECURITY_SET_CONFIG_PATTERN&lt;/code&gt; that rejects those two GUCs in both read and write modes.&lt;/li&gt;
&lt;li&gt;  Unconditional blocks on the &lt;code&gt;dblink*&lt;/code&gt; family (SSRF from the database backend, including to the instance metadata service at &lt;code&gt;169.254.169.254&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;COPY ... TO|FROM PROGRAM&lt;/code&gt; blocked even when writes are enabled (shell execution on the DB host when privileges allow).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;strip_quoted_identifiers()&lt;/code&gt; so double-quoted spellings like &lt;code&gt;"pg_sleep"&lt;/code&gt; no longer slip past word-boundary regexes.&lt;/li&gt;
&lt;li&gt;  Comment-injection heuristic also evaluated on raw SQL, because normalization folded away a trailing &lt;code&gt;--&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS rates the bulletin Important. There is no CVSS in the CVE record or NVD entry yet. The attacker model in the advisory is an unauthenticated actor placing crafted SQL into content that an authenticated user later submits through the MCP client. This is not a direct unauthenticated Postgres wire exploit.&lt;/p&gt;

&lt;p&gt;Affected: any PyPI &lt;code&gt;awslabs.postgres-mcp-server&lt;/code&gt; version &amp;lt; 1.1.7. Fixed: 1.1.7 (2026-06-25). Current tip at write-up: 1.2.0 (2026-08-26).&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Postgres / Aurora itself. This is the AWS Labs MCP wrapper package, not a database engine CVE.&lt;/li&gt;
&lt;li&gt;  Installs already on 1.1.7 or 1.2.x.&lt;/li&gt;
&lt;li&gt;  Deployments that intentionally run with &lt;code&gt;--allow_write_query&lt;/code&gt; and already grant the MCP role the DML it needs. Those operators still want the 1.1.7 denylist hardening for &lt;code&gt;dblink*&lt;/code&gt; / &lt;code&gt;COPY ... PROGRAM&lt;/code&gt; / security GUCs.&lt;/li&gt;
&lt;li&gt;  Other MCP servers (MySQL, DynamoDB, generic SQL bridges). Only this package's SQL validator.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to check
&lt;/h2&gt;

&lt;p&gt;From the environment that launches the MCP server, inspect the installed package version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip show awslabs.postgres-mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the Version field. Any value below 1.1.7 is in the affected range. If you launch via &lt;code&gt;uvx&lt;/code&gt; or a Cursor/VS Code MCP config args list, check that pin the same way (or run &lt;code&gt;pip show&lt;/code&gt; inside the same environment the MCP process uses).&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Upgrade the package, then keep the database role tight.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s1"&gt;'awslabs.postgres-mcp-server&amp;gt;=1.1.7'&lt;/span&gt;
&lt;span class="c"&gt;# or refresh the uvx pin to @latest / @1.2.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AWS's workaround (still recommended after the bump): connect the MCP server as a dedicated role, never as superuser / &lt;code&gt;rds_superuser&lt;/code&gt; / cluster master. For read-only use, grant only &lt;code&gt;CONNECT&lt;/code&gt; + &lt;code&gt;USAGE&lt;/code&gt; + &lt;code&gt;SELECT&lt;/code&gt; on the schemas the agent needs, and prefer forcing read-only transactions at the role level. The denylist and the role privileges should both hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not a remote unauthenticated Postgres login bug, not a claim of active exploitation, and not a same-day emergency for fleets already on 1.1.7+. The CVE assignment landed on 2026-09-04 for a fix that shipped on PyPI on 2026-06-25. Damage is "read-only" MCP sessions that could still change data or session GUCs when the denylist missed a primitive and the DB role was over-privileged.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://aws.amazon.com/security/security-bulletins/2026-101-aws/" rel="noopener noreferrer"&gt;AWS security bulletin 2026-101-AWS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://pypi.org/project/awslabs.postgres-mcp-server/1.1.7/" rel="noopener noreferrer"&gt;PyPI awslabs.postgres-mcp-server 1.1.7&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/awslabs/mcp/blob/main/src/postgres-mcp-server/awslabs/postgres_mcp_server/mutable_sql_detector.py" rel="noopener noreferrer"&gt;mutable_sql_detector.py (current)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://hol.org/guard/security/cves/CVE-2026-85787-an-incomplete-list-of-disallowed-inputs-in-the?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-85787-awslabs-postgres-mcp-sql-denylist-bypass" rel="noopener noreferrer"&gt;HOL Guard evidence pack for CVE-2026-85787&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>awslabs</category>
      <category>postgresmcpserver</category>
      <category>mcp</category>
    </item>
    <item>
      <title>BREAKING: CVE-2026-9317 lets anyone who can reach your Nango runner run code</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Fri, 04 Sep 2026 18:39:27 +0000</pubDate>
      <link>https://dev.to/hol/breaking-cve-2026-9317-lets-anyone-who-can-reach-your-nango-runner-run-code-41oa</link>
      <guid>https://dev.to/hol/breaking-cve-2026-9317-lets-anyone-who-can-reach-your-nango-runner-run-code-41oa</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-9317-nango-runner-trpc-missing-auth-rce" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anyone who can reach your Nango runner port can start caller-supplied JavaScript in that process.&lt;/strong&gt; Before 0.71.6, the runner tRPC surface exposed &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;abort&lt;/code&gt;, and &lt;code&gt;notifyWhenIdle&lt;/code&gt; as public procedures with an empty context. No auth middleware sat in front. Network access to the runner was enough to call &lt;code&gt;start&lt;/code&gt; with caller-supplied &lt;code&gt;code&lt;/code&gt; and execute it inside the runner.&lt;/p&gt;

&lt;p&gt;Upgrade alone is not the fix. v0.71.6 ships runner auth, but &lt;code&gt;NANGO_INTERNAL_AUTH_REQUIRED&lt;/code&gt; defaults to &lt;code&gt;false&lt;/code&gt;. Shipping the new image with no new vars is a no-op. Existing runners keep accepting unauthenticated dispatch until you set &lt;code&gt;REQUIRED=true&lt;/code&gt; and restart so runners inherit it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;CVE-2026-9317 (VulnCheck, critical, CVSS 9.2 CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N, CWE-306) covers Nango &lt;code&gt;&amp;gt;=0 &amp;lt;0.71.6&lt;/code&gt;. Fixed in 0.71.6 (GitHub release 2026-09-02). Credit: Katriel Moses, VulnCheck.&lt;/p&gt;

&lt;p&gt;Pre-patch &lt;code&gt;packages/runner/lib/server.ts&lt;/code&gt; registered those procedures as &lt;code&gt;publicProcedure&lt;/code&gt; with empty &lt;code&gt;createContext&lt;/code&gt;. &lt;code&gt;RUNNER_SECRET_KEY&lt;/code&gt; existed in the env schema but was unenforced on this surface. PR #7288 / commit &lt;code&gt;ed3030a9a0f8e4f3810fd10cb3a1905a2f5f87d2&lt;/code&gt; (merged 2026-09-01) adds &lt;code&gt;internalServiceAuthMiddleware&lt;/code&gt; plus task/node-bound procedures. Jobs mint an EdDSA JWT (&lt;code&gt;aud: runner&lt;/code&gt;); runners verify with the public key only. &lt;code&gt;/health&lt;/code&gt; stays open.&lt;/p&gt;

&lt;p&gt;Docs and &lt;code&gt;.env.example&lt;/code&gt; still default &lt;code&gt;NANGO_INTERNAL_AUTH_REQUIRED&lt;/code&gt; to false. Fail-open is intentional until you flip the flag. Put the signing key on jobs only (&lt;code&gt;NANGO_INTERNAL_AUTH_SIGNING_KEY&lt;/code&gt;). Set &lt;code&gt;NANGO_INTERNAL_AUTH_REQUIRED=true&lt;/code&gt; on the orchestrator then jobs. Runners receive the public key and &lt;code&gt;REQUIRED&lt;/code&gt; at node start. Never put the signing key on runners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Nango Cloud customers (Nango operates the runners).&lt;/li&gt;
&lt;li&gt;  Deployments where the runner port is not reachable from untrusted hosts.&lt;/li&gt;
&lt;li&gt;  Callers that only hit &lt;code&gt;GET /health&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Dashboard and public API login paths. This is runner-internal tRPC, not end-user auth.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to check
&lt;/h2&gt;

&lt;p&gt;From the deploy root, search compose/values/env for &lt;code&gt;NANGO_INTERNAL_AUTH_REQUIRED&lt;/code&gt; and the nango image tag, then check runner &lt;code&gt;/health&lt;/code&gt; and the installed nango package version.&lt;/p&gt;

&lt;p&gt;Confirm image or package version is at least &lt;code&gt;0.71.6&lt;/code&gt; and &lt;code&gt;NANGO_INTERNAL_AUTH_REQUIRED=true&lt;/code&gt; on jobs, orchestrator, and runners after restart. An upgraded tag with &lt;code&gt;REQUIRED&lt;/code&gt; still false or unset is still exposed on a reachable runner port.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;1. Upgrade self-hosted Nango to 0.71.6 or newer.&lt;/p&gt;

&lt;p&gt;2. On jobs, set &lt;code&gt;NANGO_INTERNAL_AUTH_SIGNING_KEY&lt;/code&gt;. Do not put that key on runners.&lt;/p&gt;

&lt;p&gt;3. Set &lt;code&gt;NANGO_INTERNAL_AUTH_REQUIRED=true&lt;/code&gt; on the orchestrator, then on jobs. Restart so runners inherit the public key and &lt;code&gt;REQUIRED=true&lt;/code&gt; at node start.&lt;/p&gt;

&lt;p&gt;4. Re-check version and &lt;code&gt;REQUIRED&lt;/code&gt; after restart. Until &lt;code&gt;REQUIRED=true&lt;/code&gt; is live on the runner processes, the open door remains.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not a wormable internet bug without a path to the runner port. It is not fixed by an image bump alone without flipping &lt;code&gt;REQUIRED&lt;/code&gt;. It is not the separate August 26 Nango proxy advisories.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.vulncheck.com/advisories/nango-missing-authentication-rce-via-runner-trpc-server" rel="noopener noreferrer"&gt;VulnCheck advisory: Nango missing authentication via runner tRPC&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/NangoHQ/nango/pull/7288" rel="noopener noreferrer"&gt;PR 7288 runner Auth runner start&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/NangoHQ/nango/commit/ed3030a9a0f8e4f3810fd10cb3a1905a2f5f87d2" rel="noopener noreferrer"&gt;commit ed3030a9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/NangoHQ/nango/releases/tag/v0.71.6" rel="noopener noreferrer"&gt;Nango v0.71.6 release&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://hol.org/guard/security/cves/CVE-2026-9317?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-9317-nango-runner-trpc-missing-auth-rce" rel="noopener noreferrer"&gt;HOL Guard evidence pack for CVE-2026-9317&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>nango</category>
      <category>rce</category>
      <category>missingauthentication</category>
    </item>
    <item>
      <title>CVE-2026-85024: undici WebSocket deflate bug can crash the Node process</title>
      <dc:creator>Michael Kantor</dc:creator>
      <pubDate>Fri, 04 Sep 2026 17:12:25 +0000</pubDate>
      <link>https://dev.to/hol/cve-2026-85024-undici-websocket-deflate-bug-can-crash-the-node-process-56o3</link>
      <guid>https://dev.to/hol/cve-2026-85024-undici-websocket-deflate-bug-can-crash-the-node-process-56o3</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://hol.org/blog/cve-2026-85024-undici-websocket-permessage-deflate-dos" rel="noopener noreferrer"&gt;HOL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A hostile WebSocket peer can take down the whole Node process, not just the socket.&lt;/strong&gt; undici's WebSocket client (including Node.js's bundled &lt;code&gt;globalThis.WebSocket&lt;/code&gt;) crashes the entire Node.js process when a remote WebSocket peer sends a permessage-deflate compressed message that crosses the decompressed-payload size limit and then contains a malformed DEFLATE block. In &lt;code&gt;lib/web/websocket/permessage-deflate.js&lt;/code&gt;, the size-limit cleanup calls &lt;code&gt;removeAllListeners()&lt;/code&gt; on the internal zlib &lt;code&gt;InflateRaw&lt;/code&gt;, removing its &lt;code&gt;error&lt;/code&gt; listener, but leaves the stream running.&lt;/p&gt;

&lt;p&gt;Upgrade to undici v6.28.1, v7.29.1 or v8.10.2. Current and LTS tip Node builds still ship older undici. App dependencies can bump now. Built-in &lt;code&gt;globalThis.WebSocket&lt;/code&gt; waits on a Node security release or an override.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks
&lt;/h2&gt;

&lt;p&gt;GitHub advisory GHSA-3wwx-pv8p-q78v / CVE-2026-85024 rates this Medium CVSS 5.9 (AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H). Complexity is high: the client must reach a hostile or compromised WebSocket endpoint. Impact is availability only.&lt;/p&gt;

&lt;p&gt;The inflater then emits a &lt;code&gt;Z_DATA_ERROR&lt;/code&gt; with no listener attached, which Node.js treats as a fatal unhandled &lt;code&gt;error&lt;/code&gt; event and terminates the process. Application &lt;code&gt;error&lt;/code&gt;/&lt;code&gt;close&lt;/code&gt; handlers on the public WebSocket cannot observe or prevent this, because the failing object is the internal &lt;code&gt;InflateRaw&lt;/code&gt;. A malicious or compromised WebSocket server can crash a client with a single connection, unauthenticated and without any application mistake. The attack is asymmetric (about 130 KB on the wire expands past the limit) and can be repeated on reconnect (crash loop). Affected applications are those using the undici WebSocket client (&lt;code&gt;new WebSocket(...)&lt;/code&gt;) or Node.js's bundled &lt;code&gt;globalThis.WebSocket&lt;/code&gt; that can be induced to connect to an attacker-controlled or compromised WebSocket endpoint.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt;=6.25.0 &amp;lt;6.28.1&lt;/code&gt;, &lt;code&gt;&amp;gt;=7.28.0 &amp;lt;7.29.1&lt;/code&gt;, &lt;code&gt;&amp;gt;=8.1.0 &amp;lt;8.10.2&lt;/code&gt;. Fixed: 8.10.2, 7.29.1, 6.28.1 (latest=8.10.2).&lt;/p&gt;

&lt;p&gt;Node tip builds checked from &lt;code&gt;src/undici_version.h&lt;/code&gt; on GitHub still ship older undici: v26.8.1 → 8.10.0, v24.20.0 → 7.29.0, v22.23.2 → 6.28.0. Latest Node GitHub releases as of this write-up were still Aug 26. There is no Node security release with patched undici yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is not in scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Apps that never open an undici or Node &lt;code&gt;WebSocket&lt;/code&gt; client to untrusted or third-party peers.&lt;/li&gt;
&lt;li&gt;  Server-only WebSocket stacks that do not use undici client (ws, uWebSockets, browser-only clients).&lt;/li&gt;
&lt;li&gt;  undici versions outside the three ranges above, including already-patched 8.10.2 / 7.29.1 / 6.28.1.&lt;/li&gt;
&lt;li&gt;  HTTP fetch-only undici usage with no WebSocket client path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to check
&lt;/h2&gt;

&lt;p&gt;For app dependencies from the project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm ls undici
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the resolved version falls in an affected range, upgrade. On Node builds that expose the bundled version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node -p "process.versions.undici"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare that string to the fixed trains. Tip Current/LTS builds listed above still report older numbers until Node ships a security release.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to fix
&lt;/h2&gt;

&lt;p&gt;Upgrade undici to a patched release on your train.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install undici@8.10.2
# or on older trains:
# npm install undici@7.29.1
# npm install undici@6.28.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin or override so transitive copies resolve to the patch. That covers direct &lt;code&gt;new WebSocket(...)&lt;/code&gt; from the undici package today.&lt;/p&gt;

&lt;p&gt;For Node bundled &lt;code&gt;globalThis.WebSocket&lt;/code&gt;, wait for a Node security release that bumps the embedded undici, or replace that client with a dependency you control and keep patched. The advisory lists no application-level workaround.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;This is not remote code execution, not data theft, and not an unauthenticated internet worm. The peer must already be a WebSocket the client chose to connect to. Damage is process exit and restart loops under AC:H.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://github.com/nodejs/undici/security/advisories/GHSA-3wwx-pv8p-q78v" rel="noopener noreferrer"&gt;GHSA-3wwx-pv8p-q78v&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://hol.org/guard/security/cves/CVE-2026-85024-undici-vulnerable-to-denial-of-service-via?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=blog_distribution&amp;amp;utm_content=cve-2026-85024-undici-websocket-permessage-deflate-dos" rel="noopener noreferrer"&gt;HOL Guard evidence pack for CVE-2026-85024&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cve</category>
      <category>undici</category>
      <category>node</category>
      <category>websocket</category>
    </item>
  </channel>
</rss>
