PTC Windchill & FlexPLM — CVE-2026-12569

Unauthenticated deserialization of untrusted data in the Windchill PDMLink component → remote code execution → persistent JSP web shells for command execution and data exfiltration · KEV-listed 2026-06-25
Threat
CVE-2026-12569 (Windchill RCE)
Severity
CVSS 9.3 · EXPLOITED ITW · KEV
Type
Web-facing PLM app / Java deserialization RCE
Access
Unauthenticated, remote
Version
v0.2 (Draft)
Author
HuntPack
Confidence
High
01

Executive Summary

CVE-2026-12569 (CVSS 9.3) is an unsafe-deserialization of untrusted data flaw in the web-based Windchill PDMLink product-data-management component of PTC Windchill (and the FlexPLM product built on it). An unauthenticated, remote attacker who sends a crafted request to the Windchill web tier triggers deserialization of an attacker-controlled Java object gadget chain, resulting in arbitrary code execution in the context of the Windchill / Tomcat application-server service account. This is the first PTC product ever added to the CISA KEV catalog.

PTC alerted customers with mitigation guidance on June 17 2026 (advisory CS473270), released patches on June 19, and CISA added the flaw to the KEV catalog on June 25 2026 with a federal remediation deadline of June 28. Fixed/target releases are Windchill 13.1.1, 13.0.2, 12.1.2, 12.0.2, 11.2.1, 11.1 M020, and 11.0 M030 (and the corresponding FlexPLM builds). Post-exploitation, attackers deploy persistent JSP web shells that grant remote command execution and data exfiltration — public reporting notes web shells named with 16 lowercase hex characters, so defenders should hunt web/access logs for requests to /Windchill/login/[0-9a-f]{16}.jsp (The Hacker News).

Windchill holds an organization's most sensitive engineering IP — CAD, BOMs, manufacturing specs — so RCE on the PLM tier is a direct data-theft and supply-chain-integrity risk. Because the flaw is pre-auth and the app tier is often internet- or partner-reachable, exposure is high wherever the fix has not landed. The highest-value defensive angles are two: (1) the web-shell artifact — the 16-hex .jsp file and any request to it; and (2) the process anomaly — the Windchill/Tomcat java service spawning a shell or LOLBin, which no legitimate PLM workflow does.

Defender priority: Patch to the fixed release for your branch now (13.1.1 / 13.0.2 / 12.1.2 / 12.0.2 / 11.2.1 / 11.1 M020 / 11.0 M030). In parallel, hunt every Windchill host's web/access logs for /Windchill/login/<16-hex>.jsp and Falcon process telemetry for the java/Tomcat service spawning cmd.exe/powershell.exe/sh. Treat any hit as a compromise until proven otherwise — patching does not remove an already-planted web shell.

02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry Fwd
1PTC advisory CS473270 / Trust CenterDeserialization RCE in Windchill PDMLink & FlexPLM; June 17 alert, June 19 patches; fixed releases + IOCs publishedyes
1CISA KEV (added 2026-06-25)Confirmed exploited in the wild; federal deadline 2026-06-28; first-ever PTC KEV entryyes
2The Hacker NewsJSP web shells; 16-lowercase-hex naming; hunt POST to /Windchill/login/[0-9a-f]{16}.jspyes
2CSO OnlineCVSS 9.3; PDMLink component; fixed versions 13.1.1/13.0.2/12.1.2/12.0.2/11.2.1/11.1 M020/11.0 M030; June 17/19/25 timelineyes
2threat-modeling.com / SecurityWeek / Help Net Security / Field EffectUnauthenticated RCE; persistent web shells for command exec & exfil; check for unexpected child processes of the Windchill/CPS service accountpartial

PTC published IOCs alongside advisory CS473270; the atomic attacker IPs/hashes there are tenant-perishable and were not fully reproduced in open reporting as of 2026-07-01. Detection in this pack is therefore behavioral and log-based — the 16-hex JSP web-shell path and anomalous children of the Windchill/Tomcat java service — with placeholders in the IOC CSV for the vendor atomic indicators.

03

Hunt Brief & Attack Chain

