<?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: CortexFlow</title>
    <description>The latest articles on DEV Community by CortexFlow (@cortexflow_tech).</description>
    <link>https://dev.to/cortexflow_tech</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%2Fuser%2Fprofile_image%2F4162165%2F5bc16e69-091f-4b38-a23a-32e04f75b348.jpg</url>
      <title>DEV Community: CortexFlow</title>
      <link>https://dev.to/cortexflow_tech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cortexflow_tech"/>
    <language>en</language>
    <item>
      <title>PHP2Shell: Two Critical PHP RCEs (CVSS 9.2) Leaked a Day Early — Check Your Version and Patch Today</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Thu, 22 Oct 2026 08:30:10 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/php2shell-two-critical-php-rces-cvss-92-leaked-a-day-early-check-your-version-and-patch-today-5dfm</link>
      <guid>https://dev.to/cortexflow_tech/php2shell-two-critical-php-rces-cvss-92-leaked-a-day-early-check-your-version-and-patch-today-5dfm</guid>
      <description>&lt;p&gt;Two vulnerabilities in PHP itself — not in WordPress, not in a plugin, in the interpreter — give an unauthenticated attacker remote code execution on effectively every PHP release since 5.4. The details leaked on October 20, a day before the planned disclosure, and PHP shipped an emergency out-of-cycle fix on October 21. By the end of this article you will know whether your servers are exposed, exactly which versions fix it, and how to check for signs that someone got there first.&lt;/p&gt;

&lt;p&gt;One boundary up front: this is a defender's guide. It explains how the bugs work at the level you need to patch and hunt, links the primary sources, and contains no exploit code and no links to proof-of-concept repositories — including the fake ones, which are worse than useless (see the warning in Step 4).&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened: a disclosure that leaked a day early
&lt;/h2&gt;

&lt;p&gt;The flaws were found and reported to the PHP security team in August 2026, and were working through a normal coordinated disclosure with a planned reveal on October 22. The timeline then broke:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;October 20, 2026:&lt;/strong&gt; A Hacker News post and screenshots of a private exploit tool named "PHP2Shell" — credited to the researcher Calif — leaked the two CVE IDs and claimed the bugs hit every PHP release since 5.4.0. The post was taken down; the screenshots were already everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;October 20, 19:33 UTC:&lt;/strong&gt; PHP published an advance notice of an emergency security release and moved publication up a day, to October 21 at 14:00 UTC. &lt;a href="https://watchtowr.com/intelligence/php-remote-code-execution-php2shell/" rel="noopener noreferrer"&gt;watchTowr&lt;/a&gt; confirmed the leak was genuine and said it had reproduced both vulnerabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;October 21, 14:00 UTC:&lt;/strong&gt; PHP released the fixes — 8.5.12, 8.4.27, 8.3.36 and 8.2.35 — with the full advisories: &lt;a href="https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w" rel="noopener noreferrer"&gt;GHSA-w8hw-w9fx-j79w&lt;/a&gt; (CVE-2026-109618) and &lt;a href="https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp" rel="noopener noreferrer"&gt;GHSA-6wmf-4rv5-p3rp&lt;/a&gt; (CVE-2026-109619). Both are rated &lt;strong&gt;CVSS v4.0 9.2&lt;/strong&gt; by the PHP security team.&lt;/li&gt;
&lt;li&gt;The story is big enough that Wikimedia took its Phabricator instance offline as a precaution, and the pair already has a &lt;a href="https://en.wikipedia.org/wiki/PHP2Shell" rel="noopener noreferrer"&gt;Wikipedia article&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The discoverers credited across the reporting — Calif (Calif Research), Wiz, and OpenAI — and the role AI played in building the exploit chain are covered in the AI section below; &lt;a href="https://blog.checkpoint.com/security/php2shell-what-we-know-about-the-leaked-critical-php-vulnerabilities-cve-2026-109618-cve-2026-109619/" rel="noopener noreferrer"&gt;Check Point's write-up&lt;/a&gt; is a good second source for the timeline. First, the bugs themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the two bugs work, in plain language
&lt;/h2&gt;

&lt;p&gt;Some terms, defined once. &lt;strong&gt;RCE (remote code execution)&lt;/strong&gt; means an attacker runs their own code on your server, with the permissions of the web server process. A &lt;strong&gt;SAPI&lt;/strong&gt; is the layer that connects PHP to a web server — PHP-FPM, Apache's mod_php, php-cgi, FrankenPHP and LiteSpeed are all SAPIs, and all of them are in scope here. A &lt;strong&gt;worker&lt;/strong&gt; is one long-lived PHP process inside those servers: it handles a request, cleans up, and handles the next one, thousands of times. That reuse is the heart of the second bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-109618 — corruption through an out-of-memory crash.&lt;/strong&gt; PHP sets a per-request memory limit. When a request runs out of memory mid-flight, PHP aborts it and runs cleanup. If the memory runs out at one specific moment — while PHP is still setting up the request's internal data structures — that data is only half-initialised, and the cleanup code can be made to treat the half-formed data as if it were valid. An attacker who can force memory exhaustion at the right instant (crafted multipart form submissions are one way to burn memory) corrupts the interpreter's own state, and from there reaches code execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-109619 — stale state that outlives its request.&lt;/strong&gt; Some internal state belongs to a single request and lives in memory the request owns. In this bug, that state can survive after its memory has been freed, and a global pointer still refers to it. When the &lt;em&gt;next&lt;/em&gt; request lands on the same worker — remember, workers are reused — it can end up using the leftover state before normal initialisation resets it. This is the classic shape of a &lt;strong&gt;use-after-free&lt;/strong&gt;: a program uses memory after giving it back, so whatever now occupies that memory is treated as something it is not. One confirmed path runs through &lt;strong&gt;Session Upload Progress&lt;/strong&gt;, a default-on feature (&lt;code&gt;session.upload_progress.enabled&lt;/code&gt;) that tracks file-upload progress in the session; PHP is explicit that other variants exist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcortexflow.tech%2Ffigures%2Fphp2shell-php-rce-patch-guide-stale-state.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcortexflow.tech%2Ffigures%2Fphp2shell-php-rce-patch-guide-stale-state.svg" alt="Isometric bench rig of CVE-2026-109619: one PHP worker drawn as a press, request 1's part left standing in the memory tray in orange, the freed tray hoisted away empty behind it, a pointer arm still aimed at the leftover part, and request 2 arriving on a rail carriage" width="600" height="380"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;One PHP worker, drawn as a bench press with the Anatomy figure kit. Request 1 machined its part and left it standing in the memory tray — the orange block. Its tray was then freed and hoisted clear, empty, but the pointer arm never let go of the part. &lt;strong&gt;Notice:&lt;/strong&gt; the press does not care that the part's owner is gone. When request 2 rides in on the carriage, the press works on whatever that pointer still finds — one request's leftover state, consumed by another request on the same worker. That is CVE-2026-109619, and it is also why restarting workers matters forensically: restart the press and the leftover part vanishes with the worker's memory.
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Two properties make the pair dangerous together. Neither needs a login, a valid session, or any application bug — Wiz demonstrated unauthenticated RCE against current WordPress, Drupal and Joomla images, and notes that even a "Hello World" script is enough surface. And on &lt;strong&gt;mod_php&lt;/strong&gt;, PHP rates the risk highest: the attack can succeed &lt;em&gt;before any application code runs&lt;/em&gt;, so application-level firewalls and plugin security tools may never see a request they can judge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is affected
&lt;/h2&gt;

&lt;p&gt;Every PHP release from &lt;strong&gt;5.4.0 through the versions below&lt;/strong&gt; is affected by at least one of the two flaws. Fixes exist only for supported branches:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PHP branch&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Fixed version (released Oct 21, 2026)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8.5.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.5.12&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.4.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.4.27&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.3.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.3.36&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.2.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.2.35&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.1.x and older&lt;/td&gt;
&lt;td&gt;End of life&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No official PHP fix&lt;/strong&gt; — upgrade branches, or apply a vendor/distro backport (the PHP team also published minimal source backports for 7.4, 8.0 and 8.1 for source builders)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SAPIs in scope: PHP-FPM, Apache mod_php (highest risk), php-cgi, FrankenPHP, LiteSpeed — in other words, if the PHP build serves web requests, it counts. CLI-only installs that never serve web traffic are not the concern; the forgotten PHP inside a container, a control panel, or a vendor appliance is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do now
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1 - Find every PHP build you run
&lt;/h3&gt;

&lt;p&gt;Servers accumulate PHP: the distro package, a second version for one legacy app, copies inside Docker images, a control panel's private build. Inventory all of them before patching any of them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;which &lt;span class="nt"&gt;-a&lt;/span&gt; php php-fpm php-cgi
&lt;span class="nb"&gt;ls&lt;/span&gt; /usr/bin/php&lt;span class="k"&gt;*&lt;/span&gt; /usr/sbin/php-fpm&lt;span class="k"&gt;*&lt;/span&gt; /usr/local/bin/php&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null
php &lt;span class="nt"&gt;-v&lt;/span&gt;
docker ps &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Image}}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;which -a&lt;/code&gt; matters because it lists &lt;em&gt;every&lt;/em&gt; PHP on the PATH, not just the default; the &lt;code&gt;ls&lt;/code&gt; catches versioned binaries like &lt;code&gt;php8.1&lt;/code&gt; that nothing points to any more; and the Docker line reminds you that containers carry their own PHP that host patching never touches. Record the version of each build — that list is your patch checklist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 - Patch to the fixed version, then restart the service
&lt;/h3&gt;

&lt;p&gt;Install the fixed release for your branch from &lt;a href="https://www.php.net/downloads.php" rel="noopener noreferrer"&gt;php.net&lt;/a&gt; or your distribution (distros and LTS vendors received the patches and several have shipped backports — check your vendor before assuming an old branch is stranded). Then the step people miss:&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="nb"&gt;sudo &lt;/span&gt;systemctl restart php8.3-fpm        &lt;span class="c"&gt;# adjust to your branch and SAPI&lt;/span&gt;
&lt;span class="c"&gt;# Apache mod_php instead:  sudo systemctl restart apache2&lt;/span&gt;
php &lt;span class="nt"&gt;-v&lt;/span&gt;                                    &lt;span class="c"&gt;# confirm the fixed version number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Updating the PHP package on disk does &lt;strong&gt;not&lt;/strong&gt; update the code already running. FPM and Apache workers are long-lived processes holding the old interpreter in memory; until you restart the service (or the workers recycle), you are still vulnerable — "patched" on disk, exploitable in production. Verify with &lt;code&gt;php -v&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; by confirming the service actually restarted, and remember containers need rebuilt images, not package updates inside a running container.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 3 - If you are on PHP 8.1 or older, make the EOL decision today
&lt;/h3&gt;

&lt;p&gt;There is no official fix coming for end-of-life branches. Your real options are: upgrade to 8.2+ (test first — most 8.1 code runs on 8.2/8.3 with few changes), apply your distribution or LTS vendor's backport, or build from source with the PHP team's minimal backports for 7.4/8.0/8.1. "Wait and see" is not on the list: Sansec publicly expected mass scanning within minutes of the fixed release, because a patch is also a map — diffing it shows attackers exactly where the bugs live.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 - Hunt for compromise, evidence first
&lt;/h3&gt;

&lt;p&gt;Patching closes the door; it does not tell you whether someone already walked through it. Before you restart anything, read this warning — it changes the order of operations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; If you find pre-exploit indicators on an unpatched host, preserve the forensic state &lt;em&gt;before&lt;/em&gt; patching and restarting. CVE-2026-109619 lives in worker memory, and restarting the workers destroys that state. Snapshot the machine or capture logs and process state first, then patch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Indicators defenders are hunting for (compiled from watchTowr, Check Point and Sansec reporting):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multipart POSTs carrying a &lt;code&gt;PHP_SESSION_UPLOAD_PROGRESS&lt;/code&gt; field, and large or malformed multipart POSTs generally&lt;/li&gt;
&lt;li&gt;Repeated &lt;code&gt;Allowed memory size exhausted&lt;/code&gt; fatals and request timeouts in PHP logs — the OOM bug leaves these behind&lt;/li&gt;
&lt;li&gt;FPM/Apache worker segfaults or bursts of worker crashes and respawns&lt;/li&gt;
&lt;li&gt;Unexpected files in the session save path, and new or modified &lt;code&gt;.php&lt;/code&gt; files under web roots&lt;/li&gt;
&lt;li&gt;Changes to &lt;code&gt;auto_prepend_file&lt;/code&gt; / &lt;code&gt;auto_append_file&lt;/code&gt; in any &lt;code&gt;php.ini&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Web server processes spawning &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt;, &lt;code&gt;nc&lt;/code&gt; or &lt;code&gt;base64&lt;/code&gt;; new cron jobs, systemd units, users or &lt;code&gt;authorized_keys&lt;/code&gt; entries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Starter commands for the log and file checks:&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="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="s2"&gt;"PHP_SESSION_UPLOAD_PROGRESS"&lt;/span&gt; /var/log/nginx/access.log /var/log/apache2/access.log 2&amp;gt;/dev/null | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-hi&lt;/span&gt; &lt;span class="s2"&gt;"Allowed memory size"&lt;/span&gt; /var/log/php&lt;span class="k"&gt;*&lt;/span&gt;.log 2&amp;gt;/dev/null | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
find /var/www &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; &lt;span class="nt"&gt;-newermt&lt;/span&gt; &lt;span class="s2"&gt;"2026-10-19"&lt;/span&gt; &lt;span class="nt"&gt;-print&lt;/span&gt; 2&amp;gt;/dev/null
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="s2"&gt;"auto_prepend_file&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;auto_append_file"&lt;/span&gt; /etc/php/ &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.ini"&lt;/span&gt; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat hits as triage, not verdicts: a &lt;code&gt;.php&lt;/code&gt; file modified on October 20 might be your own deploy. What you are looking for is &lt;em&gt;correlation&lt;/em&gt; — upload-progress probes plus memory fatals plus a new file is a very different picture than any one of them alone.&lt;/p&gt;

&lt;p&gt;Two defender tools help. OpenAI published a &lt;a href="https://github.com/openai/php2shell-checker" rel="noopener noreferrer"&gt;PHP2Shell checker on GitHub&lt;/a&gt;: two Codex skills — one checks a site by public URL, one runs on the server — that compare the detected PHP version against the fixed thresholds. It does not exploit anything; it is a version screen, and a site that hides its version header will come back "unknown." For hosts that cannot patch immediately, Syhunt's &lt;a href="https://github.com/syhunt/php2shell-protection" rel="noopener noreferrer"&gt;php2shell-protection toolkit&lt;/a&gt; collects emergency Apache mitigations (multipart blocking, request-size limits) — a stopgap with real breakage costs, not a fix.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Do not download or run "php2shell.py" proof-of-concept files circulating on GitHub. Per JFrog's reporting, fake PoC repositories from unknown accounts are distributing malware. You do not need an exploit to check your exposure — the version number is the check.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And on workarounds, be clear-eyed: disabling &lt;code&gt;session.upload_progress.enabled&lt;/code&gt; blocks at most one confirmed path of one bug, blocking multipart POSTs breaks every upload form you have and does nothing for the OOM bug, and the PHP core team's position is that &lt;strong&gt;patching is the only real mitigation&lt;/strong&gt;. Cloudflare customers got WAF rules (its CTO said early attack attempts were observed before the patch shipped); everyone else has the checklist above.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI angle: discovery and defence, compressed into the same week
&lt;/h2&gt;

&lt;p&gt;The reporting credits the discovery to Calif, Wiz and OpenAI, and both ReliaQuest and watchTowr describe frontier AI models compressing the exploit-development side of the work — turning a memory-corruption chain that would normally take a specialist far longer into roughly &lt;strong&gt;one week&lt;/strong&gt; of work. Hold that number at arm's length (it comes from the firms reporting the incident, not from a published methodology), but the direction is hard to argue with: a pair of bugs this subtle — an OOM that has to land mid-initialisation, a stale pointer that needs a second request on the same worker — was found, chained and weaponised fast enough to force an emergency release for a language that runs a large share of the web.&lt;/p&gt;

&lt;p&gt;The same week produced the mirror image: OpenAI's checker is itself two AI skills, built to let any site owner ask "am I exposed?" in plain language. Offence got a tool; defence got a tool. What neither got is more &lt;em&gt;time&lt;/em&gt; — the leak removed the one-day buffer the coordinated disclosure had planned, and the patch-to-mass-scanning window is now measured in minutes. The practical conclusion for anyone running infrastructure: your patch pipeline's speed is now a security control in its own right, because the other side's pipeline just got faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we don't know yet
&lt;/h2&gt;

