<?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: Andre Burgstahler</title>
    <description>The latest articles on DEV Community by Andre Burgstahler (@r3dtuxedo).</description>
    <link>https://dev.to/r3dtuxedo</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%2F4202005%2Fc84cd2ca-bdbc-40b9-be27-03667340cd7e.png</url>
      <title>DEV Community: Andre Burgstahler</title>
      <link>https://dev.to/r3dtuxedo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/r3dtuxedo"/>
    <language>en</language>
    <item>
      <title>PHP2Shell: Patch Today, Then Find the PHP You Forgot</title>
      <dc:creator>Andre Burgstahler</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:48:33 +0000</pubDate>
      <link>https://dev.to/r3dtuxedo/php2shell-patch-today-then-find-the-php-you-forgot-4ndd</link>
      <guid>https://dev.to/r3dtuxedo/php2shell-patch-today-then-find-the-php-you-forgot-4ndd</guid>
      <description>&lt;p&gt;&lt;em&gt;This article first appeared on Medium: &lt;a href="https://medium.com/@r3dtuxedo/php2shell-patch-today-then-find-the-php-you-forgot-dd590977c842" rel="noopener noreferrer"&gt;https://medium.com/@r3dtuxedo/php2shell-patch-today-then-find-the-php-you-forgot-dd590977c842&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i6zba3rptv6gqiepz0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i6zba3rptv6gqiepz0z.png" alt="Abstract illustration: on a dark navy background, a stack of off-white server slabs with one amber slab in the middle showing a thin crack; a teal line runs in from the left, wraps around the cracked slab like a patch, and continues to the right, with faint dot grids of other servers in the background" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One engine, a lot of servers. The fix is out; the work now is finding them all.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;• PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 fix two critical bugs in PHP itself (CVE-2026-109618 and CVE-2026-109619, nicknamed PHP2Shell). They can allow unauthenticated remote code execution on servers that handle web requests. Your own code doesn’t need to be buggy. Update, then restart every PHP worker.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;•&lt;/em&gt; &lt;em&gt;php -v doesn't settle it. Distros backport fixes into old version numbers, the CLI may not be what serves your site, and a container is only patched after you rebuild it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;• Most public proof-of-concept repos don’t work, and running strangers’ exploit code is a risk in itself. Check versions and packages instead. A coding agent is good at that: it can list every PHP version across your repos, Dockerfiles and CI, and open the patch PRs for you to review&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On Wednesday 21 October, at 14:00 UTC, the PHP project shipped emergency releases for every supported branch. The two bugs behind them sit in how PHP cleans up memory when a request goes wrong. That makes them unusual: this isn’t a WordPress plugin or a framework bug. It’s the engine underneath all of them.&lt;/p&gt;

&lt;p&gt;CISA put out an alert the same day, and the UK’s NCSC told organisations to update or take affected systems offline. AWS says the bugs are now “broadly exploited in the wild”. So this is a patch-today week, not a read-about-it-later week.&lt;/p&gt;

&lt;h3&gt;
  
  
  What broke, and who’s affected
&lt;/h3&gt;

&lt;p&gt;Both bugs come from how PHP handles fatal errors, especially running out of memory, partway through a request. The request ends, but some of PHP’s internal state is left behind in a broken form. A later request on the same worker can then pick that state up, which can lead to memory corruption and code execution. php.net calls the first “RCE via OOM corruption” (CVE-2026-109618) and the second “RCE via stale global state” (CVE-2026-109619). Wiz adds that the same family of bugs can also leak a worker’s memory, including other requests’ passwords and tokens.&lt;/p&gt;

&lt;p&gt;php.net’s advisory says who is at risk: “all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed.” It rates mod_php as the highest risk, because there the attack can run before any application code does. Wiz, one of the teams that reported the bugs, says it ran code without logging in on the stock WordPress, Drupal and Joomla container images, and that “even a simple ‘Hello World’ application running on an affected PHP version can be vulnerable”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This isn’t a bug in your app. It’s in the engine underneath all of them, so your code being clean doesn’t help&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The PHP project scores both at 9.2 on CVSS v4. NVD has since added its own CVSS 3.1 score of 9.8. Here is what to run, by branch:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fre89kw3p9wq2wcqyn400.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fre89kw3p9wq2wcqyn400.png" alt="Table. Fixed releases by branch, per php.net, 21 Oct 2026. 8.5 fixed in 8.5.12, 8.4 in 8.4.27, 8.3 in 8.3.36, 8.2 in 8.2.35 (ends 31 Dec 2026). 8.1, 8.0, 7.4: end of life, no PHP release, minimal source backports; use a vendor build or upgrade, CISA says take offline. 7.3 and older: nothing from PHP." width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fixed releases by branch, per php.net, 21 Oct 2026. Older branches depend on your vendor.&lt;/p&gt;