Hunt hypotheses (fidelity-ordered)

  1. H1 (high): The Windchill/Tomcat java service account spawned a shell or LOLBin (cmd.exe/powershell.exe/sh/whoami) — web-shell command execution. T1190 / T1059 / T1505.003
  2. H2 (high): Web/access logs show a request to /Windchill/login/<16-hex>.jsp — the deployed JSP web shell being planted or invoked. T1505.003
  3. H3 (high): A pre-auth POST to a Windchill endpoint carried a Java serialized-object payload (base64 magic rO0AB) — the deserialization exploitation attempt. T1190
  4. H4 (medium-high): The Windchill java service made anomalous outbound connections to a rare external IP — data exfiltration / C2 egress from the PLM tier. T1041 / T1071
  5. H5 (medium): The Windchill java parent launched download/exfil tooling (certutil, bitsadmin, curl, wget, encoded PowerShell) — staging of second-stage tooling. T1105
  6. H6 (medium): A new .jsp/executable was written under the Windchill/Tomcat webapps or temp path, or persistence (service/cron/account) appeared on the host. T1505.003 / T1053 / T1136

Attack chain

#StepTelemetryHunt Angle
1Pre-auth crafted request to Windchill PDMLink web tierWeb/access + Tomcat logs → NGSIEMSerialized-object POST, rO0AB (Q3)
2Untrusted Java object deserialized → RCE as service accountProcessRollup2 (Falcon on the Windchill host)java spawns shell/LOLBin (Q1)
3Drop persistent JSP web shell (16-hex name)Web/access logs; file-write telemetryRequest to 16-hex .jsp (Q2); new webapp file (Q6)
4Command execution & recon via the web shellProcessRollup2java→shell / recon LOLBins (Q1, Q5)
5Data exfiltration of engineering IP / C2NetworkConnectIP4; download toolingRare egress from java (Q4); staging tools (Q5)
04

Consolidated IOC Table

TypeValueConfActionContext
url-pattern/Windchill/login/[0-9a-f]{16}.jsphighhuntJSP web-shell path; 16-lowercase-hex name (per THN)
behaviorWindchill/Tomcat java service spawning cmd.exe/powershell.exe/shhighhuntWeb-shell command execution — no benign PLM workflow does this
payloadJava serialized-object magic rO0AB (base64 of 0xACED0005)mediumhuntDeserialization exploitation attempt in request body
file-artifactNew <16-hex>.jsp under Windchill/Tomcat webappshighhuntDropped web shell on disk
cveCVE-2026-12569highdetectWindchill PDMLink deserialization RCE, CVSS 9.3
ipv4 / sha256See PTC advisory CS473270 IOC listmediumblockVendor-published atomic IOCs — import from advisory (placeholders in §10 CSV)
05

Affected Surface & Telemetry Matrix

SurfaceTelemetry NeededPriorityGap Risk
Windchill PDMLink / FlexPLM web tier (Tomcat app server)ProcessRollup2 (Falcon sensor on the Windchill host) + Tomcat/web access logs → NGSIEMCriticalMedium — many Windchill servers are Falcon-covered; web-access logs must be explicitly forwarded
Reverse proxy / load balancer / WAF fronting WindchillHTTP access logs (method, url, status, user-agent, body size)HighProxy logs often not shipped to SIEM
Windchill host filesystem (webapps / temp dirs)File-write telemetry for new .jsp / executablesMediumDepends on sensor file-write visibility
Egress path from the PLM tierNetworkConnectIP4 / firewall + NetFlow from the Windchill hostMediumEast-west / egress visibility gaps

Telemetry reality: Q2–Q3 assume Windchill/Tomcat/proxy web-access logs are ingested into NGSIEM/LogScale (a custom repo) — replace #repo=windchill_web and the parsed field names (method, url, status, src_ip, http_user_agent) with your ingest's actual values. Q1, Q4, Q5 are Falcon endpoint queries that apply directly wherever a sensor covers the Windchill host.

06

ATT&CK Mapping

