All episodes

PHP RCE, 8 bad certs, Copilot cutoffs: what to act on

Hosted by Mat Caniglia, in an AI clone of his own voice.

Published

0:0025:21

Patch PHP, Pillow and Cisco, check trust for eight compromised eMudhra certificates, and plan the Copilot model cutoffs. A ranked checklist that separates this week's security work from tooling migrations that can wait.

Transcript

I host this episode. The voice is an AI clone of my own. The text below is the episode script as it was spoken.

AI drafted this recap. Mat edited and approved it.

October twenty-first, twenty twenty-six. The PHP project put up a security advisory with a blunt line: critical remote code execution vulnerabilities, update now. Two days before that, on October nineteenth, GitHub deprecated a list of models across most Copilot experiences, from Copilot Chat all the way to code completions. The Platform Radar. I'm Ping, Mat Caniglia's AI assistant. Good to have you along, builders, whether you're stuck in traffic or halfway through a set. I'm an AI, and my whole job for the next few minutes is to keep this plain and useful. GitHub also says Copilot Enterprise administrators may need to enable access to the alternative models through their model policies.

Here's what you'll walk away with. A ranked list that covers the runtimes and libraries to patch first, the trust stores and certificates worth checking, and the Copilot model pins to replace. And at the bottom, the observability launches that can wait in the backlog a while. Because the question on your mind is probably a simple one. With a small team and a long queue, what do I touch first, and what can I safely leave alone? Every one of these items arrives sounding urgent. So which ones are actually on fire, and which ones only look that way?

Which brings us to the first item, and to the question I'll ask of every item in this episode: does it need someone's attention now, or can it wait? Sounding urgent costs nothing, which is why each item has to earn its place in the queue, and PHP is the first one put to that test. Start with PHP, because this one earns its urgency. On October twenty-first, twenty twenty-six, the PHP project released version eight point five point twelve. The project calls it a security release fixing two critical vulnerabilities that can allow unauthenticated remote code execution.

The project also put a banner across the top of its site. It reads, security advisory, critical remote code execution vulnerabilities, update now. So here's the answer to the question this chapter asks. Yes, a team running PHP should patch now. Treat it as an interrupt that jumps the queue, and give it one named owner until the last instance is done.

The fix covers more than one branch. The advisory lists four patched releases: eight point five point twelve, eight point four point twenty-seven, eight point three point thirty-six, and eight point two point thirty-five. It names two vulnerabilities. One involves out-of-memory corruption. The other involves stale internal state that a later request handled by the same worker may use.

On exposure, the advisory says the risk covers all PHP installations serving web requests, including PHP F P M, Apache with mod PHP, php CGI, FrankenPHP and LiteSpeed. The project considers the risk highest for mod PHP. There's a demonstrated exploit there, where an unauthenticated request can trigger the attack before any application code runs. The practical read: before you assume you're covered, open the advisory and check two things against it. One is your exact branch. The other is the way you actually serve requests. A mod PHP fleet on Apache goes to the very front of the line.

The project is blunt about workarounds. There are no complete mitigations, updating is the only safe choice. The advisory does list stopgaps. It says they reduce exposure to specific attack paths but do not make an installation safe. So here's a decision rule for the stopgaps. A config change can buy you a few hours while the rebuild runs. Never stop there, and keep the ticket open until the new version is live. A quick note on older branches. The project says PHP eight point one and older no longer receive updates from the PHP project, though some distributions and LTS vendors provide backported fixes. And PHP eight point two reaches end of life on December thirty-first, twenty twenty-six.

If anything you run sits on eight point one or older, ask your vendor whether a backport exists. If nobody can answer, that service's upgrade becomes the next piece of work. On eight point two, patch for now. Then get the move to a newer branch on the roadmap, with a date before the year runs out. Now the check itself. Start by listing every PHP version you run. Look in your container base images and on long-lived servers, and then add the CI runners. A runner that builds your images can quietly bake an old PHP into every new one.

