For thirteen days, PaperCut's emergency builds reported the same version number as the unpatched releases they were based on. Updated, remediated, and clean are three different states, and most vulnerability programs report them as one.

For two weeks starting on August 27, 2026, a PaperCut administrator could not answer the question "is this server patched" by looking at its version number. The emergency builds PaperCut shipped during the incident reported the same version as the unpatched releases they were based on. The numbered builds that the CVE records had been naming as the fix since August 28 did not exist until September 10.
The incident itself has been covered well. Huntress documented the pre-auth RCE chain and the activity on compromised hosts. GreyNoise tracked a campaign against internet-facing servers. PaperCut's co-founder and CEO published an unusually frank account of the response.
Less attention went to the part that decides whether any of the patching worked. Updated, remediated, and clean are three different states. Most vulnerability management programs measure the first, report it as the second, and never test for the third. The gap between the first two is where patch management and vulnerability management get conflated.
PaperCut is a useful case because it broke at all three layers inside two weeks, and because none of the breaks were anybody's fault in particular.
PaperCut NG and PaperCut MF are on-premises print management platforms. PaperCut's site reports over 100 million users at over 70,000 organizations. These servers sit in the middle of a print estate, commonly hold directory credentials, and accept inbound connections from workstations across the building.
The vendor's timeline, in Australian Eastern Standard Time, which is how PaperCut published it:
| Date (AEST) | Event |
|---|---|
| August 26 | Huntress records its earliest observed exploitation: a limited incident lasting under two minutes. |
| August 27, 9:42 a.m. | An education-sector customer reports the first incident to PaperCut. A P0 is declared by midday. A second victim reports at 5:05 p.m. |
| August 27 | PaperCut publishes an urgent security advisory for PaperCut NG and MF, advising an immediate patch and restricting web access to trusted IP addresses. |
| August 28, 2:10 a.m. | Emergency Patch Release 1 for the v25 and v26 branches. |
| August 28 | Huntress publishes its analysis of the pre-auth RCE chain. CVE-2026-81578 and CVE-2026-82078 are published. |
| August 28, 8:42 p.m. | Emergency Patch Release 2. The v24 build follows at 10:08 p.m. |
| August 31 | CISA adds both CVEs to the Known Exploited Vulnerabilities catalog. |
| September 1, 6:22 p.m. | Emergency Patch Release 3. |
| September 1 | PaperCut's CEO publishes the incident retrospective. |
| September 9 | GreyNoise reports an orchestrated campaign against PaperCut NG and MF. |
| September 10, 2:00 p.m. | A Regular Maintenance Release ships: full QA, published release notes, new version numbers, superseding all three emergency patches. |
Two things in that table matter more than the rest. A customer reported an incident before the advisory existed. And the release that finally carried the version numbers the CVE records had been citing as "fixed" landed thirteen days after those records published.
Emergency patching a production print server once is hard. Someone has to find the change window, send the maintenance notice, and be there when the service does not come back cleanly. Doing it four times in two weeks is a different kind of problem.
The deeper issue is that during those two weeks, "updated" was not observable. PaperCut's emergency patch builds reported the same version number as the unpatched release they were based on. A server patched within hours of Release 1 and a server nobody had touched returned the same version string to any tool that asked. PaperCut added build numbers to the emergency patch downloads on September 1, so a pipeline keyed on the build number could tell the two apart from day five. A pipeline keyed on the version string was blind for thirteen days.
The vendor did the pragmatic thing. Shipping a fix in hours is worth more than shipping a fix with clean version metadata in a week. But the cost landed on the people who had to prove the fix was in place.
Meanwhile the rest of the queue did not pause. Between August 28 and September 9, another 2,522 CVEs published with a CVSS score of 7.5 or higher on whichever scale they carried.
| Window | Published at 7.5 or higher | Published with no score | Of those, on KEV by September 15 |
|---|---|---|---|
| August 28 to September 1 | 776 | 79 | 5, including the two PaperCut CVEs |
| September 2 to September 9 | 1,746 | 215 | 9 |
| Total | 2,522 | 294 | 14, or 12 excluding PaperCut |
The KEV column covers CVEs that published in the window, whenever CISA added them. CISA also added older CVEs to KEV over the same days, and the count leaves those out because they published before August 28. The twelve in-window CVEs with no connection to PaperCut:
| CVE | Product | Score | Added to KEV |
|---|---|---|---|
| CVE-2026-82329 | JFrog Artifactory | 9.8 (CVSS v3.1, vendor) | September 2 |
| CVE-2026-83548 | SonicWall SMA1000 | 10.0 (CVSS v3.1, CISA-ADP) | September 2 |
| CVE-2026-83549 | SonicWall SMA1000 | 7.8 (CVSS v3.1, CISA-ADP) | September 2 |
| CVE-2026-85046 | Google Chromium V8 | 8.8 (CVSS v3.1, CISA-ADP) | September 4 |
| CVE-2026-86218 | N-able N-central | 10.0 (CVSS v4, vendor), 9.8 (CVSS v3.1, NVD) | September 8 |
| CVE-2026-75650 | Adobe Commerce and Magento | 10.0 (CVSS v3.1, vendor) | September 8 |
| CVE-2026-81963 | Microsoft Windows | 7.8 (CVSS v3.1, vendor) | September 8 |
| CVE-2026-85880 | Microsoft Windows | 7.8 (CVSS v3.1, vendor) | September 8 |
| CVE-2026-87491 | Google Chromium V8 | 8.8 (CVSS v3.1, CISA-ADP) | September 9 |
| CVE-2026-67277 | MikroTik RouterOS | 8.8 (CVSS v4, CERT Polska), 8.2 (CVSS v3.1, NVD) | September 10 |
| CVE-2026-86060 | MikroTik RouterOS | 9.2 (CVSS v4, CERT Polska), 9.8 (CVSS v3.1, NVD) | September 10 |
| CVE-2026-84869 | ConnectWise ScreenConnect | 9.9 (CVSS v3.1, vendor) | September 11 |
Note the no-score column in the previous table. In the September 2 to September 9 window, 215 records still carried no CVSS score at all six days after the window closed. A program that triages on severity has no input for those until somebody enriches them, and enrichment is the step that has been degrading fastest. That degradation is why CVEs now function as a trailing indicator rather than an early warning.
Remediation means the vulnerable condition is gone and you can prove it. Proof needs a fixed-version boundary you can trust. For these two CVEs, three separate sources give three different answers.
Here is the affected block as both records published it on August 28, identical in each. The cvelistV5 repository still holds that version at its September 1 commit (CVE-2026-81578, CVE-2026-82078):
"affected": [
{
"vendor": "PaperCut",
"product": "PaperCut MF/NG",
"versions": [
{
"status": "affected",
"version": "0",
"lessThan": "24.1.10, 25.0.13, 26.0.5",
"versionType": "semver"
}
],
"defaultStatus": "unaffected"
}
]The lessThan field holds a single version. This one holds three, comma-separated, declared as semver. There is no semantic version equal to "24.1.10, 25.0.13, 26.0.5". PaperCut maintains three supported branches and the fix landed in each, which is a reasonable thing to communicate and the wrong field to communicate it in. The CVE v5 schema expects one range entry per branch.
Running both records through cvelint, an open-source validator for CVE v5 JSON records written by Martin Prpič, returns the same two findings on each:
E007 Version "0" does not match expected format for type "semver"
(at "containers.cna.affected.0.versions.0.version")
E007 Invalid lessThan version string: "24.1.10, 25.0.13, 26.0.5"
(at "containers.cna.affected.0.versions.0.lessThan")PaperCut corrected both records on September 13, sixteen days after publication. The affected block now carries three range entries, one per branch, and each lessThan holds a single version. NVD's derived ranges did not follow.
This is where the malformed field stops being a data-hygiene footnote. NVD built CPE applicability ranges for both CVEs using versionEndExcluding values of 24.1.9, 25.0.12, and 26.0.4, for both papercut_mf and papercut_ng.
Those are the releases immediately before the fixes. A tool that takes NVD's CPE ranges as written marks a server running 25.0.12 as not affected. 25.0.12 is vulnerable. The fix is 25.0.13. NVD modified both records again on September 14, after PaperCut's correction, and kept the short ranges.
A dashboard that goes green on that comparison has proven one thing: a string comparison succeeded against a range somebody derived from a field that could not be parsed.
The CVE record for CVE-2026-81578 assigns CWE-305, Authentication Bypass by Primary Weakness. PaperCut's own security bulletin classifies the same flaw as CWE-306, Missing Authentication for Critical Function. CISA's KEV entry follows the vendor and titles it as missing authentication.
The severity does not agree either. CVE-2026-81578 scores 8.8 on CVSS v4, assigned by PaperCut, which is high. NVD assigned it 9.8 on CVSS v3.1, which is critical. PaperCut published no v3 score. Whether this CVE is classified as critical depends entirely on which scale your tooling reads.
| Field | CVE-2026-81578 | CVE-2026-82078 |
|---|---|---|
| Title | PaperCut MF/NG: Authentication Bypass | PaperCut MF/NG: Unsafe Dynamic Class Loading in Database Connector |
| CWE | CWE-305 in the CVE record. CWE-306 in the vendor bulletin and CISA KEV. | CWE-470: Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection') |
| CVSS v4 (vendor) | 8.8, high | 9.4, critical |
| CVSS v3.1 (NVD) | 9.8, critical | 9.1, critical |
| Fixed in (vendor) | 24.1.10, 25.0.13, 26.0.5 | 24.1.10, 25.0.13, 26.0.5 |
| Fixed in, per NVD CPE ranges | 24.1.9, 25.0.12, 26.0.4 | 24.1.9, 25.0.12, 26.0.4 |
| Published | August 28, 2026 | August 28, 2026 |
| Added to CISA KEV | August 31, 2026 | August 31, 2026 |
Common enough to be a property of the corpus rather than a PaperCut mistake. Spektion ran cvelint v0.7.0 across every published 2026 record in the CVE Project cvelistV5 release bundle of September 15, 2026, with the 858 rejected records set aside.
| Rule | Flagged category | Distinct records |
|---|---|---|
| E007 | Invalid version strings | 33,015 |
| E011 | Use of custom version type | 15,280 |
| E019 | Timeline field requirements | 8,478 |
| E016 | English-description requirements | 5,371 |
| E008 | Invalid vendor values | 2,244 |
| E009 | Invalid product values | 1,559 |
| E006 | Missing affected or unknown product | 473 |
| E010 | Unnecessary self-reference URLs | 260 |
| E002 | Duplicate reference URLs | 10 |
| E020 | Unicode escape sequences in descriptions | 3 |
| Total scanned | 57,032 published records | 51,202 with at least one finding, or 89.78% |
Two caveats keep this honest. A lint finding is not automatically a schema violation, and E007 in particular also fires on the benign use of "0" rather than "0.0.0.0" in a version field, which is nothing like the PaperCut defect. Separating the two: 7,255 of the 33,015 records trip E007 on nothing but that bare zero, and 25,760 carry some other version string the rule cannot parse. Read the table as a statement about where the corpus is noisiest, version metadata, rather than as 33,015 broken records. That noise makes version-based remediation proof the least reliable form of proof on offer.
This is a different failure from the one Spektion Research documented in its September pull on CPE coverage, where the problem was records carrying no CPE at all. Here the field exists and is populated. It does not mean what a parser assumes. Both failures land on the same team.
Clean is the question a patch cannot answer. A patch changes the server from the moment it lands. It says nothing about what happened on that server before.
For PaperCut, "before" was real time. A customer reported the first incident to PaperCut at 9:42 a.m. AEST on August 27. Emergency Patch Release 1 shipped for the v25 and v26 branches at 2:10 a.m. on August 28, and the v24 build followed at 10:08 p.m. that night. By Spektion's arithmetic from the vendor's own timestamps, that is about 16 hours from first report to first fix on v25 and v26, and about 36 hours on v24. Huntress documented a v24.1.5 server exploited before Emergency Patch Release 2 was publicly available. Version 23 and earlier received no patch at all.
PaperCut's bulletin lists what investigators found on affected servers:
whoami, tasklist, quser, and nltest /dclist:server.logace.exe, and an AnyDesk downloadThat last item decides the argument. Upgrading PaperCut replaces PaperCut's code. It does not uninstall a Windows service someone else installed, and a remote access tool set to start on boot survives every release the vendor ships.
The vendor is explicit that its list is not a clearance test. The bulletin says the absence of its indicators "is not confirmation that a system has not been affected," and it warns that attackers may clean up the files it lists. For a server that may be compromised, its guidance is a full wipe and rebuild, restored from a backup taken before any suspicious behavior. Huntress adds the operational warning: preserve evidence before an upgrade or restart changes it.
GreyNoise's campaign analysis shows what that kind of access turns into. Across at least 440 PaperCut instances at 395 victim organizations, the actor harvested credentials, dropped a Ligolo tunnel agent for persistent access, and reached domain administrator at 12 organizations, dumping each domain's credential store with DCSync. That campaign began August 31, so it describes what access became, not a compromise that outlived a patch. A server that was entered and then patched carries the same exposure until someone looks.
Most organizations will not wipe and rebuild every PaperCut server on suspicion alone. The practical question is which hosts to open first, and the runtime dimensions answer it. Spektion's sensor grades software on those dimensions as it executes:
On a PaperCut application server, that evidence is a short record covering the two weeks: whether the application service executed, which account it ran under, whether its web interface held a listening socket reachable from outside the trusted range, and what that account could reach. Spektion matches PaperCut builds against the same catalog every scanner uses, so for those thirteen days its match, like everyone's, could not separate a patched build from an unpatched one. Patch verification stays with the patch tool. The runtime evidence changes the order of the queue, and the reason for each position travels with the finding. A server that ran the service as a domain administrator behind an internet-facing interface ranks above one where the service never started, and that ranking holds whether or not the version string can be trusted.
The same evidence feeds the controls that hold a host while the patch is in flight: OS configuration changes that cut the service's privilege and network reach, and detection rules for the SIEM or EDR built from the PaperCut process's observed behavior, so an exploitation attempt registers at the first stage of the chain instead of after the remote access tool is installed. Each control ships with steps to verify it took, which for two weeks was the one state on a PaperCut server a team could check.
| State | The claim | What it depends on | How PaperCut broke it |
|---|---|---|---|
| Updated | The current vendor-recommended build is installed. | Patch tooling plus a version number that changes when the software does. | The emergency builds reported the version of the unpatched release they were based on. For thirteen days the version number could not distinguish patched from unpatched. |
| Remediated | The vulnerable condition is gone and you can show your work. | A fixed-version boundary you can trust or a verified mitigation, and a parser that reads it correctly. | The CVE record put three versions in a semver field. NVD resolved it one release short, so tools reading NVD mark vulnerable builds as fixed. |
| Clean | An investigation proportionate to the exposure found no evidence of compromise. | Evidence from the exposure window: what executed on the server, at what privilege, and what changed. | Exploitation preceded the first patch. The vendor's own indicators include a remote access service set to start on boot, and the vendor says missing indicators do not rule out compromise. |
Three things a team can carry into the next incident:
By September 15, the cvelistV5 tree held 57,032 published records with 2026 identifiers, against 43,480 for all of 2025 and 38,454 for 2024. The share carrying at least one cvelint finding did not move with the volume: 91.1% in 2024, 91.2% in 2025, and 89.8% so far in 2026. Scores arrive late, or in two incompatible versions, or not at all, and the affected-product data is no cleaner at 57,000 records than it was at 38,000.
None of that makes the CVE catalog the enemy. Spektion matches against the same catalog every scanner does. The catalog is an input. The failure is treating it as the only input, then reporting a version comparison as if it were evidence.
PaperCut is the ordinary version of this. A vendor caught an active exploitation campaign, shipped a fix in hours, and wrote honestly about it afterward. The records still went out with a field no parser could read. NVD still resolved the fix one release short. The version number still stopped meaning anything for thirteen days. And a server that took every release on time could still be running a remote access service installed before the first one.
A patch report tells you what is installed. Knowing what the software did on the endpoint during the window, at what privilege, and with what exposure, is what tells you which hosts to open first. That is the job runtime exposure management exists to do.
Three of the figures above come from runs a reader can repeat. The CVE window table queries the NVD API 2.0 for records published August 28 to September 9, 2026, pulled September 15, 2026, at 3:29 p.m. CT. A record counts at 7.5 or higher on the highest CVSS score it carries, any version, any source, and the KEV column checks each record against the CISA KEV catalog, version 2026.09.14. The cvelint tables run cvelint v0.7.0 over the cves/2024, cves/2025, and cves/2026 trees of the cvelistV5 release bundle cve_2026-09-15_2000Z, with records in the REJECTED state set aside. Counts are distinct records with at least one finding per rule; a record with findings under several rules appears under each, so the rule rows exceed the total. The two PaperCut records are quoted from the repository as they stood at the September 1 commit linked above.
go install github.com/mprpic/cvelint/cmd/cvelint@v0.7.0
cvelint -format json cvelistV5/cves/2026 > cvelint_2026.json
curl "https://services.nvd.nist.gov/rest/json/cves/2.0?pubStartDate=2026-08-28T00:00:00.000&pubEndDate=2026-09-09T23:59:59.999&resultsPerPage=2000"Many exploitable weaknesses never get a CVE. Book a runtime exposure assessment and Spektion will show what's actually exploitable across your endpoints.