{"id":22774,"date":"2026-10-22T09:48:00","date_gmt":"2026-10-22T07:48:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=22774"},"modified":"2026-10-22T10:53:36","modified_gmt":"2026-10-22T08:53:36","slug":"php2shell-protection-updates-unpatched-websites","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/","title":{"rendered":"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain"},"content":{"rendered":"<p><strong>As of 22 October 2026.<\/strong> PHP2Shell affects the runtime beneath a large part of the web. Two critical vulnerabilities can allow unauthenticated remote code execution under suitable conditions. Security updates have been available since 21 October. The practical question is now which internet-facing installations are actually running corrected PHP. <a href=\"https:\/\/www.php.net\/archive\/2026.php#2026-10-21-5\">[1]<\/a> <a href=\"https:\/\/digital.nhs.uk\/cyber-alerts\/2026\/cc-4875\">[6]<\/a><\/p><h2>Updated situation: attempts before public disclosure<\/h2><p>AWS reports a PHP2Shell exploitation attempt on 17 October 2026 in its own MadPot telemetry, before public disclosure. For additional observed attempts, success against real-world systems remained uncertain. This is documented warning evidence, not a global count of compromised systems. Investigations of potentially affected installations should therefore reach back before the publication date. <a href=\"https:\/\/aws.amazon.com\/blogs\/security\/amazon-threat-intelligence-identifies-php2shell-exploitation-prior-to-public-disclosure-in-madpot\/\">AWS: first-hand observations and limitations<\/a><\/p>\n<h2>What PHP2Shell means<\/h2>\n<p>The identifiers are <strong>CVE-2026-109618<\/strong> and <strong>CVE-2026-109619<\/strong>. The first involves invalid internal memory state following an out-of-memory condition. The second involves internal references surviving after the underlying memory has been freed. Subsequent processing can turn either condition into a security failure. Both flaws are inside PHP itself. <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-w8hw-w9fx-j79w\">[3]<\/a> <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-6wmf-4rv5-p3rp\">[4]<\/a><\/p>\n<p>\u201cEvery version since PHP 5\u201d conveys the exceptional reach, but does not replace package verification. Old PHP 5 and 7 branches require scrutiny alongside PHP 8. cPanel lists older packages and specific corrected vendor revisions. Moving from PHP 7 to an arbitrary PHP 8 release is therefore insufficient evidence of protection. <a href=\"https:\/\/support.cpanel.net\/hc\/en-us\/articles\/44397389677335-Critical-PHP-Security-Release-CVE-2026-109618-and-CVE-2026-109619\">[7]<\/a><\/p>\n<p>Apache with mod_php presents a particularly serious case: a demonstrated attack path operates before application code starts. PHP-FPM is not a safe exemption; the PHP Foundation also reports confirmed code execution through application-dependent paths. A WordPress login cannot reliably protect against a flaw below the application layer. <a href=\"https:\/\/thephp.foundation\/blog\/2026\/10\/21\/todays-php-security-release-and-how-were-strengthening-php-security\/\">[2]<\/a><\/p>\n<h2>Which updates provide protection?<\/h2>\n<p>The corrected official releases are <strong>8.2.35, 8.3.36, 8.4.27 and 8.5.12<\/strong>, or a later corrected release in the corresponding branch. PHP 8.1 and earlier no longer receive regular PHP-project releases. Exceptional minimal source backports exist for 7.4, 8.0 and 8.1, while distributions and LTS vendors may supply corrected packages. <a href=\"https:\/\/www.php.net\/archive\/2026.php#2026-10-21-5\">[1]<\/a><\/p>\n<p>An old base version does not necessarily mean an absent patch. The complete package revision and confirmation covering <em>both<\/em> CVEs matter. Conversely, a \u201cPHP 8\u201d label establishes no protection. <a href=\"https:\/\/support.cpanel.net\/hc\/en-us\/articles\/44397389677335-Critical-PHP-Security-Release-CVE-2026-109618-and-CVE-2026-109619\">[7]<\/a><\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/php2shell-2026-en.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Four verification steps: inventory, patch both flaws, replace running processes and verify web operation\"><figcaption>The update must reach the running web service.<\/figcaption><\/figure>\n<h2>From updated packages to protected services<\/h2>\n<ol><li><strong>Inventory:<\/strong> Domains, PHP pools, containers, forgotten test installations and embedded administration tools all belong in scope.<\/li><li><strong>Evidence:<\/strong> Each runtime needs a recorded package source, revision and confirmation that both CVEs are addressed.<\/li><li><strong>Running instances:<\/strong> PHP workers must load the corrected build. Custom containers require an updated image and redeployment; updating the host does not modify an existing container image. <a href=\"https:\/\/cloud.google.com\/blog\/products\/identity-security\/responding-to-core-php-vulnerabilities-cve-2026-109618-cve-2026-109619\">[8]<\/a><\/li><li><strong>Web verification:<\/strong> The command line may use a different PHP installation from the website. Mapping each domain to the active runtime, followed by functional checks, completes the operational verification.<\/li><\/ol>\n<p>Where immediate patching remains impossible, ENISA recommends considering isolation of exposed applications. A static maintenance page served before PHP can stop requests reaching the vulnerable runtime. A maintenance plugin running inside that same PHP application does not reliably provide that separation. <a href=\"https:\/\/www.enisa.europa.eu\/news\/joint-statement-on-critical-php-vulnerabilities\">[5]<\/a><\/p>\n<p>Official configuration mitigations only offer temporary reductions in exposure. For example, <code>session.upload_progress.enabled=0<\/code> blocks specific confirmed session paths, not every possible variant. Changes to memory limits are not a universal repair either. Unlimited PHP memory can introduce availability risks; appropriate limits outside PHP require careful coordination. None of these measures replaces patching. <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-w8hw-w9fx-j79w\">[3]<\/a> <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-6wmf-4rv5-p3rp\">[4]<\/a><\/p>\n<h2>The consequences of a missing update<\/h2>\n<p>The starting point is code execution with the web worker account\u2019s permissions, not automatic root access. Depending on permissions and accessible secrets, consequences can include stolen database credentials, exposed customer records, altered content, planted malware and abused API keys. Reachable internal services may become further targets where network access and credentials permit. <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-w8hw-w9fx-j79w\">[3]<\/a><\/p>\n<p>For an online shop, a modified payment page can be more damaging than an obvious outage. Investigation, recovery, downtime and loss of trust add further costs. A later patch does not remove an existing backdoor. Concrete intrusion indicators call for isolation, evidence preservation, credential review and recovery from a trusted state.<\/p>\n<h2>Will administrators actually install the updates?<\/h2>\n<p><strong>Assessment:<\/strong> A rapid initial reduction in exposed installations is plausible; complete coverage within days is not. Centrally operated platforms can update large numbers of websites together. Individual servers depend on ownership, package availability, compatibility and controlled restarts. Google Cloud explicitly distinguishes automatically updated runtimes from services requiring redeployment. <a href=\"https:\/\/cloud.google.com\/blog\/products\/identity-security\/responding-to-core-php-vulnerabilities-cve-2026-109618-cve-2026-109619\">[8]<\/a><\/p>\n<p>The remaining population is likely to be persistent: abandoned projects, old agency deployments, containers without maintenance processes and applications tied to unsupported branches. Delays do not automatically indicate administrator negligence. Missing budgets, unclear responsibilities and untested legacy dependencies can obstruct a technically straightforward patch. A specific global update rate would currently be speculation.<\/p>\n<h2>How many websites will remain at risk?<\/h2>\n<p>On 22 October, W3Techs reports PHP on <strong>69.3% of websites with a known server-side programming language<\/strong>. Within the detected PHP population, PHP 7 accounts for 26.9% and PHP 5 for 7.7%, totaling 34.6%. These figures describe adoption and legacy usage, not measured unpatched exposure. <a href=\"https:\/\/w3techs.com\/technologies\/details\/pl-php\">[9]<\/a><\/p>\n<p>No reliable absolute remainder follows from those figures. Vendor backports, configuration differences, hidden version information and multiple websites sharing a server prevent direct conversion. Individual web pages, domains and servers also represent different counting units.<\/p>\n<p>A purely illustrative calculation: in a population of one million genuinely affected installations, a successful 95% update rate would leave 50,000 unpatched. This is <strong>neither a measurement nor a forecast<\/strong>. The arithmetic simply explains why even a high completion rate can leave a substantial remainder at internet scale. Verified patch status matters more for a particular website than a global percentage.<\/p>\n<h2>Linux operations: inventory the runtime actually in use<\/h2>\n<p>The following package examples apply to Debian\/Ubuntu systems using APT with existing trusted repositories. The relevant PHP branch must already be installed. RPM systems, hosting panels and custom containers require the corresponding vendor workflow. Adding an arbitrary third-party repository is not a reliable repair strategy.<\/p>\n<p>A recoverable backup, a mapping of domains to PHP pools and a short functional test plan belong before the change. Package installation may restart services itself, so the maintenance window starts before the installation command. This inventory covers the CLI and services, but does not yet establish the web handler:<\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">Linux: inventory PHP installations<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">cat<\/span> \/etc\/os-release\n<\/span><span class=\"cbb-line\">command <span class=\"cbb-attr\">-v<\/span> <span class=\"cbb-function\">php<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">php<\/span> <span class=\"cbb-attr\">-v<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">php<\/span> <span class=\"cbb-attr\">--ini<\/span>\n<\/span><span class=\"cbb-line\">dpkg-query <span class=\"cbb-attr\">-W<\/span> <span class=\"cbb-attr\">-f<\/span>=<span class=\"cbb-string\">'${binary:Package}\\t${Version}\\n'<\/span> <span class=\"cbb-string\">'php*'<\/span> <span class=\"cbb-string\">'libapache2-mod-php*'<\/span> <span class=\"cbb-number\">2<\/span><span class=\"cbb-operator\">&gt;<\/span>\/dev\/null\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">systemctl<\/span> list-units <span class=\"cbb-attr\">--type<\/span>=<span class=\"cbb-function\">service<\/span> <span class=\"cbb-attr\">--all<\/span> <span class=\"cbb-operator\">|<\/span> <span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-E<\/span> <span class=\"cbb-string\">'php.*fpm|apache2|nginx'<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">ps<\/span> <span class=\"cbb-attr\">-eo<\/span> pid,lstart,comm <span class=\"cbb-operator\">|<\/span> <span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-E<\/span> <span class=\"cbb-string\">'php|apache2'<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>A domain can use PHP 8.4 through FPM while the shell command <code>php<\/code> points to 8.5. Additional copies can exist in containers, hosting directories and forgotten test services. Evidence for each installation needs the package source, complete revision, service or container and associated websites.<\/p>\n<h2>Updating PHP 8.4 with APT<\/h2>\n<p>This workflow only upgrades installed 8.4 packages, including existing extensions and any installed Apache module. Simulation changes no packages. The candidate must contain PHP 8.4.27 or a vendor-confirmed backport addressing both CVEs. Debian 13 documents <code>8.4.27-1~deb13u1<\/code> as fixed. <a href=\"https:\/\/manpages.debian.org\/bookworm\/apt\/apt-get.8.en.html\">APT documentation<\/a> \u00b7 <a href=\"https:\/\/security-tracker.debian.org\/tracker\/CVE-2026-109618\">Debian: CVE-2026-109618<\/a> \u00b7 <a href=\"https:\/\/security-tracker.debian.org\/tracker\/CVE-2026-109619\">Debian: CVE-2026-109619<\/a><\/p>\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">PHP 8.4: repository and upgrade plan<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-euo<\/span> pipefail\n<\/span><span class=\"cbb-line\">branch=<span class=\"cbb-number\">8.4<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> update\n<\/span><span class=\"cbb-line\">mapfile <span class=\"cbb-attr\">-t<\/span> php_packages &lt; &lt;(\n<\/span><span class=\"cbb-line\">  dpkg-query <span class=\"cbb-attr\">-W<\/span> <span class=\"cbb-attr\">-f<\/span>=<span class=\"cbb-string\">'${db:Status-Abbrev} ${binary:Package}\\n'<\/span> \\\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">\"php<\/span><span class=\"cbb-variable\">${branch}<\/span><span class=\"cbb-string\">-*\"<\/span> <span class=\"cbb-string\">\"libapache2-mod-php<\/span><span class=\"cbb-variable\">${branch}<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-number\">2<\/span><span class=\"cbb-operator\">&gt;<\/span>\/dev\/null <span class=\"cbb-operator\">|<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">awk<\/span> <span class=\"cbb-string\">'$1 == \"ii\" { print $2 }'<\/span>\n<\/span><span class=\"cbb-line\">)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">test<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${#php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">-gt<\/span> <span class=\"cbb-number\">0<\/span>\n<\/span><span class=\"cbb-line\">apt-cache policy <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> <span class=\"cbb-attr\">-s<\/span> install <span class=\"cbb-attr\">--only-upgrade<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>Installation follows review of the plan. Unexpected removals, branch changes or vulnerable candidates are reasons to stop. The next block belongs in the same Bash session and assumes an existing FPM service:<\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">PHP 8.4: installation and FPM checks<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> install <span class=\"cbb-attr\">--only-upgrade<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> \/usr\/sbin\/php-fpm8.4 <span class=\"cbb-attr\">-t<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">systemctl<\/span> restart php8.4-fpm\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">systemctl<\/span> is-active php8.4-fpm\n<\/span><span class=\"cbb-line\">\/usr\/bin\/php8.4 <span class=\"cbb-attr\">-v<\/span>\n<\/span><span class=\"cbb-line\">\/usr\/sbin\/php-fpm8.4 <span class=\"cbb-attr\">-v<\/span><\/span><\/code><\/pre><\/figure>\n\n<h2>Updating PHP 8.5 with APT<\/h2>\n<p>An existing 8.5 deployment uses the same workflow with a corrected candidate starting at 8.5.12 or a confirmed vendor backport. Debian 13\u2019s standard repository does not provide PHP 8.5 simply because a newer PHP branch exists. Without a suitable candidate from the already approved source, this workflow stops before installation.<\/p>\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">PHP 8.5: repository and upgrade plan<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-euo<\/span> pipefail\n<\/span><span class=\"cbb-line\">branch=<span class=\"cbb-number\">8.5<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> update\n<\/span><span class=\"cbb-line\">mapfile <span class=\"cbb-attr\">-t<\/span> php_packages &lt; &lt;(\n<\/span><span class=\"cbb-line\">  dpkg-query <span class=\"cbb-attr\">-W<\/span> <span class=\"cbb-attr\">-f<\/span>=<span class=\"cbb-string\">'${db:Status-Abbrev} ${binary:Package}\\n'<\/span> \\\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">\"php<\/span><span class=\"cbb-variable\">${branch}<\/span><span class=\"cbb-string\">-*\"<\/span> <span class=\"cbb-string\">\"libapache2-mod-php<\/span><span class=\"cbb-variable\">${branch}<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-number\">2<\/span><span class=\"cbb-operator\">&gt;<\/span>\/dev\/null <span class=\"cbb-operator\">|<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">awk<\/span> <span class=\"cbb-string\">'$1 == \"ii\" { print $2 }'<\/span>\n<\/span><span class=\"cbb-line\">)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">test<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${#php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">-gt<\/span> <span class=\"cbb-number\">0<\/span>\n<\/span><span class=\"cbb-line\">apt-cache policy <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> <span class=\"cbb-attr\">-s<\/span> install <span class=\"cbb-attr\">--only-upgrade<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>Continuation again requires a reviewed plan, the same Bash session and an existing FPM service.<\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">PHP 8.5: installation and FPM checks<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> install <span class=\"cbb-attr\">--only-upgrade<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">${php_packages&#91;@&#93;}<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> \/usr\/sbin\/php-fpm8.5 <span class=\"cbb-attr\">-t<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">systemctl<\/span> restart php8.5-fpm\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">systemctl<\/span> is-active php8.5-fpm\n<\/span><span class=\"cbb-line\">\/usr\/bin\/php8.5 <span class=\"cbb-attr\">-v<\/span>\n<\/span><span class=\"cbb-line\">\/usr\/sbin\/php-fpm8.5 <span class=\"cbb-attr\">-v<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>Apache with mod_php instead requires an updated Apache module and an orderly Apache restart after a successful configuration check. On Debian the check is <code>sudo apache2ctl configtest<\/code>. A PHP package update in a pure FPM setup does not require a blanket nginx restart. Separate FPM masters, persistent CLI services and containers need individual treatment. Restarts can interrupt active requests; redundant deployments should be rolled out sequentially.<\/p>\n<h2>Updated packages do not prove updated running processes<\/h2>\n<p>Linux can keep a process running from an old executable after replacement. A fresh <code>php -v<\/code> then reports the corrected release while an existing worker continues with the old build. This read-only check identifies PHP processes retaining a deleted executable:<\/p>\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">Find old PHP process executables on Linux<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> bash &lt;&lt;<span class=\"cbb-string\">'BASH'<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">for<\/span> link <span class=\"cbb-keyword\">in<\/span> \/proc\/&#91;<span class=\"cbb-number\">0<\/span>-9&#93;*\/exe<span class=\"cbb-operator\">;<\/span> <span class=\"cbb-keyword\">do<\/span>\n<\/span><span class=\"cbb-line\">  target=<span class=\"cbb-variable\">$(<\/span>readlink <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$link<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-number\">2<\/span><span class=\"cbb-operator\">&gt;<\/span>\/dev\/null) <span class=\"cbb-operator\">||<\/span> <span class=\"cbb-keyword\">continue<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">case<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$target<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-keyword\">in<\/span>\n<\/span><span class=\"cbb-line\">    *<span class=\"cbb-function\">php<\/span>*<span class=\"cbb-string\">\"(deleted)\"<\/span>*)\n<\/span><span class=\"cbb-line\">      pid=<span class=\"cbb-variable\">${link#\/proc\/}<\/span>\n<\/span><span class=\"cbb-line\">      pid=<span class=\"cbb-variable\">${pid%\/exe}<\/span>\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-function\">printf<\/span> <span class=\"cbb-string\">'PID %s: %s\\n'<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$pid<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$target<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">;<\/span><span class=\"cbb-operator\">;<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">esac<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">done<\/span>\n<\/span><span class=\"cbb-line\">BASH<\/span><\/code><\/pre><\/figure>\n\n<p>A match calls for version and service verification, not an automatic intrusion diagnosis. An empty result does not establish complete protection either: loaded Apache modules, libraries and separately embedded runtimes need their own checks. Active workers matter more than package listings. Login, uploads, forms, queues and scheduled jobs belong in application-specific functional checks. Public <code>phpinfo()<\/code> pages are unsuitable for this task; protected internal diagnostics or active-process mapping are preferable.<\/p>\n<h2>PHP 7.4: a security backport instead of unchanged 7.4.33<\/h2>\n<p>PHP 7.4 remains end-of-life. Migration to a supported branch or a verified LTS patch from the existing supplier is preferable. For an unavoidable transition period, the PHP project published a minimal source backport covering both PHP2Shell identifiers. This does not restore general support or promise fixes for unrelated vulnerabilities.<\/p>\n<p>The security commit verified on 22 October is <code>712e60f9edfd03f0960fc4fc3c2c375f42b90aa2<\/code>. The workflow pins that exact source revision. Rebuilding the unchanged 7.4.33 release does not include this correction. <a href=\"https:\/\/github.com\/php\/php-src\/commit\/712e60f9edfd03f0960fc4fc3c2c375f42b90aa2\">PHP: specific security commit<\/a><\/p>\n<p>The example produces a minimal CLI\/FPM build in a separate compatible Debian\/Ubuntu build environment with Git and CA certificates already available. All blocks run in the same Bash session. This is <strong>not an installation executed or fully validated on a production server for this article<\/strong>. Old PHP sources are not compatible with arbitrary current system libraries.<\/p>\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">PHP 7.4: pin the official security commit<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-euo<\/span> pipefail\n<\/span><span class=\"cbb-line\">workdir=<span class=\"cbb-variable\">$(<\/span>mktemp <span class=\"cbb-attr\">-d<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$HOME<\/span><span class=\"cbb-string\">\/php74-php2shell.XXXXXX\"<\/span>)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">cd<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$workdir<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">git<\/span> init php-src\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">cd<\/span> php-src\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">git<\/span> remote add origin https:\/\/github.com\/<span class=\"cbb-function\">php<\/span>\/php-src.<span class=\"cbb-function\">git<\/span>\n<\/span><span class=\"cbb-line\">commit=712e60f9edfd03f0960fc4fc3c2c375f42b90aa2\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">git<\/span> fetch <span class=\"cbb-attr\">--depth<\/span>=<span class=\"cbb-number\">1<\/span> origin <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$commit<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">git<\/span> checkout <span class=\"cbb-attr\">--detach<\/span> FETCH_HEAD\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">test<\/span> <span class=\"cbb-string\">\"$(git rev-parse HEAD)\"<\/span> = <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$commit<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">git<\/span> show <span class=\"cbb-attr\">-s<\/span> <span class=\"cbb-attr\">--format<\/span>=<span class=\"cbb-string\">'%H%n%s%n%b'<\/span> HEAD<\/span><\/code><\/pre><\/figure>\n\n<p>The minimum tools and isolated installation prefix follow below. <code>--disable-all<\/code> keeps the example small; the result does not automatically include every extension required by WordPress or another application. The configured user and group <code>www-data<\/code> must exist in the target environment. <a href=\"https:\/\/www.php.net\/manual\/en\/install.unix.php\">PHP: Unix installation<\/a> \u00b7 <a href=\"https:\/\/www.php.net\/manual\/en\/install.fpm.install.php\">PHP: FPM build options<\/a><\/p>\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">PHP 7.4: minimal build and tests<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> update\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">apt-get<\/span> install <span class=\"cbb-attr\">--no-install-recommends<\/span> \\\n<\/span><span class=\"cbb-line\">  build-essential autoconf bison re2c pkg-config \\\n<\/span><span class=\"cbb-line\">  libxml2-dev libsqlite3-dev\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">.\/buildconf <span class=\"cbb-attr\">--force<\/span>\n<\/span><span class=\"cbb-line\">prefix=\/opt\/php74-php2shell-712e60f9\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">test<\/span> ! <span class=\"cbb-attr\">-e<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\">.\/configure \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--prefix<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--with-config-file-path<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\/etc\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--with-config-file-scan-dir<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\/etc\/conf.d\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--disable-all<\/span> <span class=\"cbb-attr\">--enable-cli<\/span> <span class=\"cbb-attr\">--enable-fpm<\/span> <span class=\"cbb-attr\">--enable-session<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--with-fpm-user<\/span>=www-data <span class=\"cbb-attr\">--with-fpm-group<\/span>=www-data \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--without-pear<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">make<\/span> <span class=\"cbb-attr\">-j2<\/span>\n<\/span><span class=\"cbb-line\">NO_INTERACTION=<span class=\"cbb-number\">1<\/span> REPORT_EXIT_STATUS=<span class=\"cbb-number\">1<\/span> <span class=\"cbb-function\">make<\/span> <span class=\"cbb-function\">test<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>Failed tests or unexplained skips of relevant tests need investigation. Installation into the new prefix follows an accepted test run; this does not replace <code>\/usr\/bin\/php<\/code> or distribution packages:<\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">PHP 7.4: isolated installation and identification<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">make<\/span> install\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> install <span class=\"cbb-attr\">-d<\/span> <span class=\"cbb-attr\">-m<\/span> <span class=\"cbb-number\">0755<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\/etc\/conf.d\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> install <span class=\"cbb-attr\">-m<\/span> <span class=\"cbb-number\">0644<\/span> <span class=\"cbb-function\">php<\/span>.ini-production <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\/etc\/php.ini\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\/bin\/php\"<\/span> <span class=\"cbb-attr\">-n<\/span> <span class=\"cbb-attr\">-v<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\/bin\/php\"<\/span> <span class=\"cbb-attr\">--ini<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$prefix<\/span><span class=\"cbb-string\">\/sbin\/php-fpm\"<\/span> <span class=\"cbb-attr\">-v<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">git<\/span> rev-parse HEAD<\/span><\/code><\/pre><\/figure>\n\n<p>The output can still carry a 7.4 version number. Evidence of the fix consists of the verified source commit, build records and the artifact actually running. Production use still requires the necessary extensions and their tests, such as database drivers, mbstring, XML, cURL or ZIP. Development libraries, ABI and phpize\/php-config must match this specific build.<\/p>\n<p>FPM configuration, pool accounts and filesystem permissions then require separate review. A dedicated socket and service prevent accidental mixing with the existing runtime. Only after a successful configuration test using the new <code>php-fpm -t -y \/path\/to\/php-fpm.conf<\/code> does the web handler switch to that pool. A successful CLI command changes no website. If rollout fails, fallback must not silently restore public access to a vulnerable runtime; isolation remains the interim option.<\/p>\n<h2>Investigation: correlate multiple signals<\/h2>\n<p>Datadog reproduced the flaws in its laboratory. Successful code execution need not crash a worker or produce a suspicious HTTP status. HTTP 200 therefore provides no assurance. Suspicious form submissions, memory errors and unexpected child processes become meaningful through correlation. A single memory-exhaustion error alone does not prove an attack. <a href=\"https:\/\/securitylabs.datadoghq.com\/articles\/php2shell-critical-vulnerabilities-in-php\/\">Datadog Security Labs: original analysis<\/a><\/p>\n<p>Investigation combines web-server\/proxy logs, PHP errors, process events and unexpected file changes. Existing evidence should be preserved before cleanup. Indiscriminate recording of complete form bodies would introduce passwords and personal data into logs; metadata and controlled forensic collection are preferable. A WAF can constrain requests but cannot fix PHP. Completion needs two distinct findings: a corrected runtime is active, and possible prior compromise has been investigated.<\/p>\n<h2>Recognizing PHP2Shell in logs: suspicion is not proof<\/h2>\n<p>No universal \u201cPHP2Shell detected\u201d log entry exists. Investigation must distinguish an unusual request, a technical failure and confirmed unauthorized code execution. A useful chain connects an unusual proxy request, an error or process event in the relevant PHP worker and a subsequent action unexplained by normal operation. Missing records can also result from disabled logging, rotation or short retention.<\/p>\n<table><thead><tr><th>Observation<\/th><th>Interpretation<\/th><th>Next check<\/th><\/tr><\/thead><tbody>\n<tr><td>Many POST requests or large uploads<\/td><td>Also normal for imports and legitimate uploads<\/td><td>Target route, time and deviation from the usual workload<\/td><\/tr>\n<tr><td>Memory exhaustion, worker termination or segfault<\/td><td>A lead, not a unique PHP2Shell signature<\/td><td>Related requests, pool, PID and known software defects<\/td><\/tr>\n<tr><td>Unexpected shell or download tool as a child process<\/td><td>Higher priority; some applications legitimately launch such programs<\/td><td>Parent process, actual purpose and timing<\/td><\/tr>\n<tr><td>Unauthorized code change or proven foreign command<\/td><td>Concrete evidence suggesting compromise<\/td><td>Isolation, evidence preservation and scope assessment<\/td><\/tr>\n<\/tbody><\/table>\n<h2>Initial Linux log queries<\/h2>\n<p>The following commands read existing data. Service names, paths and time range must match the installation. The timestamp uses the local system timezone; cross-system correlation requires accounting for offsets and clock synchronization. PHP errors appear in the journal only when the service actually sends those messages there. <a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/journalctl.html\">systemd: journalctl<\/a><\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">Journal: memory errors and worker failures<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> <span class=\"cbb-function\">journalctl<\/span> <span class=\"cbb-attr\">--since<\/span> <span class=\"cbb-string\">'2026-10-17 00:00:00'<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">-u<\/span> php8.4-fpm <span class=\"cbb-attr\">-u<\/span> php8.5-fpm <span class=\"cbb-attr\">-u<\/span> apache2 <span class=\"cbb-attr\">-u<\/span> <span class=\"cbb-function\">nginx<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--no-pager<\/span> <span class=\"cbb-attr\">-o<\/span> short-iso <span class=\"cbb-operator\">|<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-Ei<\/span> <span class=\"cbb-string\">'Allowed memory size.*exhausted|Out of memory|segfault|SIGSEGV|child .*exited on signal'<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>No output means only \u201cno match in these sources with this pattern.\u201d Separate FPM error files, container logs and virtual-host-specific logs require additional queries. Rotated files also belong in the investigation window.<\/p>\n<p>For common Apache\/nginx access logs recording the HTTP request, this query returns the last hundred matching POST lines from the files read. This is initial triage, not a complete scanner; file ordering does not guarantee chronological sorting:<\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">Access logs: inspect POST requests<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">sudo<\/span> zgrep <span class=\"cbb-attr\">-hE<\/span> <span class=\"cbb-string\">'\"POST &#91;^\"&#93;+ HTTP\/&#91;0-9.&#93;+\"'<\/span> \\\n<\/span><span class=\"cbb-line\">  \/var\/log\/<span class=\"cbb-function\">nginx<\/span>\/access.log* \/var\/log\/apache2\/access.log* <span class=\"cbb-operator\">|<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">tail<\/span> <span class=\"cbb-attr\">-n<\/span> <span class=\"cbb-number\">100<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>Missing paths or different log formats require adjusted file selection. Standard access logs normally omit the complete request body. A commonly recorded byte count usually describes the response, not the upload. Searching ordinary access logs for <code>PHP_SESSION_UPLOAD_PROGRESS<\/code> may therefore find nothing even when that form field was sent. Missing body data cannot be reconstructed retrospectively. <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/logs.html\">Apache: log meanings and configuration<\/a><\/p>\n<p>A snapshot of process relationships can provide additional context:<\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-title\">Current processes and parent processes<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">ps<\/span> <span class=\"cbb-attr\">-eo<\/span> pid,ppid,lstart,user,comm <span class=\"cbb-attr\">--forest<\/span><\/span><\/code><\/pre><\/figure>\n\n<p>This lists only processes currently running. Completed commands appear only in previously enabled execution monitoring, such as audit or EDR telemetry. Monitoring enabled today provides no retrospective execution history.<\/p>\n<h2>Improve logging without collecting form bodies<\/h2>\n<p>An additional nginx log can correlate request ID, time, method, path, status, request size and duration. The following proposed format belongs in the <code>http<\/code> context. It helps future investigations; previously missing data remains missing. <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_log_module.html\">nginx: log_format and access_log<\/a><\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"nginx\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">nginx<\/span><span class=\"cbb-title\">nginx: additional metadata format<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-nginx\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">log_format<\/span> php2shell escape=json\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-string\">'{\"time\":\"$time_iso8601\",\"request_id\":\"$request_id\",'<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-string\">'\"client\":\"$remote_addr\",\"method\":\"$request_method\",\"uri\":\"$uri\",'<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-string\">'\"status\":\"$status\",\"request_bytes\":\"$request_length\",'<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-string\">'\"response_bytes\":\"$body_bytes_sent\",\"duration\":\"$request_time\",'<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-string\">'\"upstream_status\":\"$upstream_status\"}'<\/span>;<\/span><\/code><\/pre><\/figure>\n\n<p>The next directive enables that format in the selected <code>server<\/code> context. Existing logs and inheritance need review so the new directive does not silently displace required logging.<\/p>\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"nginx\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">nginx<\/span><span class=\"cbb-title\">nginx: enable the format for the selected host<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-nginx\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">access_log<\/span> \/var\/log\/nginx\/php2shell-access.log php2shell;<\/span><\/code><\/pre><\/figure>\n\n<p>A successful <code>nginx -t<\/code> check precedes an orderly reload. <code>request_bytes<\/code> covers the complete received request including headers, not just file size or resulting PHP memory consumption. The format excludes query strings, cookies, authorization headers and bodies. IP addresses and paths can still contain personal information; access controls, retention and rotation belong in the setup. Behind a proxy, the client address is reliable only with a correctly configured trust chain. <a href=\"https:\/\/cheatsheetseries.owasp.org\/cheatsheets\/Logging_Cheat_Sheet.html\">OWASP: secure logging<\/a><\/p>\n<h2>Protection while an update is pending<\/h2>\n<p><strong>The corrected runtime takes priority.<\/strong> Additional controls restrict exposure and potential consequences but do not replace patching. For an exposed application that cannot be updated promptly, isolation before PHP is the clearest interim measure: a static maintenance page, VPN or upstream access control. Direct origin access must enforce the same boundaries; a protected CDN path with an openly reachable backend is insufficient.<\/p>\n<ul><li><strong>Request limits:<\/strong> Size, upload and rate limits at the reverse proxy should match actual needs. Legitimate imports and large files require tested rules. A small request can consume more memory internally, so size limits are not complete protection.<\/li>\n<li><strong>WAF as another layer:<\/strong> Appropriate vendor rules require activation and enforcement checks. Observation-only rules block nothing; an HTTP 403 only establishes rejection of that particular request.<\/li>\n<li><strong>Restricted privileges:<\/strong> Separate pool accounts, minimal file permissions, restricted database accounts and limited network access reduce potential damage. A compromised application can still abuse every secret legitimately available to that application.<\/li>\n<li><strong>Official interim measures:<\/strong> Disabling session upload progress early blocks particular paths, not both flaws completely. Blanket removal of PHP memory limits without suitable external boundaries can create further availability failures.<\/li><\/ul>\n<h2>Concrete intrusion indicators: separate patching from incident response<\/h2>\n<p>Deleting a suspicious file and updating PHP is insufficient for a defensible closure. The affected instance first needs isolation against further access. Relevant logs, timestamps and available process evidence should be preserved alongside containment. Unconsidered cleanup can destroy useful evidence.<\/p>\n<p>Subsequent steps include assessing accessible data and adjacent systems, replacing potentially exposed credentials from a trusted environment and rebuilding from verified sources where appropriate. A backup must predate possible compromise both chronologically and in content. Returning to public service requires a corrected active runtime, checked application and continued monitoring. \u201cPatch installed\u201d and \u201cincident investigated\u201d remain separate findings.<\/p>\n<div class=\"lw-faq\"><h2>Questions and answers<\/h2><h3>Is a WordPress update sufficient?<\/h3><p>No. Updating WordPress does not replace a corrected PHP runtime. Application updates and server packages require separate verification.<\/p><h3>Does a working website establish safety?<\/h3><p>No. Ordinary requests can succeed on a vulnerable runtime. The absence of visible changes also cannot exclude an earlier intrusion.<\/p><p>Useful evidence combines the package revision, vendor confirmation covering both CVEs and verification of active web processes. Signs of compromise require a separate investigation.<\/p><\/div><h2>Sources<\/h2><ol><li><a href=\"https:\/\/www.php.net\/archive\/2026.php#2026-10-21-5\">PHP: Security advisory, 21 October 2026<\/a><\/li><li><a href=\"https:\/\/thephp.foundation\/blog\/2026\/10\/21\/todays-php-security-release-and-how-were-strengthening-php-security\/\">PHP Foundation: security release and background<\/a><\/li><li><a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-w8hw-w9fx-j79w\">PHP: CVE-2026-109618<\/a><\/li><li><a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-6wmf-4rv5-p3rp\">PHP: CVE-2026-109619<\/a><\/li><li><a href=\"https:\/\/www.enisa.europa.eu\/news\/joint-statement-on-critical-php-vulnerabilities\">ENISA: joint statement<\/a><\/li><li><a href=\"https:\/\/digital.nhs.uk\/cyber-alerts\/2026\/cc-4875\">NHS England: PHP2Shell<\/a><\/li><li><a href=\"https:\/\/support.cpanel.net\/hc\/en-us\/articles\/44397389677335-Critical-PHP-Security-Release-CVE-2026-109618-and-CVE-2026-109619\">cPanel: corrected package revisions<\/a><\/li><li><a href=\"https:\/\/cloud.google.com\/blog\/products\/identity-security\/responding-to-core-php-vulnerabilities-cve-2026-109618-cve-2026-109619\">Google Cloud: runtime updates and redeployment<\/a><\/li><li><a href=\"https:\/\/w3techs.com\/technologies\/details\/pl-php\">W3Techs: PHP usage, 22 October 2026<\/a><\/li><\/ol><h3>Additional primary sources and documentation<\/h3><ul><li><a href=\"https:\/\/github.com\/php\/php-src\/commit\/712e60f9edfd03f0960fc4fc3c2c375f42b90aa2\">PHP: pinned PHP 7.4 security backport<\/a><\/li><li><a href=\"https:\/\/www.php.net\/manual\/en\/install.unix.php\">PHP: Unix installation<\/a><\/li><li><a href=\"https:\/\/www.php.net\/manual\/en\/install.fpm.install.php\">PHP: FPM compilation options<\/a><\/li><li><a href=\"https:\/\/manpages.debian.org\/bookworm\/apt\/apt-get.8.en.html\">APT: apt-get options and simulation<\/a><\/li><li><a href=\"https:\/\/security-tracker.debian.org\/tracker\/CVE-2026-109618\">Debian: CVE-2026-109618<\/a><\/li><li><a href=\"https:\/\/security-tracker.debian.org\/tracker\/CVE-2026-109619\">Debian: CVE-2026-109619<\/a><\/li><li><a href=\"https:\/\/aws.amazon.com\/blogs\/security\/amazon-threat-intelligence-identifies-php2shell-exploitation-prior-to-public-disclosure-in-madpot\/\">AWS: MadPot observations before disclosure<\/a><\/li><li><a href=\"https:\/\/securitylabs.datadoghq.com\/articles\/php2shell-critical-vulnerabilities-in-php\/\">Datadog Security Labs: reproduction, detection and remediation<\/a><\/li><\/ul><h3>Further analysis and reporting<\/h3><ul><li><a href=\"https:\/\/brandefense.io\/blog\/php2shell-php-rce-cve-2026-109618-109619\/\">Brandefense<\/a><\/li><li><a href=\"https:\/\/socradar.io\/blog\/php2shell-cve-2026-109618-cve-2026-109619\/\">SOCRadar<\/a><\/li><li><a href=\"https:\/\/www.abstract.security\/blog\/php2shell-critical-php-rce-vulnerabilities-cve-2026-109618-and-cve-2026-109619\">Abstract Security<\/a><\/li><li><a href=\"https:\/\/www.tanium.com\/blog\/php2shell-responding-to-cve-2026-109618-and-cve-2026-109619\">Tanium<\/a><\/li><li><a href=\"https:\/\/www.securityweek.com\/php2shell-mass-exploitation-looms-for-leaked-critical-php-flaws\/\">SecurityWeek<\/a><\/li><\/ul><p>The additionally suggested Prophet Security article was unavailable during research and was not used as evidence.<\/p><h3>Log investigation documentation<\/h3><ul><li><a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_log_module.html\">nginx<\/a><\/li><li><a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/logs.html\">Apache HTTP Server<\/a><\/li><li><a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/journalctl.html\">systemd journalctl<\/a><\/li><li><a href=\"https:\/\/cheatsheetseries.owasp.org\/cheatsheets\/Logging_Cheat_Sheet.html\">OWASP Logging Cheat Sheet<\/a><\/li><\/ul>","protected":false},"excerpt":{"rendered":"<p>PHP2Shell affects PHP itself. The required updates, the consequences of missing patches and why market share cannot reveal the number of vulnerable websites.<\/p>\n","protected":false},"author":1,"featured_media":22786,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[148],"tags":[],"class_list":["post-22774","post","type-post","status-publish","format-standard","hentry","category-web-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"PHP2Shell affects PHP itself. The required updates, the consequences of missing patches and why market share cannot reveal the number of vulnerable websites.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"PHP2Shell affects PHP itself. The required updates, the consequences of missing patches and why market share cannot reveal the number of vulnerable websites.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-22T07:48:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-22T08:53:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/php2shell-gemini-22774-en-dunkel.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain\",\"datePublished\":\"2026-10-22T07:48:00+00:00\",\"dateModified\":\"2026-10-22T08:53:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/\"},\"wordCount\":2821,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/php2shell-gemini-22774-en-dunkel.png\",\"articleSection\":[\"Web Development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/\",\"name\":\"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/php2shell-gemini-22774-en-dunkel.png\",\"datePublished\":\"2026-10-22T07:48:00+00:00\",\"dateModified\":\"2026-10-22T08:53:36+00:00\",\"description\":\"PHP2Shell affects PHP itself. The required updates, the consequences of missing patches and why market share cannot reveal the number of vulnerable websites.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/php2shell-gemini-22774-en-dunkel.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/php2shell-gemini-22774-en-dunkel.png\",\"width\":1200,\"height\":630,\"caption\":\"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/php2shell-protection-updates-unpatched-websites\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain | Lukas Wojcik","description":"PHP2Shell affects PHP itself. The required updates, the consequences of missing patches and why market share cannot reveal the number of vulnerable websites.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/","og_locale":"en_US","og_type":"article","og_title":"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain | Lukas Wojcik","og_description":"PHP2Shell affects PHP itself. The required updates, the consequences of missing patches and why market share cannot reveal the number of vulnerable websites.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-22T07:48:00+00:00","article_modified_time":"2026-10-22T08:53:36+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/php2shell-gemini-22774-en-dunkel.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain","datePublished":"2026-10-22T07:48:00+00:00","dateModified":"2026-10-22T08:53:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/"},"wordCount":2821,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/php2shell-gemini-22774-en-dunkel.png","articleSection":["Web Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/","name":"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/php2shell-gemini-22774-en-dunkel.png","datePublished":"2026-10-22T07:48:00+00:00","dateModified":"2026-10-22T08:53:36+00:00","description":"PHP2Shell affects PHP itself. The required updates, the consequences of missing patches and why market share cannot reveal the number of vulnerable websites.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/php2shell-gemini-22774-en-dunkel.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/php2shell-gemini-22774-en-dunkel.png","width":1200,"height":630,"caption":"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/php2shell-protection-updates-unpatched-websites\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP2Shell: What Provides Protection and Why Unpatched Websites Will Remain"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/22774","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=22774"}],"version-history":[{"count":3,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/22774\/revisions"}],"predecessor-version":[{"id":22796,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/22774\/revisions\/22796"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/22786"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=22774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=22774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=22774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}