&lt;p&gt;NVD’s record only lists the supported branches, but Wiz and Docker both say every version back to 5.4 is affected by at least one of the bugs. If you’re on something old, assume you’re in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fedkl0mmge9qllrg55mdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fedkl0mmge9qllrg55mdb.png" alt="Timeline, UTC. 2024: out-of-memory problem spotted during an audit; fix stalls. 11 Aug 2026: Calif reports remote code execution, then OpenAI and Wiz, all AI-assisted. 17 Oct: AWS honeypot sees an exploitation attempt. 20 Oct 15:00: CVE IDs leak; release moves up a day. 21 Oct 03:02: Cloudflare WAF rules on. 07:41: Chainguard ships fixed images early. 14:00: PHP releases fixes. 21 to 22 Oct: AWS says broadly exploited; NVD scores 9.8." width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two years of a stalled fix, then five days of leaks, rules and releases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Patch now, and check it actually took
&lt;/h3&gt;

&lt;p&gt;The question that matters is who builds the PHP you run. Only PHP built from php.net source reliably reports one of the fixed version numbers. Everyone else may be fixed under a different number.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fji9kcs0gk0lmimtv4wdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fji9kcs0gk0lmimtv4wdd.png" alt="Four ways to check. Managed host: status page or ask support for the build or date. Distro packages: list with dpkg or rpm, update, compare with the distro tracker, since 8.3.6 can be fixed. Containers: run php -v in the image, rebuild with — pull, redeploy. Source or php.net builds: php -v must read 8.5.12, 8.4.27, 8.3.36, 8.2.35 or later. Then restart every PHP worker and check the version the web server runs, not just the CLI." width="800" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start with who builds your PHP. The version string only means one thing for php.net builds.&lt;/p&gt;

&lt;p&gt;These are the read-only checks. None of them touch anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php -v                         # the CLI, which may not be what serves your site  
php-fpm8.3 -v                  # or php-fpm -v; the binary name varies by distro  
dpkg -l 'php*' | grep '^ii'    # Debian, Ubuntu  
rpm -qa 'php*'                 # RHEL, Fedora, SUSE  
apk info -v | grep '^php'      # Alpine  
docker run --rm your/image:tag php -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;On distros, the version number can look old and still be fixed. Ubuntu 24.04’s fix is php8.3 8.3.6-0ubuntu0.24.04.13, which php -v reports as 8.3.6. So compare the full package version with your distro's tracker:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60rksm5vynanuwnvqhzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60rksm5vynanuwnvqhzg.png" alt="Table. Distro; Package; Fixed build; php -v shows. Ubuntu 24.04, php8.3, 8.3.6–0ubuntu0.24.04.13, 8.3.6. Ubuntu 22.04, php8.1, 8.1.2–1ubuntu2.28, 8.1.2. Debian 12, php8.2, 8.2.35–1~deb12u1, 8.2.35. Debian 13, php8.4, 8.4.27–1~deb13u1, 8.4.27." width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fixed distro builds, per the Ubuntu and Debian trackers on 22 Oct 2026. The version string alone can look unpatched.&lt;/p&gt;

&lt;p&gt;After the update, restart every worker. A running PHP-FPM pool or Apache process keeps the old code in memory until it’s restarted: sudo systemctl restart php8.3-fpm (or apache2, httpd, frankenphp, lsws). Then check that the master process started after the update, for example with ps -o lstart,cmd -C php-fpm8.3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containers.&lt;/strong&gt; The Docker Official Images had the fixed tags on Docker Hub by the evening of 21 October (UTC). That doesn’t help a running container. Rebuild with docker build --pull, redeploy, and check the image you actually run, not the one you meant to run. Fixed upstream tags only reach you through a rebuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managed hosting.&lt;/strong&gt; If someone else runs PHP for you, it’s their patch. On 22 October a third-party tracker of host status pages listed Kinsta, Cloudways and Pantheon as patched and several others as still rolling out. Check yours, and ask for a date or a build, not just “you’re safe”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you can’t update today.&lt;/strong&gt; php.net lists partial measures, and is clear that none of them make you safe. They include session.upload_progress.enabled=0 set in php.ini or the FPM pool (not via ini_set()), a low post_max_size, and on 8.5, fatal_error_backtraces=0. Restart every worker after any change. Hiding errors does nothing. A WAF in front helps: Cloudflare turned on rules for all plans, Free included, early on 21 October. CISA's advice for anything that can't be patched, including 8.1 and older, is blunter: take it offline until it can be.&lt;/p&gt;
&lt;h3&gt;
  
  
  How AI found it, and what that changes