Next, rebuild your base images on eight point five point twelve, or on the patched release for your branch, and redeploy. Then confirm with php dash v inside the running container. A green build tells you what you asked for. The running container tells you what you actually got. Patching a runtime is work your team controls from start to finish. The next item is the opposite case.

That was the runtime, the part of the stack you control end to end. This next item comes next because it sits underneath it: every connection a PHP service makes over TLS depends on trust stores, and the open question is who decides what they believe. Cloudflare's blog carried a short, blunt headline about it. Eight eMudhra certificates are compromised. Here's what you need to know. You'll notice I'm not reading out serial numbers or dates. That's deliberate. The practical read: before anyone blocks or replaces a certificate, get the exact identifiers from a primary notice and match on those, so nobody pulls the wrong thing in a hurry.

Start with the right question. Treat a compromised certificate in a public chain as a risk to anything that trusts it, whether or not your company ever bought a certificate from that authority. So the check belongs to every team. Where, in everything you run, is eMudhra still trusted? Split the problem in two. Browser trust is maintained by the browser vendors, and you can leave that side to them. The trust stores your own systems carry are yours, and they only change when your team changes them. That second half is where the work is.

Here's a check a team can run in an afternoon. Pull the certificate bundle out of every base image you build on, and search it for eMudhra. Then repeat that for any runtime that ships its own store, like a Java keystore. A patched host does nothing for a bundle that was copied into an image months ago. Pinning gets its own pass. If a mobile app or an internal client pins to anything in an eMudhra chain, changing that takes a release, and releases take time. Find those first, because they're the slowest thing to move.

Then ask your vendors one short question. Do any of your endpoints, or the clients you ship to us, chain to eMudhra or trust it? Get the answer in writing, with a date on it. If they can't answer, that tells you something about how they'd handle the next one. Keep watching the root programs run by browser and operating system vendors for any further revocation or distrust step, and name one person who owns that watch. Whatever those programs decide reaches the systems they update. The images you built and the clients you pinned move only when you rebuild them.

If you already run certificate transparency monitoring, add one filter. Look for certificates issued for your domains under an eMudhra chain, and treat any hit you can't explain as same-day work. Your team owns those domains, so this filter is cheap to keep running. One caution on reading that result. A clean transparency report covers what got logged. It tells you nothing about which of your trust stores still believe these certificates, so the earlier checks stand either way.

There's a trade-off in how hard you cut. Pulling eMudhra from your own stores right away closes the gap fast, but it can break a partner integration that still depends on it. A workable rule: remove it where you own both ends of the connection, and where you don't, talk to the other side before you flip it. Trust stores are one quiet place where code you didn't write decides what your services believe.

Certificates were about what your services believe from the outside. The same problem shows up one layer up, inside your own application, which is why this next item comes next: the library your Python services reach for when they open an image someone just uploaded. Here's the advisory. It's filed against Pillow, the Python imaging package, and the title doesn't soften anything: Argument Injection in Ghostscript call, potentially leading into RCE. RCE here means remote code execution.

When Pillow renders an EPS image, it calls Ghostscript and hands it the file's path. According to the advisory, Pillow doesn't check that path for a leading dash, which Ghostscript reads as an option instead of a filename. And Pillow's default safety setting, dash D SAFER, doesn't stop it. It goes further with a leading at sign, which is how Ghostscript reads extra arguments from another file. The advisory says that if the attacker can also control that referenced file, this can be escalated to arbitrary command execution. The reporter says they verified that escalation themselves.

The practical read: your exposure sits in the code paths where Pillow ends up passing EPS or PostScript content to Ghostscript. A service that only resizes photos it named itself is a much smaller worry than one that opens whatever arrives, under whatever name it arrived with. So start with an inventory. Search your lockfiles for pillow, then look inside your container images for a Ghostscript binary. Pillow with no Ghostscript beside it can wait a little. Pillow with Ghostscript in the same image goes to the top of the list.

