<?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: Daniele Michelin</title>
    <description>The latest articles on DEV Community by Daniele Michelin (@mikweb2025design).</description>
    <link>https://dev.to/mikweb2025design</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%2F4203448%2Fffe5cc53-a862-4b03-bec6-790f814b375c.jpg</url>
      <title>DEV Community: Daniele Michelin</title>
      <link>https://dev.to/mikweb2025design</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mikweb2025design"/>
    <language>en</language>
    <item>
      <title>Nextcloud: Collabora's built-in CODE server is being exploited. Check it today</title>
      <dc:creator>Daniele Michelin</dc:creator>
      <pubDate>Sun, 25 Oct 2026 07:42:07 +0000</pubDate>
      <link>https://dev.to/mikweb2025design/nextcloud-collaboras-built-in-code-server-is-being-exploited-check-it-today-1ln6</link>
      <guid>https://dev.to/mikweb2025design/nextcloud-collaboras-built-in-code-server-is-being-exploited-check-it-today-1ln6</guid>
      <description>&lt;p&gt;If you run Nextcloud with the built-in Collabora server, stop and check this today. CVE-2026-110447 is an OS command injection in the app &lt;strong&gt;Collabora Online - Built-in CODE Server&lt;/strong&gt; (&lt;code&gt;richdocumentscode&lt;/code&gt;). It needs no login and no user interaction, it is rated &lt;strong&gt;CVSS 4.0: 9.2&lt;/strong&gt;, and attackers have been using it since September. CISA added it to its list of known exploited vulnerabilities on 23 October, with a deadline of 26 October for US federal agencies.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Affected:&lt;/strong&gt; the app &lt;code&gt;richdocumentscode&lt;/code&gt; in every version before &lt;strong&gt;26.4.303&lt;/strong&gt;, even when the app is disabled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not affected:&lt;/strong&gt; a separate Collabora server (Docker, DEB/RPM packages), Nextcloud All-in-One, and Nextcloud Office (&lt;code&gt;richdocuments&lt;/code&gt;) when it talks to a separate Collabora server. Those two apps have similar names, so check which one you actually have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nextcloud 29 and older:&lt;/strong&gt; the newest app version you can install there is 26.4.104, which is vulnerable. You need to remove the app or upgrade Nextcloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the attack works, in short
&lt;/h2&gt;

&lt;p&gt;The app has a script, &lt;code&gt;proxy.php&lt;/code&gt;, that starts the bundled Collabora server when a request arrives and nothing is listening. In the vulnerable versions the request path was put inside a double-quoted shell command. The shell expands &lt;code&gt;$(...)&lt;/code&gt; there, so a command hidden in the path runs as the web server user. The attack works while the local CODE server is down, for example after a restart, an upgrade or a crash.&lt;/p&gt;

&lt;p&gt;Attackers dropped a one-line PHP web shell into the app folder and then looked for password databases, password manager files and cryptocurrency wallets. The first logged attack was on 10 September, one day before the fixed version was released. The CVE and the advisory only came on 14 October, more than four weeks after the fix. That is the real lesson: waiting for a security alert would have been too late.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check in five minutes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/nextcloud
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; www-data php occ app:list | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; richdocuments
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; www-data php occ integrity:check-app richdocumentscode
find apps/richdocumentscode &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'shx*.php'&lt;/span&gt;
find apps/richdocumentscode &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.php'&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; + | &lt;span class="nb"&gt;grep &lt;/span&gt;4b9fbd0663fbfd60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line shows whether you have &lt;code&gt;richdocumentscode&lt;/code&gt; (the built-in server, vulnerable) and which version. The second runs Nextcloud's integrity check for the app. The last two look for the web shells reported so far: files named &lt;code&gt;shx….php&lt;/code&gt; and the hash of the one-line shell.&lt;/p&gt;

