<?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: Norminal Solutions</title>
    <description>The latest articles on DEV Community by Norminal Solutions (@norminal-solutions).</description>
    <link>https://dev.to/norminal-solutions</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%2F4201308%2Fd126f70a-106c-4737-b56d-a1192a231190.png</url>
      <title>DEV Community: Norminal Solutions</title>
      <link>https://dev.to/norminal-solutions</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/norminal-solutions"/>
    <language>en</language>
    <item>
      <title>Your server says PHP 8.3.6. Is it fixed for PHP2Shell?</title>
      <dc:creator>Norminal Solutions</dc:creator>
      <pubDate>Thu, 22 Oct 2026 23:36:41 +0000</pubDate>
      <link>https://dev.to/norminal-solutions/your-server-says-php-836-is-it-fixed-for-php2shell-3hf0</link>
      <guid>https://dev.to/norminal-solutions/your-server-says-php-836-is-it-fixed-for-php2shell-3hf0</guid>
      <description>&lt;p&gt;You read the PHP2Shell advisory. The fixed releases are PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12. You log in to your Ubuntu 24.04 server, run &lt;code&gt;php -v&lt;/code&gt;, and it says &lt;code&gt;PHP 8.3.6&lt;/code&gt;. That is thirty patch releases below 8.3.36.&lt;/p&gt;

&lt;p&gt;Is the server exposed? Maybe not. This article shows how to get a real answer in about five minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the number can lie
&lt;/h2&gt;

&lt;p&gt;PHP2Shell (CVE-2026-109618 and CVE-2026-109619, CVSS 9.2) is a pair of flaws in PHP itself, not in WordPress, Laravel or any other app. The PHP project published the fixes on 21 October 2026 (&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;, &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;). The research is on &lt;a href="https://php2shell.com/" rel="noopener noreferrer"&gt;php2shell.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Linux distributions do not jump to a new upstream release in a stable branch. They take the fix, apply it to the version they already ship, and add a build number to the package version. So the upstream number stays the same, and only the package version changes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distribution&lt;/th&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Fixed package version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 24.04 LTS&lt;/td&gt;
&lt;td&gt;php8.3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.3.6-0ubuntu0.24.04.13&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 22.04 LTS&lt;/td&gt;
&lt;td&gt;php8.1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.1.2-1ubuntu2.28&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu 26.04 LTS&lt;/td&gt;
&lt;td&gt;php8.5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.5.4-0ubuntu1.5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debian 13 trixie&lt;/td&gt;
&lt;td&gt;php8.4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.4.27-1~deb13u1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debian 12 bookworm&lt;/td&gt;
&lt;td&gt;php8.2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.2.35-1~deb12u1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RHEL 9 (default stream)&lt;/td&gt;
&lt;td&gt;php&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.0.30-8.el9_8.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RHEL 10&lt;/td&gt;
&lt;td&gt;php&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.3.36-1.el10_2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpine v3.23 and newer&lt;/td&gt;
&lt;td&gt;php83&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.3.36-r0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are the versions published by each vendor as of 22 October 2026. Vendors add and change entries, so confirm on your vendor's security tracker before you decide.&lt;/p&gt;

&lt;p&gt;The important part: &lt;code&gt;php -v&lt;/code&gt; and the &lt;code&gt;X-Powered-By&lt;/code&gt; header both show only &lt;code&gt;8.3.6&lt;/code&gt;. Neither shows the &lt;code&gt;-0ubuntu0.24.04.13&lt;/code&gt; part. To know, you have to read the package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: find the PHP that serves your site
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;php -v&lt;/code&gt; answers for the command-line PHP. Your site runs on PHP-FPM, Apache &lt;code&gt;mod_php&lt;/code&gt; or &lt;code&gt;php-cgi&lt;/code&gt;, and that can be a different install. Find the one that serves requests first.&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;# PHP-FPM services that are running&lt;/span&gt;
systemctl list-units &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;service &lt;span class="s1"&gt;'php*'&lt;/span&gt;

&lt;span class="c"&gt;# Apache with mod_php?&lt;/span&gt;
apachectl &lt;span class="nt"&gt;-M&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Debian and Ubuntu, each branch has its own FPM binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php-fpm8.3 &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On RHEL, AlmaLinux and Rocky it is &lt;code&gt;php-fpm -v&lt;/code&gt;. If you are still not sure, put a &lt;code&gt;phpinfo()&lt;/code&gt; page on the site, read the &lt;strong&gt;Server API&lt;/strong&gt; line, and delete the page right after.&lt;/p&gt;

&lt;p&gt;More than one branch on the box is common, for example 8.1 for an old site and 8.3 for the rest. Every branch that serves a site counts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: read the package version
&lt;/h2&gt;

&lt;p&gt;Debian and Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dpkg-query &lt;span class="nt"&gt;-W&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'${Package} ${Version}\n'&lt;/span&gt; &lt;span class="s1"&gt;'php*-fpm'&lt;/span&gt; &lt;span class="s1"&gt;'php*-common'&lt;/span&gt; &lt;span class="s1"&gt;'libapache2-mod-php*'&lt;/span&gt; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RHEL, AlmaLinux and Rocky:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpm &lt;span class="nt"&gt;-q&lt;/span&gt; php-common php-fpm
dnf module list php   &lt;span class="c"&gt;# the enabled stream is marked [e]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alpine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apk info &lt;span class="nt"&gt;-v&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'^php'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: compare it with the fixed build
&lt;/h2&gt;