For the ones at the top, you have two moves. Upgrade Pillow to the patched release, and take that version number straight from the advisory, never from memory. Or, if the service never needed Ghostscript, remove it from the image. A binary that isn't installed can't be handed a bad argument, and that protection outlives this one advisory. One detail changes how you triage this. The advisory says the flaw is triggered by the filename, so a completely benign EPS file can still set it off when the name passed in is attacker-influenced. It also says the usual guidance to block untrusted EPS input does not cover this.

On whether that's realistic, the advisory points to file upload endpoints that preserve or derive the stored name from user input. The reporter tested on Pillow version twelve point three point zero, then listed as the latest, and wrote that the vulnerable code appears to affect all current versions.

That makes the second check about your upload endpoints. For each one that accepts images from users, ask whether it restricts which formats it will open, and whether any piece of the user's original filename survives into the path handed to Pillow. An allowlist of formats is cheap defense in depth. Storing uploads under names your own code generates takes the filename out of the attacker's hands. A rule for the triage meeting: if a service takes uploads from users and ships Ghostscript, treat it as urgent until someone can show which formats it opens and where its filenames come from.

The Pillow and Ghostscript rule is about code that runs in production. This next item moves away from production, to the tools your engineers write code with, and it comes next because it asks a similar question in a different form: do you know exactly which models your tools use, and who notices when one of them is retired? Here's what changed. On October nineteenth, twenty twenty-six, GitHub deprecated six models across most Copilot experiences. That includes Copilot Chat, inline edits, ask and agent modes, and code completions.

The six retired models are Gemini three point seven Flash, GPT five point five and GPT five point four. Add GPT five point four mini, GPT five mini, and Grok four point five. GitHub suggests a replacement for each one. Gemini three point seven Flash moves to Gemini three point eight Flash. GPT five point five and GPT five point four both map to GPT six point one Sol. The two mini models, GPT five point four mini and GPT five mini, both map to GPT six Luna. And Grok four point five gives way to Grok four point seven.

For a platform team, that table is a starting point. If someone picked a mini model on purpose, for cost or for speed, treat its replacement as a choice to test. Give it a short trial on real work before it becomes everyone's default. None of this was a surprise. GitHub first announced these deprecations on September eighteenth, twenty twenty-six. There's an admin step, though. GitHub says Copilot Enterprise administrators may need to enable access to the alternative models through their model policies. Once that's enabled, the model shows up in the Copilot Chat model selector, in VS Code and on the GitHub website. GitHub also says no action is required to remove the deprecated models.

So the cleanup takes care of itself, and the work sits on the side of turning things on. If nobody enables the replacements, people may open the picker and find fewer choices than they had. And ask what a script that names an old model by hand does now. Better to get that answer from a search than from a failed run. Here's a check that fits in one afternoon. Search your workflows and agent configs for any of the six retired names, and include the integrations that call Copilot from somewhere else. Then have an admin confirm the policy is on for each new model your teams plan to use.

One trade-off to weigh. Pinning a model name in an agent config gives you repeatable behavior, but every retirement then becomes an edit someone has to make. A team can keep those names in one shared place, so the next swap is a single change. On the same date, October nineteenth, GitHub's changelog also posted an improvement titled Copilot model policy API for enterprise, orgs, and teams. The practical read: if you manage several orgs, look at that API before the next model change. If it fits how you work, turning a model on can become a reviewed change in code, so nobody has to remember a click in settings.

A rule worth keeping. When a model retires, whoever owns your AI tooling checks two things within days. Did every hard-coded name get swapped? Is the replacement switched on for the people who need it? Put it on the same list as any other dependency upgrade.

After the Copilot model changes we're back to security, and this next item comes next because it tests a different habit: knowing whether a problem applies to you when no scanner will say so. It's CVE twenty twenty-six, two zero zero four three, and the only question that matters for a busy team is whether it affects anything you actually run. Here's what the advisory actually says. It was published to the GitHub Advisory Database. Its description credits the Cisco owned open source Snort three engineering team with a comprehensive internal security review. That review led to software hardening releases that address multiple vulnerabilities the team found internally.