&lt;/h3&gt;

&lt;p&gt;The first sign of the out-of-memory problem appeared in 2024, during an external audit funded by Germany’s Sovereign Tech Agency. A PHP core developer noticed it, but nobody found a way to exploit it, and the competing fixes all broke something. The PHP Foundation’s own post calls the resulting two-year delay “a structural failure”.&lt;/p&gt;

&lt;p&gt;What changed this year was AI-assisted research. According to the PHP Foundation, Calif reported an unconditional remote code execution on 11 August as part of OpenAI’s Patch the Planet programme. OpenAI says Calif used GPT-5.6 Sol, and OpenAI reported the same root cause independently. Wiz reported further paths on 24 August; it says it used Wiz Atlas, Gemini 4 Argon and GPT-5.6 Sol, with Argon contributing most. On the receiving end, the PHP Foundation says it used AI models from Anthropic and OpenAI to help validate the reports.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;When three teams with AI help find the same bug in a few weeks, assume someone else can too&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three things follow from that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding is getting cheap; fixing isn’t.&lt;/strong&gt; The PHP security team says it has published 15 CVEs since 1 July and worked through more than 100 reports that turned out to be invalid, duplicates or not reproducible. The bottleneck is a small group of people who understand the engine well enough to choose a fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embargoes get shorter and leakier.&lt;/strong&gt; This one leaked in stages. CVE IDs circulated on 20 October with a wrong score, so PHP moved the release forward a day. Calif posted a proof-of-concept video by mistake. Then, per the PHP Foundation, Chainguard shipped fixed images more than six hours before the coordinated release. Chainguard’s CEO told The Register that his team acted on reports of active exploitation, and that they had independently rediscovered the bug starting from “a basic prompt”. AWS, meanwhile, saw an exploitation attempt in a honeypot on 17 October, before any of the public leaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure needs more planning, not less.&lt;/strong&gt; OpenAI, which helped coordinate the response with CISA and other agencies, used the case to propose a five-stage framework for disclosing AI-found bugs at this scale. Whatever you think of it, the practical lesson for anyone running PHP is the same: the gap between “fix exists” and “attackers have it” is now measured in hours.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why most public “exploits” are junk, and why you shouldn’t run them
&lt;/h3&gt;

&lt;p&gt;Within hours of the release, GitHub filled up with repositories claiming to exploit PHP2Shell. The PHP security team says it inspected the proof-of-concepts that appeared after the leak and “did not identify any functional exploits at the time of release”. Elias Taylor tested the most-starred public ones and found they don’t work against a plain PHP install. Many quietly depend on a separate file-inclusion bug in the target app, and some AI-generated ones change the target server rather than prove anything.&lt;/p&gt;

&lt;p&gt;That doesn’t make the threat fake. AWS says the bugs are now being exploited broadly, though it’s unclear how many attempts succeed. Both things are true: the repos with the most stars are mostly noise, and real attackers have something that works.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You don’t need an exploit to know whether you’re exposed. A version check answers that&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are two reasons not to “just try” one against your own server. First, a fake that fails tells you nothing, and you may conclude you’re safe when you’re not. Second, the repo itself can be the attack. A 2022 Leiden University study of GitHub proof-of-concept repositories found 899 of 47,285 that showed signs of being malicious. Running one on a laptop with your SSH keys and cloud credentials hands them over. For the same reason, I’m not linking any of them here.&lt;/p&gt;
&lt;h3&gt;
  
  
  What to do with your coding agent this week
&lt;/h3&gt;