TacticTechniqueObserved BehaviorQuery / Control
Initial AccessT1190 Exploit Public-Facing AppPre-auth deserialization RCE in Windchill PDMLinkQ3 · harden §12
PersistenceT1505.003 Web ShellPersistent 16-hex JSP web shellQ2 / Q6
ExecutionT1059 Command & Scripting InterpreterWeb shell runs OS commands as the service accountQ1
Ingress Tool TransferT1105 Ingress Tool Transfercertutil/bitsadmin/curl/wget/encoded PowerShell downloadQ5
ExfiltrationT1041 Exfil Over C2 ChannelEngineering IP exfil from the PLM tierQ4
Command & ControlT1071 Application-Layer ProtocolAnomalous outbound from the Windchill java serviceQ4
PersistenceT1053 / T1136 Task / AccountNew service/cron/account on the hostQ6
07

Native Audit-Log Hunts (non-CQL)

  • On each Windchill host: search the Tomcat/web access logs for any request path matching /Windchill/login/ followed by 16 lowercase hex characters and .jsp — the web-shell fingerprint. Any hit, on any HTTP method, is high-priority.
  • Filesystem sweep: enumerate the Windchill/Tomcat webapps, work, and temp directories for .jsp files whose name is 16 hex characters, or any .jsp created after the June 17 disclosure that is not part of the shipped application.
  • Process ancestry review: on the Windchill host, list child processes of the java/Tomcat service since disclosure — any cmd.exe, powershell.exe, sh, bash, whoami, or network tool is anomalous.
  • Patch-state confirmation: record each Windchill instance's version and confirm it is at or above the fixed release for its branch (13.1.1 / 13.0.2 / 12.1.2 / 12.0.2 / 11.2.1 / 11.1 M020 / 11.0 M030); flag any lagging instance for emergency patching.
  • PTC IOC correlation: pull the atomic IOCs from advisory CS473270 and sweep proxy/firewall logs and endpoint hashes for matches.
08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
⚠ Q1, Q4, Q5 are Falcon endpoint queries (ProcessRollup2 / NetworkConnectIP4) that run wherever a sensor covers the Windchill host. Q2, Q3, Q6 run against ingested web/proxy/Tomcat logs (NGSIEM/LogScale custom repo) — replace #repo=windchill_web and the snake_case parser fields with your ingest's actual values.
Q1 · Windchill/Tomcat java service spawns a shell (web-shell exec)
CONF HIGHFP LOWCOST LOW

Looks for: the Windchill/Tomcat java process spawning a command shell or basic recon LOLBin — the clearest sign of web-shell command execution. Very low FP: a PLM app server does not legitimately launch cmd/powershell/sh.

// HUNT: Windchill/Tomcat java service spawns shell/recon LOLBin
// MITRE: T1190, T1059, T1505.003
// CONF: high  FP: low  COST: low | REQUIRES: ProcessRollup2 (Falcon sensor on Windchill host)
// FALSE POSITIVES: rare admin/maintenance scripting on the app server
// TUNING: scope to known Windchill hosts; exclude approved deploy/backup jobs
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(java|javaw|tomcat.*|catalina.*)(\.exe)?$/i
| FileName=/^(cmd|powershell|pwsh|sh|bash|dash|whoami|hostname|ipconfig|ifconfig|systeminfo|net1?)(\.exe)?$/i
| table([@timestamp, ComputerName, aid, ParentBaseFileName, FileName, CommandLine, UserName], limit=200)
Q2 · Request to a 16-hex JSP web shell under /Windchill/login/
CONF HIGHFP LOWCOST LOW

Looks for: any web/access-log request whose path is /Windchill/login/<16-lowercase-hex>.jsp — the deployed web shell being planted or invoked (per The Hacker News). Near-zero FP: the shipped app has no such randomly named JSP under the login path.

// HUNT: 16-hex JSP web-shell path in Windchill web/access logs
// MITRE: T1505.003
// CONF: high  FP: low  COST: low | REQUIRES: ingested Windchill/Tomcat/proxy access logs
// FALSE POSITIVES: none expected; shipped app has no 16-hex .jsp under /login/
#repo=windchill_web
| url=/\/Windchill\/login\/[0-9a-f]{16}\.jsp/
| table([@timestamp, src_ip, http_user_agent, method, url, status], limit=200)
Q3 · Java serialized-object payload in a Windchill request (exploitation)
CONF MEDFP MEDCOST LOW