&lt;p&gt;Then the logs, back to at least 10 September (rotated logs included):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zgrep &lt;span class="nt"&gt;-hE&lt;/span&gt; &lt;span class="s1"&gt;'richdocumentscode/proxy\.php'&lt;/span&gt; /var/log/nginx/access.log&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'\$\(|%24%28|IFS|base64|%2e%2e'&lt;/span&gt;
zgrep &lt;span class="nt"&gt;-hE&lt;/span&gt; &lt;span class="s1"&gt;'139\.28\.18\.122|89\.38\.98\.50'&lt;/span&gt; /var/log/nginx/access.log&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every hit in the first command is a request that tried to inject something. The two IP addresses are those named in the public reports. Logs rotate, so no hit does not prove you were not attacked earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update:&lt;/strong&gt; &lt;code&gt;sudo -u www-data php occ app:update richdocumentscode&lt;/code&gt;. Fixed versions are 26.4.303, 26.4.402 and 26.4.502 (Nextcloud 30 and newer). Some admins reported start problems with 26.4.402 in mid-October and went back to 26.4.303.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Or remove it&lt;/strong&gt; if you do not use the built-in server: &lt;code&gt;sudo -u www-data php occ app:remove richdocumentscode&lt;/code&gt;. &lt;strong&gt;Disabling is not enough&lt;/strong&gt;, Collabora says so explicitly. For editing documents, a separate Collabora server is the cleaner setup anyway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An update does not remove a web shell.&lt;/strong&gt; Run the checks above after updating, not only before.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you find a web shell
&lt;/h2&gt;

&lt;p&gt;Treat it as a compromise. The web server user can read &lt;code&gt;config.php&lt;/code&gt;, so the database password, the instance secret and any stored credentials must be considered exposed. My advice: take the server out of reach, restore from a clean backup if you are unsure how far it went, rotate the database password and the secrets in &lt;code&gt;config.php&lt;/code&gt;, and have users change passwords and app passwords. In the reports no root access was seen, but that is no guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remove optional apps you do not use.&lt;/strong&gt; Every app is attack surface, and this one runs a server process of its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate Collabora server or All-in-One&lt;/strong&gt; keep the document server away from your Nextcloud files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update apps on a schedule,&lt;/strong&gt; not when a headline appears. The fix existed for more than a month before the advisory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep an inventory:&lt;/strong&gt; which Nextcloud apps run where. It makes a day like today a five-minute job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources: &lt;a href="https://www.bleepingcomputer.com/news/security/hackers-exploit-collabora-rce-flaw-to-backdoor-nextcloud-servers/" rel="noopener noreferrer"&gt;BleepingComputer&lt;/a&gt;, &lt;a href="https://thehackernews.com/2026/10/hackers-backdoor-nextcloud-servers.html" rel="noopener noreferrer"&gt;The Hacker News&lt;/a&gt; and &lt;a href="https://www.esecurityplanet.com/threats/news-collabora-nextcloud-cve-2026-110447/" rel="noopener noreferrer"&gt;eSecurityPlanet&lt;/a&gt;. More Nextcloud commands in the &lt;a href="https://daniele-michelin.com/en/cheat-sheets/nextcloud-occ-cheat-sheet/" rel="noopener noreferrer"&gt;occ cheat sheet&lt;/a&gt;. For comparison: my post on the &lt;a href="https://daniele-michelin.com/en/blog/php-emergency-patch-php2shell/" rel="noopener noreferrer"&gt;PHP emergency patch&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://daniele-michelin.com/en/blog/nextcloud-collabora-code-flaw-cve-2026-110447/" rel="noopener noreferrer"&gt;daniele-michelin.com&lt;/a&gt;. More guides, free checks (SPF, TLS, headers) and an error-message lexicon: &lt;a href="https://daniele-michelin.com/en/" rel="noopener noreferrer"&gt;daniele-michelin.com/en/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextcloud</category>
      <category>security</category>
      <category>patch</category>
      <category>cve</category>
    </item>
    <item>
      <title>Mitigating PHP2Shell when no update exists yet: php.ini settings for NAS, Plesk and your own servers</title>
      <dc:creator>Daniele Michelin</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:54:29 +0000</pubDate>
      <link>https://dev.to/mikweb2025design/mitigating-php2shell-when-no-update-exists-yet-phpini-settings-for-nas-plesk-and-your-own-servers-4dkj</link>
      <guid>https://dev.to/mikweb2025design/mitigating-php2shell-when-no-update-exists-yet-phpini-settings-for-nas-plesk-and-your-own-servers-4dkj</guid>
      <description>&lt;p&gt;Fixes for the PHP2Shell flaws (CVE-2026-109618 and CVE-2026-109619) have been available since 21 October 2026 in 8.5.12, 8.4.27, 8.3.36 and 8.2.35. On many systems the packages arrive later, for example on NAS devices such as Synology, where PHP comes through the Package Center. The blog &lt;a href="https://mariushosting.com/synology-mitigating-php2shell-cve-2026-109618-cve-2026-109619/" rel="noopener noreferrer"&gt;mariushosting&lt;/a&gt; describes a Synology stop-gap based on a few PHP settings. Here I put them in context and show how to set them on Plesk and ordinary servers too.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, important: this is not a fix