&lt;p&gt;This is where Claude Code, Codex or OpenCode earn their keep. The hard part of PHP2Shell isn’t the patch. It’s knowing where PHP lives: the old Dockerfile in a side project, the CI matrix still testing on 8.1, the Ansible variable nobody has looked at since 2023.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with AGENTS.md.&lt;/strong&gt; Add a baseline so every future session knows it, and so the agent doesn’t helpfully reintroduce an old tag next month. Claude Code reads CLAUDE.md, which can point to AGENTS.md:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Security baselines  
- PHP in production images and CI: 8.5.12, 8.4.27, 8.3.36 or 8.2.35 or later (PHP2Shell, CVE-2026-109618 and CVE-2026-109619). Never pin 8.1 or older.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Then have it take inventory.&lt;/strong&gt; Versions hide in more places than the Dockerfile:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmaxw7vugch7awi31hyqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmaxw7vugch7awi31hyqc.png" alt="Where PHP versions hide in a repo. Production: Dockerfile FROM lines and package installs, compose and Kubernetes image lines, Ansible and Terraform variables. CI: GitHub workflow setup-php versions and matrices, GitLab CI images, .tool-versions and .php-version files. Claims: the composer.json php constraint, config.platform.php and composer.lock. composer.json says which PHP the code accepts, not which PHP runs." width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Only the first row decides what serves traffic. The other two are where old versions creep back in.&lt;/p&gt;

&lt;p&gt;I wrote a small read-only script that lists all of these. It only searches files; it doesn’t build, pull or send anything. Run it yourself, or let the agent run it as step one:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Then let it open the patch PRs.&lt;/strong&gt; This prompt keeps the agent read-only until the last step, sorts what it finds into patched, floating, vulnerable, end-of-life and unknown, and opens one PR per repo with a deploy checklist. It also tells the agent not to fetch any exploit or “scanner” from the internet, and to treat what it reads as data rather than instructions:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;If you use Codex, OpenAI has also published a PHP version checker as a Codex skill. It checks a URL’s headers or a local php -v. Its README warns that distro backports may not change the version string and that "UNKNOWN does not mean the target is patched", which is the same trap as above.&lt;/p&gt;

&lt;p&gt;Two things the agent can’t do for you. A merged PR doesn’t patch a server: someone still has to rebuild, deploy and restart workers. And for hosts you don’t control, the answer is still a support ticket.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this signals
&lt;/h3&gt;

&lt;p&gt;PHP2Shell is a memory-safety bug in a memory-managed language. PHP developers never touch a pointer, but the engine underneath is C. Every high-level runtime has that layer, and AI-assisted research is now reading it closely and quickly.&lt;/p&gt;