&lt;p&gt;Honesty about the gaps, because they are real. &lt;strong&gt;The exploitation reports conflict:&lt;/strong&gt; Cloudflare's CTO said early attack attempts were observed before the patch and that Cloudflare deployed WAF rules against them, while Huntress and watchTowr initially reported no observed exploitation. Both can be true (different vantage points, different definitions of "attempt"), and the picture will sharpen over the coming days. &lt;strong&gt;Version checkers are screening, not proof:&lt;/strong&gt; they read a version number, which a backported distro package can make misleading in either direction. And the full technical root-cause write-ups were still landing as this article was published — if a detail here conflicts with the PHP advisories, the &lt;a href="https://github.com/php/php-src/security/advisories" rel="noopener noreferrer"&gt;advisories&lt;/a&gt; win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PHP2Shell is two unauthenticated RCEs in PHP itself&lt;/strong&gt; (CVE-2026-109618 via OOM corruption, CVE-2026-109619 via stale state), CVSS 9.2, affecting PHP 5.4 through 8.5 across FPM, mod_php, php-cgi, FrankenPHP and LiteSpeed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patch to 8.5.12, 8.4.27, 8.3.36 or 8.2.35 — and restart the service.&lt;/strong&gt; An updated binary with un-restarted workers is still vulnerable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP 8.1 and older get no official fix.&lt;/strong&gt; Upgrade branches or apply a vendor backport; do not wait.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hunt before you restart if you see indicators&lt;/strong&gt; — multipart upload-progress probes, memory-exhaustion fatals, worker crashes, new &lt;code&gt;.php&lt;/code&gt; files — because the stale-state evidence dies with the worker process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no reliable workaround&lt;/strong&gt;, and the circulating "PoC" files are malware bait. The version number is your test.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next step: run the Step 1 inventory on every host you own today, compare each version against the table, and schedule the restart in the same sitting — an inventory without a patch window is just a list of targets.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/php2shell-php-rce-patch-guide/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>security</category>
      <category>rce</category>
      <category>cve</category>
    </item>
    <item>
      <title>Fix Anthropic 'Invalid signature in thinking block' 400 Error in n8n AI Agent (GH #41152)</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Wed, 21 Oct 2026 08:30:00 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/fix-anthropic-invalid-signature-in-thinking-block-400-error-in-n8n-ai-agent-gh-41152-5cha</link>
      <guid>https://dev.to/cortexflow_tech/fix-anthropic-invalid-signature-in-thinking-block-400-error-in-n8n-ai-agent-gh-41152-5cha</guid>
      <description>&lt;p&gt;Your support-ticket agent runs fine all morning, then randomly throws &lt;code&gt;Bad request - please check your parameters&lt;/code&gt; on the AI Agent node. No credentials expired, nothing changed in the workflow, and re-running the same prompt sometimes works. Underneath that generic message, Anthropic returned a very specific 400:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"messages.1.content.3:
Invalid `signature` in `thinking` block. The block is bound to a different conversation."&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I traced this to a real bug in n8n's AI Agent node (Tools Agent V3), reported as &lt;a href="https://github.com/n8n-io/n8n/issues/41152" rel="noopener noreferrer"&gt;n8n GitHub issue #41152&lt;/a&gt; on 2026-10-15 and verified against the n8n source on master by the reporter. &lt;strong&gt;It only fires when Claude returns one thinking block followed by two or more &lt;code&gt;tool_use&lt;/code&gt; blocks in the same turn&lt;/strong&gt; — i.e. parallel tool calls. Turns with a single tool call work fine, which is exactly why it looks intermittent: it depends on the model's choice, not your config. The issue's reporter hit it 5 times in ~24 hours on a production support-ticket agent.&lt;/p&gt;

&lt;p&gt;By the end of this article you'll know exactly why it happens, how to confirm it's your bug in under a minute, and the four fixes that actually work — ordered from quickest to most surgical.&lt;/p&gt;

&lt;p&gt;Quick definitions before we start: a &lt;strong&gt;thinking block&lt;/strong&gt; is Anthropic's extended-thinking artifact — the model's private chain-of-thought, returned as a structured &lt;code&gt;thinking&lt;/code&gt; content block. Every thinking block carries a &lt;strong&gt;signature&lt;/strong&gt;, a cryptographic seal Anthropic places on it that binds the block to the exact conversation prefix it was created under. If you replay the block under different content (for example, with extra tool calls inserted before it), Anthropic rejects the request. The &lt;strong&gt;Tools Agent V3&lt;/strong&gt; (&lt;code&gt;typeVersion 3.1&lt;/code&gt;) is the current n8n AI Agent implementation that rebuilds the chat history between agent turns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; an n8n instance (verified on 2.42.7 as of October 2026; the mechanics apply to any 2.x running Tools Agent V3), an AI Agent node with an Anthropic Chat Model (Claude Sonnet 5 or Opus 5.x, with thinking enabled explicitly or — important — &lt;em&gt;unset&lt;/em&gt;, which means adaptive thinking is on by default), and at least two tools attached to the agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom: what the failure actually looks like
&lt;/h2&gt;

&lt;p&gt;The failure has three tell-tale fingerprints:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The workflow:&lt;/strong&gt; Manual Trigger → AI Agent (Tools Agent) → Anthropic Chat Model (e.g. &lt;code&gt;claude-opus-5-5&lt;/code&gt; or &lt;code&gt;claude-sonnet-5&lt;/code&gt;), Thinking Mode either Adaptive or simply unset, with two independent tools attached (two HTTP Request Tools, or one MCP Client Tool exposing several tools).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The trigger prompt:&lt;/strong&gt; anything that invites two lookups at once — the issue's example was &lt;em&gt;"Look up the user with email X AND search for similar tickets about Y, then summarise."&lt;/em&gt; When the model answers with one thinking block plus two &lt;code&gt;tool_use&lt;/code&gt; blocks, both tools execute, and the &lt;em&gt;next&lt;/em&gt; Anthropic call fails with the 400 above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The n8n surface:&lt;/strong&gt; &lt;code&gt;NodeOperationError: Bad request - please check your parameters&lt;/code&gt; on the AI Agent node, thrown from &lt;code&gt;ToolsAgent/V3/helpers/executeBatch.ts&lt;/code&gt;. Your parameters are fine — this message is a red herring.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to confirm in one minute:&lt;/strong&gt; open the failed execution, click the Anthropic Chat Model node, and look at the &lt;em&gt;second&lt;/em&gt; run (the one that failed). Inspect the input history. If you see the pattern &lt;code&gt;AI: [thinking][tool_use]&lt;/code&gt; appearing &lt;strong&gt;twice with the same signature&lt;/strong&gt;, then the history sent back to Anthropic looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human: ...
AI:   [thinking(sig S), tool_use A]
Tool: result A
AI:   [thinking(sig S), tool_use B]      &amp;lt;- same signature S, replayed under a different prefix
Tool: result B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The issue's reporter confirmed exactly this: in every failing run, both actions in &lt;code&gt;subNodeExecutionData.actions[].action.metadata.anthropic&lt;/code&gt; carried the identical &lt;code&gt;thinkingSignature&lt;/code&gt;. If instead you only see one tool call per turn in your failing runs, this is not your bug — keep reading past the fixes anyway, because the prevention section covers related thinking-replay problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; this bug is &lt;em&gt;new&lt;/em&gt; in the sense that it's the next failure after a previous fix. Merged PR &lt;a href="https://github.com/n8n-io/n8n/pull/38302" rel="noopener noreferrer"&gt;#38302&lt;/a&gt; ("Preserve Anthropic thinking blocks with empty text across tool calls") made empty-text thinking blocks survive the history round-trip. This report is what happens after that fix: the block survives, but it gets &lt;em&gt;duplicated&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The root cause: n8n copies one signature into every parallel tool call
&lt;/h2&gt;

&lt;p&gt;The reporter verified this in the n8n source on master (commit &lt;code&gt;40094e3&lt;/code&gt;, 2026-10-15). Here's the failure chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The model returns a single assistant turn shaped like &lt;code&gt;[thinking, tool_use A, tool_use B]&lt;/code&gt;. The thinking block's signature is minted for &lt;em&gt;that exact turn&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;When the agent rebuilds history after the tools run, &lt;code&gt;createEngineRequests.ts&lt;/code&gt; → &lt;code&gt;extractThinkingMetadata()&lt;/code&gt; (line 43) copies the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;thinkingContent&lt;/code&gt; and &lt;code&gt;thinkingSignature&lt;/code&gt; into the metadata of &lt;strong&gt;every&lt;/strong&gt; tool action of the batch. Both tool calls end up carrying an identical signature.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;buildSteps.ts&lt;/code&gt; → &lt;code&gt;buildSteps()&lt;/code&gt; (line 345) builds the conversation steps. For Gemini, there is a branch that detects parallel calls sharing a thought signature and merges them into one assistant message via &lt;code&gt;buildSharedGeminiAIMessage()&lt;/code&gt; — the code comment above it describes &lt;em&gt;exactly this problem&lt;/em&gt; ("Splitting into separate model turns invalidates the signature").&lt;/li&gt;
&lt;li&gt;There is &lt;strong&gt;no equivalent branch for Anthropic&lt;/strong&gt;. Each Anthropic tool call goes through &lt;code&gt;buildIndividualAIMessage()&lt;/code&gt; → &lt;code&gt;buildAnthropicContentBlocks()&lt;/code&gt;, which always returns &lt;code&gt;[thinkingBlock, toolUseBlock]&lt;/code&gt; — one thinking block per tool call, each with the same signature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So n8n replays the thinking block once per tool call, and the second copy sits after &lt;code&gt;tool_use A&lt;/code&gt; and &lt;code&gt;result A&lt;/code&gt; — content that did not exist when the signature was created. Anthropic's signature validation sees a block replayed under a different prefix and rejects the request. The Gemini path got the merge fix; the Anthropic path simply never did. As of the issue filing date there is no merged upstream fix — the workarounds below are the accepted solutions from the issue thread itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fixes
&lt;/h2&gt;

&lt;p&gt;Decision table first, then steps:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Thinking kept?&lt;/th&gt;
&lt;th&gt;Best when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Thinking Mode: Disabled&lt;/td&gt;
&lt;td&gt;1 click&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;You don't need chain-of-thought quality on this agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Sequential tool calls&lt;/td&gt;
&lt;td&gt;Prompt edit&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;One agent does independent lookups; you can tolerate sequential latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Swap the chat model&lt;/td&gt;
&lt;td&gt;2 clicks&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;td&gt;You're not married to Anthropic for this workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Anthropic beta &lt;code&gt;drop_block&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;td&gt;Partially&lt;/td&gt;
&lt;td&gt;You call the API directly or can pass custom headers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Fix 1 - Set Thinking Mode to Disabled on the Anthropic Chat Model node
&lt;/h3&gt;

&lt;p&gt;This is the fastest fix and the first workaround listed in the issue.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;Anthropic Chat Model&lt;/strong&gt; sub-node on your AI Agent.&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;Thinking Mode&lt;/strong&gt; option and set it to &lt;strong&gt;Disabled&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Save and re-run the workflow with the same "two lookups at once" prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; with thinking disabled there is no thinking block and therefore no signature to duplicate — the replay path can't break what doesn't exist. It also fixes the related default: since n8n 2.37.0 (via &lt;code&gt;@langchain/anthropic&lt;/code&gt; 1.5.6), Claude Sonnet 5 and Opus 5 &lt;em&gt;think adaptively even when Thinking Mode is unset&lt;/em&gt;, so "I never enabled thinking" does not protect you. Merged fix &lt;a href="https://github.com/n8n-io/n8n/pull/37954" rel="noopener noreferrer"&gt;#37954&lt;/a&gt; ("Send disabled thinking to the provider") makes the Disabled setting actually reach the API — make sure your n8n includes it (any n8n updated after that fix landed, including the 2.42.x line, is fine).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; this is not available on models that cannot disable thinking. If your model enforces thinking, skip to Fix 2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt; send the same prompt that triggered parallel tool calls. The agent should complete with no 400, and the execution input for the chat model node should show turns without any &lt;code&gt;thinking&lt;/code&gt; blocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 2 - Keep the model to one tool call per turn
&lt;/h3&gt;

&lt;p&gt;Also from the issue: &lt;em&gt;"Prompt it so that it only calls one tool per turn: works."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Rephrase the system prompt to force sequential tool use, e.g.:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are a support assistant. When you need multiple pieces of information, request them strictly one at a time: call a tool, wait for its result, and only then decide whether to call another tool. Never call two tools in the same response.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; the duplication only happens when one turn contains two or more &lt;code&gt;tool_use&lt;/code&gt; blocks. With one tool call per turn, the thinking signature is replayed exactly once under the correct prefix — the same reason single-tool turns already work today.&lt;/p&gt;

&lt;p&gt;The trade-off is latency: two sequential tool calls take roughly twice as long as two parallel ones, and you're relying on the model to obey the instruction (in practice, explicit "one at a time" instructions are followed reliably on frontier models — but it's still a prompt, not a guarantee).&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 3 - Use a different chat model node for this agent
&lt;/h3&gt;

&lt;p&gt;The issue lists this as a workaround, and there is an interesting technical reason to prefer one specific alternative: &lt;strong&gt;Gemini&lt;/strong&gt;. n8n's history builder already has &lt;code&gt;buildSharedGeminiAIMessage()&lt;/code&gt;, which merges parallel tool calls sharing a thought signature into a single assistant message — the exact handling the Anthropic path is missing. So Gemini agents don't hit this bug at all. OpenAI chat models work too, since they don't use signed thinking blocks in this flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use this:&lt;/strong&gt; if the agent's job doesn't specifically need Claude's strengths, swapping the sub-node is a two-click change with zero prompt or quality trade-offs on the thinking side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix 4 - (Advanced) Tell Anthropic to drop mismatched blocks
&lt;/h3&gt;

&lt;p&gt;The error message itself names this escape hatch: set &lt;code&gt;thinking.block_binding.prefix_mismatch_behavior&lt;/code&gt; to &lt;code&gt;"drop_block"&lt;/code&gt;, which requires the &lt;code&gt;thinking-binding-controls-2026-08-01&lt;/code&gt; value in the &lt;code&gt;anthropic-beta&lt;/code&gt; header. When Anthropic sees the duplicated signature replayed under a wrong prefix, it drops the block instead of rejecting the request.&lt;/p&gt;

&lt;p&gt;This is an API-level control — useful if you're calling the Anthropic API directly from an HTTP Request node or a Code node, not something you click into the Anthropic Chat Model node's options. If you do use it, &lt;strong&gt;verify&lt;/strong&gt;: the request succeeds, but check the model's behavior — a dropped thinking block means the turn proceeds without the chain-of-thought it was built on, which can subtly change reasoning quality on that turn.&lt;/p&gt;

&lt;h2&gt;
  
  
  What NOT to do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't chase "please check your parameters."&lt;/strong&gt; The &lt;code&gt;NodeOperationError: Bad request - please check your parameters&lt;/code&gt; message points at your node config; the actual problem is the history n8n reconstructs. Editing credentials, remapping fields, or re-creating the agent node won't help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't disable execution-data saving or tune execution settings.&lt;/strong&gt; Nothing about this failure involves the execution store — it's the conversation history payload sent to the Anthropic API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't assume it won't recur because your last three runs worked.&lt;/strong&gt; The failure is model-choice-dependent: it only fires when Claude happens to emit parallel tool calls. A prompt that worked yesterday fails tomorrow on a different day with a different phrasing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prevent it next time
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat parallel-tool-call agents on Claude as a known risk class.&lt;/strong&gt; Any AI Agent with an Anthropic Chat Model and 2+ independent tools can hit this until the upstream fix lands. Pick Fix 1, 2, or 3 as your default posture for new agents now, not after the first production failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch &lt;a href="https://github.com/n8n-io/n8n/issues/41152" rel="noopener noreferrer"&gt;GH #41152&lt;/a&gt; for the official fix.&lt;/strong&gt; The expected behavior per the issue: parallel Anthropic tool calls from one thinking turn should be replayed as a single assistant message &lt;code&gt;[thinking, tool_use A, tool_use B]&lt;/code&gt;, mirroring what &lt;code&gt;buildSharedGeminiAIMessage()&lt;/code&gt; already does for Gemini. When an n8n release closes this issue, upgrade and re-enable thinking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know the neighboring bugs.&lt;/strong&gt; The same replay path in &lt;code&gt;buildSteps.ts&lt;/code&gt; is implicated in two related open reports: &lt;a href="https://github.com/n8n-io/n8n/issues/40360" rel="noopener noreferrer"&gt;#40360&lt;/a&gt; (thinking replay sends earlier tool calls back as &lt;code&gt;input: {}&lt;/code&gt;) and the older &lt;a href="https://github.com/n8n-io/n8n/issues/37730" rel="noopener noreferrer"&gt;#37730&lt;/a&gt; regression where Thinking Mode: Disabled stopped disabling thinking. If you see a &lt;em&gt;different&lt;/em&gt; Anthropic 400 on this node, check those before assuming it's #41152.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The 400 fires only on parallel tool calls.&lt;/strong&gt; One thinking block + two &lt;code&gt;tool_use&lt;/code&gt; blocks in a single turn is the trigger; single-tool turns never fail — that's why it looks intermittent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n duplicates the thinking signature across every parallel tool call&lt;/strong&gt;, but only Gemini's replay path merges them. The Anthropic path in &lt;code&gt;buildSteps.ts&lt;/code&gt; has no equivalent, so the second copy is replayed under a different conversation prefix and Anthropic rejects it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fastest fix: Thinking Mode: Disabled&lt;/strong&gt; on the Anthropic Chat Model node (effective since fix #37954); also prompt for one tool call per turn, or swap to Gemini/OpenAI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Bad request - please check your parameters" is a red herring&lt;/strong&gt; — confirm the real cause by checking the failed execution's chat-model input for &lt;code&gt;[thinking][tool_use]&lt;/code&gt; repeated with the same signature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This is a known upstream bug (GH #41152) with no merged fix yet&lt;/strong&gt; — treat Claude agents with multiple independent tools as a risk class and design around it until the release notes say otherwise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next: open your highest-traffic AI Agent that uses an Anthropic model with 2+ tools, reproduce the "two lookups at once" prompt in a manual execution, and check the chat-model input. If you see the duplicated signature, apply Fix 1 or 2 today — the five-failures-in-24-hours pattern from the issue is exactly how this starts in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does the same workflow fail sometimes and succeed other times?
&lt;/h3&gt;

&lt;p&gt;The failure depends on the model's choice in each run, not your workflow. Claude emits a thinking block followed by &lt;em&gt;one&lt;/em&gt; &lt;code&gt;tool_use&lt;/code&gt; on some turns and &lt;em&gt;two or more&lt;/em&gt; on others. Only the parallel-tool-call turns trigger the duplicate-signature rejection. Same prompt, different day, different tool-call pattern — that's the intermittence.&lt;/p&gt;

&lt;h3&gt;
  
  
  If I never enabled thinking, how am I affected?
&lt;/h3&gt;

&lt;p&gt;Since n8n 2.37.0 (via &lt;code&gt;@langchain/anthropic&lt;/code&gt; 1.5.6), Claude Sonnet 5 and Opus 5 think &lt;em&gt;adaptively by default&lt;/em&gt; when Thinking Mode is unset — no explicit opt-in required. Check your Anthropic Chat Model node: if Thinking Mode is unset on one of these models, thinking is on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will disabling thinking hurt my agent's quality?
&lt;/h3&gt;

&lt;p&gt;It depends on the task. For lookup-and-summarise agents (fetch two records, summarise), disabling thinking typically costs little — the model still has full tool outputs to work with. For multi-step reasoning agents, expect some degradation. That's what Fix 2 (sequential tool calls, thinking kept) is for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Gemini affected by the same bug?
&lt;/h3&gt;

&lt;p&gt;No — n8n's &lt;code&gt;buildSteps.ts&lt;/code&gt; already merges parallel calls sharing a thought signature into one assistant message for Gemini (&lt;code&gt;buildSharedGeminiAIMessage()&lt;/code&gt;). The issue explicitly notes the comment above that code describes exactly this signature problem. The Anthropic branch just never got the same handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where is this tracked upstream?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/n8n-io/n8n/issues/41152" rel="noopener noreferrer"&gt;n8n-io/n8n issue #41152&lt;/a&gt;, filed 2026-10-15, verified against master source at commit &lt;code&gt;40094e3&lt;/code&gt;, reproduced on 2.42.7. Related: open &lt;a href="https://github.com/n8n-io/n8n/issues/40360" rel="noopener noreferrer"&gt;#40360&lt;/a&gt; on the same replay path, merged &lt;a href="https://github.com/n8n-io/n8n/pull/38302" rel="noopener noreferrer"&gt;#38302&lt;/a&gt; which made thinking blocks survive the round-trip in the first place.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/fix-anthropic-thinking-block-duplicate-n8n/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>anthropic</category>
      <category>agents</category>
      <category>errorfix</category>
    </item>
    <item>
      <title>Google Workspace Will Block AI Agents Without This OAuth Flag on Nov 11: The n8n Builder's Checklist</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Mon, 19 Oct 2026 08:29:59 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/google-workspace-will-block-ai-agents-without-this-oauth-flag-on-nov-11-the-n8n-builders-checklist-2c32</link>
      <guid>https://dev.to/cortexflow_tech/google-workspace-will-block-ai-agents-without-this-oauth-flag-on-nov-11-the-n8n-builders-checklist-2c32</guid>
      <description>&lt;p&gt;Google is about to draw a hard line between humans and agents inside Workspace. If your n8n AI agent touches Gmail, Drive, or Calendar through a Google OAuth client, you have until November 11, 2026 to flip one checkbox in the Google Cloud console. Miss it, and on November 12 the setting locks permanently on your existing client — leaving you to rebuild the whole OAuth credential from scratch.&lt;/p&gt;

&lt;p&gt;This is not a rumor. Google is introducing a new "agentic" classification flag for OAuth clients — a checkbox labeled &lt;strong&gt;"Use this client for an AI-powered agent"&lt;/strong&gt; inside Google Auth Platform &amp;gt; Clients. Starting &lt;strong&gt;November 11, 2026&lt;/strong&gt;, Google's Workspace MCP servers will actively reject any OAuth client that isn't marked as agentic, returning an error that says the client is not marked as an AI agent. The timing matters: Google is rolling out Workspace MCP servers that expose Gmail, Drive, Calendar, and other productivity tools as live Model Context Protocol servers, and only agentic-tagged credentials will be allowed to connect to them.&lt;/p&gt;

&lt;p&gt;By the end of this post, you will know exactly which of your OAuth clients need the flag, the two dates that matter, and a four-step checklist to get compliant before the lock-in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Google is doing this
&lt;/h2&gt;