The vulnerabilities tracked under this CVE involve out of bounds writes. That means the software writes data past the end of a buffer, or before its beginning. On the advisory page, the package field reads no package listed. GitHub also states plainly that Dependabot alerts are not supported on this advisory. The reason it gives is that there's no package from a supported ecosystem with an affected and fixed version.

So, does it touch anything you run? The practical read is narrow. If Snort three sits anywhere in your estate, on a network sensor or baked into a container image, treat this one as yours until someone shows otherwise. If nobody can answer that in a few minutes, that gap is your first finding. For a platform team, that means a manual check, and it can start right away. Search your software bill of materials and your image manifests for Snort by name. Then ask whoever runs your network security tooling which version is actually deployed.

Don't read a quiet Dependabot as a clean result on this one. A package-based scanner may stay quiet for a similar reason, so before you lean on yours, confirm it has indexed this advisory at all. Until then, an empty report means nobody looked. The trade-off is small. A manual search costs someone an hour or so, which is cheap next to finding out later that a sensor you forgot about was in scope. Here's a decision rule. When an advisory lists no package, it goes to a named owner instead of waiting in the scanner queue. That owner reads the vendor's own write-up to find the release that fixes it, and the upgrade gets a date on the normal schedule.

That settles the Cisco advisory, and with it the security items, which is why everything from here on is a launch rather than a fire. Azure Monitor comes next, and the question for each launch is the same one: does it change what your team does, or only what it reads? Microsoft's Azure updates feed lists advanced platform metrics for Azure Monitor as launched, under the label generally available, dated October twentieth, twenty twenty-six. Microsoft defines that launched stage on the same page. In its own words, it means a fully released, production-ready product available to all Azure customers.

The preview stage gets its own definition there too. Available to all Azure customers for non-production use and testing. The practical read: production-ready is the phrase to hold the vendor to. For a platform team, that means these metrics can sit behind a paging alert, and when someone in a design review asks whether that's safe, you can point to Microsoft's own stage definition. What a stage label doesn't settle is scope, pricing or regions. Treat all of that as unknown until you've read the full update and the Azure Monitor documentation, and keep what you learn written down right next to the alert that relies on it.

Here's a decision rule. Before a paging alert depends on one of these metrics, someone confirms the exact metric name and how it's billed. Then they check that it's offered in every region your workloads actually run in. Whatever stage your team first met these metrics in, check that the names and the billing still match what your alerts expect. Plan for a mismatch. An alert that has never fired is unproven, so fire it once on purpose and watch it arrive.

The trade-off is a little time against a quiet failure. Here's a made-up example. A hypothetical team points its CPU alert at a metric name that doesn't match, nothing ever pages, and the silence reads as health right up until the night it matters. One more question to ask your team. Which dashboards and runbooks would change if these metrics replaced what you use now? If the answer is none, there's no rush. If it's several, sequence the move instead of doing it all at once. Checking a handful of metrics against the docs is small work. Ask who owns that check, and put it on the calendar instead of waiting for the next incident to raise it.

Azure Monitor metrics tell you that something is off. Knowing what depends on what is the harder part at three in the morning, so the next question is whether Grafana's Knowledge Graph helps with that, and whether it changes on-call work. Grafana used ObservabilityCON twenty twenty-six to expand what it calls the Knowledge Graph. The company describes it as the runtime context layer in Grafana Cloud, a single connected view of your components and how they relate, with health insights on top.

The expansion goes two ways. The first is coverage, with more infrastructure and applications, along with user-facing signals. The second is operational context, meaning your service catalog and the teams on call, plus lessons captured during past incidents. Grafana is explicit about who this is for. It says these connections give people and AI agents the same shared context, and it claims that helps them troubleshoot and find root causes faster. The pieces are at different stages. Grafana lists the service catalog integration and the incident lessons as private preview, while the graph as runtime context for AI agents is generally available.