&lt;p&gt;The good news is that defenders got the same tools, and this time had about two months’ warning. The bad news is that the warning period leaked, and the next one may be shorter. The most useful thing you can do this week is boring: patch, restart, and leave behind an inventory and an AGENTS.md line so the next emergency takes an hour instead of a day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;php.net, &lt;a href="https://www.php.net/archive/2026.php#2026-10-21-5" rel="noopener noreferrer"&gt;Security advisory: Critical remote code execution vulnerabilities, update now&lt;/a&gt;, 21 Oct 2026, and the &lt;a href="https://www.php.net/ChangeLog-8.php" rel="noopener noreferrer"&gt;PHP 8 ChangeLog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PHP security advisories &lt;a href="https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w" rel="noopener noreferrer"&gt;GHSA-w8hw-w9fx-j79w&lt;/a&gt; and &lt;a href="https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp" rel="noopener noreferrer"&gt;GHSA-6wmf-4rv5-p3rp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The PHP Foundation, &lt;a href="https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/" rel="noopener noreferrer"&gt;Today’s PHP Security Release, and How We’re Strengthening PHP Security&lt;/a&gt;, 21 Oct 2026&lt;/li&gt;
&lt;li&gt;NVD, &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-109618" rel="noopener noreferrer"&gt;CVE-2026-109618&lt;/a&gt; and &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-109619" rel="noopener noreferrer"&gt;CVE-2026-109619&lt;/a&gt;, checked 22 Oct 2026&lt;/li&gt;
&lt;li&gt;Wiz Research, &lt;a href="https://www.wiz.io/blog/php2shell-php-rce" rel="noopener noreferrer"&gt;PHP2Shell: AI uncovers critical RCE vulnerabilities affecting 70% of the Internet&lt;/a&gt;, 21 Oct 2026&lt;/li&gt;
&lt;li&gt;OpenAI, &lt;a href="https://openai.com/index/coordinated-disclosure-of-critical-vulnerabilities/" rel="noopener noreferrer"&gt;Patch the Planet: coordinated disclosure of critical vulnerabilities&lt;/a&gt;, 21 Oct 2026&lt;/li&gt;
&lt;li&gt;CISA, &lt;a href="https://www.cisa.gov/news-events/alerts/2026/10/21/critical-vulnerabilities-php-require-immediate-patching" rel="noopener noreferrer"&gt;Critical Vulnerabilities in PHP Require Immediate Patching&lt;/a&gt;, 21 Oct 2026&lt;/li&gt;
&lt;li&gt;AWS Security Blog, &lt;a href="https://aws.amazon.com/blogs/security/amazon-threat-intelligence-identifies-php2shell-exploitation-prior-to-public-disclosure-in-madpot/" rel="noopener noreferrer"&gt;Amazon threat intelligence identifies PHP2Shell exploitation prior to public disclosure&lt;/a&gt;, 21 Oct 2026&lt;/li&gt;
&lt;li&gt;Cloudflare, &lt;a href="https://blog.cloudflare.com/php-vulnerabilities-waf-protection/" rel="noopener noreferrer"&gt;Cloudflare deploys protections against php2shell vulnerability&lt;/a&gt;, 21 Oct 2026&lt;/li&gt;
&lt;li&gt;Docker, &lt;a href="https://www.docker.com/blog/security-update-on-php2shell-impact-for-docker-customers/" rel="noopener noreferrer"&gt;Security Update on PHP2Shell: Impact for Docker Customers&lt;/a&gt;, 22 Oct 2026&lt;/li&gt;
&lt;li&gt;Ubuntu &lt;a href="https://ubuntu.com/security/CVE-2026-109618" rel="noopener noreferrer"&gt;CVE-2026-109618&lt;/a&gt; and Debian &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-109618" rel="noopener noreferrer"&gt;security tracker&lt;/a&gt;, checked 22 Oct 2026&lt;/li&gt;
&lt;li&gt;Elias Taylor, &lt;a href="https://eliastaylor.com/noexploit/" rel="noopener noreferrer"&gt;There isn’t an easy exploit for this PHP vulnerability&lt;/a&gt;, 21 Oct 2026&lt;/li&gt;
&lt;li&gt;The Register, &lt;a href="https://www.theregister.com/security/2026/10/22/php-blames-supply-chain-security-biz-chainguard-for-putting-entire-web-at-risk/5304611" rel="noopener noreferrer"&gt;PHP blames supply chain security biz Chainguard for putting entire web at risk&lt;/a&gt;, 22 Oct 2026&lt;/li&gt;
&lt;li&gt;El Yadmani et al., &lt;a href="https://arxiv.org/abs/2210.08374" rel="noopener noreferrer"&gt;Beyond the Surface: Investigating Malicious CVE Proof of Concept Exploits on GitHub&lt;/a&gt;, Leiden University&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If this was useful, &lt;a href="https://r3dtuxedo.substack.com/subscribe" rel="noopener noreferrer"&gt;subscribe to Agents in Practice&lt;/a&gt; for one practical note on AI coding agents a week. Helping your team adopt Claude Code or Codex safely and without the surprise bill? I consult on exactly that: &lt;a href="https://andre-burgstahler-9n5.pages.dev/" rel="noopener noreferrer"&gt;https://andre-burgstahler-9n5.pages.dev/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed by the author.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>security</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Stop Asking Your AI for More. Ask It to Go Deeper.</title>
      <dc:creator>Andre Burgstahler</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:46:46 +0000</pubDate>
      <link>https://dev.to/r3dtuxedo/stop-asking-your-ai-for-more-ask-it-to-go-deeper-3k0h</link>
      <guid>https://dev.to/r3dtuxedo/stop-asking-your-ai-for-more-ask-it-to-go-deeper-3k0h</guid>
      <description>&lt;p&gt;&lt;em&gt;This article first appeared on Medium: &lt;a href="https://medium.com/@r3dtuxedo/stop-asking-your-ai-for-more-ask-it-to-go-deeper-3090bce87009" rel="noopener noreferrer"&gt;https://medium.com/@r3dtuxedo/stop-asking-your-ai-for-more-ask-it-to-go-deeper-3090bce87009&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How four questions from Felix Rieseberg rewired the way I prompt, and what the internet thinks of them
&lt;/h4&gt;

&lt;p&gt;There’s a particular kind of disappointment every engineer who works with AI agents knows well.&lt;/p&gt;

&lt;p&gt;You ask for something. The agent delivers. It’s fine. It’s formatted, polite, and plausible, and it’s about as useful as a weather report for a city you’re not in. So you do what everyone does: you ask for &lt;em&gt;more&lt;/em&gt;. “Be more detailed.” “Go deeper.” “Add edge cases.”&lt;/p&gt;

