October 2026 Security Roundup: Updates Across PHP, Node.js, NGINX, Go and GitLab
newsUpdated 13 min read
PHP2Shell, 10 Node.js CVEs, five NGINX fixes, a Go certificate block, GitLab patches and the eMudhra CA key compromise: what to patch first and how to check.

Developing story. Last verified: 2026-10-22. Each vendor's own release notes are linked in its section and carry the latest word on versions.
By Frankie C. · Senior Market Researcher, Mindber. Tracks 500+ AI/SaaS tools across SEA markets via the Mindber Innovation Index methodology.
How we assessed this: On 22 October 2026 we read the Node.js security release, the NGINX release notes on GitHub and the Go issue tracker and release tags. GitLab's changelog, the certifi and uv advisories and Cloudflare's PHP2Shell write-up covered the rest. Amazon's report on PHP2Shell exploitation was out of reach, so we cite only its title. Mindber did not run an exploit or test any server. Where a vendor page was out of reach, the section says so.
If you run a web stack, the week of 14 to 21 October 2026 left you with more than one update to schedule. PHP shipped fixes for two critical engine flaws known as PHP2Shell, and Node.js fixed 10 CVEs on the same day. NGINX had closed five a week earlier. Go blocked a handful of intermediate certificates over unspecified security concerns, GitLab released security patches, and eight intermediate CA keys from eMudhra were compromised. One widely shared post on X put all of it on a single day. The dates below come from each vendor's own notes, and they span a week.
What to patch first
Our order, with the reason for each. Only the first item had public reports of exploitation in the sources we read, which is why it sits alone at the top.
- PHP on Apache with mod_php, today. Amazon reports PHP2Shell exploitation in its honeypots before disclosure, Cloudflare has seen attack traffic, and the proven attack needs nothing from your code. Our PHP2Shell guide has the fixed versions and the commands.
- Node.js services that accept outside input. The Brotli bug sits in a decoder that untrusted data can reach, and two more high-severity bugs weaken TLS hostname checks.
- Anything that trusts the
emSign ECC Root CA - G3root. Exploiting the stolen keys takes an on-path position, which narrows the risk. Certificate trust is hard to audit after the fact, though. - NGINX, especially with HTTP/3, SSI with AIO, alias with rewrite or rotating session ticket keys. Four of the five CVEs need one of those features switched on.
- Self-managed GitLab and rebuilt Go programs. Both matter, and neither had a reported attack in the sources we read.
The same week in order:
Seven days of security updates
- 1
14 October: NGINX
NGINX 1.31.7 mainline and 1.30.6 stable fix five CVEs. - 2
18 to 20 October: certifi
certifi 2026.10.18 removes all emSign roots. Release 2026.10.19, committed early on 20 October (UTC), restores the roots that were not affected. - 3
20 October: Go and uv
Go 1.27.3 and 1.26.10 are tagged with a block on a small set of intermediate certificates (CVE-2026-111943). uv 0.13.4 ships, and the certifi and uv advisories are published on GitHub. - 4
20 October: GitLab
GitLab tags 19.5.1, 19.4.3 and 19.3.6. The 19.5.1 changelog lists 14 security changes. - 5
21 October: PHP and Node.js
PHP ships its four fixed releases for PHP2Shell. Node.js ships 26.12.1, 24.22.1 and 22.23.4 with 10 CVE fixes and a CA update for the eMudhra compromise.
PHP: PHP2Shell, the one already exploited
CVE-2026-109618 and CVE-2026-109619 are memory bugs in the PHP engine. One corrupts request memory when PHP runs out of memory at the wrong moment, the other lets freed data from one request poison the next one on the same worker. Either can give an attacker code execution without a login. Cloudflare reports attack traffic against its customers, and Amazon's threat intelligence team titled its report "Amazon Threat Intelligence identifies PHP2Shell exploitation prior to public disclosure in MadPot".
Our PHP2Shell guide covers each setup, the stopgaps and a compromise check. The short version: because the flaws sit in PHP itself, no WordPress, Magento or Laravel update helps. The fix is a new PHP build and a restart of every worker.
Node.js: ten CVEs across three release lines
The Node.js October 2026 security release lists ten CVEs, fixed in 26.12.1, 24.22.1 and 22.23.4. It says end-of-life versions are always affected, and it ships fixes only for the three supported lines.
| CVE | Severity | Issue | Lines affected |
|---|---|---|---|
| CVE-2026-111497 | High | Brotli decoder out-of-bounds write permits remote code execution | 26, 24, 22 |
| CVE-2026-105482 | High | dns.resolve truncates names containing a NUL character | 26, 24, 22 |
| CVE-2026-105483 | High | TLS hostname bypass when the IP is written in fullwidth digits | 26, 24 |
| CVE-2026-106069 | High | TLS hostname bypass when the host loosely resolves to an IP address | 26, 24, 22 |
| CVE-2026-105481 | Medium | Keep-alive socket processes a response written before the request was sent | 26, 24, 22 |
| CVE-2026-106072 | Medium | Non-canonical IPv4 hostnames let DNS SANs authenticate IP endpoints | 26, 24, 22 |
| CVE-2026-106074 | Medium | crypto.randomUUID() and randomInt() caches saved into startup snapshots and SEAs repeat values | 26, 24, 22 |
| CVE-2026-106070 | Low | ZipFile returns attacker-controlled prefix bytes after a failed header check | 26 only |
| CVE-2026-106071 | Low | Permission Model filesystem over-grant via wildcard lookup | 26 only |
| CVE-2026-106073 | Low | Permission Model bypass with fs.realpathSync | 26, 24, 22 |
The Brotli bug deserves the most attention. Any service that decompresses Brotli data from outside hands that decoder input an attacker controls. An API that accepts compressed request bodies does that, and so does a proxy that unpacks upstream responses. Two other high-severity bugs are about TLS hostname checks, which matters most for code that calls other services by IP address or by names it takes from users. The third truncates DNS names at a NUL character.
How you upgrade depends on how Node.js got onto the machine. A Docker image moves when you change its base tag, for example from node:24 to a tag at 24.22.1 or later, and rebuild. A host managed with nvm takes nvm install 24 followed by a restart of the service. Distribution packages lag upstream, so check that your package source has published the fixed build before you assume a routine apt upgrade covered it.
One medium bug is easy to miss. If you build Node.js single executable applications (SEAs) or startup snapshots, crypto.randomUUID() and randomInt() could hand every process the same values, because their entropy caches were saved into the snapshot. Rebuild those artifacts on a fixed release, then confirm the runtime on every host:
check-node.sh
node -v # 26.12.1, 24.22.1, 22.23.4 or newer
docker run --rm my-app:latest node -v # the version inside each image you shipeMudhra: eight intermediate CA keys compromised
Eight intermediate CA certificates from eMudhra, all chaining to the emSign ECC Root CA - G3 root, had their private keys compromised, and the CA revoked them. That is the account in the certifi advisory and the matching uv advisory. With one of those keys, an attacker can issue a certificate for any hostname. Paired with an on-path position, such as a hostile network or a hijacked route, that lets them read or change TLS traffic from clients that trust the root.
Fixes landed in four places within four days. GitHub rates both the certifi and uv advisories critical, 9.1 on CVSS v4.0.
- Python's certifi, the CA bundle behind
requests,urllib3andpip, removed every emSign root in 2026.10.18 and restored the unaffected ones in 2026.10.19. Upgrade to 2026.10.19 or later, and rebuild container images that vendor certifi. - uv dropped the root in 0.13.4, following
webpki-root-certs1.0.10. - Node.js's security release lists a
ca-certdependency update for the "eMudhra Intermediate CA Compromise" on all three supported lines. - Go 1.27.3 and 1.26.10 make
crypto/x509drop any chain that passes through "a small set of intermediate certificates" from one certificate authority, tracked as CVE-2026-111943. The Go issue names no CA. It was filed on 19 October, the day after certifi pulled the emSign roots, but Go has not said the two are related.
Every Python virtual environment and container image carries its own copy of certifi. A clean result from the system Python says nothing about the copy inside each project's venv. Run the version check there too, or rebuild the environments from an updated lock file.
To see whether a site you call, or your own, presents a chain through eMudhra, read the issuer of each certificate it sends. An emSign or eMudhra name in that list is worth a closer look:
check-chain.sh
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null | grep -E '^ *i:'What we could not confirm is how operating system and browser trust stores responded. Those vendors publish their own root program updates, and none was in the sources we read, so check your distribution's ca-certificates package for an update this week.
check-trust.sh
python3 -m pip show certifi | grep -i '^version' # 2026.10.19 or newer
uv --version # 0.13.4 or newer
node -v # 26.12.1, 24.22.1, 22.23.4 or newer
go version # go1.27.3, go1.26.10 or newerNGINX: five CVEs from a week earlier
NGINX 1.31.7 and 1.30.6 shipped on 14 October with these fixes:
- CVE-2026-15176, a buffer overflow when
aliasis used withrewrite. - CVE-2026-93479, a buffer overflow when evaluating string expressions with variables.
- CVE-2026-95101, request body injection in HTTP/3.
- CVE-2026-97629, session forgery when TLS session ticket keys are rotated.
- CVE-2026-97205, a use-after-free in
ngx_http_ssi_modulewith AIO.
Most of the five need a specific feature turned on, so your configuration tells you how exposed you are. Dump it and look for the directives involved:
check-nginx.sh
nginx -v # 1.31.7, 1.30.6 or newer
sudo nginx -T 2>/dev/null | grep -nE 'listen .*quic|http3|ssi +on|aio|ssl_session_ticket_key|ssl_session_cache|alias'A match is not proof of risk. No match doesn't make the update optional either, because the release notes tie the string-expression overflow to no single directive. The ticket-key note names no directive at all, and since 1.23.2 NGINX rotates ticket keys on its own when ssl_session_cache uses shared memory, so that line is in the search. The newer 1.31.8 mainline release lists no new security fixes, so 1.31.7 or 1.30.6 is the floor. If NGINX fronts a PHP-FPM pool, pair this update with the PHP one so the box is restarted once. Before the restart, run sudo nginx -t to catch configuration errors, because a failed start leaves the site down rather than on the old version. Distribution builds of NGINX often trail the release notes, so on Debian, Ubuntu or RHEL compare the package changelog with the CVE list above. The packages from nginx.org follow upstream releases directly.
Go: one CVE, and one still open
The Go fix is about trust, not memory. Go 1.27.3 and 1.26.10, tagged on 20 October, change Verify so it drops any chain that runs through the blocked intermediates. The Go team marks the issue urgent and recommends upgrading at once.
Upgrading the toolchain changes nothing for programs already built. Go compiles the standard library into each binary, so every service, CLI and container image needs a rebuild with the new toolchain and a redeploy. The binary itself tells you which toolchain built it, which makes it easy to audit a fleet:
check-go-binaries.sh
go version ./my-service # prints the Go version the binary was built with
go version -m ./my-service | head -n 3 # same, plus the module pathAnything that reports an older toolchain than the fixed releases still trusts the blocked intermediates. Third-party Go tools you install as binaries, such as CLIs and exporters, need their vendors to ship rebuilt versions.
A second Go issue, CVE-2026-97044, is still open. Filed a day later, it reports that x/net/idna applies length checks only after Punycode conversion, so an HTTP client resolving a long, invalid hostname can burn excessive CPU. The issue is public and had no fixed release when we checked.
GitLab: security patches for self-managed instances
GitLab tagged 19.5.1, 19.4.3 and 19.3.6 on 20 October, along with 19.2.9, 19.1.9, 19.0.10 and 18.11.13, which we did not check. The 19.5.1 changelog lists 14 security changes. Among them:
- Escape the LDAP email filter value to prevent an authentication bypass.
- Enforce the SAML and LDAP membership lock on paths that add members.
- Validate push checks on all ref types.
- Strip sensitive Workhorse headers using canonical casing.
- Build OAuth discovery endpoint URLs from the configured instance URL.
- Keep project vulnerability reads scoped when filtering by project.
Three of those six, the SAML and LDAP lock, the push checks and the vulnerability reads, apply only to the Enterprise Edition.
The X post counted 12 CVEs. GitLab's release post would carry the CVE IDs, but we could not open it, so treat the count as unconfirmed and read the release post before you schedule the upgrade. Within one minor line, such as 19.4.2 to 19.4.3, the upgrade is a plain package update. Jumping several minor versions at once may need intermediate stops on GitLab's documented upgrade path, so plan that before the maintenance window rather than during it. To see which version an Omnibus instance runs:
check-gitlab.sh
sudo gitlab-rake gitlab:env:info | grep -A2 'GitLab information' # 19.5.1, 19.4.3, 19.3.6 or newerMore from Mindber
- PHP2Shell: how to check and fix your server, the full guide to this week's most urgent fix.
- The Mindber news desk for follow-ups as vendors publish more fixes.
- ASEAN AI compliance guide: breach-notification rules in Malaysia, Singapore and the Philippines, if an update comes too late.
- AI agent procurement guide: security and breach questions to ask any vendor that hosts your data.
- Claude Fable 5 suspended: why Anthropic held its cyber-capable Mythos 5 model back for vetted defenders.
- NVIDIA NemoClaw: infrastructure-level security controls for AI agents.
- Loop engineering: how AI agents test an idea over and over, the pattern behind AI-found bugs such as PHP2Shell.
- Rankings, discover and our methodology.
- AI coding agents, including Claude Code and the Codex agent in ChatGPT, can read configuration files and flag risky directives. Give them read-only access on production.
Frequently asked questions
Were any of these vulnerabilities exploited besides PHP2Shell?
Not in the sources we read. None of the Node.js, NGINX, Go, certifi or uv notes mentions attacks in the wild. We could not read GitLab's release post, so its status is open.
Do I need to restart services after these updates?
Yes. Running Node.js processes and NGINX workers keep the old code until they restart, and Go programs need a rebuild and redeploy because the standard library is compiled in. Updating certifi takes effect for new Python processes, so restart long-running ones too.
Why does a Go update fix a certificate authority problem?
Go checks certificate chains in its own crypto/x509 package, and the new releases make its Verify drop chains that run through the blocked intermediates. Go programs pick that up only once they are rebuilt with the fixed toolchain.
Is my Node.js 20 or older app covered by these fixes?
No. Node.js counts every end-of-life version as affected by each security release, and this one patched only the lines in the table above. Move to one of those and rebuild any images that bundle an older runtime.
Does the eMudhra compromise affect visitors to my website?
Only if an attacker sits on their network path and their client trusts the affected root. Your own site's certificate is unaffected unless eMudhra issued it. For servers and scripts you control, updating certifi, uv, Node.js, Go and the system CA package closes the gap.
Sources & methodology
Editorial analysis of each vendor's own release notes and advisories, retrieved 2026-10-22. Where a vendor page was out of reach, the article says so. Follow each link for the current position.
- [1]Node.js 10 CVEs, severities, affected lines and fixed versions 26.12.1, 24.22.1, 22.23.4; end-of-life lines unfixedNode.js: October 2026 security releases · 2026-10-21
- [2]NGINX 1.31.7 and 1.30.6 fix five CVEs on 14 October; 1.31.8 lists no security fixesnginx/nginx GitHub releases · 2026-10-21
- [3]Go crypto/x509 blocks a small set of intermediates, CVE-2026-111943, urgent trackGo issue #82345 · 2026-10-20
- [4]x/net/idna Punycode length checks, CVE-2026-97044, openGo issue #82374 · 2026-10-20
- [5]GitLab 19.5.1 with 14 security changes; 19.4.3 and 19.3.6 tagged the same dayGitLab CHANGELOG at v19.5.1-ee · 2026-10-20
- [6]Eight eMudhra intermediates under emSign ECC Root CA - G3 compromised and revoked; certifi 2026.10.18 and 2026.10.19GitHub advisory GHSA-6q48-6c7w-9gw2 (certifi) · 2026-10-20
- [7]uv 0.13.4 removes the emSign root, following webpki-root-certs 1.0.10GitHub advisory GHSA-hq85-5cpj-mr62 (uv) · 2026-10-20
- [8]PHP2Shell fixed releases and exposurephp.net: Security advisory, update now · 2026-10-21
- [9]Attack traffic against Cloudflare customersCloudflare blog · 2026-10-21
- [10]PHP2Shell exploitation in MadPot honeypots before disclosure (report title only, page not read)Amazon Security Blog · 2026-10-22
- [11]ca-cert update for the eMudhra intermediate CA compromise on 26.x, 24.x and 22.xNode.js: October 2026 security releases · 2026-10-21
Keep reading
PHP2Shell (CVE-2026-109618, CVE-2026-109619): What It Is and How to Check and Fix Your Server
The week's most urgent fix, with versions, commands, stopgaps and a compromise check.
ASEAN AI Compliance Guide 2026
Breach notification and data rules SaaS teams in the region need to know.
NemoClaw: NVIDIA's open-source AI agent security stack
Infrastructure-level security controls for AI agents that run on your own machines.
This article is an analysis of public information. It is not original security research, and Mindber did not test any exploit or server. All facts were checked against the sources above on 22 October 2026. The situation is still developing, so follow each vendor for the latest fixed versions. Spot an error? Tell us. Corrections ship within 24 hours.
Learn the basics on Mindber
New to AI? These free Mindber pages explain the ideas behind articles like this one.
Share this article
Legal notice
This publication constitutes editorial commentary on publicly available information and does not constitute financial, legal, investment, or professional advice. Product names, trademarks, and registered trademarks referenced herein are the property of their respective owners; their appearance does not imply endorsement or affiliation. Mindber's analysis reflects editorial judgment based on public signals and is subject to change without notice. Scores are not buy, sell, or hold recommendations. No commercial relationship exists between Mindber and the vendors evaluated unless separately disclosed in writing. This publication is governed by the laws of Malaysia. Any dispute arising from or in connection with this publication shall be submitted to the exclusive jurisdiction of the courts of Malaysia.