<?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: softjapan</title>
    <description>The latest articles on DEV Community by softjapan (@softjapan).</description>
    <link>https://dev.to/softjapan</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%2F1801506%2Fccd16f92-b1fa-47f8-b4e1-939030051f6d.jpg</url>
      <title>DEV Community: softjapan</title>
      <link>https://dev.to/softjapan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/softjapan"/>
    <language>en</language>
    <item>
      <title>Stopgap fix: patch CVE-2026-109618 / 109619 (PHP RCE) while still on PHP 7.4</title>
      <dc:creator>softjapan</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:20:26 +0000</pubDate>
      <link>https://dev.to/softjapan/stopgap-fix-patch-cve-2026-109618-109619-php-rce-while-still-on-php-74-2pbd</link>
      <guid>https://dev.to/softjapan/stopgap-fix-patch-cve-2026-109618-109619-php-rce-while-still-on-php-74-2pbd</guid>
      <description>&lt;p&gt;On 2026-10-21 the PHP project disclosed &lt;strong&gt;two unauthenticated remote code execution vulnerabilities&lt;/strong&gt; (&lt;a href="https://www.php.net/archive/2026.php#2026-10-21-5" rel="noopener noreferrer"&gt;php.net announcement&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-109618&lt;/strong&gt; (&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;): out-of-memory handling can interrupt PHP while internal request data is only partly initialized, and request cleanup may then treat that invalid data as valid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-109619&lt;/strong&gt; (&lt;a href="https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp" rel="noopener noreferrer"&gt;GHSA-6wmf-4rv5-p3rp&lt;/a&gt;): internal state owned by a request can survive after its memory is freed, and a later request on the same worker may use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every PHP installation that serves web requests is affected: PHP-FPM, Apache mod_php, php-cgi and others. The advisory rates the risk &lt;strong&gt;highest for mod_php&lt;/strong&gt;, where an unauthenticated request can trigger the attack before any application code runs.&lt;/p&gt;

&lt;p&gt;Fixed releases exist only for &lt;strong&gt;PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12&lt;/strong&gt;. PHP 7.4 is end of life, but because the bugs are so severe, the PHP security team published &lt;strong&gt;minimal source backports&lt;/strong&gt; for 7.4, 8.0 and 8.1.&lt;/p&gt;

&lt;p&gt;The official Docker images &lt;code&gt;php:7.4-*&lt;/code&gt; will not be rebuilt. &lt;strong&gt;If your Dockerfile says &lt;code&gt;FROM php:7.4-apache&lt;/code&gt;, you stay vulnerable unless you act.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I rebuilt those images with the backport applied and published them as open source:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/softjapan/php74-cve-patched" rel="noopener noreferrer"&gt;https://github.com/softjapan/php74-cve-patched&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;This is a stopgap, not a fix for PHP 7.4.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only &lt;strong&gt;CVE-2026-109618 and CVE-2026-109619&lt;/strong&gt; are fixed. Other issues found after 7.4.33 are not.&lt;/li&gt;
&lt;li&gt;The base OS, &lt;strong&gt;Debian 11 (bullseye), reached end of LTS in 2026-08.&lt;/strong&gt; OS packages such as OpenSSL and Apache receive no more updates.&lt;/li&gt;
&lt;li&gt;These are not official images from the PHP project or Docker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The real fix is upgrading to PHP 8.2 or newer.&lt;/strong&gt; Use these images to buy time for that upgrade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- FROM php:7.4-apache
&lt;/span&gt;&lt;span class="gi"&gt;+ FROM ghcr.io/softjapan/php74-cve-patched:7.4-apache
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Change one &lt;code&gt;FROM&lt;/code&gt; line (apache / fpm / cli, amd64 / arm64).&lt;/li&gt;
&lt;li&gt;Rebuild, redeploy and &lt;strong&gt;restart every PHP worker&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm the fix with &lt;code&gt;check-patched.sh&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan your upgrade to PHP 8.2+.&lt;/strong&gt; You are done only after this step.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 1: check whether you are vulnerable
&lt;/h2&gt;

&lt;p&gt;The catch: &lt;strong&gt;after the backport, &lt;code&gt;php -v&lt;/code&gt; still prints &lt;code&gt;7.4.33&lt;/code&gt;.&lt;/strong&gt; The version number cannot tell you whether you are protected.&lt;/p&gt;

&lt;p&gt;This script looks inside the PHP binaries instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSLO&lt;/span&gt; https://raw.githubusercontent.com/softjapan/php74-cve-patched/main/scripts/check-patched.sh
sh check-patched.sh php:7.4-apache            &lt;span class="c"&gt;# an image&lt;/span&gt;
sh check-patched.sh &lt;span class="nt"&gt;--container&lt;/span&gt; my-web-1      &lt;span class="c"&gt;# a running container&lt;/span&gt;
sh check-patched.sh &lt;span class="nt"&gt;--local&lt;/span&gt;                   &lt;span class="c"&gt;# this machine (VM / bare metal)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The official image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image: php:7.4-apache
PHP version: 7.4.33
  VULNERABLE  /usr/lib/apache2/modules/libphp7.so
  VULNERABLE  /usr/local/bin/php
RESULT: VULNERABLE to CVE-2026-109618 / CVE-2026-109619
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The patched image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image: ghcr.io/softjapan/php74-cve-patched:7.4-apache
PHP version: 7.4.33
  patched     /usr/lib/apache2/modules/libphp7.so
  patched     /usr/local/bin/php
RESULT: PATCHED (backport found in every PHP binary)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 and newer count as fixed. Older versions are checked for &lt;code&gt;zend_new_array_singleton&lt;/code&gt;, a function the backport adds.&lt;/li&gt;
&lt;li&gt;It checks &lt;strong&gt;each SAPI binary separately&lt;/strong&gt;: the CLI, plus &lt;code&gt;libphp7.so&lt;/code&gt; (mod_php) and &lt;code&gt;php-fpm&lt;/code&gt;, which are what actually serve your requests. That catches a patched CLI next to an unpatched Apache module.&lt;/li&gt;
&lt;li&gt;Exit code &lt;code&gt;0&lt;/code&gt; means patched and &lt;code&gt;1&lt;/code&gt; means vulnerable, so you can block vulnerable images in CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The check is a heuristic. A backport from a distribution or LTS vendor written a different way may show as vulnerable. In that case, check with your vendor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: switch images
&lt;/h2&gt;

&lt;p&gt;The same images, with the same tags and digests, are on two registries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Official image&lt;/th&gt;
&lt;th&gt;GHCR&lt;/th&gt;
&lt;th&gt;Docker Hub&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;php:7.4-apache&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ghcr.io/softjapan/php74-cve-patched:7.4-apache&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;softjpn/php74-cve-patched:7.4-apache&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;php:7.4-fpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ghcr.io/softjapan/php74-cve-patched:7.4-fpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;softjpn/php74-cve-patched:7.4-fpm&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;php:7.4-cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ghcr.io/softjapan/php74-cve-patched:7.4-cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;softjpn/php74-cve-patched:7.4-cli&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They work exactly like the official images:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker-php-ext-install&lt;/code&gt;, &lt;code&gt;docker-php-ext-configure&lt;/code&gt;, &lt;code&gt;pecl&lt;/code&gt; and &lt;code&gt;php.ini-production&lt;/code&gt; all work as before.&lt;/li&gt;
&lt;li&gt;CI checks that &lt;code&gt;php -m&lt;/code&gt; lists the same extensions as the official image.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apt-get install&lt;/code&gt; works, because apt now points at &lt;code&gt;archive.debian.org&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example for Laravel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ghcr.io/softjapan/php74-cve-patched:7.4-apache&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--no-install-recommends&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        libzip-dev libpng-dev libjpeg-dev libfreetype6-dev &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-configure gd &lt;span class="nt"&gt;--with-freetype&lt;/span&gt; &lt;span class="nt"&gt;--with-jpeg&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-install &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; gd pdo_mysql zip bcmath opcache &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Changing the image is not enough on its own.&lt;/strong&gt; Containers and workers that are already running keep the old binaries. Rebuild, redeploy and restart every PHP worker, then run &lt;code&gt;check-patched.sh --container &amp;lt;name&amp;gt;&lt;/code&gt; against the &lt;strong&gt;running&lt;/strong&gt; container.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What exactly changed
&lt;/h2&gt;

&lt;p&gt;Very little. The images start from the &lt;a href="https://github.com/docker-library/php/tree/1361ba95d80570e3984f9de9f765948246191557/7.4/bullseye" rel="noopener noreferrer"&gt;last PHP 7.4 Dockerfiles in docker-library/php (commit 1361ba95)&lt;/a&gt; and change three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;apt uses &lt;code&gt;archive.debian.org&lt;/code&gt;.&lt;/strong&gt; Bullseye has left the regular mirrors, so &lt;code&gt;apt-get update&lt;/code&gt; there returns 404.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The backport is applied to the PHP 7.4.33 source&lt;/strong&gt; with &lt;code&gt;patch -p1 --fuzz=0&lt;/code&gt;. If it does not apply cleanly, the build fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The build checks the result.&lt;/strong&gt; If &lt;code&gt;php&lt;/code&gt;, &lt;code&gt;php-fpm&lt;/code&gt; or &lt;code&gt;libphp7.so&lt;/code&gt; is missing the fix, the build fails.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The patch is &lt;strong&gt;byte-identical&lt;/strong&gt; to the upstream commit &lt;a href="https://github.com/php/php-src/commit/712e60f9edfd03f0960fc4fc3c2c375f42b90aa2" rel="noopener noreferrer"&gt;php/php-src@712e60f&lt;/a&gt;. On every push and every week, CI checks two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The vendored patch still matches the upstream commit.&lt;/li&gt;
&lt;li&gt;The upstream backport branch has no new commits. If it does, CI fails so a new patch can be shipped.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first internal version re-ran &lt;code&gt;./configure&lt;/code&gt; on top of &lt;code&gt;php:7.4-apache&lt;/code&gt;. That approach hard-coded x86_64 options and let the fpm and cli builds drift from each other. Starting from the official Dockerfiles keeps the images compatible with the official ones and makes multi-arch builds straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trust, but verify
&lt;/h2&gt;

&lt;p&gt;You probably should not pull a security image from a stranger on faith, so everything here can be checked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Images are built only by GitHub Actions in the repository, with SBOM and provenance attestations.&lt;/li&gt;
&lt;li&gt;Images are signed with cosign (keyless):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cosign verify ghcr.io/softjapan/php74-cve-patched:7.4-apache &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--certificate-identity-regexp&lt;/span&gt; &lt;span class="s1"&gt;'^https://github.com/softjapan/php74-cve-patched/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--certificate-oidc-issuer&lt;/span&gt; https://token.actions.githubusercontent.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Pin a digest (&lt;code&gt;@sha256:...&lt;/code&gt;) in production.&lt;/li&gt;
&lt;li&gt;Or skip these images and &lt;a href="https://github.com/softjapan/php74-cve-patched/blob/main/examples/build-it-yourself/README.md" rel="noopener noreferrer"&gt;build them yourself&lt;/a&gt;. The guide also covers applying the patch with &lt;code&gt;patch -p1&lt;/code&gt; if you build PHP from source without Docker.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mitigations if you cannot switch right away
&lt;/h2&gt;

&lt;p&gt;The advisory also lists mitigations. It is clear that they &lt;strong&gt;only block some attack paths and do not make an installation safe&lt;/strong&gt;, but they are useful as a bridge until you switch, and as defense in depth afterwards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-109618 (OOM corruption)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;memory_limit=-1&lt;/code&gt; in a way applications cannot override, such as &lt;code&gt;php_admin_value&lt;/code&gt; in the FPM pool or Apache config. Check that no other setting brings back a finite limit.

&lt;ul&gt;
&lt;li&gt;Use a container or cgroup memory limit instead, ideally one that kills only the affected worker.&lt;/li&gt;
&lt;li&gt;Do not use &lt;code&gt;RLIMIT_AS&lt;/code&gt; or &lt;code&gt;RLIMIT_DATA&lt;/code&gt; as a substitute. They can cause the very allocation failure you are trying to avoid.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lower &lt;code&gt;post_max_size&lt;/code&gt;: &lt;code&gt;8M&lt;/code&gt; if you have no file uploads, &lt;code&gt;32M&lt;/code&gt; if you do. Keep &lt;code&gt;upload_max_filesize&lt;/code&gt; below &lt;code&gt;post_max_size&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Also limit request size, field count, multipart part count, header count and nesting depth at the web server or proxy, including for requests without a usable &lt;code&gt;Content-Length&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-109619 (stale global state)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;session.upload_progress.enabled=0&lt;/code&gt; and &lt;strong&gt;restart every worker.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Set it in &lt;code&gt;php.ini&lt;/code&gt;, the FPM pool or the server config, which apply before request parsing. &lt;code&gt;ini_set()&lt;/code&gt; and &lt;code&gt;.user.ini&lt;/code&gt; do not help.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Remove invalid or deprecated settings applied per request that emit diagnostics before initialization. Hiding the diagnostics with &lt;code&gt;@&lt;/code&gt; or &lt;code&gt;display_errors&lt;/code&gt; does not help.&lt;/li&gt;
&lt;li&gt;Fix fatal errors and timeouts that an attacker can trigger.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The images ship an optional file with some of these settings (&lt;code&gt;session.upload_progress.enabled = 0&lt;/code&gt; and lower &lt;code&gt;post_max_size&lt;/code&gt; / &lt;code&gt;upload_max_filesize&lt;/code&gt;). It is &lt;strong&gt;disabled by default&lt;/strong&gt;, so PHP behaves exactly like the official image. To enable it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; /usr/local/share/php74-cve-patched/zz-cve-2026-mitigations.ini &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PHP_INI_DIR&lt;/span&gt;&lt;span class="s2"&gt;/conf.d/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  After the stopgap
&lt;/h2&gt;

&lt;p&gt;One more time: &lt;strong&gt;this stops the bleeding. It does not cure the patient.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Find every PHP 7.4 environment and run &lt;code&gt;check-patched.sh&lt;/code&gt; on it.&lt;/li&gt;
&lt;li&gt;[ ] Switch images, redeploy and restart the workers.&lt;/li&gt;
&lt;li&gt;[ ] Confirm &lt;code&gt;check-patched.sh --container&lt;/code&gt; reports &lt;code&gt;PATCHED&lt;/code&gt; on the &lt;strong&gt;running&lt;/strong&gt; containers.&lt;/li&gt;
&lt;li&gt;[ ] Add the mitigation settings where they make sense.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Set a plan and a deadline for moving to PHP 8.2+.&lt;/strong&gt; PHP 8.2 itself reaches end of life on 2026-12-31, so consider 8.3 or newer.&lt;/li&gt;
&lt;li&gt;[ ] Tell your team that the OS (Debian 11) is not getting updates either.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CVE-2026-109618 and CVE-2026-109619 are unauthenticated RCEs. Treat mod_php as top priority.&lt;/li&gt;
&lt;li&gt;The official PHP 7.4 Docker images will not be fixed. If you use &lt;code&gt;php:7.4-*&lt;/code&gt;, you stay vulnerable.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/softjapan/php74-cve-patched" rel="noopener noreferrer"&gt;php74-cve-patched&lt;/a&gt; is a &lt;strong&gt;stopgap&lt;/strong&gt; that brings in the official backport with a one-line &lt;code&gt;FROM&lt;/code&gt; change.&lt;/li&gt;
&lt;li&gt;The real fix is upgrading to PHP 8.2 or newer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PHP 8.0 / 8.1 images (official backports exist for those too) and Alpine variants are on the roadmap. Open an issue if you need one. And if this saved you an emergency upgrade, a ⭐ on GitHub helps other people stuck on PHP 7.4 find it.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/softjapan/php74-cve-patched" rel="noopener noreferrer"&gt;https://github.com/softjapan/php74-cve-patched&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.php.net/archive/2026.php#2026-10-21-5" rel="noopener noreferrer"&gt;PHP: News Archive 2026 (2026-10-21 security advisory)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w" rel="noopener noreferrer"&gt;GHSA-w8hw-w9fx-j79w (CVE-2026-109618)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp" rel="noopener noreferrer"&gt;GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/php/php-src/tree/PHP-7.4-CVE-2026-109618-109619" rel="noopener noreferrer"&gt;php-src branch PHP-7.4-CVE-2026-109618-109619&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>php</category>
      <category>docker</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Set Up a Laravel Backend and Next.js Frontend Development Environment with Docker within 5 minutes</title>
      <dc:creator>softjapan</dc:creator>
      <pubDate>Sat, 04 Jan 2025 15:35:19 +0000</pubDate>
      <link>https://dev.to/softjapan/set-up-a-laravel-backend-and-nextjs-frontend-development-environment-with-docker-within-5-minutes-58ck</link>
      <guid>https://dev.to/softjapan/set-up-a-laravel-backend-and-nextjs-frontend-development-environment-with-docker-within-5-minutes-58ck</guid>
      <description>&lt;h1&gt;
  
  
  Set Up a Laravel Backend and Next.js Frontend Development Environment with Docker within 5 minutes
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/softjapan/laravel-nextjs-dev-environment" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This guide walks you through creating a Laravel backend and a Next.js frontend, all within a Dockerized environment. You can have everything up and running in just a few minutes.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; and &lt;strong&gt;Docker Compose&lt;/strong&gt; installed on your system
&lt;/li&gt;
&lt;li&gt;Basic knowledge of &lt;strong&gt;Laravel&lt;/strong&gt; and &lt;strong&gt;Next.js&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - Basic knowledge of command-line usage
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Clone the Repository
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/softjapan/laravel-nextjs-dev-environment.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Create the Laravel Backend
&lt;/h2&gt;

&lt;p&gt;By default, this setup uses MySQL. We will skip running migrations at this point and do them later. Other options use default settings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;laravel-nextjs-dev-environment
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/app"&lt;/span&gt; softjpn/laravel-nodejs-dev laravel new laravel-backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Install Laravel Breeze and Dependencies
&lt;/h2&gt;

&lt;p&gt;We will install Laravel Breeze (API scaffolding) without running migrations at this stage. Migrations will be run later after configuring the &lt;code&gt;.env&lt;/code&gt; file and starting the Docker containers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;laravel-backend
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/app"&lt;/span&gt; softjpn/laravel-nodejs-dev composer require laravel/breeze &lt;span class="nt"&gt;--dev&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/app"&lt;/span&gt; softjpn/laravel-nodejs-dev php artisan breeze:install api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Create the Next.js Frontend
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/app"&lt;/span&gt; softjpn/laravel-nodejs-dev git clone https://github.com/laravel/breeze-next.git next-frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Install Frontend Dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;next-frontend
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/app"&lt;/span&gt; softjpn/laravel-nodejs-dev npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Create the Environment Files
&lt;/h2&gt;

&lt;p&gt;These files contain database connection details and other environment variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;span class="nb"&gt;cp&lt;/span&gt; ./envfiles/laravel-backend/.env ./laravel-backend/.env
&lt;span class="nb"&gt;cp&lt;/span&gt; ./envfiles/next-frontend/.env ./next-frontend/.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Start the Docker Containers
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Run Database Migrations
&lt;/h2&gt;

&lt;p&gt;Once the containers are running and your &lt;code&gt;.env&lt;/code&gt; files are in place, apply the migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; laravel-backend php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Access the Frontend
&lt;/h2&gt;

&lt;p&gt;Open your browser and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Stop the Docker Containers
&lt;/h2&gt;

&lt;p&gt;When you’re done, shut down the containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Screenshot
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhz1ntskgeqkhzw3jgypa.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.amazonaws.com%2Fuploads%2Farticles%2Fhz1ntskgeqkhzw3jgypa.png" alt="screenshot" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This project is open source and available under the &lt;a href="https://dev.toLICENSE"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;Contributions are welcome! Feel free to open a pull request with improvements or suggestions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contact
&lt;/h2&gt;

&lt;p&gt;For questions or additional support, please open an issue in this repository.&lt;/p&gt;




&lt;p&gt;Enjoy your streamlined Laravel + Next.js development setup!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>ChatGPT Client with LINE-Style UI Built with Flutter and Riverpod</title>
      <dc:creator>softjapan</dc:creator>
      <pubDate>Wed, 01 Jan 2025 03:00:28 +0000</pubDate>
      <link>https://dev.to/softjapan/chatgpt-client-with-line-style-ui-built-with-flutter-and-riverpod-2hei</link>
      <guid>https://dev.to/softjapan/chatgpt-client-with-line-style-ui-built-with-flutter-and-riverpod-2hei</guid>
      <description>&lt;h2&gt;
  
  
  ChatGPT Client with LINE-Style UI Built with Flutter and Riverpod
&lt;/h2&gt;

&lt;p&gt;This is a ChatGPT client application developed with Flutter and Riverpod, featuring a LINE-inspired chat UI.&lt;br&gt;&lt;br&gt;
It provides real-time, bidirectional communication by integrating with OpenAI’s GPT models.&lt;/p&gt;




&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LINE-Style Chat UI&lt;/strong&gt;
A simple, intuitive design that offers a streamlined user experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Chat with OpenAI GPT Model&lt;/strong&gt;
Utilizes the ChatGPT API to enable natural, human-like conversations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management with Riverpod&lt;/strong&gt;
Improves scalability and maintainability by separating application logic from the UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt;
Adapts seamlessly to various screen sizes, from smartphones to larger devices&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2F4n8gucma5nu6ku4kafgs.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.amazonaws.com%2Fuploads%2Farticles%2F4n8gucma5nu6ku4kafgs.png" alt="Image description" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flutter&lt;/strong&gt; 3.19.x or higher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dart&lt;/strong&gt; 3.3.x or higher&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI API Key&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the repository&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/softjapan/flutter_chatgpt.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install dependencies&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   flutter pub get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Configure environment variables&lt;/strong&gt;
Create a &lt;code&gt;.env&lt;/code&gt; file in the project’s root directory and add the following:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   endpoint='https://api.openai.com/v1/'
   model='gpt-4-turbo-preview'
   aiToken='your-api-key-here'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the application&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   flutter run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Technologies Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://flutter.dev/" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://riverpod.dev/" rel="noopener noreferrer"&gt;Riverpod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/" rel="noopener noreferrer"&gt;OpenAI API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/freezed" rel="noopener noreferrer"&gt;Freezed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/flutter_dotenv" rel="noopener noreferrer"&gt;flutter_dotenv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  License
&lt;/h3&gt;

&lt;p&gt;This project is released under the &lt;a href="//./LICENSE"&gt;MIT License&lt;/a&gt;. Please see the &lt;a href="//./LICENSE"&gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt;




&lt;h3&gt;
  
  
  How to Contribute
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fork&lt;/strong&gt; this repository&lt;/li&gt;
&lt;li&gt;Create a new feature branch
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/amazing-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Commit your changes
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'Add some amazing feature'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Push the branch to the remote repository
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git push origin feature/amazing-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create a &lt;strong&gt;Pull Request&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Author
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Twitter&lt;/strong&gt;: &lt;a href="https://twitter.com/softbasejp" rel="noopener noreferrer"&gt;FullStack@ITエンジニア&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub Repository: &lt;a href="https://github.com/softjapan/flutter_chatgpt" rel="noopener noreferrer"&gt;https://github.com/softjapan/flutter_chatgpt&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>riverpod</category>
      <category>chatgpt</category>
      <category>openai</category>
    </item>
  </channel>
</rss>