&lt;p&gt;And the agent obliges. The answer gets longer. It gets more headings and more bullet points. If you’re unlucky, it gets a table. Somewhere around the third iteration you realize you’ve asked for depth and received volume.&lt;/p&gt;

&lt;p&gt;I did this for the better part of a year. Then, last week, I read an essay that named the mistake in one sentence.&lt;/p&gt;

&lt;h3&gt;
  
  
  The sentence
&lt;/h3&gt;

&lt;p&gt;Felix Rieseberg works on Claude at Anthropic. On 13 October he &lt;a href="https://x.com/felixrieseberg/status/2110023283169247623" rel="noopener noreferrer"&gt;posted on X&lt;/a&gt; that he’d written “a tutorial” on being more ambitious with AI. The essay is called &lt;a href="https://felixrieseberg.com/how-to-be-more-ambitious-a-tutorial-for-humans-with-models/" rel="noopener noreferrer"&gt;How to be more ambitious: A tutorial for humans with models&lt;/a&gt;. It sorts ambition into four kinds: speed, altitude, depth, and range. The depth section ends with this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I want a deeper version of this task, not a bigger one. Before rewriting it: (1) say what a top professional in this field would do here that I’m not asking for; (2) name the rawest material they would start from instead of what has already been digested for me; (3) name the specific methods and tools they would use; (4) say what, other than you or me, would show the result is right. Then rewrite my prompt to ask for exactly that.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Deeper, not bigger.&lt;/em&gt; I read it twice, copied it into a notes file, and then did something I rarely do with prompting advice: I used it every day for a week.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why “bigger” is the trap
&lt;/h3&gt;

&lt;p&gt;When you ask a model for a better answer without defining “better”, it does the cheapest thing that looks like effort: it adds. Size is easy to produce and easy to mistake for quality, for the model and, honestly, for us.&lt;/p&gt;

&lt;p&gt;Depth works differently. Think about how a senior engineer fixes a nasty crash. They don’t write a longer bug report. They reproduce the crash on a clean machine, bisect to the commit that introduced it, and write a test that fails before the fix and passes after. What they deliver is &lt;em&gt;smaller&lt;/em&gt; than what a junior would write: three lines of root cause and a tight diff. All the depth went into the method.&lt;/p&gt;

&lt;p&gt;Felix makes a point that stopped me cold: when you tell a model to “act like an expert”, it tends to switch vocabulary without switching methods. You get a statistician’s tone on top of the same markdown table. The costume changes. The instruments don’t.&lt;/p&gt;

&lt;h3&gt;
  
  
  The four questions, in plain words
&lt;/h3&gt;

&lt;p&gt;Each question pins down something you can check.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What would a top professional do that I’m not asking for?&lt;/strong&gt; This finds the missing practice. It has to be an action, not a virtue. “Be thorough” fails. “Reproduce on all three operating systems before reading the stack trace” passes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What’s the rawest material they’d start from?&lt;/strong&gt; Most of what we hand an agent has already been digested: the dashboard instead of the event table, the summary instead of the paper, the ticket instead of the logs. Each layer of digestion bakes in someone’s assumptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which specific methods and tools would they use?&lt;/strong&gt; Things you can search for or install: git bisect, survival curves, a profiler trace, a property-based test. If the task can still be satisfied with prose and a table, the method hasn't changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What, other than you or me, would show it’s right?&lt;/strong&gt; The outside judge: a test suite, a benchmark, a prediction checked against data the agent hasn’t seen, a number reconciled against an independent source. “Double-check your work” doesn’t count.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then comes the rewrite, and the rewrite is the payoff. You don’t get a methodology lecture. You get a prompt you can paste.&lt;/p&gt;

&lt;h3&gt;
  
  
  What changed for me
&lt;/h3&gt;

&lt;p&gt;I want to be careful here. I’m not going to wave around numbers I didn’t measure, and I’m not going to talk about my employer’s work. But I can describe the &lt;em&gt;shape&lt;/em&gt; of what changed, because it was obvious within days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I stopped re-prompting.&lt;/strong&gt; My old loop was ask, skim, “go deeper”, skim, “no, I meant…”, and repeat. The four questions front-load that negotiation. Most of my rounds of “that’s not what I meant” simply disappeared, because the rewrite spelled out what I meant before any work started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My prompts got shorter and harder.&lt;/strong&gt; That surprised me. The rewrites are rarely longer than the originals. They’re denser: one sentence naming the raw data, one naming the method, one naming the check. A good deeper prompt reads less like a wish and more like a test plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agents’ output became checkable.&lt;/strong&gt; This is the big one. When a result arrives with a named outside judge (a failing-then-passing test, a benchmark run, a reconciliation), I’m no longer judging the work by how confident it sounds. I’m judging it by whether it passed. On engineering tasks this turned review from reading prose into reading evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I learned what I didn’t know I didn’t know.&lt;/strong&gt; Question one is a cheap private tutor. Ask what a top performance engineer would do on a slow page, and you’ll hear about field data versus lab data, performance budgets in CI, and the critical rendering path. That kind of knowledge sticks. My prompting improved because my understanding of the work improved.&lt;/p&gt;