&lt;/h2&gt;

&lt;p&gt;According to the PHP advisory only the update protects completely. Settings like the following reduce individual attack paths. They are a plaster for the time until the package arrives, not a replacement. As soon as your vendor ships a patched version (8.2.35, 8.3.36, 8.4.27 or newer), install it and only roll the stop-gap back if your application needs that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three settings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;session.upload_progress.enabled = 0&lt;/code&gt;: turns off the upload progress feature that works through the session. That mechanism processes data already during the upload, so switching it off is the first measure.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session.use_only_cookies = 1&lt;/code&gt; and &lt;code&gt;session.use_cookies = 1&lt;/code&gt;: session IDs are only accepted via cookies, not via URL or form fields.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session.use_strict_mode = 1&lt;/code&gt;: PHP does not adopt a session ID it did not issue itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Side effect: applications that build an upload progress bar from PHP sessions will no longer show it. The upload itself keeps working.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to set them
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Synology Web Station:&lt;/strong&gt; open Web Station, “Script Language Settings” on the left, choose the PHP profile, “Edit”, “Core” tab. Set &lt;code&gt;session.upload_progress.enabled&lt;/code&gt; from 1 to 0 and the three &lt;code&gt;session.use_*&lt;/code&gt; values to 1. Then check that your website really uses this profile (Web Service in the sidebar). The source blog states the effect for PHP 8.4, 8.3, 8.2, 8.0 and older.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plesk:&lt;/strong&gt; domain, “PHP Settings”, field “Additional directives”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;session.upload_progress.enabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="py"&gt;session.use_only_cookies&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;session.use_cookies&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;session.use_strict_mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Your own server:&lt;/strong&gt; create a file in the &lt;code&gt;conf.d&lt;/code&gt; of the affected PHP version (for example &lt;code&gt;99-php2shell.ini&lt;/code&gt;) and restart PHP-FPM or Apache.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containers:&lt;/strong&gt; mount the file as an ini into the image (volume to &lt;code&gt;/usr/local/etc/php/conf.d/&lt;/code&gt;) and restart the container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check that it works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-i&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"session.upload_progress.enabled|session.use_(cookies|only_cookies|strict_mode)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That shows only the CLI values. For the website itself, briefly open a small page with &lt;code&gt;phpinfo()&lt;/code&gt; and delete it afterwards, or check the domain's settings in Plesk. Important: restart PHP after the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other measures that are mentioned
&lt;/h2&gt;

&lt;p&gt;According to the report by The Hacker News, the PHP team additionally suggests for CVE-2026-109618 to set &lt;code&gt;memory_limit=-1&lt;/code&gt; (so applications cannot override it), keep &lt;code&gt;post_max_size&lt;/code&gt; low and enforce size limits at the web server already. Read the advisory and test whether your applications can live with those values.&lt;/p&gt;

&lt;h2&gt;
  
  
  My recommendation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;First check which PHP version really runs and whether a patched build exists.&lt;/li&gt;
