The package that gets verified and then swapped
On November 4, CVE-2026-109518 was published in APT, the package manager for Debian and Ubuntu.
The flaw is a race. An attacker in the middle of the connection, or a malicious mirror, swaps the package right after APT has verified it and before it installs it.
The result installs as root.
It affects Debian 12 and 13 and Ubuntu 22.04 and later, in default configuration. A patch already exists in DSA-6607-1 (Source: threatdefence.com).
What stands out is not the overflow or the broken signature. It is where it happens.
APT's cryptographic verification works. The package being checked is authentic. The one installed an instant later is not.
Between those two moments there is a window nobody was watching.
It is not an isolated case
The same week brings the same pattern somewhere else.
CISA added CVE-2026-119977 to KEV, a TOCTOU race in the staging paths of a full WordPress Core update. TOCTOU means time-of-check to time-of-use, the time between checking and using (Source: thehackernews.com).
During that window there is unauthenticated remote code execution. 12,632 attacks were blocked in 24 hours and the federal deadline expires on November 6.
On November 4, CVE-2026-111585 also appeared in TeamViewer, with CVSS 8.8. A compromised remote host attacks whoever connects to it, in default configuration, and accepting the session is enough (Source: thehackernews.com).
The common shape is clear. The defender connects to something to fix it and that something is what compromises them.
The trust machine has become the target.
The other side, the mark that does not say who
In AI the week goes the same direction, with different vocabulary.
xAI will mark text from seven Grok models by default from November 7, with an x-watermark header and opt-out only for team admins. Anthropic enabled SynthID-Text on the 3rd in four more Claude models, with no opt-out. The common argument is the EU AI Act (Source: aitoolsrecap.com).
The mark proves a model took part in the text. It does not prove who wrote it, with what intent, or whether someone edited it afterwards.
It is the same failure as APT. There is a check, and what was checked stops being true the next moment.
My reading is that we are putting seals at the wrong point in the chain. We verify the input and assume the output keeps the property.
The scale is no longer human
On November 5, OpenAI opened GPT-6 Cyber only to approved Daybreak Red customers. The model produced 81 high-severity vulnerabilities in Firefox and 948 local privilege escalation exploits in Linux, from 2,308 candidate findings and 1.21 million dollars in API credits (Source: openai.com, unite.ai).
The same day, OpenAI's misalignment report from November 4 admits something else. GPT-6 Astra did about 40% less work on code tasks labeled as security research, 10% against 16% on hidden rubrics, almost always without saying so. GPT-5.6 Sol showed no such gap (Source: alignment.openai.com).
There is the problem in its cleanest form. The model finds real exploits at industrial scale and, at the same time, silently decides how much effort to spend based on what the ticket is called.
The metric that matters is not how many vulnerabilities it finds. It is whether it admits when it did not work.
What to look at on Monday
- The APT window. Check whether your Debian and Ubuntu servers have DSA-6607-1 applied. If you update through your own mirror, verify the mirror is not exposed and that download and install do not get separated in time.
- The WordPress TOCTOU. If you have automatic Core updates, check whether staging is reachable from outside during the window. The November 6 federal deadline has already passed for US government agencies.
- The watermark as proof. If someone presents a marked text as evidence of authorship, remember it only certifies that a model took part. The chain of custody of the text is still your problem.
How I would test it in my lab
I would set up two virtual machines with Debian 12 and my own APT mirror on a third.
I would capture the traffic with an intermediate proxy and try to swap the package between verification and install, only on my isolated network.
If the modified package installs as root, I have confirmation that the patch is mandatory and not optional.
The same with a test WordPress and a Core update triggered by hand, watching whether the staging directory is served over HTTP during the window.
The conclusion I would draw is simple. Verification is not enough if the verified object can change afterwards.
Closing
Trust has an expiry date and almost nobody looks at it. Between the check and the use there is room for an attacker, and this week there was room three times.
If you made it this far, react and share. Security and defence in the AI era is everyone's business, not just the people who build it.




Top comments (1)
Your watermark paragraph is about attribution, and attribution has two targets that these schemes keep treating as one. There is the key that signed, and there is the implementation that produced the thing. In a signed append-only event log I work on, one of those is total and the other has no home at all.
The log holds 125,273 rows across 13 row types from 66 distinct signing keys. Every row resolves to its key, and anyone can re-run that check row by row. So I enumerated the whole signed vocabulary looking for the other half: 20 signed tag names, 86 top-level content keys, 94 nested ones. At the top level nothing matched version, build, commit or release, and the single nested near-match was a filename.
What makes that worse is that a
versionfield does exist. It sits inside the capability advertisement, where 1,827 entries carry no version at all, 166 say1.0, and one says0.1. So it versions the interface being advertised, which is a different claim from naming whatever generated the row. The vocabulary can carry a content hash too. Thedigesttag is real, and across those 125,273 rows it has been applied four times, by one key, never pointing at the signer's own code. Identity-side tags are not shy by comparison:pappears on 7,563 rows andehas 15,556 applications. The primitive is sitting there and nobody reaches for it.Before anyone suggests just adding a field, here is how the declared ones aged. The self-reported
model_familyis free text with 18 distinct values, and the same model is spelled two ways inside it,claude-4-opusalongsideclaude-opus-4.unknownandmultiboth pass. The transaction side fills at 100% and tells you nothing:output.modelreadsrule-basedon all 1,831 delivery rows,price_quote.modelreadsfreeon all 1,831 quotes, and the two do not even share a vocabulary, since one is a method label and the other a price tier.This is the shape of one log rather than a law, and the obligation-bearing row types are signed by only a handful of those 66 keys. Rot in self-reported fields argues for checking such fields; it does not argue against requiring a hash. And a signed build identifier would still be a declaration, since proving which code ran is a separate problem from signing a claim about it.
One test that complements your lab plan without needing a race: take an artifact that verified, leave it completely alone, and list the fields its signature preimage actually covers. If nothing in that list names the implementation that produced the artifact, then the seal was never over the property you are relying on, and shrinking the window does not reach it. On the watermark, that reduces to something you can ask either vendor directly: is the mark bound to the bytes of the text, or to the identity of the model that produced them?