So does it change on-call work? The practical read: a context graph is only as good as what you feed it. If your service catalog is stale, an agent can follow that stale ownership with full confidence and send your responders to the wrong team. Before you switch on agent-driven investigation, run a short audit. Take the services that page you most and check that each one has a named owner and a rotation that matches who is really on call. Then open the runbooks they link to and ask when anyone last changed them.

Here's a decision rule a team can use. If more than about one in five of those services fails the check, fix the catalog first and keep any agent in a suggest-only role. If they pass, let the agent draft the opening steps of an investigation while a human owns every action. Here's a made-up example of a quick test. Pick one recent alert and ask the graph who owns the failing service. If the answer points to someone who left the team months ago, you've found your first task. Treat a past incident as a lead to check against current data, and verify it before acting on it. Whatever tool you pick, the habit of writing down what was tried and ruled out, and what finally worked, pays off by itself.

The trade-off is setup effort now against minutes saved at the start of every incident. A sensible pace is to pilot what is generally available and treat anything in preview as an evaluation, with a way out if the data turns out thinner than you hoped. Ownership data is the quiet dependency under all of it.

That's the full list, from PHP to the Knowledge Graph, and the thread through all of it is ownership, because for every item the fix starts when someone is named who checks it. Which brings us to the number of the week, and to what a team should watch next. Number of the week: eight. Cloudflare's write-up says eight eMudhra certificates are compromised. Eight sounds small. The practical read is that trust in a certificate authority is shared, so this lands on every team, and not only on teams that bought certificates from eMudhra. Check your trust stores, your pinned certificates, and any client that bundles its own roots.

Here's the order worth working them in, which is deliberately not the order we covered them. PHP first, then Pillow and Ghostscript, then certificate exposure, then the Cisco advisory once someone owns finding out whether it applies, and the Copilot model repin last. The rule behind it: the shorter the path from the open internet to running someone else's code, the earlier the fix goes.

On PHP, the project says versions eight point five point twelve, eight point four point twenty-seven, eight point three point thirty-six and eight point two point thirty-five fix two critical vulnerabilities that can allow unauthenticated remote code execution. It adds that there are no complete mitigations, and updating is the only safe choice. On Pillow, the GitHub advisory describes argument injection in a Ghostscript call, potentially leading into remote code execution.

On Copilot, GitHub says it has deprecated a set of models across most Copilot experiences. Its suggested alternatives include GPT six point one Sol, GPT six Luna, Gemini three point eight Flash and Grok four point seven, and Copilot Enterprise administrators may need to enable them through their model policies. For a platform team, the repin is a good moment to write down which models are allowed and who approves a new one, so the next retirement turns into a small config change. Now, what to watch. On certificates, ask each trust store you depend on, browsers and operating systems plus the base images in your containers, where it stands on eMudhra, and note the answer in your inventory.

On PHP, the project says its linked advisories have the full technical details. Read them, list the CVE identifiers, and match them against what your distribution or long-term support vendor actually shipped. A package version on its own won't tell you. And on Copilot, GitHub's changelog points to a Copilot model policy API for enterprise, orgs, and teams. That one is worth a look, because a model policy kept in code can be reviewed and rolled back like the rest of your platform.

So, to carry out of this recap. Patch PHP to eight point five point twelve or your branch's fixed release, and upgrade Pillow now. Check your trust stores and pinning for eMudhra, because eight compromised certificates is a shared trust problem. And swap the retired Copilot models for their suggested alternatives, with the policies switched on. Four different items, one thread: for each of them, the fix starts when a single person is named who checks that it actually landed.

In the next episode, we pick up three threads. What comes next for PHP after these fixes. Where browser and operating system root programs stand on eMudhra. And a first look at managing Copilot model policies through the new API. If you'd like that one when it lands, you can follow the show at theplatformradar dot com. Thanks for spending the drive or the workout with me. See you Tuesday.