&lt;li&gt;If not: set the stop-gap, test the application, leave a dated note.&lt;/li&gt;
&lt;li&gt;Check the Package Center or your host regularly and install the update as soon as it appears.&lt;/li&gt;
&lt;li&gt;Where possible switch to a handler with timely updates, as I described in my &lt;a href="https://daniele-michelin.com/en/blog/php-emergency-patch-php2shell/" rel="noopener noreferrer"&gt;post on the PHP emergency patch&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source of the Synology guide: &lt;a href="https://mariushosting.com/synology-mitigating-php2shell-cve-2026-109618-cve-2026-109619/" rel="noopener noreferrer"&gt;mariushosting&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://daniele-michelin.com/en/blog/php2shell-workaround-php-ini/" rel="noopener noreferrer"&gt;daniele-michelin.com&lt;/a&gt;. More guides, free checks (SPF, TLS, headers) and an error-message lexicon: &lt;a href="https://daniele-michelin.com/en/" rel="noopener noreferrer"&gt;daniele-michelin.com/en/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>security</category>
      <category>patch</category>
      <category>nas</category>
    </item>
    <item>
      <title>PHP emergency patch (PHP2Shell): how to check and patch your servers</title>
      <dc:creator>Daniele Michelin</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:38:39 +0000</pubDate>
      <link>https://dev.to/mikweb2025design/php-emergency-patch-php2shell-how-to-check-and-patch-your-servers-cpa</link>
      <guid>https://dev.to/mikweb2025design/php-emergency-patch-php2shell-how-to-check-and-patch-your-servers-cpa</guid>
      <description>&lt;p&gt;On 21 October 2026 the PHP team released emergency updates for two critical vulnerabilities (CVE-2026-109618 and CVE-2026-109619, together “PHP2Shell”, 9.2 each on CVSS 4.0). They sit in the runtime, not in an application: even a “Hello World” page on a vulnerable PHP version can be attacked, without any account. The fix is in &lt;strong&gt;8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/strong&gt;. Researchers at Wiz, Calif and OpenAI found them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why updating the application is not enough
&lt;/h2&gt;

&lt;p&gt;Updating WordPress, Laravel or Nextcloud changes nothing about the PHP version underneath. That comes from the server package, the host or the container image. According to the PHP advisory every way of running PHP is affected (PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed). mod_php is the most dangerous: a single request can trigger the attack before any application code runs. In addition, memory of the PHP process can be read, and it may hold passwords, tokens and keys of other requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: find every PHP installation
&lt;/h2&gt;