&lt;p&gt;Do not compare by eye. Let the package manager do it. On Debian and Ubuntu:&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;installed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg-query &lt;span class="nt"&gt;-W&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'${Version}'&lt;/span&gt; php8.3-fpm&lt;span class="si"&gt;)&lt;/span&gt;
dpkg &lt;span class="nt"&gt;--compare-versions&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$installed&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; ge &lt;span class="s2"&gt;"8.3.6-0ubuntu0.24.04.13"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &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;"at or above the fixed build"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"older than the fixed build: update"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put your own package name and your release's fixed version in the command. On RPM systems, &lt;code&gt;rpmdev-vercmp&lt;/code&gt; (from &lt;code&gt;rpmdevtools&lt;/code&gt;) does the same job.&lt;/p&gt;

&lt;p&gt;Two traps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AlmaLinux and Rocky have their own build strings.&lt;/strong&gt; AlmaLinux builds end in &lt;code&gt;.alma.1&lt;/code&gt;, and Rocky module builds have their own suffix. Compare with your distribution's string, not with Red Hat's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ubuntu 20.04 and older&lt;/strong&gt; get the fix through Ubuntu Pro (ESM). Without Pro, &lt;code&gt;apt upgrade&lt;/code&gt; does not install it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: update, then restart
&lt;/h2&gt;

&lt;p&gt;If the package is older than the fixed build, update it:&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;# Debian / Ubuntu&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade

&lt;span class="c"&gt;# RHEL / AlmaLinux / Rocky&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade &lt;span class="s1"&gt;'php*'&lt;/span&gt;

&lt;span class="c"&gt;# Alpine&lt;/span&gt;
apk update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apk upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then restart. This is the step people forget. Running PHP processes keep the old code in memory until they stop, so a new package on disk changes nothing yet.&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;# use your branch&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2      &lt;span class="c"&gt;# or httpd on RHEL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart queue workers, Laravel Octane, Symfony Messenger consumers and any other long-running PHP process too. Then repeat Step 1 and Step 2 to confirm what is running now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Containers
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker restart&lt;/code&gt; keeps the old PHP, because the PHP is in the image. Pull the updated base image, rebuild your image and recreate the container. Official &lt;code&gt;php&lt;/code&gt; images use upstream releases, so look for 8.2.35, 8.3.36, 8.4.27 or 8.5.12 there. Images built on a distribution's own PHP packages follow the distribution table above.&lt;/p&gt;

&lt;h2&gt;
  
  
  PHP 7.4, 8.0 and 8.1
&lt;/h2&gt;

&lt;p&gt;The PHP project ships no new release for these branches. Its security team published source patches for 7.4, 8.0 and 8.1, for people who build PHP themselves. Everyone else needs a fixed build from a distribution, host or LTS vendor (for example Ubuntu 22.04's &lt;code&gt;8.1.2-1ubuntu2.28&lt;/code&gt;, or RHEL 8's php:7.4 stream), or a move to 8.2 or newer. Note that 8.2 itself reaches end of life on 31 December 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the outside view can and cannot tell
&lt;/h2&gt;

&lt;p&gt;From outside, the only version hint is the &lt;code&gt;X-Powered-By&lt;/code&gt; header, which PHP adds when &lt;code&gt;expose_php&lt;/code&gt; is on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;X-Powered-By: PHP/8.3.6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one line is useful. &lt;code&gt;PHP/8.3.12&lt;/code&gt; on branch 8.3 is clearly below 8.3.36, and no distribution ships that number as a fixed build. But &lt;code&gt;PHP/8.3.6&lt;/code&gt; can be either the old Ubuntu build or the fixed one, because the header never shows the package suffix. And a missing header tells you nothing at all. Hiding it with &lt;code&gt;expose_php = Off&lt;/code&gt; is fine hardening, and it does not fix PHP2Shell.&lt;/p&gt;

&lt;p&gt;A header is a hint, not proof. Use it as a quick first look at your own sites, then confirm on the server with the steps above. Our team built a free checker that reads the header and knows these distribution builds. It answers "not fixed", "fixed release", "check the package" or "cannot tell": &lt;a href="https://php2shell.fyi/?ref=devto" rel="noopener noreferrer"&gt;php2shell.fyi&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Find every PHP that serves a site (FPM pools, &lt;code&gt;mod_php&lt;/code&gt;, containers).&lt;/li&gt;
&lt;li&gt;Read the full package version, not &lt;code&gt;php -v&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Compare it with your vendor's fixed build using the package manager.&lt;/li&gt;
&lt;li&gt;Update, then restart PHP-FPM, Apache and long-running workers.&lt;/li&gt;
&lt;li&gt;On 7.4, 8.0 or 8.1, get a vendor build or plan the move.&lt;/li&gt;
&lt;li&gt;After the update, rotate the secrets PHP could read on hosts that ran an affected version. The flaws can leak server memory.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;This article was drafted with AI assistance and checked by the php2shell.fyi team. php2shell.fyi is unofficial and not affiliated with PHP or php2shell.com. Package versions are as published by each vendor on 22 October 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>security</category>
      <category>linux</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