&lt;p&gt;An OAuth client is the credential bundle (client ID + secret) that identifies your app to Google's sign-in system. Until now, a credential used by a cron-jobbed n8n workflow looked identical to one used by a human clicking through a web app. That made it impossible for Workspace admins to write security policies that apply only to agent traffic — rate limits, data-loss controls, access reviews — without also hitting human users.&lt;/p&gt;

&lt;p&gt;The agentic flag splits the traffic at the identity layer. Marking a client as agentic doesn't grant extra scopes or bypass user consent; it labels the traffic so admins can apply dedicated agent controls to it. The rollout comes with a new best practice from Google: if your solution has both human-interactive features (standard Google REST APIs) and AI agent workflows, maintain &lt;strong&gt;separate OAuth Client IDs&lt;/strong&gt; for each.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dates that matter
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Oct 12, 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The "Use this client for an AI-powered agent" checkbox became available in the Google Cloud console (Google Auth Platform &amp;gt; Clients) for new and existing clients.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nov 11, 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workspace MCP servers start rejecting requests from OAuth clients that lack the agentic tag.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nov 12, 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;is_agentic&lt;/code&gt; setting becomes &lt;strong&gt;permanent&lt;/strong&gt; on existing clients. If you didn't flip it in time, you cannot toggle it on that client — you must create a brand-new OAuth Client ID and update every configuration that references the old one.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last date is the trap. This isn't a setting you can enable lazily the first time something breaks on November 12. After the cutoff, a missed flag means a new client ID, new consent screens, and re-wiring every n8n credential and MCP config that used the old one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 4-step n8n builder's checklist
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Inventory your Google OAuth clients.&lt;/strong&gt; Open Google Cloud console and list every OAuth Client ID under Auth Platform &amp;gt; Clients. Flag each one: is this credential used by an AI agent (an n8n AI Agent node, a workflow that acts on your behalf, an MCP client config) or by human-driven workflows? Builders commonly run both through a single client — that is exactly the pattern Google now wants split.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Enable the agentic flag on agent clients.&lt;/strong&gt; For each client that powers agent traffic, open it and tick &lt;strong&gt;"Use this client for an AI-powered agent"&lt;/strong&gt;. This is available today; do it now rather than in the November scramble. You should see the checkbox persist on the client detail page after saving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Split human and agent traffic into separate clients.&lt;/strong&gt; Google's updated guidance is explicit: one OAuth Client ID for human-interactive features, one for agent workflows. In n8n this means creating a second Google OAuth2 credential and assigning it only to the nodes/agents that act autonomously. If you're unsure which workflows qualify, treat anything that reads or writes Workspace data without a human clicking "run" each time as agent traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Watch your MCP configs.&lt;/strong&gt; If you connect n8n to Workspace MCP servers (see our guide to &lt;a href="https://dev.to/blog/how-to-connect-mcp-server-n8n/"&gt;connecting an MCP server to n8n&lt;/a&gt;), the OAuth credentials behind those connections are the ones the November 11 enforcement targets. Re-auth flows and client JSON files (like &lt;code&gt;mcp_config.json&lt;/code&gt; entries in coding-agent setups) must reference an agentic-tagged client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz6xqe3eg97rhrn10mf2w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz6xqe3eg97rhrn10mf2w.jpg" alt="A person working at a desk managing OAuth security settings" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does and doesn't affect
&lt;/h2&gt;

&lt;p&gt;To be precise about scope: the enforcement applies to Google Workspace &lt;strong&gt;MCP servers&lt;/strong&gt; — the new protocol surface, not the decades-old REST APIs behind n8n's standard Google nodes. If your workflows only use n8n's built-in Google Drive/Gmail nodes with plain REST calls, this deadline doesn't touch them. But the industry is moving: Google, Microsoft, and everyone else are converging on MCP as the agent protocol, and this is Google declaring that MCP access will be gated at the identity layer. If you plan to give agents live Workspace access via MCP — which is where agent builders are headed — this flag is your ticket.&lt;/p&gt;