&lt;h3&gt;
  
  
  And the people on the other end
&lt;/h3&gt;

&lt;p&gt;Here’s the part I underestimated: depth flows downstream.&lt;/p&gt;

&lt;p&gt;When the method gets deeper, the people who use the result get something more trustworthy. Think about the difference, for anyone relying on a piece of software, between a fix that “should work” and a fix that comes with a regression test proving that exact failure can’t come back. Or a performance change verified on a throttled mid-range phone, which is what real users carry, instead of the developer’s laptop. Or an analysis whose headline number was reconciled against the source system before anyone made a decision with it.&lt;/p&gt;

&lt;p&gt;None of that is flashy. Customers rarely notice depth directly. They notice the absence of the second bug report, the screen that loads on the train, the decision that didn’t need reversing. In domains where mistakes are expensive, that’s the whole game.&lt;/p&gt;

&lt;h3&gt;
  
  
  What people are saying
&lt;/h3&gt;

&lt;p&gt;The essay travelled. Felix’s post passed four million impressions on X within a few days, and the prompt itself has been copied, translated, and remixed widely. Some reactions I found genuinely useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nicholas Charriere (&lt;a href="https://x.com/nichochar/status/2110589417811579362" rel="noopener noreferrer"&gt;@nichochar&lt;/a&gt;): “I love seeing how others prompt. This one stood out to me.”&lt;/li&gt;
&lt;li&gt;Shardul (&lt;a href="https://x.com/shardiban/status/2111186105496482014" rel="noopener noreferrer"&gt;@shardiban&lt;/a&gt;): “This is brilliant and has made a significant impact to my work in the last couple of days.”&lt;/li&gt;
&lt;li&gt;RileyTheGroove (&lt;a href="https://x.com/animriley/status/2110084934605926636" rel="noopener noreferrer"&gt;@animriley&lt;/a&gt;): “‘Be more ambitious’ is the ‘be confident’ of advice. True, useless, no instructions included. Depth is the one I see skipped most. Hand the model raw data and real methods and it stops being a chatbot.”&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://x.com/NotairenPapier/status/2110755646870265870" rel="noopener noreferrer"&gt;@NotairenPapier&lt;/a&gt;: “Your crash-free app example is the strongest part: the ambition became actionable once the model could access reports, reproduce failures and verify fixes.”&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://intelligentartifact.com/posts/ambition-needs-instruments/" rel="noopener noreferrer"&gt;Intelligent Artifact&lt;/a&gt; write-up summed it up neatly: “This is a better request than ‘think harder’ because it asks for changes that can be inspected.”&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://developer.tenten.co/claude-ambition-altitude-depth-range-verifiable-workflows" rel="noopener noreferrer"&gt;Tenten developer blog post&lt;/a&gt; put it this way: “The prompt is useful because it exposes missing work before asking for more output.”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the critics are saying, and why they have a point
&lt;/h3&gt;