Looks for: a request to the Windchill web tier carrying a base64 Java serialized-object stream (rO0AB, the base64 encoding of magic 0xACED0005) — the deserialization exploitation attempt. FP: some legitimate Windchill client/server traffic serializes Java objects — scope to unauthenticated paths and pair with Q1/Q2.

// HUNT: base64 Java serialized-object magic (rO0AB) in Windchill request
// MITRE: T1190
// CONF: medium  FP: medium  COST: low | REQUIRES: access logs that capture URI/body or a WAF field
// FALSE POSITIVES: legitimate Java-serialized client traffic
// TUNING: restrict to pre-auth endpoints; require method=POST; exclude known app clients
#repo=windchill_web
| method=POST
| @rawstring=/rO0AB[A-Za-z0-9+\/=]{6}/
| table([@timestamp, src_ip, http_user_agent, method, url, status], limit=200)
Q4 · Anomalous outbound from the Windchill java service (exfil / C2)
CONF MEDFP MEDCOST MED

Looks for: outbound connections initiated by the Windchill/Tomcat java process to non-RFC1918 addresses — potential engineering-IP exfiltration or C2. FP: legitimate integrations (license servers, SaaS connectors, update checks) — baseline and allow-list known destinations.

// HUNT: rare external egress from the Windchill java service
// MITRE: T1041, T1071
// CONF: medium  FP: medium  COST: medium | REQUIRES: NetworkConnectIP4 (Falcon sensor)
// FALSE POSITIVES: license/update/SaaS integrations
// TUNING: allow-list known integration IPs/CIDRs and corporate proxies
#event_simpleName=/NetworkConnectIP4/
| ContextBaseFileName=/^(java|javaw|tomcat.*)(\.exe)?$/i
| RemoteAddressIP4!=/^(10\.|127\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.)/
| groupBy([ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], function=count())
| sort(_count, order=asc)
Q5 · Windchill java parent launches download / staging tooling
CONF MEDFP LOWCOST LOW

Looks for: the Windchill java service launching a child whose command line invokes download/exfil LOLBins or encoded PowerShell — second-stage tooling pulled through the web shell. Low FP on a PLM app server.

// HUNT: download/staging tooling spawned from Windchill java service
// MITRE: T1105
// CONF: medium  FP: low  COST: low | REQUIRES: ProcessRollup2 (Falcon sensor)
// FALSE POSITIVES: rare admin update tooling — verify against change records
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(java|javaw|tomcat.*|catalina.*)(\.exe)?$/i
| CommandLine=/certutil|bitsadmin|FromBase64String|Invoke-WebRequest|Net\.WebClient|DownloadString|curl\s|wget\s|-enc\s/i
| table([@timestamp, ComputerName, aid, ParentBaseFileName, FileName, CommandLine, UserName], limit=200)
Q6 · New JSP / webapp file write on the Windchill host (web-shell drop)
CONF MEDFP MEDCOST LOW

Looks for: creation of a .jsp file whose basename is 16 hex characters — the web shell landing on disk. FP: application deploys/upgrades write JSPs — exclude approved deploy windows and the installer service account.

// HUNT: 16-hex .jsp file written on the Windchill host
// MITRE: T1505.003
// CONF: medium  FP: medium  COST: low | REQUIRES: file-write telemetry (Falcon sensor)
// FALSE POSITIVES: legitimate app deploy/upgrade JSP writes
// TUNING: exclude installer/deploy accounts and approved change windows
#event_simpleName=/PeFileWritten|NewExecutableWritten|FileCreateInfo/
| FileName=/^[0-9a-f]{16}\.jsp$/i
| table([@timestamp, ComputerName, aid, FileName, TargetFileName, UserName], limit=200)
09

CrowdStrike Custom IOA Recommendations