&lt;p&gt;Two honest caveats. First, the granular rollout details come from secondary coverage (&lt;a href="https://astig.ph/google-workspace-oauth-agentic-setting-mcp-servers-2026/" rel="noopener noreferrer"&gt;ASTIG's Oct 2026 report&lt;/a&gt; and &lt;a href="https://pulse.appsscript.info/p/2026/10/mark-ai-agent-oauth-clients-as-agentic-for-google-workspace-mcp-by-november-11-2026/" rel="noopener noreferrer"&gt;Apps Script Pulse's Oct 14 analysis&lt;/a&gt;, which references Google's updated Manage OAuth Clients documentation). I have not read Google's own announcement page directly, so verify the checkbox wording in your own console before you act. Second, if you authenticate Google entirely through n8n's hosted OAuth service rather than your own Cloud project client, this may not apply to you at all — the flag lives on &lt;em&gt;your&lt;/em&gt; OAuth client IDs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google Workspace MCP servers reject non-agentic OAuth clients starting &lt;strong&gt;November 11, 2026&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;is_agentic&lt;/code&gt; flag locks permanently on &lt;strong&gt;November 12&lt;/strong&gt; — miss it and you're creating a new client ID from scratch.&lt;/li&gt;
&lt;li&gt;Keep &lt;strong&gt;separate OAuth Client IDs&lt;/strong&gt; for human vs. agent traffic; the flag grants no extra permissions, it just labels traffic for admin controls.&lt;/li&gt;
&lt;li&gt;Audit your n8n Google OAuth2 credentials and MCP configs now, not in November.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Next step:&lt;/strong&gt; Open your Google Cloud console's Auth Platform &amp;gt; Clients page today, find the client behind your most important n8n agent workflow, and tick "Use this client for an AI-powered agent". While you're there, read our &lt;a href="https://dev.to/blog/mcp-n8n-troubleshooting/"&gt;MCP + n8n troubleshooting guide&lt;/a&gt; for the OAuth re-auth patterns that pair with this change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqjg0pjk9667gkerq4yv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqjg0pjk9667gkerq4yv.jpg" alt="Security monitoring for AI agent OAuth traffic" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Pexels&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/google-workspace-agentic-oauth-november-deadline/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>googleworkspace</category>
      <category>oauth</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Archon's Agent Control API Has No Login and Listens on Every Interface: The CVE-2026-111322 Lockdown Guide</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Sun, 18 Oct 2026 08:29:55 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/archons-agent-control-api-has-no-login-and-listens-on-every-interface-the-cve-2026-111322-4dhm</link>
      <guid>https://dev.to/cortexflow_tech/archons-agent-control-api-has-no-login-and-listens-on-every-interface-the-cve-2026-111322-4dhm</guid>
      <description>&lt;p&gt;On October 15, 2026, VulnCheck published &lt;a href="https://www.vulncheck.com/advisories/archon-0.2.13-through-0.11.1-missing-authentication-via-api-control-api" rel="noopener noreferrer"&gt;CVE-2026-111322&lt;/a&gt; against Archon, the open-source workflow engine behind Claude Code, Codex, and Pi. The finding is brutally simple: in a default install, Archon's &lt;code&gt;/api/*&lt;/code&gt; control API has no authentication, and the server binds to &lt;code&gt;0.0.0.0&lt;/code&gt; — every network interface.&lt;/p&gt;

&lt;p&gt;That matters because this API is not a status page. It starts workflow runs, injects messages into agent conversations, and approves or rejects the actions your AI coding agent paused on for human review. Anyone on your network can do all of that with no credential. By the end of this guide you will have a locked-down Archon install — in about 10 minutes, with zero code changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Archon Is, in One Line
&lt;/h2&gt;

&lt;p&gt;Archon (23,700+ stars on GitHub) is an open-source engine that drives AI coding agents through YAML-defined development workflows. You run &lt;code&gt;archon serve&lt;/code&gt;, and a web console lets you watch the agent work, talk to it, and approve the actions it pauses on. That console talks to the HTTP control API at the center of this CVE.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Finding, Precisely
&lt;/h2&gt;

&lt;p&gt;Security researcher &lt;a href="https://hackmd.io/@hieuPenguinnn/archon-os-api-missing-authentication-default" rel="noopener noreferrer"&gt;hieuPenguinnn&lt;/a&gt; pinned the root cause to three facts in the Archon OS server package (reviewed at release tag &lt;code&gt;v0.11.1&lt;/code&gt;, published 2026-09-25):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The server binds to all interfaces by default.&lt;/strong&gt; &lt;code&gt;packages/server/src/index.ts&lt;/code&gt; sets the bind host to &lt;code&gt;process.env.HOST || '0.0.0.0'&lt;/code&gt;, and the shipped &lt;code&gt;.env.example&lt;/code&gt; confirms the default port is &lt;code&gt;3090&lt;/code&gt;. A default install is network-reachable on port 3090.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The API gate is disabled by default.&lt;/strong&gt; The &lt;code&gt;/api/*&lt;/code&gt; middleware only enforces authentication when &lt;code&gt;isApiGateEnabled()&lt;/code&gt; is true — which requires &lt;strong&gt;both&lt;/strong&gt; a Postgres &lt;code&gt;DATABASE_URL&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; a &lt;code&gt;BETTER_AUTH_SECRET&lt;/code&gt;. A default install uses SQLite and sets neither, so every request passes through with no identity check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The mutating routes are the agent control plane.&lt;/strong&gt; Behind that disabled gate: start workflow runs (&lt;code&gt;POST /api/workflows/{name}/run&lt;/code&gt;), inject conversation messages, approve/reject paused agent actions, and connect/disconnect provider keys.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The one-line version: anyone who can reach port 3090 on your machine can drive your AI coding agent.&lt;/strong&gt; The CVE carries CWE-306 (missing authentication for critical function) plus CWE-862, CVSS 9.8 (v3.1) / 9.3 (v4.0). Affected: versions &lt;code&gt;0.2.13&lt;/code&gt; through &lt;code&gt;0.11.1&lt;/code&gt;. As of October 16, 2026, the latest release is still &lt;code&gt;v0.11.1&lt;/code&gt; — there is no vendor patch and no published advisory.&lt;/p&gt;

&lt;p&gt;One honest caveat from the researcher's own writeup: he did &lt;strong&gt;not&lt;/strong&gt; establish direct remote code execution on the host from source review alone — the provider-key list route returns metadata only, and the damage a driven run can do depends on the workflows and agent configured. VulnCheck scores it 9.8 because the agent plane is reachable and these agents run commands. Treat it as critical either way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn8poygcmy5bp6h502q87.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn8poygcmy5bp6h502q87.jpeg" alt="A programmer typing code on a laptop, representing the AI coding agent running on the developer's machine" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The agent runs on your machine with your permissions. Its control plane should not be network-open.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SSH or terminal access to the machine running &lt;code&gt;archon serve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your Archon &lt;code&gt;.env&lt;/code&gt; file (or however you set its environment variables)&lt;/li&gt;
&lt;li&gt;About 10 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example terminology:&lt;/strong&gt; &lt;code&gt;&amp;lt;your-host&amp;gt;&lt;/code&gt; is the machine running Archon. Port &lt;code&gt;3090&lt;/code&gt; is the default from the shipped &lt;code&gt;.env.example&lt;/code&gt; — replace it if you changed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 - Check Whether You Are Affected
&lt;/h2&gt;

&lt;p&gt;Check your Archon version first. If it falls between &lt;code&gt;0.2.13&lt;/code&gt; and &lt;code&gt;0.11.1&lt;/code&gt; inclusive, you are running affected code:&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;# inside your Archon checkout or container&lt;/span&gt;
git describe &lt;span class="nt"&gt;--tags&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-m1&lt;/span&gt; &lt;span class="s1"&gt;'"version"'&lt;/span&gt; package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check your config. You are exposed when &lt;strong&gt;all three&lt;/strong&gt; are true: no &lt;code&gt;HOST&lt;/code&gt; set to &lt;code&gt;127.0.0.1&lt;/code&gt;, no Postgres &lt;code&gt;DATABASE_URL&lt;/code&gt;, and no &lt;code&gt;BETTER_AUTH_SECRET&lt;/code&gt;:&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="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'^(HOST|PORT|DATABASE_URL|BETTER_AUTH_SECRET)'&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Missing lines mean defaults apply: &lt;code&gt;HOST=0.0.0.0&lt;/code&gt;, SQLite, no auth. &lt;strong&gt;That is the vulnerable posture — and it is the shipped default.&lt;/strong&gt; (Note: this is a different defect from CVE-2025-69443, which concerned Archon's archived Python backend.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Check What the API Is Actually Bound To
&lt;/h2&gt;

&lt;p&gt;Do not trust the config file alone — check the listening socket:&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;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;3090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see one line. If it reads &lt;code&gt;0.0.0.0:3090&lt;/code&gt;, the control API is reachable from your entire network. If it reads &lt;code&gt;127.0.0.1:3090&lt;/code&gt;, the network reach is already gone and you can skip to Step 5.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; &lt;code&gt;localhost&lt;/code&gt; in a URL does not mean the server is loopback-only. Plenty of setups proxy through a tunnel while the underlying server still sits on &lt;code&gt;0.0.0.0&lt;/code&gt;. The &lt;code&gt;ss&lt;/code&gt; output is the ground truth.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3 - Bind the Server to Loopback
&lt;/h2&gt;

&lt;p&gt;This is the single highest-leverage fix. The shipped &lt;code&gt;.env.example&lt;/code&gt; documents it explicitly:&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;# HOST=0.0.0.0 # Bind address (default: 0.0.0.0). Set to 127.0.0.1 to restrict to localhost only.&lt;/span&gt;
&lt;span class="c"&gt;# PORT=3090 # Default: 3090.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set it in your &lt;code&gt;.env&lt;/code&gt; (create the file if you do not have one):&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="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the server, then re-run Step 2. You should now see &lt;code&gt;127.0.0.1:3090&lt;/code&gt; — other hosts on your network can no longer reach the API at all, even though the auth gate is still disabled. The researcher confirms this removes the network reach entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Block the Port at the Firewall
&lt;/h2&gt;

&lt;p&gt;Bind config is one layer; the firewall is the second. Deny inbound traffic to 3090 from anywhere except the local machine:&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;# Ubuntu/Debian with ufw&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw deny 3090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ufw deny 3090&lt;/code&gt; blocks inbound connections to that port from all interfaces. Loopback traffic from your own machine still reaches &lt;code&gt;127.0.0.1:3090&lt;/code&gt;, so the web console keeps working locally. If you run Archon in Docker with published ports, remove the &lt;code&gt;-p 3090:3090&lt;/code&gt; mapping and use &lt;code&gt;--network host&lt;/code&gt; or container-to-container networking instead — a published port re-opens the door the bind config just closed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 - If You Need Network Access, Enable Web Auth
&lt;/h2&gt;

&lt;p&gt;Only do this step if you genuinely need to reach Archon from other machines. The supported way to arm the auth gate is to set &lt;strong&gt;both&lt;/strong&gt; a Postgres database URL and a secret:&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="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;:5432/archon
&lt;span class="nv"&gt;BETTER_AUTH_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;generate-a-long-random-string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate the secret with &lt;code&gt;openssl rand -hex 32&lt;/code&gt; — never reuse one from another service. With both set, &lt;code&gt;isApiGateEnabled()&lt;/code&gt; returns true and the middleware enforces a 401 on non-allowlisted &lt;code&gt;/api/*&lt;/code&gt; routes. If that migration is too heavy right now, keep Step 3 and 4 and put a reverse proxy with basic auth in front of Archon instead. &lt;strong&gt;Never expose port 3090 directly to the internet or an untrusted network.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 - Verify Everything Works
&lt;/h2&gt;

&lt;p&gt;Three checks, in order:&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;# 1. Loopback still answers&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://127.0.0.1:3090/api/health

&lt;span class="c"&gt;# 2. Nothing listens on the external interface&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;3090   &lt;span class="c"&gt;# expect 127.0.0.1:3090 only&lt;/span&gt;

&lt;span class="c"&gt;# 3. The web console loads locally&lt;/span&gt;
&lt;span class="c"&gt;# open http://127.0.0.1:3090 in your browser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If check 1 succeeds and check 2 shows only the loopback line, the lockdown holds: the agent control plane is reachable from your machine and nowhere else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6cxoywncimuz8dhz4k7h.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6cxoywncimuz8dhz4k7h.jpeg" alt="Code on a dark screen, representing the control API that should stay off the network" width="500" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The fix is three lines of config and one firewall rule — not a patch, because none exists yet.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Am I safe if I only use Archon on my laptop?
&lt;/h3&gt;

&lt;p&gt;Probably — if nothing else on your network can reach it. "Probably" is not a control, though: run Step 2 and confirm &lt;code&gt;127.0.0.1:3090&lt;/code&gt;. Coffee-shop Wi-Fi and office LANs are exactly the networks where an open &lt;code&gt;0.0.0.0&lt;/code&gt; bind hurts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this the same as the old Archon Python CVE?
&lt;/h3&gt;

&lt;p&gt;No. CVE-2025-69443 concerned the archived Python backend. CVE-2026-111322 is in the TypeScript Archon OS server line — a separate defect in a separate codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Has Archon patched it?
&lt;/h3&gt;

&lt;p&gt;Not yet. As of October 16, 2026 there is no public advisory for this defect and the latest release (&lt;code&gt;v0.11.1&lt;/code&gt;, from September 25) is still affected. Watch the &lt;a href="https://github.com/coleam00/Archon" rel="noopener noreferrer"&gt;coleam00/Archon releases page&lt;/a&gt; for a version that changes the default bind host or adds auth — keep the lockdown until then.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does this affect n8n too?
&lt;/h3&gt;

&lt;p&gt;No — this is Archon-specific. But the pattern is worth auditing everywhere: any agent tool you run (&lt;code&gt;archon serve&lt;/code&gt;, local LLM servers, MCP servers) that binds &lt;code&gt;0.0.0.0&lt;/code&gt; by default is the same class of mistake. Grep your running services with &lt;code&gt;ss -tlnp&lt;/code&gt; and question every &lt;code&gt;0.0.0.0&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and What I Did Not Test
&lt;/h2&gt;

&lt;p&gt;I did not spin up Archon and execute requests against a live instance here — the findings above come from VulnCheck's advisory (October 15, 2026) and the researcher's pinned source review at &lt;code&gt;v0.11.1&lt;/code&gt;, both of which agree on the three root-cause facts. The mitigation steps are config-level and low-risk, but back up your &lt;code&gt;.env&lt;/code&gt; before editing. And this lockdown fixes the network reach — it does nothing about prompt injection, malicious plugins, or supply-chain attacks on the agent itself, which are separate problems with their own fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-111322 is a missing-authentication flaw (CVSS 9.8)&lt;/strong&gt; in Archon 0.2.13–0.11.1: the &lt;code&gt;/api/*&lt;/code&gt; control API has no login and binds to &lt;code&gt;0.0.0.0:3090&lt;/code&gt; by default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The shipped default is the vulnerable posture&lt;/strong&gt; — the auth gate only arms with both a Postgres &lt;code&gt;DATABASE_URL&lt;/code&gt; and a &lt;code&gt;BETTER_AUTH_SECRET&lt;/code&gt;, which a default SQLite install never sets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set &lt;code&gt;HOST=127.0.0.1&lt;/code&gt; and firewall port 3090&lt;/strong&gt; — two changes that remove the network reach entirely, verified with &lt;code&gt;ss -tlnp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No vendor patch exists as of October 16, 2026&lt;/strong&gt; — keep the lockdown until a release notes an auth fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit your other agent tools for the same pattern&lt;/strong&gt; — any local server binding &lt;code&gt;0.0.0.0&lt;/code&gt; by default is this bug waiting for a CVE number.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next step: if you run AI coding agents, read our &lt;a href="https://dev.to/blog/plugin4shell-zero-click-rce-ai-coding-agents/"&gt;Plugin4Shell breakdown&lt;/a&gt; — a separate zero-click flaw where a pinned plugin commit turned out to be a lie. And if you self-host n8n, our &lt;a href="https://dev.to/blog/censys-114000-exposed-n8n-hardening-checklist/"&gt;exposed-instances hardening checklist&lt;/a&gt; covers the same bind-and-expose pattern for automation infrastructure.&lt;/p&gt;




&lt;p&gt;Images: Pexels&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/archon-cve-2026-111322-lockdown/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>archon</category>
      <category>cve</category>
      <category>security</category>
      <category>aicodingagents</category>
    </item>
    <item>
      <title>Ni8mare: The CVSS 10.0 n8n Flaw That Turns a Webhook Into a Full Server Takeover</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Sat, 17 Oct 2026 08:29:59 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/ni8mare-the-cvss-100-n8n-flaw-that-turns-a-webhook-into-a-full-server-takeover-5fkf</link>
      <guid>https://dev.to/cortexflow_tech/ni8mare-the-cvss-100-n8n-flaw-that-turns-a-webhook-into-a-full-server-takeover-5fkf</guid>
      <description>&lt;p&gt;A vulnerability with the worst possible severity score is sitting in older n8n installs, and it needs no login to exploit. &lt;strong&gt;Ni8mare (CVE-2026-21858)&lt;/strong&gt; lets a remote, unauthenticated attacker send one specially crafted request to an n8n webhook and walk away with any file on the server — API keys, database contents, credentials, everything. Cyera's public write-up of the flaw has been circulating again this week, and the exposure numbers are ugly: the Shadowserver Foundation found nearly 60,000 internet-connected n8n instances still running vulnerable versions.&lt;/p&gt;

&lt;p&gt;By the end of this article you'll know exactly how Ni8mare works (in plain language), whether your instance is exposed, and how to patch it in about 15 minutes — plus what to check in case someone got there first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ni8mare actually is
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;webhook&lt;/strong&gt; is an HTTP endpoint n8n exposes so outside services can trigger your workflows — a form submission, a file upload, a payment event. A &lt;strong&gt;CVE&lt;/strong&gt; is the industry-wide catalog ID for a specific bug; &lt;strong&gt;CVSS 10.0&lt;/strong&gt; is the maximum severity rating, meaning the bug is remotely exploitable, needs no authentication, and can fully compromise the host.&lt;/p&gt;

&lt;p&gt;Ni8mare lives in how n8n parses incoming webhook data. n8n picks its parser based on the &lt;code&gt;Content-Type&lt;/code&gt; header of the request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;multipart/form-data&lt;/code&gt; → a special file-upload parser (the Formidable library), which stores uploaded files in temporary locations and populates &lt;code&gt;req.body.files&lt;/code&gt;. The temp-file indirection exists specifically to block path-traversal tricks.&lt;/li&gt;
&lt;li&gt;Anything else (e.g. &lt;code&gt;application/json&lt;/code&gt;) → the regular body parser, which populates &lt;code&gt;req.body&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bug: n8n's file-handling code reads from &lt;code&gt;req.body.files&lt;/code&gt; &lt;strong&gt;without verifying the request actually went through the upload parser&lt;/strong&gt;. So an attacker sends a request to a form/file-upload webhook with &lt;code&gt;Content-Type: application/json&lt;/code&gt; and a hand-built &lt;code&gt;files&lt;/code&gt; object — and n8n treats it as a legitimate parsed upload, including the attacker-supplied &lt;code&gt;filepath&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvd1tcgiowbb2b1zkehqz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvd1tcgiowbb2b1zkehqz.webp" alt="Terminal windows showing system diagnostics and log output on a monitor in a dark room" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How one webhook request becomes full server control
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Attacker finds a webhook that expects file uploads.&lt;/strong&gt; Any workflow with a Form node or file-upload webhook on an internet-reachable n8n instance qualifies. The webhook URL doesn't need to be secret — n8n webhook paths are often guessable or leaked in client-side code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They send a request with the wrong Content-Type.&lt;/strong&gt; Instead of &lt;code&gt;multipart/form-data&lt;/code&gt;, the request declares &lt;code&gt;application/json&lt;/code&gt; and includes a fake &lt;code&gt;files&lt;/code&gt; payload — with the &lt;code&gt;filepath&lt;/code&gt; field pointed at any file on the server, like &lt;code&gt;/proc/self/environ&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, or the SQLite database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n copies the "uploaded" file.&lt;/strong&gt; Since the upload parser never ran, the attacker-controlled filepath is used verbatim. Per Cyera's write-up, "instead of copying an uploaded file, we can copy any local file from the system" — and any node downstream of the form receives the local file's content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File read becomes full compromise.&lt;/strong&gt; Reading &lt;code&gt;database.sqlite&lt;/code&gt; or environment files yields the &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt; and every stored credential. Cyera notes the same primitive allows forging session cookies (authentication bypass), injecting files into workflows, and ultimately arbitrary code execution — full server takeover.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No account. No workflow access. One HTTP request to a public webhook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pbfc851rgr8suxi7xca.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pbfc851rgr8suxi7xca.webp" alt="A masked hacker at a workstation with glowing green code monitors" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the blast radius is massive
&lt;/h2&gt;

&lt;p&gt;n8n isn't a blog engine — it's the automation control plane. The workflows on a compromised instance typically hold OAuth tokens for Google Workspace and Salesforce, OpenAI API keys, database connection strings, and payment processor credentials. One server takeover hands an attacker every integration the business wired up.&lt;/p&gt;

&lt;p&gt;The numbers, all as reported this month:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100M+ Docker pulls&lt;/strong&gt; of n8n; Cyera estimates ~100,000 servers potentially exposed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nearly 60,000 internet-connected instances still vulnerable&lt;/strong&gt;, per the Shadowserver Foundation's scan data (reported by TechRadar in September 2026).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;76% of exposed n8n instances run versions with known critical CVEs&lt;/strong&gt;, per Censys's October 2026 State of the Internet report — we covered that count in our &lt;a href="https://dev.to/blog/censys-114000-exposed-n8n-hardening-checklist/"&gt;exposed-n8n hardening checklist&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ni8mare was reported to n8n's security team on November 9 and patched nine days later in &lt;strong&gt;n8n 1.121.0&lt;/strong&gt;. So the fix has existed for almost a year — the exposed instances are simply instances nobody updated. There are no official workarounds; patching is the only remediation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are you exposed?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your setup&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;n8n Cloud&lt;/td&gt;
&lt;td&gt;Safe — n8n patched Cloud instances automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted n8n &lt;strong&gt;1.121.0 or later&lt;/strong&gt; (any 1.x above it, or the 2.x line)&lt;/td&gt;
&lt;td&gt;Safe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted n8n &lt;strong&gt;below 1.121.0&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Vulnerable&lt;/strong&gt; — patch now&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted below 1.121.0 &lt;strong&gt;and internet-exposed&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Vulnerable and reachable&lt;/strong&gt; — treat as urgent, assume probing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: the 2.x release line postdates this fix, so if you already run 2.x you're on the patched code path. But versions and advisories rot fast — if you're unsure, the check in Step 1 takes ten seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; SSH or console access to the machine running n8n, your &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt; value saved somewhere safe, and about 15 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 - Check your n8n version
&lt;/h2&gt;

&lt;p&gt;In the n8n editor, open &lt;strong&gt;Settings → About&lt;/strong&gt; — it shows the exact build. Or from the host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;n8n-container-name&amp;gt; n8n &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;n8n-container-name&amp;gt;&lt;/code&gt; with your container's name (often &lt;code&gt;n8n&lt;/code&gt;). You should see something like &lt;code&gt;1.121.0&lt;/code&gt;, &lt;code&gt;1.123.83&lt;/code&gt;, or &lt;code&gt;2.x.x&lt;/code&gt;. Anything below &lt;code&gt;1.121.0&lt;/code&gt; is in the vulnerable range — and honestly, if you're still on the 1.12x line at all, you should move to the current stable anyway (the October 2026 advisory batch alone patched 14 more advisories, covered in our &lt;a href="https://dev.to/blog/n8n-october-2026-security-update/"&gt;October security update post&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Back up before you touch anything
&lt;/h2&gt;

&lt;p&gt;Upgrading is low-risk, but a backup makes it zero-risk. Export your workflows from the editor (⋮ menu → Export), and copy your database — the default SQLite file, or a &lt;code&gt;pg_dump&lt;/code&gt; if you run Postgres.&lt;/p&gt;

&lt;p&gt;The critical one: &lt;strong&gt;confirm your &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt; value is saved somewhere off the server.&lt;/strong&gt; Without the exact same key, a restored instance cannot decrypt any stored credential, and every credential becomes unusable. I treat this as step zero of every upgrade.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; if your instance was internet-exposed on a vulnerable version, back up &lt;em&gt;first&lt;/em&gt;, but also plan to rotate secrets after patching (Step 4) — a backup preserves your data, it doesn't undo a compromise that already happened.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3 - Upgrade to the patched version
&lt;/h2&gt;

&lt;p&gt;For the common Docker Compose install:&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;# 1. Pull the patched image&lt;/span&gt;
docker compose pull n8n

&lt;span class="c"&gt;# 2. Recreate the container with the new image&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# 3. Watch the logs for a clean startup&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why these commands: &lt;code&gt;pull&lt;/code&gt; fetches the fixed image, &lt;code&gt;up -d&lt;/code&gt; recreates the container on it, and the logs confirm the database migrations ran without errors. You should see &lt;code&gt;n8n ready on 0.0.0.0, port 5678&lt;/code&gt; with no migration failures.&lt;/p&gt;

&lt;p&gt;Pin to a fixed version tag rather than &lt;code&gt;latest&lt;/code&gt; in your &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;n8n&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;n8nio/n8n:1.123.83&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything at or above &lt;code&gt;1.121.0&lt;/code&gt; closes Ni8mare; pinning the current stable (1.123.83 on the 1.x line, or the 2.x line) also picks up every advisory since. If you installed via npm:&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;# Stop the running process first (systemd/pm2/however you run it)&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; n8n@1.123.83
&lt;span class="c"&gt;# then start it again&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify in &lt;strong&gt;Settings → About&lt;/strong&gt; that the running version is at or above &lt;code&gt;1.121.0&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Check whether someone got there first
&lt;/h2&gt;

&lt;p&gt;If your instance was both vulnerable &lt;em&gt;and&lt;/em&gt; internet-reachable, patching closes the hole but doesn't erase a break-in. Work through these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scan your own exposure.&lt;/strong&gt; Check whether your instance's IP appears in Shadowserver or Censys scan data for vulnerable n8n versions. If it was fingerprinted, assume it was probed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review webhook access logs.&lt;/strong&gt; Look for requests to your webhook endpoints with unusual &lt;code&gt;Content-Type&lt;/code&gt; headers (&lt;code&gt;application/json&lt;/code&gt; hitting form/file-upload paths) or requests that don't match any legitimate integration. One anomalous hit to a file-upload webhook is the signature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate your secrets.&lt;/strong&gt; If there is any chance of compromise, rotate the &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt;, every API key and OAuth credential stored in n8n, and any database passwords the instance could reach. A file-read bug means the attacker may hold a copy of everything — changing the locks after patching is the only way to be sure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit user sessions.&lt;/strong&gt; Check for unfamiliar owner/admin accounts or unexpected workflow changes — the file-read primitive can escalate to session forgery.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want this as a repeatable routine, our free &lt;a href="https://dev.to/templates/n8n-security-advisory-triage/"&gt;n8n security advisory triage template&lt;/a&gt; walks through the same pattern — inventory your version, check it against the advisory list, and run the post-patch verification — as an actual workflow you can import.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this article doesn't cover (honest limits)
&lt;/h2&gt;

&lt;p&gt;I did not test the exploit against a live instance — reproducing a CVSS 10.0 unauthenticated RCE would be reckless, and Cyera's write-up contains the technical detail if you need it for a compliance report. I also can't confirm whether Ni8mare was exploited in the wild before or after the patch; neither n8n nor Cyera has published exploitation data. The exposure counts come from third-party internet scans (Shadowserver via TechRadar, Censys), which measure &lt;em&gt;vulnerable&lt;/em&gt; instances, not &lt;em&gt;compromised&lt;/em&gt; ones. Patch first, investigate logs second.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Am I affected if I only use n8n Cloud?
&lt;/h3&gt;

&lt;p&gt;No. n8n Cloud instances were patched automatically. This is a self-hosted problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  I run 2.x — do I need to do anything?
&lt;/h3&gt;

&lt;p&gt;The Ni8mare fix predates the 2.x line, so 2.x installs already contain it. But use this as the prompt to check you're on a current 2.x — the October 2026 advisory batch patched 14 more advisories on top.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a workaround if I can't upgrade right now?
&lt;/h3&gt;

&lt;p&gt;No official workaround exists for Ni8mare. The closest mitigation is removing internet exposure: put n8n behind a VPN or firewall so webhook endpoints aren't publicly reachable. That shrinks who can knock, but patching is the actual fix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where are the full advisory details?
&lt;/h3&gt;

&lt;p&gt;On the &lt;a href="https://github.com/n8n-io/n8n/security/advisories" rel="noopener noreferrer"&gt;n8n GitHub Security Advisories page&lt;/a&gt; and Cyera's research write-up (linked from the Infosecurity Magazine coverage). The original report to n8n's security team was November 9; the fix shipped nine days later in 1.121.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ni8mare (CVE-2026-21858) is a CVSS 10.0 unauthenticated RCE in n8n&lt;/strong&gt; — one crafted webhook request can read any file on the server, forging sessions and escalating to full takeover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The fix is n8n 1.121.0 or later&lt;/strong&gt; — nearly 60,000 internet-connected instances are still unpatched, which is why this still matters a year later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no workaround&lt;/strong&gt; — patch, or at minimum pull the instance off the public internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you were exposed, rotate everything&lt;/strong&gt; — a file-read bug means stored secrets may already be copied; changing keys after patching is the real remediation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next: run the 4-step check above, then grab the &lt;a href="https://dev.to/templates/n8n-security-advisory-triage/"&gt;n8n security advisory triage template&lt;/a&gt; to make version checks a repeatable routine instead of a panic.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Pexels&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/ni8mare-n8n-cve-2026-21858-patch-guide/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>security</category>
      <category>cve</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>Your LLM Gateway Holds Every API Key. LiteLLM Let Any User Steal Them: CVE-2026-35029 Patch Guide</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Fri, 16 Oct 2026 08:29:55 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/your-llm-gateway-holds-every-api-key-litellm-let-any-user-steal-them-cve-2026-35029-patch-guide-47lf</link>
      <guid>https://dev.to/cortexflow_tech/your-llm-gateway-holds-every-api-key-litellm-let-any-user-steal-them-cve-2026-35029-patch-guide-47lf</guid>
      <description>&lt;p&gt;LiteLLM is the open-source LLM gateway that roughly 100,000 developers download every month to route their apps through OpenAI, Anthropic, Google, and every other model provider. Check Point's AI agent security team found two vulnerabilities in it that collapse its entire security model: a missing authorization check that lets &lt;em&gt;any&lt;/em&gt; user become an admin and run code (CVE-2026-35029), and a server-side request forgery flaw that exposes every provider API key stored in the gateway (CVE-2026-59823). Both are fixed in LiteLLM 1.83.9. If you run LiteLLM — especially in front of your n8n AI agents — this post gives you the four-step check, patch, rotate, and audit procedure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the two CVEs actually do
&lt;/h2&gt;

&lt;p&gt;An LLM gateway sits between your application and the model providers. Instead of each workflow calling OpenAI's API directly, everything routes through the gateway, which forwards requests to the right backend. LiteLLM is exactly that: a proxy that centralizes credentials, logging, and usage tracking. That centralization is the point — and it's exactly what makes these flaws dangerous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-35029 is a missing authorization check.&lt;/strong&gt; Authorization is the part of security that answers "is this user &lt;em&gt;allowed&lt;/em&gt; to do this?" LiteLLM's runtime configuration endpoint was missing that check, so any authenticated user — even one with the lowest privilege role — could modify the gateway's runtime configuration. Per Check Point's findings, that turns into full system takeover: file access, credential theft, and remote code execution via malicious Python modules loaded from cloud storage. Mateo Rojas-Carulla, Check Point's head of research for AI agent security, put it bluntly: anyone holding an account on a vulnerable deployment could take over the gateway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-59823 is a server-side request forgery (SSRF) flaw.&lt;/strong&gt; SSRF is when an attacker tricks &lt;em&gt;your&lt;/em&gt; server into making a network request of &lt;em&gt;their&lt;/em&gt; choosing. Here, it lets an attacker redirect the gateway's outbound requests — which means the requests that carry your OpenAI, Anthropic, and Google API keys — toward an attacker-controlled destination. The keys that were supposed to be the most centralized, protected secret in your AI stack get handed over.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnvmak7svrdh9sgk5yjvt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnvmak7svrdh9sgk5yjvt.jpg" alt="White server racks in a data center corridor — every model request through your LiteLLM gateway travels infrastructure like this, and these flaws let an attacker ride along" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check Point disclosed both through the coordinated disclosure process, and LiteLLM shipped the fixes in version 1.83.9 — anything older than 1.83.9 is affected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why agent builders should care
&lt;/h2&gt;

&lt;p&gt;If you self-host n8n, there's a good chance LiteLLM sits in your stack: it's the natural way to give all your AI Agent nodes one OpenAI-compatible endpoint, with fallbacks, load balancing, and a single bill. The danger here is the blast radius math. A compromised LLM gateway isn't one leaked key — it's &lt;em&gt;every&lt;/em&gt; key: OpenAI, Anthropic, Gemini, and whatever else you've configured. And unlike a leaked key that an attacker quietly uses, a gateway takeover is a standing foothold: the attacker can execute code on the host, read files, and pivot further.&lt;/p&gt;

&lt;p&gt;Christopher Jess, senior R&amp;amp;D manager at Black Duck, noted the pattern is painfully familiar: a missing permission check let low-privileged users reach administrative functions, with code execution as the consequence. As AI adoption accelerates, he warned, security fundamentals are being treated as secondary — and a gateway that centralizes all your AI access is a particularly valuable target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The one-line takeaway: the box holding all your model API keys let any of its users pick the lock and walk out with the whole ring.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shell access to wherever LiteLLM runs (Docker host, VPS, or the machine with &lt;code&gt;pip install litellm&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Your LiteLLM version number (Step 1 shows you how)&lt;/li&gt;
&lt;li&gt;Admin access to your LiteLLM UI and your AI provider dashboards (to rotate keys)&lt;/li&gt;
&lt;li&gt;Permission to restart the gateway container or process&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 - Check your LiteLLM version
&lt;/h2&gt;

&lt;p&gt;The vulnerabilities affect every LiteLLM version &lt;strong&gt;older than 1.83.9&lt;/strong&gt;. Find your running version first.&lt;/p&gt;

&lt;p&gt;If you run LiteLLM in Docker, exec into the container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;your-litellm-container&amp;gt; pip show litellm 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"Name|Version"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or check from the host if you installed with pip:&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 litellm | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"Name|Version"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a &lt;code&gt;Version:&lt;/code&gt; line like &lt;code&gt;Version: 1.83.9&lt;/code&gt;. &lt;strong&gt;Anything below 1.83.9 is vulnerable — proceed to Step 2 immediately.&lt;/strong&gt; If you're on 1.83.9 or later, the fixes are in; skip to Step 4 and still do the audit, because the flaws were live in your version history if you ever ran an older build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Upgrade to LiteLLM 1.83.9 or later
&lt;/h2&gt;

&lt;p&gt;Pull and restart with the fixed release. For Docker Compose installs:&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="nb"&gt;cd&lt;/span&gt; /path/to/your/litellm-compose
docker compose pull
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;your-litellm-container&amp;gt; pip show litellm | &lt;span class="nb"&gt;grep &lt;/span&gt;Version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;pip show&lt;/code&gt; output must read &lt;code&gt;1.83.9&lt;/code&gt; or higher. For pip installs, upgrade in place:&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="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="s2"&gt;"litellm&amp;gt;=1.83.9"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the LiteLLM process afterward — the fix is in the application code, so a running old process stays vulnerable until restarted.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; upgrading doesn't erase what already happened. If your gateway was reachable by accounts you don't fully trust, treat key rotation in Step 3 as mandatory, not optional.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3 - Rotate every provider API key stored in the gateway
&lt;/h2&gt;

&lt;p&gt;CVE-2026-59823 exposes the API keys LiteLLM stores. Rotating means generating a brand-new key at the provider and replacing the old one everywhere the gateway reads it, so any stolen copy stops working.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In each provider dashboard (OpenAI, Anthropic, Google AI, and any others configured), generate a new API key.&lt;/li&gt;
&lt;li&gt;Update the environment variables or config file LiteLLM reads — typically &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;, &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;, &lt;code&gt;GEMINI_API_KEY&lt;/code&gt;, and friends in your &lt;code&gt;.env&lt;/code&gt; or Docker Compose file.&lt;/li&gt;
&lt;li&gt;Revoke the old keys at the provider so they can't be used if they were exfiltrated.&lt;/li&gt;
&lt;li&gt;Restart the gateway so it picks up the new values.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verify the old keys are dead by checking your provider dashboards: the revoked keys should show as inactive or deleted, and your LiteLLM health endpoint should still respond normally with the new keys in place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjitqf6vq3fs6vtz6cu4y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjitqf6vq3fs6vtz6cu4y.jpg" alt="Developer typing code on a laptop — rotating API keys and verifying the gateway after the upgrade" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Audit accounts and verify permissions are actually enforced
&lt;/h2&gt;

&lt;p&gt;Check Point's explicit recommendation applies here: since &lt;em&gt;any&lt;/em&gt; account could have exploited these flaws, review who has gateway access and remove accounts that no longer need it. In the LiteLLM UI, list users and their roles, and prune anything stale — former teammates, test accounts, shared credentials.&lt;/p&gt;

&lt;p&gt;Then do the permission check that would have caught this bug: log in as a low-privilege user and try to reach an admin-only endpoint (the runtime config modification path is the one to test). If a low-privilege account can change anything admin-scoped, your role enforcement still has a gap — the fix closed these two CVEs, but the discipline of verifying permissions in practice is what keeps the next missing check from hurting you.&lt;/p&gt;

&lt;p&gt;Finally, add the gateway to your security routine: include LiteLLM in your regular vulnerability scans and penetration tests alongside your web apps and cloud infra. Gateways are high-value targets precisely because they centralize secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard cases and limits
&lt;/h2&gt;

&lt;p&gt;This guide covers the reported, patched CVEs only. It does not audit your LiteLLM deployment for other misconfigurations — open admin UI to the internet, default credentials, overly broad key scopes. If your gateway was internet-facing, assume broader exposure and review access logs for unusual config changes around the disclosure window (Check Point's detailed post went out October 13, 2026). There is no published workaround that avoids the upgrade; patching is the only fix.&lt;/p&gt;

&lt;p&gt;I also haven't verified LiteLLM's exact endpoint paths for the vulnerable calls — use the official advisory and your version's behavior as the source of truth, not this post, for the specific API routes in your environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Am I affected if I only use LiteLLM's Python SDK, not the proxy server?
&lt;/h3&gt;

&lt;p&gt;The disclosed flaws target the LiteLLM proxy/gateway server, which serves multiple users and stores provider keys. A local SDK-only setup that never exposes a server to other users is not the attack scenario described — but if you run the proxy at all, check your version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do these flaws affect n8n's built-in AI nodes directly?
&lt;/h3&gt;

&lt;p&gt;No. They affect LiteLLM itself. But if your n8n workflows point at a self-hosted LiteLLM endpoint, every model call your agents make flows through the vulnerable component — which is why this is an n8n-builder problem too.&lt;/p&gt;

&lt;h3&gt;
  
  
  Was there active exploitation before the patch?
&lt;/h3&gt;

&lt;p&gt;Neither Check Point's report nor the coverage I've seen confirms in-the-wild exploitation. That said, the details were published October 13, 2026, and exploitability is trivial for any account holder — the safe assumption is that exposed instances are being probed now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM before 1.83.9 is vulnerable to two serious flaws&lt;/strong&gt;: CVE-2026-35029 (missing authz → any user to admin + RCE) and CVE-2026-59823 (SSRF → every provider API key exposed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade to 1.83.9 or later immediately&lt;/strong&gt;, then restart the gateway — the running process stays vulnerable until it restarts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate every provider API key&lt;/strong&gt; the gateway stored; revoking the old ones at the provider is what actually kills a stolen key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prune gateway accounts and test permissions as a low-privilege user&lt;/strong&gt; — the gap between configured and enforced permissions is where this class of bug lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat AI gateways as high-value targets&lt;/strong&gt; in your security routine: they hold the keys to everything your agents do.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next: if your LiteLLM is internet-facing, review its access logs for config changes made by unexpected accounts around mid-October. And while you're in the gateway's settings, check that the admin UI isn't reachable from the public internet at all — that's a separate exposure these CVEs didn't need, but it's the next one attackers will try.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://www.infosecurity-magazine.com/news/high-risk-vulnerabilities-llm-tool/" rel="noopener noreferrer"&gt;Infosecurity Magazine&lt;/a&gt; (reporting Check Point's disclosure, Oct 15, 2026).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Pexels (free license).&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/litellm-missing-auth-rce-cve-patch-guide/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cve</category>
      <category>litellm</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Censys Counted 114,000 Exposed n8n Instances: Your Self-Hosted Hardening Checklist</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Thu, 15 Oct 2026 08:29:56 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/censys-counted-114000-exposed-n8n-instances-your-self-hosted-hardening-checklist-ck5</link>
      <guid>https://dev.to/cortexflow_tech/censys-counted-114000-exposed-n8n-instances-your-self-hosted-hardening-checklist-ck5</guid>
      <description>&lt;p&gt;Censys published its fifth annual State of the Internet Report yesterday (October 14, 2026), and the headline number for our corner of the internet is uncomfortable: &lt;strong&gt;n8n is the single most widely exposed AI product on the public internet — 113,926 hosts and counting.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exposed AI infrastructure grew 63% in nine months (from October 2025 to July 2026), reaching nearly 268,000 systems, according to the Censys Advanced Research Collective's analysis of the Censys Internet Map. These are not just chatbots — they are the behind-the-scenes tools connecting AI to data, applications, and user accounts. And the worst stat: among n8n hosts with parseable versions, &lt;strong&gt;76% were running a version within the affected range of at least one recent critical vulnerability.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you self-host n8n, this post is for you. By the end, you will have run through a six-step checklist that takes your instance from "probably on the list" to "hardened" — most of it in under an hour.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the report actually says
&lt;/h2&gt;

&lt;p&gt;The numbers that matter for n8n builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n: ~114,000 exposed hosts&lt;/strong&gt;, the most exposed AI product measured. Second place is OpenClaw (~54,000), the personal AI agent assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where they live:&lt;/strong&gt; the US (62,687), China (42,511), and Germany (31,222) account for just over half of all exposed AI infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patch posture is the killer:&lt;/strong&gt; 76% of n8n instances with a detectable version were vulnerable to at least one recent critical flaw. Exposure is bad; unpatched exposure is the whole ballgame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonus finding that breaks a common habit:&lt;/strong&gt; 68% of exposed HTTP(S) services and 34% of SSH services sat on &lt;strong&gt;non-standard ports&lt;/strong&gt;. Running n8n on port 5679 instead of 5678 does not hide you from internet-wide scanners — it just annoys your team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Censys also found roughly 134,000 internet-exposed hosts running industrial control systems (ICS), with about 70% on consumer and mobile networks — a reminder that "exposed by accident" is the default failure mode of the modern internet, not a rare event.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://www.prnewswire.com/news-releases/censys-2026-state-of-the-internet-report-finds-exposed-ai-infrastructure-grew-63-in-nine-months-302908111.html" rel="noopener noreferrer"&gt;Censys 2026 State of the Internet Report&lt;/a&gt; (released October 14, 2026), with n8n-specific figures summarized in &lt;a href="https://cyber.hendryadrian.com/article/3184/censys-report-highlights-internet-exposure-blind-spots-in-ai-ics-and-legacy-software" rel="noopener noreferrer"&gt;this independent breakdown&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7os4xtepzu5k4jwinl97.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7os4xtepzu5k4jwinl97.jpg" alt="Rows of server racks in a data center aisle, the kind of infrastructure the Censys report scans" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Censys continuously scans the entire internet — if your n8n answers on a public IP, it is almost certainly in their data.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SSH access to the machine running your n8n instance.&lt;/li&gt;
&lt;li&gt;Your n8n is self-hosted (Docker, npm, or a VPS install). n8n Cloud users: most of this is handled for you — skip to Step 4 for the version check.&lt;/li&gt;
&lt;li&gt;A domain name pointing at your server (needed for the TLS step). No domain yet? Do Step 5's VPN approach instead and get the domain later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Terminology:&lt;/strong&gt; &lt;code&gt;&amp;lt;your-domain&amp;gt;&lt;/code&gt; = your server's public domain (e.g. &lt;code&gt;n8n.example.com&lt;/code&gt;). &lt;code&gt;&amp;lt;your-port&amp;gt;&lt;/code&gt; = the port n8n listens on (default &lt;code&gt;5678&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 - Check whether you are exposed
&lt;/h2&gt;

&lt;p&gt;Before changing anything, confirm your current exposure. Two free checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Censys itself:&lt;/strong&gt; go to &lt;a href="https://search.censys.io" rel="noopener noreferrer"&gt;search.censys.io&lt;/a&gt;, create a free account, and search for your server's public IP or domain. If your n8n login page shows up, scanners have you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From your own terminal&lt;/strong&gt;, see what your server answers on the open internet:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run from a machine OUTSIDE your network (not from the server itself)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; http://&amp;lt;your-domain&amp;gt;:&amp;lt;your-port&amp;gt;/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;200&lt;/code&gt; with an n8n login page means anyone on the internet can reach your editor. A connection timeout means you are already firewalled — skip ahead to Step 4 for the patch check.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; if Step 1 showed your editor is reachable AND you have no login configured (Step 2), treat this as urgent — anyone can open your workflows, read your credentials store entries, and execute workflows against your connected accounts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 2 - Turn on authentication (or verify yours works)
&lt;/h2&gt;

&lt;p&gt;n8n self-hosted instances should never serve the editor without a login. If you can open your editor in an incognito window without being asked for credentials, fix this now.&lt;/p&gt;

&lt;p&gt;For a Docker Compose install, add to your &lt;code&gt;docker-compose.yml&lt;/code&gt; (or &lt;code&gt;.env&lt;/code&gt; file):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_ACTIVE=true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_USER=&amp;lt;your-username&amp;gt;&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_PASSWORD=&amp;lt;a-long-random-password&amp;gt;&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BLOCK_ENV_ACCESS_IN_NODE=true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why each key matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;N8N_BASIC_AUTH_ACTIVE&lt;/code&gt; / &lt;code&gt;N8N_BASIC_AUTH_USER&lt;/code&gt; / &lt;code&gt;N8N_BASIC_AUTH_PASSWORD&lt;/code&gt; — forces a username/password prompt on the editor. This is the single highest-value change on this list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;N8N_BLOCK_ENV_ACCESS_IN_NODE=true&lt;/code&gt; — stops Code and Execute nodes from reading your process environment variables (where API keys and secrets often live). Enabled by default in recent n8n versions; set it explicitly so an upgrade never silently relaxes it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recreate the container (&lt;code&gt;docker compose up -d&lt;/code&gt;), then open the editor in an incognito window. &lt;strong&gt;You should see a login prompt.&lt;/strong&gt; If you don't, the variables didn't take — check for typos and that you edited the right compose file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 - Put a reverse proxy with TLS in front
&lt;/h2&gt;

&lt;p&gt;Exposed HTTP on port 5678 means login credentials travel in cleartext. Caddy is the fastest way to fix this — it fetches a free Let's Encrypt certificate automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;n8n.&amp;lt;your-domain&amp;gt; {
    reverse_proxy localhost:&amp;lt;your-port&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole file for the common case. Point your DNS at the server, run &lt;code&gt;caddy run&lt;/code&gt;, and &lt;code&gt;https://n8n.&amp;lt;your-domain&amp;gt;&lt;/code&gt; gets a valid certificate within a minute. Then close port &lt;code&gt;&amp;lt;your-port&amp;gt;&lt;/code&gt; to the internet in your firewall — the proxy is the only thing that should talk to n8n directly:&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="nb"&gt;sudo &lt;/span&gt;ufw deny &amp;lt;your-port&amp;gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 80,443/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see: port scan of your server shows only 80/443 open, and &lt;code&gt;https://&lt;/code&gt; loads n8n with a valid certificate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Patch n8n now (the 76% step)
&lt;/h2&gt;

&lt;p&gt;This is the step the report is really about. Three out of four exposed n8n instances were running versions with known critical vulnerabilities — and the n8n &lt;a href="https://cortexflow.tech/blog/n8n-october-2026-security-update/" rel="noopener noreferrer"&gt;October 2026 security update&lt;/a&gt; alone patched 14 advisories. Check your version in the n8n UI (bottom-left, Settings) and compare against the latest release:&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;# Docker Compose install: pull and restart with the latest stable image&lt;/span&gt;
docker compose pull n8n
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; n8n
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;n8n-container-name&amp;gt; n8n &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a version matching the current release line (2.43.x as of October 15, 2026 — verify against &lt;a href="https://github.com/n8n-io/n8n/releases" rel="noopener noreferrer"&gt;n8n's releases page&lt;/a&gt;). Then re-check Censys or the UI: your version should no longer fall in any advisory's affected range.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h31rb1ip1oj39onq2jc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h31rb1ip1oj39onq2jc.jpg" alt="A person typing on a laptop in a dark room — attackers automate scanning for unpatched instances" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Unpatched instances get found by automation, not by humans picking targets. Patching removes you from the easy list.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; if you still run n8n via npm or npx, this is your deadline pressure too — &lt;a href="https://cortexflow.tech/blog/n8n-npm-to-docker-migration/" rel="noopener noreferrer"&gt;n8n 3.0 drops npm/npx installs entirely&lt;/a&gt;. Migrate to Docker first, then patch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 5 - Shrink the attack surface: firewall + editor access
&lt;/h2&gt;

&lt;p&gt;Even patched and logged-in, an editor facing the whole internet is a standing invitation to password-spraying bots. Pick one:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A — IP allowlist (simplest).&lt;/strong&gt; In your reverse proxy, only allow your office/home IPs on the editor paths, while leaving &lt;code&gt;/webhook/*&lt;/code&gt; paths open for integrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# nginx example: editor locked down, webhooks public&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;allow&lt;/span&gt; &lt;span class="mf"&gt;203.0&lt;/span&gt;&lt;span class="s"&gt;.113.0/24&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# your office IP range&lt;/span&gt;
    &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:&amp;lt;your-port&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/webhook/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:&amp;lt;your-port&amp;gt;&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;&lt;strong&gt;Option B — VPN only (strongest).&lt;/strong&gt; Put the editor behind Tailscale or WireGuard and expose &lt;em&gt;only&lt;/em&gt; webhook URLs publicly. Nothing on the internet can even start a login attempt.&lt;/p&gt;

&lt;p&gt;Remember the report's non-standard-port finding: changing the port is not a defense. Scanners enumerate all 65,535 ports. Authentication, TLS, patching, and network restriction are defenses; obscurity is decoration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 - Verify everything and schedule the next check
&lt;/h2&gt;

&lt;p&gt;Run this final pass and set a calendar reminder:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Incognito window: editor requires login — confirmed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl&lt;/code&gt; from outside: only 443 answers; direct port is refused — confirmed.&lt;/li&gt;
&lt;li&gt;n8n version matches the current release line — confirmed.&lt;/li&gt;
&lt;li&gt;Search your domain on Censys again in 48 hours — your instance should show the updated version, or nothing at all if you went VPN-only.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then make it recurring: subscribe to &lt;a href="https://docs.n8n.io/hosting/security/" rel="noopener noreferrer"&gt;n8n's security advisories&lt;/a&gt; and re-run this checklist quarterly. The Censys trend line is one direction — exposure grew 63% in nine months — so "set and forget" is how instances end up in next year's report.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is my n8n really at risk if I only use it for personal automations?
&lt;/h3&gt;

&lt;p&gt;Yes — arguably more. Personal instances tend to run older versions with weaker passwords, and they hold the same credentials (Gmail, Stripe, GitHub) an attacker wants. The 76%-unpatched figure includes exactly these installs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does n8n Cloud have this problem?
&lt;/h3&gt;

&lt;p&gt;No. Cloud instances sit behind n8n's own hardened infrastructure with forced authentication. This checklist is for self-hosted instances — Docker, npm, or bare VPS installs.&lt;/p&gt;

&lt;h3&gt;
  
  
  I use a non-standard port. Am I safe?
&lt;/h3&gt;

&lt;p&gt;No. Censys's report explicitly found most exposed services on non-standard ports — 68% of HTTP(S) and 34% of SSH. Scanners do not care about your port number.&lt;/p&gt;

&lt;h3&gt;
  
  
  How often should I update n8n?
&lt;/h3&gt;

&lt;p&gt;At minimum, within days of any security advisory. n8n ships advisories through its docs and the October 2026 batch had 14 of them. A quarterly calendar reminder is the floor; same-week patching for security releases is the goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Censys's October 14 report names n8n the most exposed AI product on the internet&lt;/strong&gt; — ~114,000 hosts, with 76% of version-detectable instances running vulnerable versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The fix is four layers, not one:&lt;/strong&gt; forced authentication, TLS via reverse proxy, current patched version, and network restriction (firewall/VPN/IP allowlist).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-standard ports are not security&lt;/strong&gt; — the report proves scanners find them routinely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patching is the highest-leverage step&lt;/strong&gt; — exposure plus a known CVE is what turns a scan result into a breach.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next: run Step 1 right now — it takes two minutes and tells you which half of this checklist is urgent for you. Then read our &lt;a href="https://cortexflow.tech/blog/n8n-october-2026-security-update/" rel="noopener noreferrer"&gt;n8n October 2026 security update&lt;/a&gt; to see exactly which 14 advisories your patch covers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Pexels&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/censys-114000-exposed-n8n-hardening-checklist/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>security</category>
      <category>selfhosted</category>
      <category>hardening</category>
    </item>
    <item>
      <title>Ruflo: The Open-Source Meta-Harness Running 100-Agent Coding Swarms</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Wed, 14 Oct 2026 08:30:03 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/ruflo-the-open-source-meta-harness-running-100-agent-coding-swarms-3609</link>
      <guid>https://dev.to/cortexflow_tech/ruflo-the-open-source-meta-harness-running-100-agent-coding-swarms-3609</guid>
      <description>&lt;p&gt;What if you gave an AI agent a &lt;em&gt;mission&lt;/em&gt; instead of a &lt;em&gt;task&lt;/em&gt; — and it came back with researched code, passing tests, a security review, and a record of what everything cost? On October 13, 2026, Cognitum One released the latest version of &lt;strong&gt;Ruflo&lt;/strong&gt;, the open-source "meta-harness" that turns one coding assistant (Claude Code, OpenAI Codex, or any MCP client) into a coordinated swarm of 100+ specialized agents. It is MIT-licensed, has over 74,000 GitHub stars, and recorded 12.5 million npm downloads in the last year.&lt;/p&gt;

&lt;p&gt;The interesting part is not the star count. It is the premise Ruflo is built on: &lt;strong&gt;an agent is a model plus a harness&lt;/strong&gt;. The model reasons and writes; the harness supplies the tools, memory, workflows, sandboxes, and controls that let it do real work. That idea has direct consequences for how you build agents in n8n — and here is the full loop Ruflo's new release describes, what builders should steal, and where the approach breaks down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgxchvspl72k9mktmmpew.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgxchvspl72k9mktmmpew.jpg" alt="Two developers reviewing code together on a large screen — the human pairing session that Ruflo's swarm model automates" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New in This Ruflo Release
&lt;/h2&gt;

&lt;p&gt;The announcement (via ACCESS Newswire, published October 13, 2026) centers on two capabilities plus a bundle of supporting infrastructure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ruflo Mods: one mission, end to end.&lt;/strong&gt; A Mod turns a single mission statement into a complete agent workflow — research, build, test, validate, secure, benchmark, and learn from the result. Mods route prompts and enforce policy directly inside Claude Code, so the mission logic travels with the agent rather than living in a doc nobody reads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One control plane, with human approval.&lt;/strong&gt; The Ruflo Console is a visual cockpit beside Claude Code that keeps missions, workflows, agent activity, logs, token usage, and cost in view. Administrators choose read, write, manage, or full control for Claude — and whether it acts automatically or asks first. The default is read access with approval, and a "Take back control" switch pauses Claude's console tools at any time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-machine agent federation.&lt;/strong&gt; Independent Ruflo installations on different computers, organizations, or cloud regions can discover each other, delegate sub-tasks, and share workloads. Remote agents start untrusted and prove identity through mTLS and Ed25519 challenge-response (no shared secrets). Behavioral trust scoring upgrades reliable peers over time and downgrades misbehaving ones immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in PII data gating.&lt;/strong&gt; A configurable 14-type detection pipeline scans outbound federation messages for email addresses, API keys, Social Security numbers, and similar data before anything leaves the local machine. Administrators set per-trust-level policies to block, redact, hash, or pass each type; HIPAA, SOC 2, and GDPR modes produce structured, searchable audit records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SONA self-learning memory.&lt;/strong&gt; Agents improve without retraining the underlying model. SONA, working with ReasoningBank and trajectory learning, captures successful execution patterns as local embeddings in HNSW-indexed AgentDB memory, so agents can reuse what worked in later tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;314 native MCP tools.&lt;/strong&gt; Ruflo's Model Context Protocol surface spans 314 tools covering CI checks, local security scans, cloud deployment hooks, and observability pipelines — plus 26 CLI commands and 35 plugins. MCP is the open standard that lets one AI client talk to many external tool servers, and Ruflo sits on both sides of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adaptive backpressure.&lt;/strong&gt; A new messaging layer regulates delivery speed between swarm nodes, preventing timeouts and agent crashes during long, high-volume software engineering jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MetaHarness and &lt;code&gt;ruflo eject&lt;/code&gt;.&lt;/strong&gt; MetaHarness grades an agent setup's readiness from 1 to 100, scans tool configurations for security risks, and snapshots projects to catch regressions between runs. &lt;code&gt;ruflo eject&lt;/code&gt; packages a configured swarm into a standalone agent toolkit with its own name and command-line package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting started:&lt;/strong&gt; in Claude Code, run &lt;code&gt;/plugin marketplace add ruvnet/ruflo&lt;/code&gt;, install &lt;code&gt;ruflo-console@ruflo&lt;/code&gt; and &lt;code&gt;ruflo-mods@ruflo&lt;/code&gt;, then &lt;code&gt;/reload-plugins&lt;/code&gt;. For Codex and other MCP clients, run &lt;code&gt;npx ruflo@latest init&lt;/code&gt; in a project, then connect the client to the Ruflo MCP server. Cognitum One recommends starting with one bounded task — such as a read-only project review — and adding agents, memory, and federation only as each earns its place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the "Model + Harness" Premise Matters
&lt;/h2&gt;

&lt;p&gt;Most agent failures I see are harness failures, not model failures. The model knew how to write the API call; the failure was that nobody capped its spend, nobody saved what it learned, nobody gated what data it could exfiltrate, and nobody could audit what it did. Ruflo's premise reframes the builder's job: you are not picking a smarter model, you are building a better harness — memory, routing, approvals, observability, policy enforcement.&lt;/p&gt;

&lt;p&gt;That framing is worth importing wholesale. If your agent cannot answer "what did it run, what did it cost, and what data crossed the boundary," you do not have an agent system. You have a chat window with ambitions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What n8n Builders Should Steal
&lt;/h2&gt;

&lt;p&gt;Ruflo is a coding-agent harness, but five of its ideas map cleanly onto automation agents built in n8n:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Treat the harness as the product.&lt;/strong&gt; In n8n terms: the AI Agent node is the model; everything around it — the tools you attach, the memory backend, the error workflow, the execution logging — is the harness. When an agent misbehaves, debug the harness first. This is the same lesson as our &lt;a href="https://dev.to/blog/n8n-ai-agent-memory-explained/"&gt;n8n AI Agent memory guide&lt;/a&gt;: most "forgetful agent" bugs live in the memory backend choice, not the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Mission-style definitions beat task lists.&lt;/strong&gt; Ruflo Mods encode the whole mission loop (research → build → test → validate → secure → learn) once. In n8n, the equivalent is a well-scoped system prompt plus sub-workflows: define the loop once, reuse it everywhere. If you find yourself re-explaining the same review process in five workflows, you have a Mod-shaped hole.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Default to approval, upgrade to autonomy.&lt;/strong&gt; Ruflo defaults to read access with approval — the agent asks before it acts. n8n already has the machinery: per-tool human-in-the-loop approvals via chat, Slack, Telegram, or email. The Ruflo pattern to copy is the default posture: start every new agent asking for permission, and grant autonomy only where the blast radius is understood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Route by cost, not by habit.&lt;/strong&gt; Ruflo's intelligent model routing sends simple tasks to cheaper, faster models and reserves top-tier models for complex reasoning. In n8n, you can do this today: a classifier node or a small local model triages incoming work, and only the hard cases reach your expensive frontier model. Sending every decision to your biggest LLM is the fastest way to burn budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Memory that learns across runs.&lt;/strong&gt; SONA captures successful execution patterns as local embeddings so agents reuse what worked. n8n's closest equivalents are Chat Memory Manager and database-backed memory with long-lived session IDs — the point being that memory should accumulate across runs, not reset with each execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Limits and Where This Breaks
&lt;/h2&gt;

&lt;p&gt;A 100-agent swarm is not free in any sense of the word. Every agent burns tokens, and coordination overhead grows faster than the swarm — queen-led topologies help, but more agents means more messages, more tool calls, and more places for a wrong assumption to propagate. Ruflo's adaptive backpressure exists precisely because long swarm runs time out and crash without it.&lt;/p&gt;

&lt;p&gt;Federation across machines is the riskiest feature here. mTLS and Ed25519 challenge-response are the right primitives, and PII gating is a genuinely thoughtful control — but "behavioral trust scoring" is doing a lot of work in one sentence. In production, treat every federated peer as adversarial until proven otherwise, and run PII gating in block mode until you have read every redaction decision it made on real traffic.&lt;/p&gt;

&lt;p&gt;Also worth noting: 74,000 stars is a community signal, not a production guarantee.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjcsgkk2z5auwc61a0foz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjcsgkk2z5auwc61a0foz.jpg" alt="Developer working with multiple monitors — coordinating a 100-agent swarm multiplies oversight work, not removes it" width="800" height="1198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruflo is MIT-licensed and available at github.com/ruvnet/ruflo, but enterprise features (commercial licensing, support, deployment inside Cognitum One's ruOS) sit behind the company. Evaluate it the way you would any open-source infrastructure: read the MetaHarness readiness report on your own setup before trusting it with production credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is Ruflo?
&lt;/h3&gt;

&lt;p&gt;Ruflo is an open-source AI agent meta-harness and multi-agent orchestration platform from Cognitum One (MIT license). It turns one coding assistant — Claude Code, OpenAI Codex, or any MCP client — into a coordinated swarm of specialized agents (planner, coder, tester, reviewer, security, docs) with shared memory, model routing, and human approval controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Ruflo free?
&lt;/h3&gt;

&lt;p&gt;The core is MIT-licensed open source (github.com/ruvnet/ruflo). Model provider costs still apply — you pay Claude/OpenAI/your provider for the tokens the swarm burns, which with 100 agents can add up fast. Commercial licensing, enterprise support, and managed deployment (ruOS) are paid.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Ruflo relate to n8n?
&lt;/h3&gt;

&lt;p&gt;Ruflo orchestrates coding agents; n8n orchestrates workflow automation agents. They solve the same class of problem at different layers — and n8n's first-class Agents (sub-agents, skills, human-in-the-loop approvals) are where the meta-harness ideas apply directly. One is not a replacement for the other.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should I try first?
&lt;/h3&gt;

&lt;p&gt;Cognitum One's own advice: start with one bounded, read-only task like a project review. Watch the Console's cost and activity views. Add memory, then more agents, then federation — each only after the previous layer earns its place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ruflo (announced Oct 13, 2026) is an open-source meta-harness that turns one coding assistant into a governed swarm of 100+ agents via Claude Code, Codex, or any MCP client.&lt;/li&gt;
&lt;li&gt;Its core premise — an agent is a model plus a harness — reframes agent building around memory, routing, approvals, observability, and policy instead of model choice.&lt;/li&gt;
&lt;li&gt;New capabilities worth attention: Ruflo Mods (mission → full workflow), a control plane defaulting to approval, cross-machine federation with PII gating, SONA self-learning memory, and 314 MCP tools.&lt;/li&gt;
&lt;li&gt;For n8n builders: default to approval, route models by cost, make memory accumulate across runs, and encode missions once instead of repeating them per workflow.&lt;/li&gt;
&lt;li&gt;Honest limit: swarms multiply token cost and coordination risk; treat federation as adversarial by default and verify PII gating on real traffic before trusting it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The most useful idea in this release is not any single feature — it is the checklist the meta-harness premise gives you: what did it run, what did it cost, what data crossed the boundary, and what did it learn for next time. If your n8n agents can answer those four questions, your harness is already better than most. For the full announcements referenced in this piece, the original press release is linked above; for n8n-specific agent hardening, read our guide on &lt;a href="https://dev.to/blog/n8n-ai-agent-memory-explained/"&gt;AI agent memory&lt;/a&gt; next.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Unsplash / Pexels&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/ruflo-open-source-multi-agent-orchestration/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>multiagent</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Shai-Hulud Just Infected an AI Agent Platform's npm Package — What Self-Hosted n8n Builders Must Do Now</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Fri, 09 Oct 2026 08:30:03 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/shai-hulud-just-infected-an-ai-agent-platforms-npm-package-what-self-hosted-n8n-builders-must-do-kbg</link>
      <guid>https://dev.to/cortexflow_tech/shai-hulud-just-infected-an-ai-agent-platforms-npm-package-what-self-hosted-n8n-builders-must-do-kbg</guid>
      <description>&lt;p&gt;On October 8, 2026, the npm package &lt;code&gt;tensorlake&lt;/code&gt; — the TypeScript SDK for Tensorlake's AI agent infrastructure — was compromised by a new Shai-Hulud worm variant. Version 0.5.144 shipped a preinstall hook that stole npm tokens, GitHub tokens, AWS keys, SSH keys, &lt;code&gt;.env&lt;/code&gt; files, crypto wallets, and browser passwords from every machine that installed it. The version was pulled within minutes, but the malware persists on infected hosts.&lt;/p&gt;

&lt;p&gt;If you self-host n8n, this is your threat model: you live on npm. Every community node you install, every Docker rebuild that runs &lt;code&gt;npm install&lt;/code&gt;, every &lt;code&gt;npx&lt;/code&gt; in your CI pipeline runs install scripts. This article walks through exactly how this attack worked — and the concrete checklist that keeps your secrets out of the next one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The attack chain: verified commits to poisoned publish in 20 hours
&lt;/h2&gt;

&lt;p&gt;According to Aikido's analysis, the infection didn't start with a typo-squatted package. It started inside the legitimate &lt;code&gt;tensorlake&lt;/code&gt; GitHub repository. On October 7, the threat actor made verified commits under the identity of a maintainer — the malware was introduced in commit &lt;code&gt;41b38f0&lt;/code&gt; via direct file upload, and the actor then bumped the version to trigger a publish. The repository was compromised for roughly 20 hours before version 0.5.144 went live on npm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your dependency can be poisoned at the source, not just by a lookalike name.&lt;/strong&gt; The registry did everything "right" — the package was real, the version was real, the publisher identity was stolen at the repo level.&lt;/p&gt;

&lt;p&gt;Timeline, per Socket (who flagged the malicious release 11 minutes after it published, at 01:23:10 UTC on October 8):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;01:12:07 UTC, Oct 8&lt;/strong&gt; — &lt;code&gt;tensorlake@0.5.144&lt;/code&gt; published to npm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;01:23:10 UTC&lt;/strong&gt; — Socket's scanner flags it; researchers confirm a ChainDrop/Shai-Hulud payload.&lt;/li&gt;
&lt;li&gt;Shortly after — version 0.5.144 is removed from the registry. Clean versions remain, but damage is already done on any host that ran &lt;code&gt;npm install&lt;/code&gt; in between.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With ~12,000 weekly downloads and 1k+ GitHub stars, the package's reach is far from trivial — even a minutes-long window can hit CI pipelines that install the latest version on every run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1gwgqfrt95346m4xw7qe.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1gwgqfrt95346m4xw7qe.jpeg" alt="A hooded figure typing at a laptop with data streams on screen — illustrating the threat actor behind the Tensorlake npm compromise" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A compromised package doesn't attack your server — it attacks the developer machine that installs it.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What the malware actually does: preinstall is the whole game
&lt;/h2&gt;

&lt;p&gt;The poisoned release carried an npm &lt;code&gt;preinstall&lt;/code&gt; hook — a script that runs automatically the moment you install the package, before your code ever touches it. Here's the chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;preinstall&lt;/code&gt; launches &lt;code&gt;package/lib/setup.mjs&lt;/code&gt;, an obfuscated loader.&lt;/li&gt;
&lt;li&gt;The loader installs the &lt;strong&gt;Bun&lt;/strong&gt; runtime and uses it to execute &lt;code&gt;package/lib/Math_Symbol.js&lt;/code&gt; — the main credential-stealing, self-propagating worm.&lt;/li&gt;
&lt;li&gt;The stealer harvests credentials from local files, CI environments, Kubernetes configs, and Vault sources, then drops the &lt;strong&gt;HackBrowserData&lt;/strong&gt; binary to extract browser-stored credentials too.&lt;/li&gt;
&lt;li&gt;It exfiltrates everything, establishes persistence on the host, and opens a channel for remotely supplied code execution — with C2 coordinated through an Ethereum contract and GitHub as a fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stolen-data list reads like an inventory of a working developer's life: npm tokens, GitHub tokens, AWS credentials and secrets, HashiCorp Vault data, Kubernetes credentials, SSH keys, &lt;code&gt;.env&lt;/code&gt; files, crypto wallets, browser passwords, Anthropic Claude config files, and messaging app data. This variant also targets 14 cryptocurrency browser extensions specifically — Aikido notes this suggests an operator more focused on quickly monetizing infected developer endpoints than on further supply-chain propagation.&lt;/p&gt;

&lt;p&gt;The nasty part Socket warns about: &lt;strong&gt;persistence can survive removing the dependency&lt;/strong&gt;. And per The Register's reporting, this variant monitors certain stolen GitHub tokens — if one is revoked, the malware can trigger deletion of the infected user's home directory under specific conditions. That means the cleanup order matters: disable the malicious token monitor &lt;em&gt;before&lt;/em&gt; you revoke credentials, or the attacker burns the machine out of spite.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why n8n self-hosters are squarely in the blast radius
&lt;/h2&gt;

&lt;p&gt;Most self-hosted n8n setups depend on npm in at least one of these ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm-installed n8n itself&lt;/strong&gt; (&lt;code&gt;npm install -g n8n&lt;/code&gt;) — every update executes install scripts as your user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community nodes&lt;/strong&gt; — installed via npm from the editor; &lt;a href="https://dev.to/blog/n8n-3-unverified-community-nodes/"&gt;n8n 3.0 is already disabling unverified community nodes&lt;/a&gt; because this vector is that serious.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Docker builds&lt;/strong&gt; — &lt;code&gt;RUN npm install&lt;/code&gt; during image build runs preinstall hooks inside your build environment, which often holds registry credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI pipelines&lt;/strong&gt; — a nightly &lt;code&gt;npm install&lt;/code&gt; pulling &lt;code&gt;latest&lt;/code&gt; is exactly the shape of install that caught the malicious Tensorlake window.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deeper problem: a workflow automation server is a secrets concentration point. Your n8n host holds API keys for OpenAI, Stripe, your database, your CRM — the exact kind of material this worm was built to harvest. An infected build machine doesn't just compromise one account; it compromises the keys that run your business.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddyac16usa4bkigrcsxt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddyac16usa4bkigrcsxt.jpeg" alt="Rows of server racks in a data center — where self-hosted automation servers concentrate the secrets attackers want" width="800" height="1200"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A self-hosted automation server is a secrets concentration point — exactly what this worm hunts.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The checklist: what to do today
&lt;/h2&gt;

&lt;p&gt;This is a how-to embedded in the news, because the next Shai-Hulud wave will use the same shape.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Check whether you installed 0.5.144
&lt;/h3&gt;

&lt;p&gt;Search your lockfiles and install history:&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="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"tensorlake"&lt;/span&gt; package-lock.json yarn.lock pnpm-lock.yaml 2&amp;gt;/dev/null
npm &lt;span class="nb"&gt;ls &lt;/span&gt;tensorlake 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the answer is yes: &lt;strong&gt;do not just uninstall.&lt;/strong&gt; Uninstalling removes the package but not the persistence. Socket's guidance: rebuild the affected system from a trusted source &lt;em&gt;before&lt;/em&gt; restoring access to secrets, and rotate every credential the machine could see — then revoke. And per researcher warnings, neutralize the token monitor before revoking affected tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Stop running npm install scripts by default
&lt;/h3&gt;

&lt;p&gt;Most install scripts are conveniences, not necessities. Disable them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm config &lt;span class="nb"&gt;set &lt;/span&gt;ignore-scripts &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it works: preinstall/preinstall hooks — the exact mechanism this worm used — simply never execute. If a package genuinely needs its build step (rare for apps), allow it explicitly per-package. In Docker builds, this one line removes the install-time attack surface from every image you build.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pin versions and audit the diff
&lt;/h3&gt;

&lt;p&gt;Floating ranges (&lt;code&gt;^0.5.144&lt;/code&gt;) in a CI pipeline that runs nightly is how a 20-hour malicious window becomes your incident. Pin exact versions, commit the lockfile, and make dependency updates a deliberate, reviewable PR — not an automatic pull. n8n's own 3.0 guidance on unverified community nodes points the same direction: treat every installed package as a trust decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Isolate where you install
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;npm install&lt;/code&gt; in throwaway CI runners or containers with no long-lived credentials mounted — never on the machine that holds your production secrets. If your n8n host and your build machine are the same box, that is the single biggest structural fix available to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Scan before you trust
&lt;/h3&gt;

&lt;p&gt;Socket flagged this release in 11 minutes. Tools like Socket's scanner or Aikido's Safe Chain intercept &lt;code&gt;npm&lt;/code&gt;/&lt;code&gt;npx&lt;/code&gt; installs and check packages against malware intel before they run. One of them on your CI is cheap insurance against the next wave — the August keyv/flat-cache compromise used the same ChainDrop family, and the pattern is clearly not done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this pattern is heading
&lt;/h2&gt;

&lt;p&gt;Shai-Hulud has evolved from generic npm typosquatting into a purpose-built AI-infrastructure hunter. The Tensorlake compromise is the first public case of the worm jumping to an AI agent platform — and the operator's pivot toward crypto wallets and browser stores suggests these campaigns are being run as profitable criminal operations, not one-off stunts.&lt;/p&gt;

&lt;p&gt;For agent builders, the takeaway is structural: &lt;strong&gt;your automation stack's security is the union of every dependency's security.&lt;/strong&gt; The AI Agent node you configured perfectly means nothing if the install script that delivered your community node ran &lt;code&gt;setup.mjs&lt;/code&gt; first. Secrets hygiene, install isolation, and script-disabled installs are the cheapest defenses you have — adopt them before you need them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tensorlake@0.5.144&lt;/code&gt; was poisoned on Oct 8, 2026&lt;/strong&gt; — preinstall hook → obfuscated loader → Bun-executed worm stealing npm/GitHub/AWS/Vault/SSH/crypto credentials and browser passwords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The repo itself was compromised&lt;/strong&gt; — verified commits under a stolen maintainer identity, 20 hours before publish. Lockfile pinning plus malware scanning beat trust in upstream.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence survives uninstall&lt;/strong&gt; — rebuild from a trusted source, rotate everything, and neutralize the token monitor &lt;em&gt;before&lt;/em&gt; revoking tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kill the install-script vector now&lt;/strong&gt; — &lt;code&gt;npm config set ignore-scripts true&lt;/code&gt;, pin exact versions, and never &lt;code&gt;npm install&lt;/code&gt; on the machine that holds your production secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n self-hosters are high-value targets&lt;/strong&gt; — community nodes, npm installs, and CI builds are exactly the surfaces this worm family hunts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next: run the &lt;code&gt;grep&lt;/code&gt; in step 1 across your projects today — and if any lockfile shows 0.5.144, treat it as an active incident, not a cleanup task.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Was I affected if I never installed the tensorlake package?
&lt;/h3&gt;

&lt;p&gt;No. The malicious code only ran on machines that installed &lt;code&gt;tensorlake@0.5.144&lt;/code&gt; during the window before it was removed from npm. If you never had it in a lockfile or install log, you're not affected by this specific incident — but the hardening steps above protect you from the next one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is preinstall so dangerous compared to a normal compromised package?
&lt;/h3&gt;

&lt;p&gt;A normal compromised package only runs when &lt;em&gt;you&lt;/em&gt; execute its code. A &lt;code&gt;preinstall&lt;/code&gt; hook runs automatically during &lt;code&gt;npm install&lt;/code&gt;, with your user's permissions, on the machine doing the install — which often holds CI secrets, AWS keys, and SSH credentials. You get infected without ever importing the library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does using Docker protect me from this class of attack?
&lt;/h3&gt;

&lt;p&gt;Partially. Docker isolates the &lt;em&gt;running&lt;/em&gt; workflow from the host, but &lt;code&gt;RUN npm install&lt;/code&gt; in your Dockerfile still executes preinstall hooks during the build — and build environments often carry registry credentials. The fix is &lt;code&gt;npm config set ignore-scripts true&lt;/code&gt; in your Dockerfiles plus multi-stage builds that don't leak build-time secrets.&lt;/p&gt;

&lt;h3&gt;
  
  
  How fast was this caught?
&lt;/h3&gt;

&lt;p&gt;Socket flagged &lt;code&gt;tensorlake@0.5.144&lt;/code&gt; at 01:23:10 UTC on October 8, 2026 — roughly 11 minutes after publication. The version was then removed from the npm registry. Speed of detection doesn't help hosts that installed during the window, which is why scanning must happen &lt;em&gt;before&lt;/em&gt; install.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Pexels&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;[Sources: &lt;a href="https://socket.dev/blog/tensorlake-compromise" rel="noopener noreferrer"&gt;Socket&lt;/a&gt;, &lt;a href="https://www.aikido.dev/blog/tensorlake-npm-package-compromised" rel="noopener noreferrer"&gt;Aikido&lt;/a&gt;, &lt;a href="https://thehackernews.com/2026/10/tensorlake-npm-package-compromised-to.html" rel="noopener noreferrer"&gt;The Hacker News&lt;/a&gt;, &lt;a href="https://www.theregister.com/security/2026/10/08/shai-hulud-worm-makes-jump-to-ai-infrastructure-with-tensorlake-compromise/5302054" rel="noopener noreferrer"&gt;The Register&lt;/a&gt;]&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/shai-hulud-tensorlake-npm-supply-chain-attack/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>supplychain</category>
      <category>security</category>
      <category>npm</category>
    </item>
    <item>
      <title>n8n 2.43.0 Is a Guardrails Release: No More Publishing Broken Workflows</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Thu, 08 Oct 2026 08:29:54 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/n8n-2430-is-a-guardrails-release-no-more-publishing-broken-workflows-1k3d</link>
      <guid>https://dev.to/cortexflow_tech/n8n-2430-is-a-guardrails-release-no-more-publishing-broken-workflows-1k3d</guid>
      <description>&lt;p&gt;n8n shipped 2.43.0 on October 6, 2026, and the changelog reads like a production-hardening checklist rather than a feature launch. The marquee fix is a simple one: n8n now blocks you from publishing a workflow that has unconnected required node inputs (&lt;a href="http://github.com/n8n-io/n8n/releases" rel="noopener noreferrer"&gt;commit 5e28ff8&lt;/a&gt;, tracked as #37265). Around it, the release applies policy checks to CLI commands, extends MCP availability rules to error workflows, deduplicates agent message deliveries, and fixes agent session handling on SQLite. The pattern is unmistakable — n8n is spending this release cycle on making agents fail less often, not do more things.&lt;/p&gt;

&lt;p&gt;In this post: what each of the important 2.43.0 changes actually does for you, why the publishing guardrail is the headline, and the upgrade path if you're self-hosting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: n8n stops you from publishing broken workflows
&lt;/h2&gt;

&lt;p&gt;The most impactful single change is &lt;code&gt;core: Block publishing workflows with unconnected required node inputs&lt;/code&gt;. Before 2.43.0, you could publish (activate) a workflow where a required input of a node was left dangling — say you dragged in an Agent node, connected the model, but never wired the chat trigger. The workflow would then run in production and fail silently, or worse, fire half-built automations against real APIs.&lt;/p&gt;

&lt;p&gt;Now the editor refuses to publish until required inputs are connected. This matters more than it looks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For agent workflows&lt;/strong&gt;, "required inputs" includes the tool connections, memory, and model sub-nodes that the Agent node depends on. Agents are exactly the workflows most likely to be published half-wired because they have the most connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For teams&lt;/strong&gt;, it kills a whole class of "it worked in testing" incidents where a dev published a draft during iteration and forgot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For automated publishing&lt;/strong&gt; (CI/CD pipelines that activate workflows via the API or CLI), this pairs with the new CLI policy checks below — the same guardrail logic is being applied everywhere publishing happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest limitation: this only catches &lt;em&gt;structurally&lt;/em&gt; unconnected required inputs. It will not catch a connected-but-misconfigured node, a wrong credential, or a prompt that hallucinates. Structural guardrails shrink the failure surface; they don't eliminate testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Policy checks now apply to the CLI too
&lt;/h2&gt;

&lt;p&gt;Two related changes extend n8n's guardrail logic beyond the editor UI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;core: Apply policy checks to CLI import and execute commands (#39714)&lt;/code&gt; — organizations that define policies (restrictions on node usage, credentials, etc.) now get those same policies enforced when workflows are imported or executed through the n8n CLI. Before this, a policy that blocked a risky node in the editor could be bypassed by importing the same workflow from the command line. That's a real hole, and it's now closed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core: Apply MCP availability rules to error workflow settings (#39885)&lt;/code&gt; — MCP, or Model Context Protocol, is the standard way AI tools expose themselves to models. n8n checks which MCP features are available to an instance; this change makes those same availability rules apply to error workflows (the workflows that run when another workflow fails). Your failure handlers get the same tooling guarantees as your main workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together with the publishing block, these three changes form a coherent theme: &lt;strong&gt;guardrails that previously only existed in the editor now follow the workflow everywhere&lt;/strong&gt; — CLI, error paths, and publishing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent sessions get more reliable
&lt;/h2&gt;

&lt;p&gt;The Agent node received several reliability fixes that matter if you run agents in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;core: Deduplicate agent message deliveries (#39794)&lt;/code&gt; — agent messages were being delivered more than once in some paths. If your agent talks to Slack or a webhook, duplicate deliveries meant duplicate replies. That's the kind of bug that erodes user trust in an agent fast.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core: Correct Agent session pagination on SQLite (#39802)&lt;/code&gt; — if you self-host n8n with SQLite (the default for small Docker/npm installs), agent session history pagination was wrong, meaning sessions could show missing or duplicated messages. Fixed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core: Connect Slack Agent channels through managed setup in MCP (#39776)&lt;/code&gt; — wiring Slack channels to the Slack Agent node now goes through n8n's managed MCP setup, which is the path n8n wants you on for agent-to-channel integrations.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Agent Node: Remove outdated tutorial tip callout (#35505)&lt;/code&gt; and &lt;code&gt;core: Apply removed fields when the Agent Builder patches agent config (#40122)&lt;/code&gt; — the AI-assisted agent builder now handles deprecated fields correctly when patching agent configs, and a stale tutorial tip is gone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also relevant: &lt;code&gt;ai-builder: Treat a blank folder path as no folder in the build tool (#40116)&lt;/code&gt; — a small paper-cut fix for the AI workflow builder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure OpenAI Responses-only deployments now work
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Azure OpenAI Chat Model Node: Support Responses-only deployments (#39403)&lt;/code&gt; — Azure OpenAI lets enterprises create deployments that only expose the Responses API (OpenAI's newer unified API surface) rather than the legacy Chat Completions API. n8n's Azure OpenAI node previously couldn't talk to these. If your organization standardized on Responses API deployments — common in Azure-centric enterprises — your n8n agents can now use them directly instead of routing through a generic HTTP node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I didn't verify:&lt;/strong&gt; the release-notes aggregators also list expanded support for Databricks, Google Calendar, and Supabase nodes in this release. The official changelog excerpt I reviewed in detail didn't surface the individual commits for those, so treat that list as plausible-but-unconfirmed until you read the full notes yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shutdown and multi-instance behavior gets safer
&lt;/h2&gt;

&lt;p&gt;Two changes target the least glamorous part of production: shutting down cleanly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;core: Cap pending task request timeouts to the shutdown deadline (#40136)&lt;/code&gt; — when n8n shuts down, pending task-runner requests could hang past the deadline. Timeouts are now capped so shutdown actually completes. This matters for containerized deploys (Docker, Kubernetes) where the orchestrator kills you after the grace period whether you're done or not.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core: Keep floating entitlements attached when a multi-main instance shuts down (#39713)&lt;/code&gt; — in multi-main setups (n8n's high-availability mode), license entitlements could detach during shutdown, causing entitlement checks to fail on restart. Fixed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus editor quality-of-life: pasted nodes now center in the canvas viewport (#39995), the From AI button aligns with parameter inputs (#40152), and the workflow SDK group layout for AI subtrees and sticky notes improved (#39981).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faiskf943pqm745nz4rw3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faiskf943pqm745nz4rw3.jpg" alt="Server hardware in a data center, representing the infrastructure behind n8n's self-hosted releases" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  API changes for programmatic teams
&lt;/h2&gt;

&lt;p&gt;Three API-side fixes are worth knowing if you manage n8n programmatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;API: Let global members grant variable scopes to API keys (#40064)&lt;/code&gt; — continuing the permission tightening started in 2.41.7, global members can now grant variable scopes to API keys, giving finer control over what API credentials can touch.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;API: Emit valid schemas for untyped values in the Public API spec (#39884)&lt;/code&gt; — the generated API spec no longer emits invalid schemas for untyped values, which fixes broken codegen for some API clients.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core: Generate missing workflow IDs in the import:workflow command (#40011)&lt;/code&gt; — importing workflows via CLI no longer chokes on missing IDs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdoyeos4lalpauzpf0kh3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdoyeos4lalpauzpf0kh3.jpg" alt="Network cables and server hardware illustrating backend reliability fixes" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you upgrade?
&lt;/h2&gt;

&lt;p&gt;If you're on the 2.4x line, 2.43.0 is a no-regrets upgrade: it's a bug-fix release with no breaking changes, and the publishing guardrail alone is worth it. If you're self-hosting, the upgrade is the same drill as always:&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;# Docker (recommended path)&lt;/span&gt;
docker pull n8nio/n8n:2.43.0
&lt;span class="c"&gt;# then recreate your container against your existing data volume&lt;/span&gt;

&lt;span class="c"&gt;# npm&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; n8n@2.43.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two precautions, as always: &lt;strong&gt;back up your n8n data first&lt;/strong&gt; (database + &lt;code&gt;~/.n8n&lt;/code&gt; encryption key if you use npm), and if you're several versions behind, skim the breaking-change notes — the &lt;a href="https://dev.to/blog/n8n-october-2026-security-update/"&gt;October 2026 security update&lt;/a&gt; covered the CVE-driven releases that may have forced intermediate jumps. Running our &lt;a href="https://dev.to/templates/n8n-security-advisory-triage/"&gt;n8n security advisory triage template&lt;/a&gt; against this release is a quick way to decide priority across your fleet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I didn't test:&lt;/strong&gt; I did not run the upgrade myself — the changes above are from the published changelog, not from my own instance. The guardrails are described from the release notes, so if your publishing flow goes through a custom script, test the new block in staging before it surprises your CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does n8n 2.43.0 contain security fixes?
&lt;/h3&gt;

&lt;p&gt;The published 2.43.0 changelog I reviewed lists no CVEs or security advisories — it's a bug-fix and hardening release. If you haven't applied the October security patches yet (see the &lt;a href="https://dev.to/blog/n8n-october-2026-security-update/"&gt;October 2026 security update&lt;/a&gt;), do that first; 2.43.0 includes all prior 2.x patches by virtue of being the latest point release.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will the publishing block break my CI/CD pipeline?
&lt;/h3&gt;

&lt;p&gt;It will only block publishing if your workflows have unconnected required inputs — which is precisely the case that produces broken production runs. If your pipeline publishes workflows generated by the AI builder, run one publish in staging first to confirm everything is wired. This is a feature, not a regression, but it can surface latent wiring bugs in workflows that previously published silently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is 2.43.0 related to the 2.42.x line?
&lt;/h3&gt;

&lt;p&gt;Yes — 2.43.0 is the next release after the 2.42.x beta line we covered when &lt;a href="https://dev.to/blog/n8n-2414-stable-242-beta-agents-mcp/"&gt;2.41.4 and the 2.42 beta&lt;/a&gt; shipped. The 2.42 series has stabilized into 2.43.0, so if you were tracking beta for the AI Assistant and Agent work, this is your off-ramp onto a stable-ish line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n 2.43.0 is a guardrails release&lt;/strong&gt;, not a feature release: the headline change blocks publishing workflows with unconnected required node inputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy checks now apply to CLI import/execute&lt;/strong&gt; and MCP availability rules reach error workflows — guardrails follow your workflows everywhere, not just the editor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent reliability fixes&lt;/strong&gt;: deduplicated message deliveries, corrected SQLite session pagination, and Slack Agent via managed MCP setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure OpenAI Responses-only deployments&lt;/strong&gt; are now supported in the Azure OpenAI node — relevant for Azure-standardized enterprises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade is low-risk&lt;/strong&gt; if you're already on 2.x; back up first, and use the security advisory triage template to prioritize across a fleet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bigger story: n8n is quietly rebuilding itself around production agents, one guardrail at a time. &lt;a href="https://dev.to/blog/n8n-agents-explained/"&gt;How n8n's AI Assistant and Agents fit together&lt;/a&gt; is the right context piece if you want to see where this hardening trend points next.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Pexels&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/n8n-2430-agent-guardrails-release/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>aiagents</category>
      <category>automation</category>
      <category>releases</category>
    </item>
    <item>
      <title>Langflow's MCP Server Setup Let Any User Run OS Commands on the Host: CVE-2026-105697 Patch Guide</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Wed, 07 Oct 2026 08:30:00 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/langflows-mcp-server-setup-let-any-user-run-os-commands-on-the-host-cve-2026-105697-patch-guide-4c3n</link>
      <guid>https://dev.to/cortexflow_tech/langflows-mcp-server-setup-let-any-user-run-os-commands-on-the-host-cve-2026-105697-patch-guide-4c3n</guid>
      <description>&lt;p&gt;On October 5, 2026, a &lt;strong&gt;CVSS 9.9 critical&lt;/strong&gt; vulnerability was disclosed in Langflow, the open-source platform many builders use to prototype AI agents and workflows: &lt;strong&gt;CVE-2026-105697&lt;/strong&gt;, an OS command injection (CWE-78) in its MCP server handling. Before Langflow 1.10.3, the MCP stdio transport would launch &lt;strong&gt;whatever command a user typed into the MCP server configuration&lt;/strong&gt; — no allowlist, wrapped in &lt;code&gt;bash -c&lt;/code&gt;. A public proof-of-concept is already available. If you self-host Langflow, &lt;strong&gt;upgrade to 1.10.3 (or langflow-base 0.10.3 / lfx 1.10.3) now&lt;/strong&gt; — and disable the dev-only auto-login setting if it's still on. This post explains exactly what broke, whether you're exposed, and how to patch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What CVE-2026-105697 is
&lt;/h2&gt;

&lt;p&gt;Langflow lets users connect &lt;strong&gt;MCP (Model Context Protocol) servers&lt;/strong&gt; to flows — either through the UI (Settings → MCP Servers → Add MCP Server, which hits &lt;code&gt;POST&lt;/code&gt;/&lt;code&gt;PATCH /api/v2/mcp/servers/{server_name}&lt;/code&gt;) or through the MCP Tools component inside a flow. With a &lt;strong&gt;stdio transport&lt;/strong&gt;, "connecting" to an MCP server means the platform launches a local process.&lt;/p&gt;

&lt;p&gt;The problem: before version 1.10.3, Langflow took the &lt;code&gt;command&lt;/code&gt; and &lt;code&gt;args&lt;/code&gt; fields from the MCP server configuration and executed them directly — with &lt;strong&gt;no allowlist&lt;/strong&gt; of permitted commands, and wrapped in &lt;code&gt;bash -c "exec {command} ..."&lt;/code&gt;. So a "server" whose command was &lt;code&gt;touch /tmp/pwned&lt;/code&gt;, &lt;code&gt;rm -rf /something&lt;/code&gt;, or a reverse shell wasn't validated or rejected — it &lt;strong&gt;ran on the Langflow host as the Langflow process user&lt;/strong&gt; the moment Langflow tried to connect to the server (listing servers, loading tools, or running the flow). Even if the UI later reported that the stdio server failed to start, the command had already executed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbaa5v6uvmtzstvuvxrf5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbaa5v6uvmtzstvuvxrf5.jpg" alt="Server room hardware — the Langflow host is where the injected command executes" width="800" height="1203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The worst part: unauthenticated on default instances
&lt;/h2&gt;

&lt;p&gt;Most critical RCEs at least require an account. This one often doesn't.&lt;/p&gt;

&lt;p&gt;Langflow ships with &lt;strong&gt;&lt;code&gt;LANGFLOW_AUTO_LOGIN=true&lt;/code&gt;&lt;/strong&gt; by default — documented as a &lt;strong&gt;development-only setting&lt;/strong&gt;. With it enabled, a single request to &lt;code&gt;GET /api/v1/auto_login&lt;/code&gt; hands out a token &lt;strong&gt;without credentials&lt;/strong&gt;. So on any Langflow instance exposed to the internet with the default configuration, this vulnerability was reachable &lt;strong&gt;without an account at all&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With auto-login disabled (as it should be in production), the flaw is still exploitable by &lt;strong&gt;any authenticated non-admin user&lt;/strong&gt; — anyone who can reach the MCP server settings or build a flow with the MCP Tools component. In shared or team environments, that's a wide privilege boundary: a low-privilege user gets OS-level command execution on the host.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which versions are affected
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Vulnerable&lt;/th&gt;
&lt;th&gt;Patch to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Langflow&lt;/td&gt;
&lt;td&gt;&amp;lt; 1.10.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.10.3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;langflow-base&lt;/td&gt;
&lt;td&gt;&amp;lt; 0.10.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.10.3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfx&lt;/td&gt;
&lt;td&gt;&amp;lt; 1.10.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.10.3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Disclosed October 5, 2026 (record modified October 6). Per the CVE metadata: public PoC available, &lt;strong&gt;not yet in the CISA Known Exploited Vulnerabilities catalog&lt;/strong&gt; (no confirmed in-the-wild exploitation as of publication), EPSS 0.40% — but with a PoC public and a 9.9 score, treat the window between disclosure and patching as your real risk.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; check &lt;code&gt;LANGFLOW_AUTO_LOGIN&lt;/code&gt; first, not your version number. If your instance is internet-exposed and auto-login was on, assume it was reachable unauthenticated and review your logs and host for signs of compromise &lt;em&gt;before&lt;/em&gt; you trust the patch alone.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Are you exposed? A 60-second check
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is your Langflow reachable from the internet?&lt;/strong&gt; Check your reverse proxy, security groups, or &lt;code&gt;curl&lt;/code&gt; it from outside your network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is &lt;code&gt;LANGFLOW_AUTO_LOGIN=true&lt;/code&gt;?&lt;/strong&gt; Check your environment or Docker compose. If yes, this setting should never have been on outside local dev.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which version are you on?&lt;/strong&gt; &lt;code&gt;pip show langflow&lt;/code&gt; or check the Docker image tag. Anything below 1.10.3 / 0.10.3 is vulnerable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who has accounts?&lt;/strong&gt; With auto-login off, every non-admin account was a potential entry point — review your user list.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; back up your Langflow data (flows, credentials, the database or &lt;code&gt;~/.langflow&lt;/code&gt; directory) before upgrading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Upgrade to the fixed version
&lt;/h3&gt;

&lt;p&gt;If you installed via pip:&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="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="s2"&gt;"langflow&amp;gt;=1.10.3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're using the &lt;code&gt;langflow-base&lt;/code&gt; package:&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="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="s2"&gt;"langflow-base&amp;gt;=0.10.3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run the official Docker image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull langflowai/langflow:latest
&lt;span class="c"&gt;# then recreate your container (your data volume holds flows + db)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2 — Turn off auto-login in anything that isn't local dev
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LANGFLOW_AUTO_LOGIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or in your Docker compose / env file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LANGFLOW_AUTO_LOGIN=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3 — Don't expose Langflow directly
&lt;/h3&gt;

&lt;p&gt;Put Langflow behind a reverse proxy with authentication (or a VPN / private network), and restrict which hosts can reach it. Langflow holds API keys and credentials in its flows — it should never be a public URL with default settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Look for compromise if you were exposed
&lt;/h3&gt;

&lt;p&gt;If your instance was internet-reachable with auto-login on and running a vulnerable version: review flow and MCP server configurations for entries you didn't create, check the host for unexpected processes or files, rotate every credential and API key stored in Langflow, and consider rebuilding the host from a clean image.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger lesson: MCP server configs are privileged
&lt;/h2&gt;

&lt;p&gt;This is the part every agent builder should internalize, even if you've never touched Langflow. An MCP stdio server definition &lt;strong&gt;is arbitrary code execution by design&lt;/strong&gt; — it launches a process on the host. That means the configuration surface for MCP servers should be treated with the same seriousness as SSH access or sudo: allowlists for commands, least-privilege users, and no unauthenticated access, ever.&lt;/p&gt;

&lt;p&gt;The same caution applies to the MCP nodes in your own stack. If you're wiring MCP into n8n, our &lt;a href="https://dev.to/blog/mcp-n8n-troubleshooting/"&gt;MCP + n8n troubleshooting guide&lt;/a&gt; covers the transport pitfalls — and the general principle stands: anything that launches a process on your behalf must never accept unvalidated input from a lower-privilege user. This is also the second high-severity AI-infrastructure CVE in a week affecting agent builders, after &lt;a href="https://dev.to/blog/gitlab-ai-gateway-cve-2026-90970-patch/"&gt;GitLab's AI Gateway sandbox escape&lt;/a&gt; — the attack surface is moving from models to the glue around them.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is CVE-2026-105697?
&lt;/h3&gt;

&lt;p&gt;A critical (CVSS 9.9) OS command injection in Langflow, disclosed October 5, 2026. Before Langflow 1.10.3, the MCP stdio transport executed whatever command a user put in an MCP server configuration — no allowlist, wrapped in &lt;code&gt;bash -c&lt;/code&gt; — running it on the Langflow host. Fixed in Langflow 1.10.3, langflow-base 0.10.3, and lfx 1.10.3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need an account to exploit it?
&lt;/h3&gt;

&lt;p&gt;On instances with the default &lt;code&gt;LANGFLOW_AUTO_LOGIN=true&lt;/code&gt; exposed to the internet: no — &lt;code&gt;GET /api/v1/auto_login&lt;/code&gt; issues a token without credentials. With auto-login disabled, any authenticated non-admin user could exploit it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a public exploit?
&lt;/h3&gt;

&lt;p&gt;Yes — proof-of-concept references and code are publicly available. It is not in the CISA KEV catalog yet, meaning no confirmed in-the-wild exploitation has been recorded. Patch anyway; the PoC closes the gap between theory and practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  I'm an n8n user — should I care?
&lt;/h3&gt;

&lt;p&gt;Yes, for the pattern, not the package. n8n has its own MCP integrations, and the same class of bug — unvalidated command/argument handling in a tool-execution path — keeps appearing across agent infrastructure (see &lt;a href="https://dev.to/blog/n8n-expression-sandbox-escape-cve/"&gt;n8n's own October CVEs&lt;/a&gt;). Audit any workflow platform where a low-privilege user can define something that launches a process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;CVE-2026-105697 is a textbook reminder that the most dangerous code in an AI agent stack is often not the model — it's the launcher. A configuration field that accepts a command and runs it is a shell, and Langflow treated it like a settings form. Upgrade to Langflow 1.10.3, kill auto-login outside local dev, and stop exposing workflow platforms to the open internet. Then audit the rest of your agent glue for the same shape of flaw — because this class of bug is having a very busy October.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images: Pexels&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/langflow-mcp-stdio-rce-cve-2026-105697/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>langflow</category>
      <category>security</category>
      <category>cve</category>
      <category>mcp</category>
    </item>
    <item>
      <title>n8n Published Two CVEs in One Day: Expression Sandbox Escape (CVE-2026-86076) and Argument Injection (CVE-2026-44790)</title>
      <dc:creator>CortexFlow</dc:creator>
      <pubDate>Tue, 06 Oct 2026 08:29:55 +0000</pubDate>
      <link>https://dev.to/cortexflow_tech/n8n-published-two-cves-in-one-day-expression-sandbox-escape-cve-2026-86076-and-argument-4mji</link>
      <guid>https://dev.to/cortexflow_tech/n8n-published-two-cves-in-one-day-expression-sandbox-escape-cve-2026-86076-and-argument-4mji</guid>
      <description>&lt;p&gt;On October 5, 2026, n8n disclosed &lt;strong&gt;two security advisories in a single day&lt;/strong&gt; — both able to hand an attacker full control of the server your workflows and agents run on. The first, &lt;strong&gt;CVE-2026-86076&lt;/strong&gt; (CVSS 8.7), is an expression sandbox escape: a crafted workflow expression can break out of n8n's expression compiler and execute arbitrary code in the n8n process. The second, &lt;strong&gt;CVE-2026-44790&lt;/strong&gt; (CVSS 9.4), is an argument-injection flaw. Neither is known to be exploited yet, but both are published, so the fix versions are your move: &lt;strong&gt;upgrade to n8n 1.123.76, 2.37.7, or 2.38.2&lt;/strong&gt; depending on your release line. This post explains what broke, whether you're exposed, and the exact steps to patch.&lt;/p&gt;

&lt;h2&gt;
  
  
  CVE-2026-86076: the expression sandbox escape
&lt;/h2&gt;

&lt;p&gt;n8n lets workflow builders write &lt;strong&gt;expressions&lt;/strong&gt; — little snippets like &lt;code&gt;={{ $json.name }}&lt;/code&gt; inside node parameters that get evaluated when the workflow runs. Expressions are supposed to run inside a &lt;strong&gt;sandbox&lt;/strong&gt;, a restricted environment where they can transform data but can't touch the server, spawn processes, or call the JavaScript &lt;code&gt;Function&lt;/code&gt; constructor.&lt;/p&gt;

&lt;p&gt;CVE-2026-86076 broke that boundary. Per n8n's advisory (GHSA-hw8v-xxg5-vvvx), the expression compiler's &lt;strong&gt;sanitizer&lt;/strong&gt; — the code that keeps expressions safe — was resolved through a dynamically-scoped &lt;code&gt;this&lt;/code&gt;. An attacker could define a &lt;strong&gt;class field named &lt;code&gt;__sanitize&lt;/code&gt;&lt;/strong&gt; that rebound the sanitizer to a malicious value and reached the &lt;code&gt;Function&lt;/code&gt; constructor. Once you have &lt;code&gt;Function&lt;/code&gt;, you have arbitrary JavaScript execution. Game over.&lt;/p&gt;

&lt;p&gt;The blast radius depends on where the expression runs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On the backend:&lt;/strong&gt; any expression author could run code inside the n8n process — the same process that holds your credentials, your workflow definitions, and your execution history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In the editor preview:&lt;/strong&gt; a member's crafted expression could execute JavaScript &lt;strong&gt;in the browser session of whoever opened the workflow&lt;/strong&gt; — meaning a malicious teammate (or a compromised account) could attack other editors just by getting them to open a workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The patch rejects reserved class-member names like &lt;code&gt;__sanitize&lt;/code&gt;, closing the rebinding path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Firjh4xoodzu4u960pgw1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Firjh4xoodzu4u960pgw1.jpg" alt="Abstract code on a screen — n8n workflow expressions are evaluated in a sandbox" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Which n8n versions are affected
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your line&lt;/th&gt;
&lt;th&gt;Vulnerable&lt;/th&gt;
&lt;th&gt;Patch to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;n8n 2.38.x&lt;/td&gt;
&lt;td&gt;&amp;gt;= 2.38.0, &amp;lt; 2.38.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.38.2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n8n 2.0 – 2.37.x&lt;/td&gt;
&lt;td&gt;&amp;gt;= 2.0.0, &amp;lt; 2.37.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.37.7&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n8n 1.x (LTS-era)&lt;/td&gt;
&lt;td&gt;&amp;lt; 1.123.76&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.123.76&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;First published October 5, 2026; first seen in the wild as an advisory record on September 8, 2026. Per the advisory metadata: not known to be exploited, needs hands-on effort to exploit — but gives an attacker full control when it works.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; this hits hardest on &lt;strong&gt;shared or multi-user n8n instances&lt;/strong&gt; — anyone who can create or edit a workflow is an "expression author." If you hand workflow-edit rights to clients, contractors, or junior team members, treat this as urgent rather than routine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  CVE-2026-44790: argument injection, CVSS 9.4
&lt;/h2&gt;

&lt;p&gt;The same-day second advisory, CVE-2026-44790 (GHSA-57g9-58c2-xjg3), is classified &lt;strong&gt;CWE-88: improper neutralization of argument delimiters&lt;/strong&gt; — an argument-injection flaw. The published details are thinner than for CVE-2026-86076, but the metadata is unambiguous: &lt;strong&gt;CVSS 9.4, critical&lt;/strong&gt;, published October 5, 2026, gives an attacker full control, needs hands-on effort, not known to be exploited. Track it through the &lt;a href="https://github.com/advisories/GHSA-57g9-58c2-xjg3" rel="noopener noreferrer"&gt;GitHub advisory&lt;/a&gt; and the &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44790" rel="noopener noreferrer"&gt;NVD record&lt;/a&gt;, and patch on the same upgrade window as CVE-2026-86076 — the advisory metadata notes vendor patches were already being shipped through the fixed lines above.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to patch your self-hosted n8n
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu53g7mhcw4njqd1u45wa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu53g7mhcw4njqd1u45wa.jpg" alt="Server racks in a data center — the machines running your self-hosted n8n" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; SSH or terminal access to the host running n8n, and a recent backup. n8n's data (workflows, credentials, executions) lives in its SQLite file or Postgres database plus the &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt; — back up both before upgrading, because a failed upgrade without the key means locked credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example terminology:&lt;/strong&gt; &lt;code&gt;&amp;lt;your-n8n-host&amp;gt;&lt;/code&gt; is your server. Replace it in every command.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 - Back up before you touch anything
&lt;/h3&gt;

&lt;p&gt;Why: credential blobs are encrypted with &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt;; if the upgrade fails midway and you lose the data volume, the key alone won't restore your workflows.&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;# If n8n runs in Docker with a named volume:&lt;/span&gt;
docker stop n8n
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; n8n_data:/data &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/backup alpine &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;tar &lt;/span&gt;czf /backup/n8n-backup-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%F&lt;span class="si"&gt;)&lt;/span&gt;.tar.gz /data
docker start n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;docker start n8n&lt;/code&gt; report the container is running. Keep the tarball somewhere off-host. If you use Postgres externally, take your usual &lt;code&gt;pg_dump&lt;/code&gt; instead.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; if you have never exported &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt; to a safe place, do it now — printenv it from the running container and store it in your secrets manager. A volume backup without the key is a paperweight.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 2 - Upgrade to the fixed version
&lt;/h3&gt;

&lt;p&gt;Why: the patch is only in 1.123.76, 2.37.7, and 2.38.2 (or later). Match your line from the table above — don't jump lines casually, especially from 1.x to 2.x, which has breaking changes.&lt;/p&gt;

&lt;p&gt;Docker (most self-hosted setups):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull n8nio/n8n:2.38.2
docker stop n8n &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker &lt;span class="nb"&gt;rm &lt;/span&gt;n8n
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; n8n &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-file&lt;/span&gt; /path/to/your/n8n.env &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; n8n_data:/home/node/.n8n &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5678:5678 &lt;span class="se"&gt;\&lt;/span&gt;
  n8nio/n8n:2.38.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the image tag with &lt;code&gt;1.123.76&lt;/code&gt; or &lt;code&gt;2.37.7&lt;/code&gt; if that's your line, and keep your own &lt;code&gt;--env-file&lt;/code&gt;, volumes, and port mapping — the lines above are the shape, not your exact config.&lt;/p&gt;

&lt;p&gt;npm installs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update &lt;span class="nt"&gt;-g&lt;/span&gt; n8n
&lt;span class="c"&gt;# then pin-check: n8n --version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the fixed version number in the output — for example &lt;code&gt;2.38.2&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 - Verify the fix is live
&lt;/h3&gt;

&lt;p&gt;Why: a container can restart on the old image if the pull failed or the tag was cached.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec &lt;/span&gt;n8n n8n &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;2.38.2&lt;/code&gt; (or &lt;code&gt;2.37.7&lt;/code&gt; / &lt;code&gt;1.123.76&lt;/code&gt;). Then open the n8n UI: &lt;strong&gt;Settings → About&lt;/strong&gt; (bottom-left) should show the same version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 - Audit who could have written expressions
&lt;/h3&gt;

&lt;p&gt;Why: the vulnerability window was open from first-seen (September 8, 2026) to your patch. If untrusted users had workflow-create or workflow-edit rights during that window, check whether they planted anything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review &lt;strong&gt;Users / members&lt;/strong&gt; in the instance: anyone with edit rights you don't fully trust should have them reviewed.&lt;/li&gt;
&lt;li&gt;Scan recently modified workflows for unfamiliar expressions in node parameters, especially anything referencing &lt;code&gt;__sanitize&lt;/code&gt;, &lt;code&gt;constructor&lt;/code&gt;, or &lt;code&gt;Function&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If anything looks wrong, treat it as a compromise: rotate credentials stored in n8n, check connected services for unexpected activity, and review execution logs for the affected period.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you can't upgrade today
&lt;/h2&gt;

&lt;p&gt;n8n's advisory lists short-term mitigations — they reduce exposure but &lt;strong&gt;do not fix&lt;/strong&gt; the flaw:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Restrict instance access to fully trusted users only.&lt;/li&gt;
&lt;li&gt;Stop granting workflow-create or workflow-edit permissions to untrusted users.&lt;/li&gt;
&lt;li&gt;Audit existing workflows for unexpected expressions in node parameters.&lt;/li&gt;
&lt;li&gt;Set the environment variable &lt;code&gt;N8N_EXPRESSION_ENGINE=vm&lt;/code&gt; to switch the expression engine.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do these only as a bridge to the upgrade, not instead of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free template:&lt;/strong&gt; &lt;a href="https://dev.to/templates/n8n-security-advisory-triage/"&gt;n8n Security Advisory Triage&lt;/a&gt; — a ready-to-import n8n workflow that watches for new n8n security advisories and alerts you the moment one drops, so the next CVE doesn't catch you by surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-86076 (CVSS 8.7):&lt;/strong&gt; a class field named &lt;code&gt;__sanitize&lt;/code&gt; rebinds n8n's expression sanitizer and reaches the &lt;code&gt;Function&lt;/code&gt; constructor — full code execution in the n8n process, or in another editor's browser session via workflow preview.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-44790 (CVSS 9.4):&lt;/strong&gt; an argument-injection flaw disclosed the same day — thinner public detail, higher severity; patch in the same window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix versions: 1.123.76, 2.37.7, 2.38.2&lt;/strong&gt; — match your release line; back up data + &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt; first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-user instances are the high-risk case&lt;/strong&gt; — anyone with workflow-edit rights is an expression author.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The pattern repeats:&lt;/strong&gt; agent and automation control planes concentrate credentials and tool access, so classic bug classes (sandbox escapes, argument injection) keep landing there. My earlier pieces on the n8n October security update and the GitLab AI Gateway flaw are the same story from different angles.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next: check which of your n8n members hold workflow-edit rights right now, and whether any of them shouldn't. The patch closes the hole; the permission audit closes the habit.&lt;/p&gt;

&lt;p&gt;Images: Unsplash&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://cortexflow.tech/blog/n8n-expression-sandbox-escape-cve/" rel="noopener noreferrer"&gt;CortexFlow&lt;/a&gt;. Free n8n templates: &lt;a href="https://cortexflow.tech/templates/" rel="noopener noreferrer"&gt;https://cortexflow.tech/templates/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>security</category>
      <category>cve</category>
      <category>aiagents</category>
    </item>
  </channel>
</rss>