&lt;p&gt;A server rarely has just one PHP. Typical places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;distribution package&lt;/strong&gt; (&lt;code&gt;php -v&lt;/code&gt;, &lt;code&gt;php-fpm&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panel-provided versions&lt;/strong&gt;, for instance Plesk under &lt;code&gt;/opt/plesk/php/*&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containers&lt;/strong&gt;: Nextcloud, WordPress and others ship their own PHP in the image (&lt;code&gt;docker exec NAME php -v&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra handlers&lt;/strong&gt; per website that sit on a different version than the rest.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /opt/plesk/php/ 2&amp;gt;/dev/null
&lt;span class="k"&gt;for &lt;/span&gt;c &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Names}}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="s2"&gt;: "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt; php &lt;span class="nt"&gt;-v&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare each version with the table: below 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 is vulnerable. PHP 8.1 and older no longer get updates, there are only source backports for 7.4, 8.0 and 8.1; 8.2 ends on 31 December 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: patch and restart
&lt;/h2&gt;

&lt;p&gt;On Debian/Ubuntu the usual &lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt;. Important: distributions often ship the fix under an “old” version number, so check the package changelog for the CVE number, not just the version string. Then &lt;strong&gt;restart PHP-FPM or Apache&lt;/strong&gt;, including long-running PHP workers. Without a restart the old code keeps running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worked example: my server tonight
&lt;/h2&gt;

&lt;p&gt;On my Plesk server I had three sources: the Ubuntu system package (8.3.6), Plesk PHP 8.5.11 and two Docker images with their own PHP. Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plesk PHP 8.5&lt;/strong&gt; updated to 8.5.12 through the Plesk installer.&lt;/li&gt;
&lt;li&gt;For the &lt;strong&gt;Ubuntu package there was no fix yet&lt;/strong&gt;. Instead of waiting I installed Plesk PHP 8.3 (now 8.3.36) and moved the websites to that handler. Same minor version, so little compatibility risk. Then I tested each site individually.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;containers&lt;/strong&gt; (Nextcloud AIO) still carry an older PHP. Only the new image helps there, once it is released.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Synology, Plesk, shared hosting, Docker: what to do?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared hosting (e.g. at STRATO or IONOS):&lt;/strong&gt; PHP is run and updated by the provider. Check in the control panel which PHP version the site uses and switch to a supported one. Keep your own application (WordPress, Nextcloud, shop) up to date anyway. This is my professional view, not a statement by any provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plesk:&lt;/strong&gt; every PHP version is a separate package. Install the updates via the Plesk updater or the package manager, then check: &lt;code&gt;/opt/plesk/php/8.3/bin/php -v&lt;/code&gt; (for each installed version) and &lt;code&gt;plesk bin php_handler --list&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synology:&lt;/strong&gt; PHP comes with Web Station and the Package Center. Until Synology ships an update, the only option is the php.ini mitigation: &lt;a href="https://daniele-michelin.com/en/blog/php2shell-workaround-php-ini/" rel="noopener noreferrer"&gt;guide for NAS, Plesk and your own servers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker and containers:&lt;/strong&gt; the fix is in the image. &lt;code&gt;docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;/code&gt;, then &lt;code&gt;docker exec &amp;lt;container&amp;gt; php -v&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A few tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inventory first:&lt;/strong&gt; write down where PHP runs (system, panel, containers). Next emergency you save the search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid mod_php:&lt;/strong&gt; switch to PHP-FPM where you can. It reduces the attack surface and allows separate pools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test after every switch:&lt;/strong&gt; home page, login, forms, cron jobs. A 200 on the home page is not enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workarounds are not a fix:&lt;/strong&gt; limits such as a small &lt;code&gt;post_max_size&lt;/code&gt; only reduce individual attack paths. The update stays mandatory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan for end of support:&lt;/strong&gt; anyone on 8.1 or older needs a migration plan, not just this patch. 8.2 ends in two months.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch your secrets:&lt;/strong&gt; because memory could be read, rotate tokens and keys if you see suspicious traces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources: &lt;a href="https://thehackernews.com/2026/10/php-issues-emergency-patches-for-two.html" rel="noopener noreferrer"&gt;The Hacker News&lt;/a&gt; and the PHP security advisory.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://daniele-michelin.com/en/blog/php-emergency-patch-php2shell/" rel="noopener noreferrer"&gt;daniele-michelin.com&lt;/a&gt;. More guides, free checks (SPF, TLS, headers) and an error-message lexicon: &lt;a href="https://daniele-michelin.com/en/" rel="noopener noreferrer"&gt;daniele-michelin.com/en/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>security</category>
      <category>patch</category>
      <category>linux</category>
    </item>
    <item>
      <title>Three critical NGINX flaws: less dramatic than PHP2Shell, but patch them quickly anyway</title>
      <dc:creator>Daniele Michelin</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:38:34 +0000</pubDate>
      <link>https://dev.to/mikweb2025design/three-critical-nginx-flaws-less-dramatic-than-php2shell-but-patch-them-quickly-anyway-3d0h</link>
      <guid>https://dev.to/mikweb2025design/three-critical-nginx-flaws-less-dramatic-than-php2shell-but-patch-them-quickly-anyway-3d0h</guid>
      <description>&lt;p&gt;A sysadmin never quite sleeps. PHP has barely been patched and F5 reports three critical flaws in NGINX Open Source and NGINX Plus, each rated CVSS 9.2. They can crash individual workers (DoS) and, under some conditions, lead to code execution. The good news: unlike PHP2Shell, not every installation is automatically exposed. It depends on specific directives. The bad news: there is no official interim mitigation, only the update.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three flaws in one sentence each
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-15176&lt;/strong&gt;: heap overflow when &lt;code&gt;alias&lt;/code&gt; meets &lt;code&gt;rewrite&lt;/code&gt; plus a &lt;code&gt;set&lt;/code&gt; or &lt;code&gt;return&lt;/code&gt; that uses &lt;code&gt;$request_filename&lt;/code&gt;. &lt;code&gt;$request_filename&lt;/code&gt; in an access-log format is enough as well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-97205&lt;/strong&gt;: use-after-free when asynchronous file I/O (&lt;code&gt;aio&lt;/code&gt;) is enabled and SSI pages with virtual includes are processed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-93479&lt;/strong&gt;: heap overflow with regular expressions in &lt;code&gt;map&lt;/code&gt; when &lt;code&gt;root&lt;/code&gt; or a log format uses capture variables before the map output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three affect the data plane only. Code execution additionally requires ASLR to be bypassed. No active attacks are known at the moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which versions?
&lt;/h2&gt;

&lt;p&gt;NGINX Open Source is fixed in &lt;strong&gt;1.31.7&lt;/strong&gt; and &lt;strong&gt;1.30.6&lt;/strong&gt;. NGINX Plus in &lt;strong&gt;37.1.0.1&lt;/strong&gt; and &lt;strong&gt;37.0.5.1&lt;/strong&gt;; R33 to R36 get no fix in their branch, only a migration helps. Older versions are partly affected too, back to very old releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check in five minutes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nginx &lt;span class="nt"&gt;-v&lt;/span&gt;
nginx &lt;span class="nt"&gt;-T&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-nE&lt;/span&gt; &lt;span class="s1"&gt;'request_filename|^\s*aio\s|^\s*ssi\s+on'&lt;/span&gt;
nginx &lt;span class="nt"&gt;-T&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-nE&lt;/span&gt; &lt;span class="s1"&gt;'^\s*map\s'&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;c &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Names}}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$c&lt;/span&gt; nginx &lt;span class="nt"&gt;-v&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ^ &lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line shows the version. The second searches the directives of the first two flaws in the complete, resolved configuration (including included files). The third lists every &lt;code&gt;map&lt;/code&gt; block: look closely whether regular expressions with capture groups are used and whether those captures appear in &lt;code&gt;root&lt;/code&gt; or a &lt;code&gt;log_format&lt;/code&gt;. The last line finds NGINX inside containers, which are easy to forget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patch depending on where NGINX comes from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Distribution:&lt;/strong&gt; &lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt; and search the package changelog for the CVE numbers. Distributions often ship the fix under an old version number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panel (Plesk, cPanel):&lt;/strong&gt; the panel brings its own NGINX. Don't replace it by hand; wait for the vendor's update and keep automatic updates on. Check the configuration until then.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containers:&lt;/strong&gt; move the image to &lt;code&gt;nginx:1.30.6-alpine&lt;/code&gt; or newer. If you don't want to rebuild the app, swap only the runtime layer: new NGINX image as the base, copy the built files and templates from the old image, recreate the container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then &lt;code&gt;nginx -t&lt;/code&gt; and a reload. For containers, recreate them, a restart is not enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looked like on my server
&lt;/h2&gt;

&lt;p&gt;The NGINX in front of my websites comes from the panel and was on 1.30.5. No patched package was available there yet. Checking the complete configuration showed: no &lt;code&gt;$request_filename&lt;/code&gt;, no &lt;code&gt;aio&lt;/code&gt;, no SSI, and the &lt;code&gt;map&lt;/code&gt; blocks use no captures. So not exploitable, and the update will arrive automatically once the vendor ships it. One container with its own NGINX was still on 1.29.8. I moved it to 1.30.6 right away, without rebuilding the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No reason to panic, but no reason to leave it either.&lt;/strong&gt; The configuration can change with the next deployment. What is not exploitable today may be tomorrow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the resolved configuration&lt;/strong&gt; (&lt;code&gt;nginx -T&lt;/code&gt;), not just your own file. Many directives come from panel or package includes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't forget containers:&lt;/strong&gt; front ends, admin interfaces and office services often bring their own NGINX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid floating tags:&lt;/strong&gt; &lt;code&gt;FROM nginx:alpine&lt;/code&gt; is convenient, but you never know which version is running. Pin a concrete version and raise it on purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a small inventory:&lt;/strong&gt; where NGINX runs, where PHP runs, which image is where. After PHP2Shell two days ago it has already paid off twice for me.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources: &lt;a href="https://nginx.org/en/security_advisories.html" rel="noopener noreferrer"&gt;NGINX security advisories&lt;/a&gt; and the &lt;a href="https://www.csa.gov.sg/alerts-and-advisories/alerts/al-2026-150/" rel="noopener noreferrer"&gt;Cyber Security Agency of Singapore&lt;/a&gt;. For comparison: my post on the &lt;a href="https://daniele-michelin.com/en/blog/php-emergency-patch-php2shell/" rel="noopener noreferrer"&gt;PHP emergency patch&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://daniele-michelin.com/en/blog/nginx-vulnerabilities-october-2026/" rel="noopener noreferrer"&gt;daniele-michelin.com&lt;/a&gt;. More guides, free checks (SPF, TLS, headers) and an error-message lexicon: &lt;a href="https://daniele-michelin.com/en/" rel="noopener noreferrer"&gt;daniele-michelin.com/en/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>security</category>
      <category>patch</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