DetectionPatternExclusionsAction
Windchill Web-Shell Exec (Custom IOA)Parent java/Tomcat → child cmd/powershell/sh (Q1)Approved deploy/backup jobs on the app serverDetect → Block
16-hex JSP Access (NGSIEM scheduled search)Request to /Windchill/login/<16-hex>.jsp (Q2)NoneAlert — Critical
Windchill Download Tooling (Custom IOA)Parent java → download LOLBin / encoded PowerShell (Q5)Sanctioned update toolingDetect → Block

Q1 and Q5 are strong Custom IOA candidates because the parent→child relationship is deterministic and benign PLM workflows never trigger it. Q2 (web-shell path) is best run as an NGSIEM scheduled search over ingested access logs and promoted to a Critical alert after a short baseline.

10

Machine-Readable IOC Appendix

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
ipv4,REPLACE_WITH_CS473270_ATTACKER_IP,detect,high,2026-12-31,CVE-2026-12569 exploitation source (PTC advisory),campaign:Windchill-CVE-2026-12569
sha256,REPLACE_WITH_WEBSHELL_SHA256,prevent,critical,2026-12-31,JSP web shell payload,campaign:Windchill-CVE-2026-12569
domain,REPLACE_WITH_C2_DOMAIN,detect,high,2026-09-30,post-exploitation C2/exfil,campaign:Windchill-CVE-2026-12569
Behavioral / Log Signatureshunt logic
web log path: /Windchill/login/[0-9a-f]{16}.jsp
process: java/tomcat -> cmd.exe / powershell.exe / sh / whoami
request body: base64 Java serialized magic rO0AB (0xACED0005)
file write: 16-hex .jsp under Windchill/Tomcat webapps
child of java: certutil / bitsadmin / curl / wget / -enc PowerShell
rare external egress from the Windchill java service
Scoping / Contextwhere to look
Product: PTC Windchill (PDMLink) and FlexPLM
Component: web-based PDMLink, Java/Tomcat app tier
Access required: unauthenticated, remote (pre-auth RCE)
Evidence: Tomcat/web access logs; ProcessRollup2 on host
Web-shell naming: 16 lowercase hex characters, .jsp
Vendor advisory: PTC CS473270 (IOCs published)
Exposure / Patch Auditremediation gate
CVE-2026-12569 — PATCH AVAILABLE (PTC advisory 2026-06-19; KEV 2026-06-25)
Fixed: Windchill 13.1.1, 13.0.2, 12.1.2, 12.0.2, 11.2.1, 11.1 M020, 11.0 M030
Fed KEV deadline: 2026-06-28
Audit: every Windchill instance at/above its branch fixed release? (y/n)
Audit: web/access logs forwarded to NGSIEM? (y/n)
Hunt: 16-hex .jsp present on any host BEFORE assuming patch = clean
11

Detection Validation Gates