&lt;p&gt;Not everyone was charmed, and the criticisms deserve more than a shrug. The sharpest came from the &lt;a href="https://news.ycombinator.com/item?id=50100345" rel="noopener noreferrer"&gt;Hacker News thread&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;“It’s just ‘make no mistakes’ with extra steps.”&lt;/strong&gt; One commenter, TheSamFischer, called the prompt “along the same vein as ‘make no mistakes’” and added: “Don’t give Anthropic even more of your money to burn tokens on stuff like this.” Cost is real. The four questions add a round trip before any work happens. &lt;a href="https://x.com/Ivrqen/status/2110976918149550276" rel="noopener noreferrer"&gt;@Ivrqen&lt;/a&gt; made the same point more vividly: “cool until it burns 30k tokens reinventing standard libraries from scratch.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Where’s the evidence?”&lt;/strong&gt; maxcb liked the essay but felt “it’s missing substance to help backup the idea that generic ambitious prompts are more effective”, and asked of the crash-free example: “And did it work? What % fewer crashes are there now?” That’s fair, and it’s why I’m not quoting my own numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“The model invents things to look ambitious.”&lt;/strong&gt; UncleEntity: “the more ambitious I get the more Claude doesn’t follow the plan and just makes up random stuff to get the tests to pass instead of following the design…” A model asked for expert methods can name methods that sound right and aren’t, or game the very check you gave it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Handing over judgment is risky.”&lt;/strong&gt; mjd, on letting the model pick the most urgent decisions: it “sounds like it is inviting horribly embarrassing mistakes.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Most people fail earlier than this.”&lt;/strong&gt; &lt;a href="https://x.com/spamofthemic/status/2110502334379987145" rel="noopener noreferrer"&gt;@spamofthemic&lt;/a&gt; was “very skeptical” that this is how typical users fail, arguing that “Step 0 is ‘understanding how to articulate problems to Claude’.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’d add one of my own: &lt;strong&gt;the raw material is usually the bottleneck.&lt;/strong&gt; The prompt happily tells you to start from the event logs. It can’t give you access to them. Felix says as much: before Claude could keep his apps crash-free, he had to wire up crash reports, version-to-commit mapping, and machines to reproduce on. Often the most valuable output of a deepening pass is a list of access I need to request.&lt;/p&gt;

&lt;p&gt;And for a quick question, all of this is overkill. Not everything deserves an expert’s method.&lt;/p&gt;

&lt;h3&gt;
  
  
  So I made it a skill, and tried to bake the criticisms in
&lt;/h3&gt;

&lt;p&gt;A prompt you have to remember to paste is a prompt you’ll forget, so I packaged it as an &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;Agent Skill&lt;/a&gt;: a folder with a SKILL.md that Claude Code, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, and OpenCode now all load on demand. Seven tools converging on one open format is quietly one of the best things to happen to this ecosystem.&lt;/p&gt;

&lt;p&gt;The skill goes beyond the original paragraph, mostly to answer the critics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tests for each question.&lt;/strong&gt; For example: “Would a competent non-expert skip this step? If not, it isn’t depth.” Generic answers get rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No fake raw material.&lt;/strong&gt; If data isn’t accessible, the agent has to say so and name the access needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outside judges ranked by strength&lt;/strong&gt;, with a pass condition precise enough to fail. Self-review is explicitly ruled out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“When not to use”&lt;/strong&gt;: trivial lookups and quick answers skip it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A closing line, “what I deliberately did not add”,&lt;/strong&gt; which forces the agent to name the bigger temptations it resisted. It’s a small thing that keeps rewrites honest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It installs with one script on macOS, Linux, or Windows, and it’s MIT-licensed: &lt;a href="https://github.com/r3dlex/deepen-prompt" rel="noopener noreferrer"&gt;github.com/r3dlex/deepen-prompt&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The habit, not the tool
&lt;/h3&gt;

&lt;p&gt;What I really took from Felix’s essay isn’t a prompt. It’s a reflex. When a result disappoints me, I no longer ask for more. I ask four questions: what would the best person in this field do, what would they start from, what would they use, and what would prove them wrong?&lt;/p&gt;

&lt;p&gt;Most of the time the answer reveals that the shallow part wasn’t the model.&lt;/p&gt;

&lt;p&gt;It was my prompt.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Read&lt;/em&gt; &lt;a href="https://felixrieseberg.com/how-to-be-more-ambitious-a-tutorial-for-humans-with-models/" rel="noopener noreferrer"&gt;&lt;em&gt;Felix’s essay&lt;/em&gt;&lt;/a&gt; &lt;em&gt;(the sections on altitude and range are just as good) and his&lt;/em&gt; &lt;a href="https://x.com/felixrieseberg/status/2110023283169247623" rel="noopener noreferrer"&gt;&lt;em&gt;original post on X&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. All credit for the idea is his.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If this was useful, &lt;a href="https://r3dtuxedo.substack.com/subscribe" rel="noopener noreferrer"&gt;subscribe to Agents in Practice&lt;/a&gt; for one practical note on AI coding agents a week. Helping your team adopt Claude Code or Codex safely and without the surprise bill? I consult on exactly that: &lt;a href="https://andre-burgstahler-9n5.pages.dev/" rel="noopener noreferrer"&gt;https://andre-burgstahler-9n5.pages.dev/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance and reviewed by the author.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>promptengineering</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