GateCheckPass Criteria
Telemetry readyWindchill hosts run a Falcon sensor (ProcessRollup2) and web/access logs land in NGSIEM (#repo=windchill_web or equivalent)Process + access events visible within ingest SLA; fields parsed
BaselineRun Q4 over 14 days; catalog legitimate integration egress from the java service. Run Q6 to learn normal deploy-time JSP writesExclusions captured before alerting
Positive testIn a lab Windchill, drop a benign 0123456789abcdef.jsp and request it; from the app account run whoamiQ2 fires on the request; Q1 fires on the child process
PromotionQ1 and Q2 reviewed clean for 7 daysPromote Q1 to a blocking Custom IOA and Q2 to a Critical scheduled-search alert
12

Hardening — Tiered & Deployable

Immediate (this week — patch is available)
  • Patch to the fixed release for your branch — Windchill 13.1.1 / 13.0.2 / 12.1.2 / 12.0.2 / 11.2.1 / 11.1 M020 / 11.0 M030 (and the matching FlexPLM build), per PTC advisory CS473270. (MITRE M1051 Update Software)
  • Hunt for an already-planted web shell before trusting the patch — sweep every host for 16-hex .jsp files and for the Q1 process signature. Patching does not remove an existing shell. (M1049 / M1047 Audit)
  • Front Windchill with a WAF/proxy rule blocking requests to /Windchill/login/[0-9a-f]{16}.jsp and requests carrying base64 Java-serialized streams (rO0AB). (M1050 Exploit Protection)
  • Forward Tomcat/web-access logs to NGSIEM and enable the Q2 web-shell alert. (M1047 Audit)
Near term (1–4 weeks)
  • Reduce exposure of the PLM web tier — remove any direct internet exposure; require VPN/ZTNA or partner-scoped access to Windchill. (M1035 Limit Access to Resource Over Network)
  • Run Windchill/Tomcat under a least-privilege service account (not SYSTEM/root) so RCE lands with minimal rights. (M1026 Privileged Account Management)
  • Egress-filter the Windchill host to only its required integration destinations, shrinking exfil/C2 paths (feeds Q4). (M1037 Filter Network Traffic)
Strategic (1–3 months)
  • Enable a JVM deserialization allow-list (JEP 290 / ObjectInputFilter) or deploy RASP that blocks untrusted gadget-chain deserialization on the app tier. (M1050 Exploit Protection)
  • Segment the PLM tier into its own zone with brokered admin access, isolating it from user/data VLANs. (M1030 Network Segmentation)
  • Add Windchill to the emergency-patch SLA and asset inventory so future PTC PSIRT advisories are actioned within the KEV window. (M1051)
13

Deployable Playbooks

1 — Sweep a Windchill host for 16-hex JSP web shells (Linux/Tomcat)

#!/usr/bin/env bash
# Run on each Windchill app server. Finds JSP files whose basename is 16 hex chars.
WEBROOT="${1:-/opt/ptc/Windchill}"
find "$WEBROOT" -type f -iname '*.jsp' 2>/dev/null \
  | grep -E '/[0-9a-f]{16}\.jsp$' \
  | tee /tmp/windchill_webshell_hits.txt
echo "[*] $(wc -l < /tmp/windchill_webshell_hits.txt) suspicious JSP(s) found"

2 — Windows sweep + access-log grep (PowerShell)

# Web-shell files on a Windows Windchill host + access-log hits.
$root = 'C:\ptc\Windchill'
Get-ChildItem -Path $root -Recurse -Filter *.jsp -ErrorAction SilentlyContinue |
  Where-Object { $_.BaseName -match '^[0-9a-f]{16}$' } |
  Select-Object FullName, CreationTime, Length
Select-String -Path 'C:\ptc\Windchill\tomcat\logs\localhost_access*.log' `
  -Pattern '/Windchill/login/[0-9a-f]{16}\.jsp'

3 — NGSIEM scheduled-search alert (LogScale) for the web shell (Q2)

# Schedule as a recurring search; severity Critical, notify SOC.
#repo=windchill_web
| url=/\/Windchill\/login\/[0-9a-f]{16}\.jsp/

4 — WAF rule sketch (block the web-shell path + serialized payloads)

# ModSecurity-style: block 16-hex JSP under /Windchill/login/ and rO0AB bodies.
SecRule REQUEST_URI "@rx /Windchill/login/[0-9a-f]{16}\.jsp" \
  "id:926001,phase:1,deny,status:403,log,msg:'Windchill CVE-2026-12569 webshell path'"
SecRule REQUEST_BODY "@rx rO0AB[A-Za-z0-9+/=]{6}" \
  "id:926002,phase:2,deny,status:403,log,msg:'Windchill CVE-2026-12569 Java deserialization'"
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-contain the affected Windchill host (Falcon RTR / firewall); block the WAF web-shell path; suspend suspicious sessionsSOC / NetworkContainment record; WAF rule change
EradicateCapture and remove all 16-hex .jsp web shells; kill injected child processes; remove any new services/cron/accounts; apply the branch fixed releaseIR / PlatformWeb-shell files & hashes; process tree; patch evidence
RecoverRebuild the host from a clean image if RCE/persistence is confirmed; rotate the Windchill service-account creds, DB creds, and any app secrets/keys on the hostPlatform / IRRebuild record; credential-rotation log
Assess impactReview access logs and egress for engineering-IP exfiltration (BOMs/CAD); notify IP-owner & legal if data left the tierIR / LegalExfil timeline; data-scope memo
15

Detection Coverage Map

TechniqueBehaviorCQLIOA/AlertCoverage
T1190Pre-auth deserialization exploitationQ3Partial (needs body/URI capture)
T1505.00316-hex JSP web shell (path + on disk)Q2,Q6✓ (scheduled search)Good (if access logs ingested)
T1059Web-shell command executionQ1✓ (Custom IOA)Good (host sensor)
T1105Second-stage download toolingQ5✓ (Custom IOA)Good
T1041/T1071Exfil / C2 egress from javaQ4Partial (baseline-dependent)

Known gaps: the exploitation attempt itself (Q3) is only visible if the proxy/WAF captures request bodies or URIs — many access logs do not, so Q1/Q2 (post-exploitation) are the durable detections. On Windchill hosts without a Falcon sensor, Q1/Q4/Q5/Q6 do not apply and coverage collapses to ingested web logs (Q2/Q3) — prioritize sensor coverage or log forwarding on the PLM tier. Atomic attacker IOCs live in PTC advisory CS473270; the §10 CSV uses placeholders until they are imported.

16

Hunt Summary Ticket

TITLE:       Hunt — PTC Windchill / FlexPLM RCE CVE-2026-12569 (deserialization → JSP web shell)
SEVERITY:    Critical (CVSS 9.3, exploited ITW, KEV 2026-06-25; unauth pre-auth RCE)
SCOPE:       All Windchill PDMLink / FlexPLM instances (Java/Tomcat web tier)
HYPOTHESIS:  Unauthenticated attacker triggered Java deserialization in PDMLink,
             gained RCE as the app service account, dropped a 16-hex JSP web shell
             and used it for command execution and engineering-IP exfiltration
QUERIES:     Q1 java->shell · Q2 16-hex JSP path · Q3 rO0AB payload
             Q4 rare egress · Q5 download tooling · Q6 JSP file write
DO FIRST:    Patch to branch fixed release; sweep for 16-hex .jsp; enable Q2 alert;
             run Q1 across all Windchill hosts
FINDINGS:    <record host, web-shell path/file, java child procs, egress, timestamps>
GAPS:        Exploitation body often not logged; sensor-less hosts limited to web logs;
             atomic IOCs only in PTC CS473270
ACTIONS:     Isolate host, remove web shells, patch, rebuild if persistence confirmed,
             rotate service/DB creds, assess IP exfiltration
OWNER:       HuntPack
VERSION:     v0.2 (2026-07-01)
17

Changelog

v0.22026-07-24CQL correctness pass. All table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.
v0.12026-07-01Initial HuntPack — 6 queries (3 Falcon endpoint, 3 NGSIEM log-based), Custom IOA + scheduled-search recs, patch-first hardening with web-shell hunt, playbooks (Linux/Windows/NGSIEM/WAF), containment. Built from PTC advisory CS473270 + CISA KEV + The Hacker News / CSO Online / threat-modeling.com / SecurityWeek / Help Net Security reporting.
18

References

TierSourceUsed ForAccess Date
1PTC Trust Center — Windchill/FlexPLM RCE (advisory CS473270)Root cause, timeline, fixed releases, IOCs2026-07-01
1CISA KEV Catalog (CVE-2026-12569 added 2026-06-25)Confirmed ITW exploitation; federal deadline2026-07-01
2The Hacker News — CISA adds PTC Windchill RCE to KEVJSP web shells; 16-hex naming; login-path hunt2026-07-01
2CSO Online — hackers exploit critical PTC Windchill flawCVSS 9.3; PDMLink; fixed versions; June 17/19/25 timeline2026-07-01
2Threat-Modeling.com — CVE-2026-12569 analysisUnexpected child processes of the Windchill/CPS service account2026-07-01
2SecurityWeek — first-ever exploitation of PTC WindchillPersistent JSP web shells; command exec & exfil2026-07-01
2Help Net Security — JSP web shells on unpatched WindchillExploitation confirmation; unauthenticated RCE2026-07-01
2Field Effect — Windchill flaw allows unauthenticated RCEDeserialization mechanism; eSupport CS473270 pointer2026-07-01