JetBrains TeamCity On-Premises — CVE-2026-63077

Unauthenticated remote code execution via the agent polling protocol · CWE-502 deserialization of untrusted data · CISA KEV, actively exploited
Threat
CVE-2026-63077
Severity
EXPLOITED ITW · CVSS 9.8
Type
CI/CD server pre-auth RCE
Access
Unauthenticated, network (HTTP/S)
Version
v0.1 (Draft) · 2026-08-06
Author
HuntPack
Intel confidence
High on vuln · NONE on actor/IOCs
01

Executive Summary

CVE-2026-63077 is a critical, unauthenticated remote code execution flaw in JetBrains TeamCity On-Premises. An attacker who can reach the server over HTTP(S) sends a crafted request to the agent polling protocol — the channel distributed build agents use to check in with the central server for job assignments — and the server deserializes attacker-controlled objects (CWE-502), bypassing authentication entirely and executing arbitrary operating system commands as the TeamCity server process. No credentials, no session, no user interaction.

Attacker objective. A TeamCity server is not just another web app: it holds the stored credentials, signing material, source access and deployment connections for everything the organisation builds. JetBrains states that successful exploitation "could expose TeamCity data, configurations, and stored credentials, modify server state, and potentially compromise the integrity of build artifacts and downstream CI/CD pipelines." The realistic goal is therefore not the box — it is the secrets store and the build definitions, which convert one server compromise into a supply-chain foothold in every downstream artifact.

Highest-value defensive angle. Because the exploit runs commands as the server JVM, the most reliable, IOC-independent signal is the TeamCity server Java process becoming a parent of something it has no business parenting — a shell, an interpreter, a downloader, a discovery binary. On a correctly configured server (dedicated host, no co-located build agent, per vendor guidance) that parent-child edge should be effectively empty in a healthy environment, which makes Q1 and Q2 in this pack the two queries to run first.

Timeline. Reported privately to JetBrains on 2026-07-10 by researcher Antoni Tremblay. Vendor advisory published 2026-07-27 stating no known exploitation. CISA added the CVE to the Known Exploited Vulnerabilities catalog on 2026-08-05 with a federal remediation due date of 2026-08-08 under BOD 26-04, moving its exploitation assessment from "none" to "active" and rating the flaw both automatable and capable of total technical impact. Censys observed roughly 4,500 internet-reachable TeamCity web properties shortly after disclosure.

Honest scoping — read before you tune anything. As of 2026-08-06 there is no public attribution, no published exploitation scale, and no published atomic indicator of any kind — no C2 domains, no IP addresses, no file hashes, no actor name. The Hacker News states plainly that it is "currently not known how the vulnerability is being exploited in the wild, the identity of the threat actors behind the attacks, and the scale of such efforts," and JetBrains had not updated its advisory to confirm exploitation at the time of writing. This pack is therefore behavioral-first by necessity, not by preference. Every detection below keys on attacker behavior on the TeamCity host. The IOC table and the Falcon import CSV contain no atomic indicators, only clearly labelled REPLACE_WITH_ placeholders, because inventing them would be worse than having none.

Defender priority: patch to 2025.11.7 or 2026.1.3 (or apply the JetBrains security patch plugin) and assume pre-patch compromise on any instance that was internet-reachable between 2026-07-27 and the patch. Rotate every credential stored in the TeamCity secrets store and every token the server could reach — patching closes the door but does not evict an attacker who already read the vault.

02

Source Review & Web Hunter Notes

TierSourceKey findingCarry forward
1 · VendorJetBrains TeamCity advisory (2026-07-27)All On-Premises versions affected; fixed in 2025.11.7 / 2026.1.3; exploit path is the agent polling protocol; runs commands as the server process; patch plugin for 2017.1+; "not aware of any active exploitation" at publicationYes
1 · GovCISA KEV catalog entry"Deserialization of untrusted data vulnerability that could allow unauthenticated remote code execution via the agent polling protocol"; CWE-502; Date Added 2026-08-05; Due 2026-08-08; ransomware use = UnknownYes
1 · GovNVD CVE-2026-63077CVSS 9.8 CRITICAL; "In JetBrains TeamCity before 2026.1.3, 2025.11.7 unauthenticated remote code execution was possible via the agent polling protocol"Yes
2 · Vendor researchRapid7 Emergent Threat ResponseConfirms CVSS 9.8 + deserialization classification; notes KEV addition on Aug 5; recommends restricting network access as defense-in-depth; detection content shipped Jul 28Yes
2 · PressThe Hacker News (2026-08-06)Explicitly: exploitation method, actor identity and scale are all unknown; JetBrains advisory not yet updated to confirm ITWYes — this is the basis for the no-IOC posture
2 · PressHelp Net Security (2026-07-28, updated 2026-08-06)Researcher credit (Antoni Tremblay); JetBrains checked TeamCity Cloud for exploitation and found none; notes state-sponsored groups and ransomware affiliates have historically targeted unpatched TeamCityYes — historical precedent only, not attribution for this CVE
2 · PressBleepingComputer (2026-07-30)Private report date 2026-07-10; patch-plugin restart requirements by version; vendor best-practice guidancePartial
3 · AggregatorCyber Press (2026-08-06)CISA assessment none → active, rated automatable / total technical impact; Censys ~4,500 internet-reachable TeamCity web properties; fixed builds 222742 (2026.1.3) and 208264 (2025.11.7)Partial — exposure figure and build numbers are single-source
3 · AggregatorSecurityOnline / Security AffairsCorroborate CVSS 9.8, agent-polling-protocol root cause, affected/fixed versions; recommend restricting the agent polling port to trusted rangesPartial
1 · Vendor docsJetBrains "TeamCity Data Directory" helpCanonical layout of the data directory (.BuildServer): config/, plugins/, system/artifacts, pluginData/secure/credentials.json, config/database.properties, auth-config.xml, main-config.xml, logs/teamcity-server.logYes — these are the hunt targets in Q3/Q4/Q6
1 · Vendor docsJetBrains "Security Notes" helpSuper-user token is printed to logs/teamcity-server.log; teamcity.superUser.disable=true; move DB creds to env vars; HTTPS-only; dedicated DB user; no guest login; restrict data-directory ACLs; config-repo change monitoringYes — hardening + Q6

Web-hunter decisions

  • KEV date discrepancy resolved in favour of CISA. Several outlets refer to the KEV addition as "August 6". The CISA catalog itself records Date Added: 2026-08-05; that is the value used throughout this pack. 2026-08-06 is this pack's build date.
  • No IOC extraction was possible. All twelve sources were searched for hashes, domains, IPs, URIs, user-agents, and file names attributable to exploitation. None publish any. No indicator has been synthesised to fill the gap.
  • Historical TeamCity targeting is context, not attribution. Help Net Security and BleepingComputer both note that state-backed actors and ransomware affiliates have exploited earlier TeamCity flaws. That establishes the threat model and justifies urgency; it does not name an actor for this CVE and is not treated as attribution anywhere in this pack.
  • Exploit mechanics are deliberately absent. No source publishes a PoC or wire-level detail of the polling-protocol request, and none is reconstructed here. Detection is built on post-exploitation host behavior, which is both available and more durable than a request signature.
  • Single-source claims are labelled. The Censys ~4,500 exposure count and the fixed build numbers appear in one aggregator only and are marked Partial above.

Provenance note. The verbatim fetched text of every source cited in this pack is archived alongside it in TeamCity-CVE-2026-63077-Hunt-sources/, one file per source, so that any indicator or claim can be traced back to the page it came from.

03

Hunt Brief & Attack Chain

Hunt hypotheses (ordered by fidelity)

#HypothesisMITREFalcon telemetryConf
H1The TeamCity server JVM has spawned an OS command interpreter (cmd, powershell, sh, bash). On a dedicated server host this edge should not exist.T1190 → T1059.003/.004ProcessRollup2, SyntheticProcessRollup2HIGH
H2The server JVM has spawned discovery or ingress-transfer tooling (whoami, id, curl, wget, certutil) — the standard first minute after a web RCE lands.T1082, T1105ProcessRollup2, SyntheticProcessRollup2HIGH
H3An executable, archive or JAR has been written into the TeamCity data directory or web application tree by a process other than the server's own update flow.T1505.003, T1554NewExecutableWritten, PeFileWritten, JarFileWritten, ZipFileWrittenMEDIUM
H4A plugin archive has appeared in .BuildServer/plugins — TeamCity auto-loads plugins from that directory at start, making it a clean persistence and code-execution primitive.T1505, T1554ZipFileWritten, JarFileWrittenMEDIUM
H5The server JVM is making outbound connections to infrastructure that is not VCS, artifact-repository or JetBrains update infrastructure.T1071.001, T1105NetworkConnectIP4MEDIUM
H6A process command line references the TeamCity secrets or configuration files (credentials.json, database.properties, auth-config.xml, or the server log that carries the super-user token).T1552.001ProcessRollup2, SyntheticProcessRollup2HIGH
H7Estate scoping: some TeamCity servers are unknown to the patching programme. Enumerate every host running a TeamCity server JVM.ProcessRollup2, SyntheticProcessRollup2HIGH
H8Exposure scoping: TeamCity server JVMs are listening on HTTP ports, and some of those listeners are reachable beyond the trusted network.T1190NetworkListenIP4HIGH
H9Blast-radius scoping: the TeamCity server process is running as SYSTEM / root / Administrator, so any exploitation is an immediate full-host compromise.ProcessRollup2, SyntheticProcessRollup2HIGH

Attack chain

StepAttacker actionTelemetryHunt angle
1 · ReconLocate an internet-reachable TeamCity server (login page or REST API is enough to fingerprint)Perimeter/WAF logs, external ASM; not visible to EDRNative hunt N1 · Q8 for internal exposure
2 · ExploitCrafted request to the agent polling protocol; server deserializes untrusted data and bypasses auth (CWE-502)Reverse-proxy / Tomcat access logs on the serverNative hunt N2 — EDR GAP: no published request signature exists
3 · ExecutionArbitrary OS commands run with the privileges of the TeamCity server processProcessRollup2 / SyntheticProcessRollup2Q1, Q2 — primary detection
4 · DiscoveryIdentify the account, host, and reachable network from inside the CI/CD trust zoneProcessRollup2Q2
5 · Credential accessRead the TeamCity secrets store, DB credentials, auth config, and the server log's super-user tokenProcessRollup2 command lines; file access auditingQ6 · native hunt N3
6 · PersistenceDrop a webshell into the web application tree, or a malicious plugin into .BuildServer/pluginsNewExecutableWritten, PeFileWritten, JarFileWritten, ZipFileWrittenQ3, Q4 · native hunt N4
7 · Pipeline tamperingAdd or modify build steps so the poisoned payload is compiled into downstream artifactsTeamCity audit log + config VCS repoNative hunt N5 — EDR GAP: application-layer only
8 · C2 / exfilEgress from the server JVM to attacker infrastructure; artifact and source theftNetworkConnectIP4, DnsRequestQ5
9 · Downstream impactCompromised artifacts and deployment connections reach production and customersArtifact signing / SBOM / release attestation systemsNative hunt N6 — outside EDR scope
04

Consolidated IOC Table

There are no public atomic indicators for CVE-2026-63077 as of 2026-08-06. No vendor, government or press source consulted publishes a hash, domain, IP, URI or user-agent tied to exploitation of this CVE. The rows below are therefore version and behavioral indicators — the things that are actually knowable today. No hash, domain or IP has been invented to pad this table.

TypeValueConfidenceActionContextExpiry
Vulnerable versionTeamCity On-Premises < 2025.11.7 (11.x line)HIGHdetectVendor + NVD: all On-Premises versions before the fix are affected2027-02-06
Vulnerable versionTeamCity On-Premises < 2026.1.3 (2026.1 line)HIGHdetectVendor + NVD2027-02-06
Fixed build2026.1.3 = build 222742 · 2025.11.7 = build 208264MEDIUMenrichSingle-source (aggregator) — verify against the JetBrains download page before using as a patch gate2026-09-06
BehaviorTeamCity server JVM as parent of cmd/powershell/sh/bashHIGHdetectDirect consequence of "executes arbitrary OS commands with the privileges of the TeamCity server process"2027-02-06
BehaviorTeamCity server JVM as parent of curl/wget/certutil/whoami/idHIGHdetectStandard post-RCE discovery and ingress transfer2027-02-06
BehaviorUnexpected archive/JAR written to .BuildServer/pluginsMEDIUMhuntTeamCity auto-loads plugins from this directory at start — also the legitimate patch-plugin path2026-11-06
BehaviorCommand line referencing pluginData/secure/credentials.json, config/database.properties, auth-config.xmlHIGHdetectVendor-documented locations of stored secrets2027-02-06
BehaviorCommand line reading logs/teamcity-server.log from a non-admin contextMEDIUMhuntVendor security notes: the super-user administrator token is written to this log2026-11-06
Config weaknessTeamCity server JVM running as SYSTEM / root / AdministratorHIGHhuntVendor: impact "depends on the privileges granted to the TeamCity server process"2027-02-06
Filenamefix_CVE_2026_63077.zipHIGHenrichBenign — the official JetBrains security patch plugin. Listed so triage does not mistake it for the H4 persistence signal.2027-02-06
ActorNone publishedNo attribution exists as of 2026-08-06
Hash / domain / IPNone publishedNo atomic indicator has been released by any source; see §10 for placeholder-only import CSV
05

Affected Surface & Telemetry Matrix

SurfaceExposureRequired telemetryPriorityGap risk
TeamCity server host — WindowsDirect RCE target; commands run as the service accountFalcon sensor, ProcessRollup2, file-write events, NetworkConnectIP4CRITICALLOW — standard sensor coverage
TeamCity server host — LinuxDirect RCE target; commands run as the service accountFalcon Linux sensor, ProcessRollup2, NetworkConnectIP4CRITICALMEDIUM — CI hosts are frequently unmanaged or sensor-exempt
TeamCity server in a container / Kubernetes podSame RCE; ephemeral filesystem hides file-drop evidenceFalcon container sensor or node-level sensorCRITICALHIGH — file-write hunts (Q3/Q4) degrade badly without container visibility
TeamCity data directory (.BuildServer)Holds config, plugins, artifacts and the secrets storeFile-write events; OS file-integrity monitoring for non-executable dropsCRITICALMEDIUM.jsp/.xml writes are not covered by Falcon's executable-write events
Agent polling endpoint / HTTP listenerThe exploited interface itselfReverse proxy or Tomcat access logs; NetworkListenIP4 for exposureCRITICALHIGH — no published request signature; access logs must be shipped to be useful
Build agentsServer can force code execution on any connected agent (vendor-documented)ProcessRollup2 on agent hostsHIGHMEDIUM
Stored credentials & VCS connectionsPost-exploitation prize: source access, deploy keys, registry tokensTeamCity audit log; downstream VCS / cloud / registry audit logsCRITICALHIGH — outside EDR entirely
Downstream artifacts & deployment targetsSupply-chain blast radiusArtifact registry logs, signing/attestation records, SBOM diffsHIGHHIGH — rarely instrumented
TeamCity Cloud (JetBrains-hosted)Not affected — vendor applied measures and found no exploitation evidenceN/A
06

ATT&CK Mapping

TacticTechniqueObserved / expected behaviorQuery or control
Initial AccessT1190 — Exploit Public-Facing ApplicationCrafted request to the TeamCity agent polling protocol; auth bypass via untrusted deserializationQ8 (exposure), N1/N2 (access logs), M1051 patch
ExecutionT1059.003 — Windows Command ShellServer JVM spawns cmd.exeQ1
ExecutionT1059.004 — Unix ShellServer JVM spawns sh / bashQ1
ExecutionT1059.001 — PowerShellServer JVM spawns powershell.exe / pwshQ1
DiscoveryT1082 — System Information Discoverywhoami, id, hostname, uname, systeminfo under the server JVMQ2
DiscoveryT1016 — System Network Configuration Discoveryipconfig, ifconfig, nltest, net under the server JVMQ2
Command & ControlT1105 — Ingress Tool Transfercurl, wget, certutil, bitsadmin pulling a second stageQ2, Q5
Command & ControlT1071.001 — Application Layer Protocol: WebServer JVM beaconing outbound to non-build infrastructureQ5
PersistenceT1505.003 — Server Software Component: Web ShellWebshell dropped into the TeamCity web application treeQ3, N4 (file integrity — Falcon has no .jsp-write event)
PersistenceT1505 — Server Software ComponentMalicious plugin placed in .BuildServer/plugins, auto-loaded at server startQ4
Persistence / Defense EvasionT1554 — Compromise Host Software BinaryTampering with TeamCity binaries, JARs or bundled pluginsQ3, Q4
Credential AccessT1552.001 — Unsecured Credentials: Credentials In FilesReading pluginData/secure/credentials.json, config/database.properties, auth-config.xmlQ6, N3
Credential AccessT1552.004 — Private KeysTheft of SSH/deploy keys and signing material held by the CI serverQ6, N3, containment phase 3
Privilege EscalationT1078 — Valid AccountsSuper-user token harvested from logs/teamcity-server.log grants system-administrator loginQ6, hardening (teamcity.superUser.disable)
Collection / ExfiltrationT1213 — Data from Information RepositoriesSource, artifacts and build logs pulled from .BuildServer/system/artifactsQ5, N6
Initial Access (downstream)T1195.002 — Compromise Software Supply ChainPoisoned build steps propagate to downstream artifacts and deployment targetsN5EDR GAP
07

Native Audit-Log Hunts (non-CQL)

These cover the chain steps Falcon cannot see. Several are the only coverage for their step — treat them as required, not optional.

N1 · External exposure inventory

Enumerate every TeamCity HTTP(S) endpoint reachable from outside the trusted network — from your external attack-surface tooling, perimeter firewall rules, and reverse-proxy vhosts. JetBrains warns that even exposing the login screen or REST API gives attackers an entry point. Cross-check the result against Q7 and Q8 to find servers the patching programme does not know about.

N2 · Reverse-proxy / Tomcat access-log review for the exploitation window

No public request signature exists, so this is a retrospective anomaly review rather than a signature search. On every TeamCity server, pull access logs for 2026-07-27 through the patch date and look for: requests to agent-polling paths from source addresses that are not registered build agents; unauthenticated requests that returned 200 where 401/403 was expected; bursts from a single source across many endpoints; and any request immediately preceding one of the Q1/Q2 process events by timestamp.

# Correlate: for each Q1/Q2 hit, pull proxy log lines within +/- 60s on that host.
# Adjust the log path to your deployment (nginx / Apache / Tomcat localhost_access_log).
awk -v t1="27/Jul/2026" '$0 ~ t1' /var/log/nginx/teamcity-access.log \
  | grep -viE ' (401|403) ' \
  | awk '{print $1}' | sort | uniq -c | sort -rn | head -50
# Then diff the top source IPs against your registered build-agent inventory.

N3 · TeamCity audit log review

In the TeamCity UI, Administration | Audit. For the window from 2026-07-27 to now, review: new or modified user accounts, especially system administrators; access-token creation; role assignments; changes to authentication settings; and any action attributed to the super user. The vendor documents that the super-user token is printed to logs/teamcity-server.log — an attacker with file read on the host has an administrator login without touching a password.

N4 · Data-directory file integrity (covers the webshell gap)

Falcon's file-write events cover PE, ELF, JAR and ZIP writes but not .jsp, .jspx, .xml or .properties. That is precisely the webshell case, so it must be covered at the OS level.

# Linux — files modified in the data directory and web app tree since the advisory date
find "${TEAMCITY_DATA_PATH:-$HOME/.BuildServer}" /opt/TeamCity/webapps \
     -newermt "2026-07-27" -type f \
     \( -name '*.jsp' -o -name '*.jspx' -o -name '*.war' -o -name '*.jar' -o -name '*.zip' -o -name '*.sh' \) \
     -printf '%TY-%Tm-%Td %TH:%TM  %u  %p\n' 2>/dev/null | sort

# Windows (PowerShell) — same idea
$dd = $env:TEAMCITY_DATA_PATH; if (-not $dd) { $dd = "$env:USERPROFILE\.BuildServer" }
Get-ChildItem -Path $dd,'C:\TeamCity\webapps' -Recurse -File -ErrorAction SilentlyContinue |
  Where-Object { $_.LastWriteTime -ge '2026-07-27' -and $_.Extension -match '^\.(jsp|jspx|war|jar|zip|ps1|bat)$' } |
  Select-Object LastWriteTime, Length, FullName | Sort-Object LastWriteTime

N5 · Build configuration tamper review (supply-chain step — no EDR coverage)

Build definitions live as XML under .BuildServer/config/<projectID>/buildTypes/. If the vendor's Administration | Configs Repository feature is enabled, every settings change is already a git commit — diff it. If it is not enabled, enable it now (hardening N-2) and compare the current config tree against your most recent backup in the meantime.

# If the configs repository is enabled, review every settings commit since the advisory:
git -C /path/to/teamcity-config-repo log --since=2026-07-27 --stat

# Otherwise diff config against the last known-good backup:
diff -ruN /backups/teamcity/last-known-good/config "${TEAMCITY_DATA_PATH}/config" | head -200
# Focus on: new build steps, changed command-line runners, new parameters
# holding URLs or credentials, and edits to project-config.xml / *.xml under buildTypes/.

N6 · Downstream credential and artifact review

Every credential the TeamCity server could reach must be treated as disclosed on any instance assessed as compromised. Review the audit logs of each downstream system for use of those credentials from unfamiliar sources since 2026-07-27: VCS hosting (new deploy keys, force pushes, tag rewrites), artifact registries (unexpected publishes or re-publishes), cloud providers (new access keys, role assumptions), and container registries (image pushes outside pipeline windows). Compare published artifact digests against build records.

08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.

Run order: Q7 and Q8 first to scope which hosts are even in play, then Q1 and Q2 for the primary compromise signal, then Q6, Q3, Q4, Q5 for post-exploitation. Q9 is a blast-radius question, not a detection. None of these queries carries an in-query time filter — set the window with the console time picker (7 days minimum; 2026-07-27 onward for a retrospective sweep).

Q1 · TeamCity server JVM spawns an OS command shell
CONF HIGHFP LOWCOST LOW

Looks for: the direct consequence of the vulnerability — the TeamCity server JVM becoming the parent of a command interpreter. The parent command-line filter pins this to the server process specifically, so a build agent co-located on the same host (a separate JVM running agent.jar) does not match. FP: low on a dedicated server host; server-side plugins that shell out are the realistic benign case.

// HUNT: TeamCity server JVM spawns an OS command shell (CVE-2026-63077 post-exploitation)
// MITRE: T1190, T1059.001, T1059.003, T1059.004
// CONF: high  FP: low  COST: low
// REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 (Windows and Linux sensors)
// FALSE POSITIVES: server-side TeamCity plugins that legitimately invoke a shell; a
//   maintenance script started by an admin from inside the server JVM tree.
// TUNING: baseline 30 days, then exclude the specific ParentCommandLine + FileName +
//   CommandLine triples that recur daily; exclude hosts confirmed to run a build agent
//   under the SERVER jvm (unsupported config) by ComputerName.
// LOOKBACK: set the window in the console time picker; use 2026-07-27 onward to sweep retrospectively
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^java(\.exe)?$/i
| ParentCommandLine=/(teamcity-server|teamcity\.server|catalina|BuildServer|bootstrap\.jar|TeamCity)/i
| FileName=/^(cmd(\.exe)?|powershell(\.exe)?|pwsh(\.exe)?|wscript\.exe|cscript\.exe|mshta\.exe|sh|bash|dash|zsh|ksh|python3?(\.exe)?|perl)$/i
| table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, ParentCommandLine, TargetProcessId])
| sort(@timestamp, order=desc, limit=500)
Q2 · TeamCity server JVM spawns discovery or download tooling
CONF HIGHFP MEDCOST LOW

Looks for: the first minute after a web RCE lands — who am I, where am I, and pull the next stage. Catches operators who never spawn a full shell and instead execute binaries directly. FP: medium — TeamCity health checks and VCS integrations legitimately call hostname, nslookup and occasionally curl; these recur on a schedule and baseline out cleanly.

// HUNT: TeamCity server JVM spawns discovery or ingress-transfer tooling
// MITRE: T1082, T1016, T1105
// CONF: high  FP: medium  COST: low
// REQUIRES: ProcessRollup2 / SyntheticProcessRollup2
// FALSE POSITIVES: TeamCity server health reports and VCS plugins invoking hostname or
//   nslookup; curl used by an admin-authored server-side maintenance job.
// TUNING: run over 30 days and drop any (ComputerName, FileName, CommandLine) triple that
//   appears on more than 5 distinct days at a regular cadence -- that is automation, not an
//   operator. Alert only on first-seen combinations.
// LOOKBACK: set the window in the console time picker
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^java(\.exe)?$/i
| ParentCommandLine=/(teamcity-server|teamcity\.server|catalina|BuildServer|bootstrap\.jar|TeamCity)/i
| FileName=/^(whoami(\.exe)?|hostname(\.exe)?|id|uname|w|systeminfo\.exe|ipconfig\.exe|ifconfig|ip|nltest\.exe|net(\.exe)?|net1\.exe|arp(\.exe)?|route(\.exe)?|tasklist\.exe|ps|curl(\.exe)?|wget|certutil\.exe|bitsadmin\.exe|nslookup(\.exe)?|dig|ssh|scp|nc|ncat)$/i
| table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine, ParentCommandLine, TargetProcessId])
| sort(@timestamp, order=desc, limit=500)
Q3 · Executable, JAR or archive written into the TeamCity data directory
CONF MEDFP MEDCOST LOW

Looks for: payload and persistence drops into the vendor-documented TeamCity directory layout (.BuildServer, and the webapps/plugins/lib trees). FP: medium — the TeamCity update flow and legitimate plugin installs write here, and artifact publication writes into system/artifacts constantly. Known gap: Falcon's file-write events do not fire for .jsp webshells; cover that with native hunt N4.

// HUNT: executable / JAR / archive written into the TeamCity data or webapp tree
// MITRE: T1505, T1505.003, T1554
// CONF: medium  FP: medium  COST: low
// REQUIRES: NewExecutableWritten, PeFileWritten, JarFileWritten, ZipFileWritten
// FALSE POSITIVES: TeamCity in-product upgrades, legitimate plugin installation, and
//   normal build-artifact publication under system/artifacts.
// TUNING: exclude TargetFileName matching system[\\/]+artifacts (routine artifact
//   publication) and correlate the remainder against your change calendar; a write during
//   an approved upgrade window with ContextBaseFileName=java is the expected benign case.
// LOOKBACK: set the window in the console time picker
#event_simpleName=/NewExecutableWritten|PeFileWritten|JarFileWritten|ZipFileWritten/
| TargetFileName=/(\.BuildServer[\\\/]|[\\\/]TeamCity[\\\/](webapps|plugins|lib|conf)[\\\/]|[\\\/]teamcity[\\\/](webapps|plugins|lib|conf)[\\\/])/i
| TargetFileName!=/[\\\/]system[\\\/]+artifacts[\\\/]/i
| table([@timestamp, aid, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData])
| sort(@timestamp, order=desc, limit=500)
Q4 · Plugin archive dropped into the TeamCity plugins directory
CONF MEDFP HIGHCOST LOW

Looks for: the cleanest persistence primitive on a TeamCity server. The vendor documents that plugins placed in .BuildServer/plugins are "loaded automatically on the TeamCity start" — an attacker with file write and a restart gets durable, in-process code execution. FP: high right now, because the official remediation for this very CVE is dropping fix_CVE_2026_63077.zip into that directory. Do not auto-alert this one during the patch window; use it as a hunt and confirm every hit against a change record.

// HUNT: plugin archive written to the TeamCity plugins directory (auto-loaded at server start)
// MITRE: T1505, T1554
// CONF: medium  FP: high  COST: low
// REQUIRES: ZipFileWritten, JarFileWritten
// FALSE POSITIVES: the OFFICIAL JetBrains security patch plugin fix_CVE_2026_63077.zip lands
//   here as the sanctioned remediation, as does every legitimate plugin install and upgrade.
// TUNING: exclude FileName fix_CVE_2026_63077.zip when the write falls inside an approved
//   patch window on a host in the remediation scope; keep it in scope everywhere else, since
//   a plausible filename is exactly what an operator would choose. Maintain an allowlist of
//   your approved plugin archive names and alert on anything outside it.
// LOOKBACK: set the window in the console time picker
#event_simpleName=/ZipFileWritten|JarFileWritten/
| TargetFileName=/(\.BuildServer|TeamCity|teamcity)/i
| TargetFileName=/[\\\/]plugins[\\\/][^\\\/]+\.(zip|jar)$/i
| table([@timestamp, aid, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData])
| sort(@timestamp, order=desc, limit=500)
Q5 · Rare outbound destinations from the TeamCity server JVM
CONF MEDFP HIGHCOST MED

Looks for: C2 and exfiltration egress from the server process, surfaced as a rarity hunt — sorted ascending so the least-common destinations float to the top, rather than trying to enumerate badness. FP: high by construction — TeamCity legitimately reaches VCS hosts, package and artifact repositories, and JetBrains update servers. The tuning below is what makes this query usable.

// HUNT: rare external destinations contacted by the TeamCity server JVM
// MITRE: T1071.001, T1105, T1213
// CONF: medium  FP: high  COST: medium
// REQUIRES: NetworkConnectIP4 with ContextBaseFileName populated
// FALSE POSITIVES: VCS hosts, Maven/NuGet/npm/PyPI mirrors, container registries, JetBrains
//   update and licensing endpoints, and cloud deployment APIs are all legitimate egress.
// TUNING: restrict the result to hosts identified as TeamCity SERVERS by Q7 first -- this
//   query matches any java process, so on a build-agent host it is pure noise. Then exclude
//   your VCS / artifact-repo / registry egress ranges by adding further !cidr stages, and
//   work the ascending tail: a destination seen once, from one host, is the interesting row.
// LOOKBACK: set the window in the console time picker
#event_simpleName=/NetworkConnectIP4/
| ContextBaseFileName=/^java(\.exe)?$/i
| !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8","169.254.0.0/16"])
| groupBy([RemoteAddressIP4, RemotePort], function=[count(as=Connections), count(aid, distinct=true, as=Hosts), collect(ComputerName, limit=10)], limit=5000)
| sort(Connections, order=asc, limit=300)
Q6 · Access to the TeamCity secrets, config or super-user log
CONF HIGHFP MEDCOST LOW

Looks for: the actual objective. Every path in this query is a vendor-documented location for stored secrets: pluginData/secure/credentials.json (VCS credentials), config/database.properties (which JetBrains notes is not encrypted), auth-config.xml, and logs/teamcity-server.log — which carries the super-user administrator token. FP: medium — backup jobs and admin troubleshooting read these same files.

// HUNT: process command line touching TeamCity credential, config or super-user-token files
// MITRE: T1552.001, T1552.004, T1078
// CONF: high  FP: medium  COST: low
// REQUIRES: ProcessRollup2 / SyntheticProcessRollup2
// FALSE POSITIVES: scheduled backup jobs archiving the data directory; admin troubleshooting
//   reading teamcity-server.log; log shippers tailing the server log.
// TUNING: exclude the backup service account by UserName and the log-shipper binary by
//   FileName, then treat anything remaining -- especially a hit whose parent chain reaches
//   the server JVM, or that lands within minutes of a Q1/Q2 hit on the same aid -- as
//   credential theft until proven otherwise.
// LOOKBACK: set the window in the console time picker
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| CommandLine=/(credentials\.json|database\.properties|auth-config\.xml|main-config\.xml|ldap-config\.properties|teamcity-server\.log|\.BuildServer)/i
| FileName=/^(cmd(\.exe)?|powershell(\.exe)?|pwsh(\.exe)?|sh|bash|zsh|cat|head|tail|more|less|type|findstr\.exe|grep|awk|sed|strings|tar(\.exe)?|zip|7z(\.exe)?|gzip|xcopy\.exe|robocopy\.exe|copy|cp|scp|curl(\.exe)?|wget|certutil\.exe|base64|openssl)$/i
| table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine, ParentBaseFileName, ParentCommandLine])
| sort(@timestamp, order=desc, limit=500)
Q7 · Estate inventory — every host running a TeamCity server JVM
CONF HIGHFP LOWCOST LOW

Looks for: scope. With a federal remediation deadline of 2026-08-08 and a vulnerability that affects every On-Premises version ever shipped, the first question is which hosts you actually have. Run this before anything else and reconcile the output against your CMDB — the shadow instance nobody owns is the one that gets exploited.

// HUNT: inventory of hosts running a TeamCity server JVM (patch-scoping query)
// MITRE: n/a -- asset discovery for remediation scoping
// CONF: high  FP: low  COST: low
// REQUIRES: ProcessRollup2 / SyntheticProcessRollup2
// FALSE POSITIVES: build agents whose command line happens to contain the string TeamCity;
//   check the collected CommandLine for agent.jar and treat those rows as agents, not servers.
// TUNING: after the first run, keep a list of confirmed server ComputerName values and reuse
//   it to scope Q5 and Q8, which are otherwise noisy on agent hosts.
// LOOKBACK: set the window in the console time picker; 30d gives better coverage of
//   infrequently-restarted servers than 7d
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^java(\.exe)?$/i
| CommandLine=/(teamcity-server|teamcity\.server|BuildServer|TeamCity)/i
| groupBy([ComputerName, aid], function=[count(as=Starts), selectFromMax(field=@timestamp, include=[UserName, ImageFileName, CommandLine])], limit=1000)
| sort(ComputerName, order=asc, limit=1000)
Q8 · TeamCity HTTP listeners — exposure triage
CONF HIGHFP MEDCOST LOW

Looks for: which TeamCity hosts are listening, on what address and port. A listener bound to 0.0.0.0 on the default 8111 is the profile that put ~4,500 servers on Censys. Pair the output with N1 to decide which listeners are actually internet-reachable. FP: medium — matches any java listener, so scope to the Q7 server list.

// HUNT: TeamCity server JVM HTTP listeners and bind addresses (exposure triage)
// MITRE: T1190 (attack-surface reduction)
// CONF: high  FP: medium  COST: low
// REQUIRES: NetworkListenIP4
// FALSE POSITIVES: any java application listening on these ports -- build agents, other
//   Tomcat apps, and unrelated JVM services will all appear.
// TUNING: intersect the ComputerName list with the confirmed servers from Q7 before acting;
//   a listener on 8111 bound to 0.0.0.0 on a Q7-confirmed host is the row that matters.
// LOOKBACK: set the window in the console time picker
#event_simpleName=/NetworkListenIP4/
| ContextBaseFileName=/^java(\.exe)?$/i
| in(LocalPort, values=[8111, 8112, 8080, 8443, 80, 443])
| groupBy([ComputerName, aid, LocalAddressIP4, LocalPort], function=count(as=Observations), limit=1000)
| sort(LocalPort, order=asc, limit=1000)
Q9 · TeamCity server running as SYSTEM / root — blast-radius check
CONF HIGHFP LOWCOST LOW

Looks for: the variable that decides how bad exploitation is. JetBrains states the impact "depends on the privileges granted to the TeamCity server process" and explicitly recommends running with the minimum OS privileges required. Every host this query returns converts a CVE-2026-63077 hit from "CI server compromise" into "full host compromise", and should be re-hosted under a dedicated low-privilege service account.

// HUNT: TeamCity server JVM running under a highly privileged OS account
// MITRE: n/a -- blast-radius and hardening verification
// CONF: high  FP: low  COST: low
// REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 with UserName populated
// FALSE POSITIVES: a service wrapper that starts as SYSTEM and immediately drops privileges
//   will still be recorded here; confirm the effective account on the host before escalating.
// TUNING: none required -- every row is a hardening finding, not an alert. Feed the results
//   straight into the Immediate hardening tier in section 12.
// LOOKBACK: set the window in the console time picker; use 30d to catch rare restarts
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^java(\.exe)?$/i
| CommandLine=/(teamcity-server|teamcity\.server|BuildServer|TeamCity)/i
| UserName=/(^SYSTEM$|^LOCAL SYSTEM$|SYSTEM$|^root$|^Administrator$|^admin$)/i
| table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine])
| sort(ComputerName, order=asc, limit=500)
09

CrowdStrike Custom IOA Recommendations

Two of the nine queries are strong enough to promote to preventative Custom IOAs. The rest stay Investigate-only until baselined in your environment.

IOA-1 · CI server JVM spawning a command interpreter PROMOTE

FieldValue
Rule groupProcess Creation — Windows and Linux (two rules, one per platform)
Rule nameDETECT — CI Server JVM Spawns Command Interpreter
Parent Image FileName.*\\java\.exe (Windows) · .*/java (Linux)
Parent Command Line.*(teamcity-server|catalina|BuildServer|bootstrap\.jar).*
Grandparent Image FileNameleave unset — the service wrapper varies by install method
Image FileName.*\\(cmd|powershell|pwsh|wscript|cscript|mshta)\.exe (Windows) · .*/(sh|bash|dash|zsh|ksh) (Linux)
ActionStart at Detect / Critical for 7 days, then move to Block once the benign set is empty
ExclusionsHosts confirmed to run a build agent under the server JVM; any server-side plugin shell invocation identified during Q1 baselining
Deployment pathFalcon console → Endpoint security → Custom IOA rule groups → assign to a host group scoped to the Q7 server list

Do not set this to Block on day one. If a legitimate server-side plugin shells out on your instance, blocking will break builds during the exact week you are trying to patch. Run Detect for a week, empty the benign set, then block.

IOA-2 · CI server JVM spawning a downloader PROMOTE (detect only)

FieldValue
Rule nameDETECT — CI Server JVM Spawns Ingress Transfer Tool
Parent Image FileName / Command Lineas IOA-1
Image FileName.*\\(curl|wget|certutil|bitsadmin)\.exe (Windows) · .*/(curl|wget) (Linux)
ActionDetect / High — keep as detect; blocking downloaders on a CI host has real breakage potential
ExclusionsScheduled server-side jobs identified during Q2 baselining

Investigate-only (do not promote yet)

QueryWhy it stays a hunt
Q3, Q4The legitimate patch plugin and the in-product upgrade flow write to the same paths. An IOA here would fire on your own remediation.
Q5Rarity hunts have no fixed pattern to encode as an IOA. Convert to a scheduled search with a rarity threshold once baselined.
Q6Promotable after backup and log-shipper accounts are excluded — revisit at v0.2.
Q7, Q8, Q9Inventory and hardening posture questions, not detections.

Scheduled search & alert package (Q1)

ItemContent
Scheduled Search nameDETECT — TeamCity Server JVM Spawns Shell (CVE-2026-63077)
ScheduleEvery 15 minutes, 20-minute lookback, while the KEV remediation window is open
Alert subject[CRITICAL] Detection: TeamCity CVE-2026-63077 — server JVM spawned a command shell on {ComputerName}
Alert bodyThe TeamCity server process spawned an OS command interpreter. CVE-2026-63077 is an unauthenticated RCE in the TeamCity agent polling protocol, added to CISA KEV on 2026-08-05 and actively exploited. Treat as a live intrusion on a CI/CD server until disproven. Isolate the host, preserve the data directory and server logs, and begin credential rotation.
EscalationSOC L1 → CI/CD platform owner and IR lead immediately. Do not wait for L2 triage: the credential-rotation clock starts at detection.

Triage checklist (L1)

  1. Confirm the host is a TeamCity server (Q7), not a build agent — this changes everything about the response.
  2. Record the TeamCity version and whether 2025.11.7 / 2026.1.3 or the patch plugin is applied. An unpatched host makes this a presumed intrusion.
  3. Pull the full process tree for the TargetProcessId and capture every child command line.
  4. Run Q6 scoped to the same aid for the surrounding 24 hours — credential access is the objective.
  5. Run Q3 and Q4 scoped to the same aid for persistence drops.
  6. Run Q5 scoped to the same ComputerName and look at the ascending tail for new destinations.
  7. Pull reverse-proxy access logs for that host ±60 seconds around the process event (N2) and identify the source address.
  8. Review the TeamCity audit log (N3) for new administrators, tokens, or build-step changes.
  9. Escalate to containment (§14) — do not close on "the command looked benign"; the parent-child edge is the finding.

Pivot queries

  • Host-scoped timeline: take Q1, replace the filter chain with | aid="<the aid>" plus #event_simpleName=/ProcessRollup2|NetworkConnectIP4|DnsRequest/, and sort ascending to build the minute-by-minute story.
  • Environment-wide sweep: run Q1 and Q2 with no host scoping across the full window from 2026-07-27 to now — one compromised server usually means the scanner found several.
  • Lateral movement from the CI zone: #event_simpleName=/UserLogon/ filtered to the TeamCity service account, grouped by ComputerName, to find where that identity has been used off the server.
10

Machine-Readable IOC Appendix

The Falcon import CSV below contains no real indicators, and that is deliberate. No source publishes a hash, domain or IP for CVE-2026-63077 exploitation. Every atomic row is a REPLACE_WITH_ placeholder for you to fill from your own incident data. Importing this file as-is would create three useless IOC entries — it is a template, not a feed. The blocks that follow it are the ones with actual content.

Falcon IOC Management CSVtemplate only — no public IOCs exist
type,value,action,severity,expiration,description,tags
sha256,REPLACE_WITH_SHA256,detect,critical,2027-02-06,CVE-2026-63077 second-stage payload observed in YOUR incident,cve:CVE-2026-63077
domain,REPLACE_WITH_C2_DOMAIN,detect,high,2026-11-06,CVE-2026-63077 C2 observed in YOUR incident,cve:CVE-2026-63077
ipv4,REPLACE_WITH_C2_IPV4,detect,high,2026-11-06,CVE-2026-63077 C2 or exploit source from YOUR proxy logs,cve:CVE-2026-63077
# NO public atomic indicators existed for CVE-2026-63077 as of 2026-08-06.
# No hash, domain, IP or URI has been published by JetBrains, CISA, NVD, Rapid7,
# or any press source. Do NOT import these rows until you have replaced the
# REPLACE_WITH_ values with indicators from your own investigation.
# Detection for this CVE is behavioral -- see section 8.
Behavioral signaturesthe real detection content
BEHAVIOR-01  TeamCity server JVM (java + teamcity-server|catalina|bootstrap.jar in
             parent cmdline) is the PARENT of cmd|powershell|pwsh|sh|bash|dash|zsh
             -> primary CVE-2026-63077 post-exploitation signal            [Q1]
BEHAVIOR-02  Same parent -> whoami|id|hostname|uname|systeminfo|ipconfig|nltest
             -> post-RCE discovery                                          [Q2]
BEHAVIOR-03  Same parent -> curl|wget|certutil|bitsadmin -> ingress transfer [Q2]
BEHAVIOR-04  Executable / JAR / ZIP written under .BuildServer or the TeamCity
             webapps|plugins|lib|conf tree, outside a change window          [Q3]
BEHAVIOR-05  New .zip or .jar in .BuildServer/plugins -> auto-loaded at server
             start = durable in-process persistence                          [Q4]
BEHAVIOR-06  Command line referencing credentials.json | database.properties |
             auth-config.xml | teamcity-server.log -> credential access      [Q6]
BEHAVIOR-07  Rare external destination from the server JVM, one host / one hit  [Q5]
BEHAVIOR-08  TeamCity server JVM running as SYSTEM / root -> full-host blast
             radius on exploitation                                          [Q9]
BEHAVIOR-09  .jsp / .jspx appearing in the webapps tree -> webshell. NOT covered
             by Falcon file-write events; use native hunt N4.
BEHAVIOR-10  New or modified build step in .BuildServer/config/*/buildTypes/*.xml
             -> supply-chain tampering. Application layer only; use N5.
Named tooling & attributionexplicitly empty
THREAT ACTOR ......... NONE PUBLISHED as of 2026-08-06
MALWARE FAMILY ....... NONE PUBLISHED
TOOLING .............. NONE PUBLISHED
EXPLOITATION SCALE ... NOT DISCLOSED
EXPLOIT MECHANICS .... NO PUBLIC PoC OR REQUEST SIGNATURE

The Hacker News, 2026-08-06: "It's currently not known how the vulnerability is
being exploited in the wild, the identity of the threat actors behind the attacks,
and the scale of such efforts."

CISA KEV: "Known To Be Used in Ransomware Campaigns? Unknown"

CONTEXT, NOT ATTRIBUTION: press reporting notes that state-sponsored groups and
ransomware affiliates have exploited EARLIER TeamCity vulnerabilities. That
justifies urgency. It does not name an actor for CVE-2026-63077 and must not be
written into a report as if it did.

KNOWN-BENIGN, do not mistake for a payload:
  fix_CVE_2026_63077.zip  = the official JetBrains security patch plugin
Patch & exposure auditrun this first
FIXED VERSIONS
  TeamCity On-Premises 2025.11.7   (build 208264, single-source -- verify)
  TeamCity On-Premises 2026.1.3    (build 222742, single-source -- verify)
AFFECTED
  ALL TeamCity On-Premises versions before the above. TeamCity Cloud: NOT affected.
PATCH PLUGIN (if you cannot upgrade)
  Supported on TeamCity 2017.1+ ; fixes ONLY CVE-2026-63077
  2017.1 - 2018.1 : server RESTART required after install
  2018.2+         : can be enabled without a restart
  2024.03+        : auto-downloads security patches; see Administration | Updates
KEV / COMPLIANCE
  CISA KEV Date Added : 2026-08-05
  FCEB Due Date       : 2026-08-08   (BOD 26-04)
  CWE                 : CWE-502 Deserialization of Untrusted Data
  CVSS v3.1           : 9.8 CRITICAL
AUDIT CHECKLIST
  [ ] Q7  every host running a TeamCity server JVM enumerated and matched to CMDB
  [ ] N1  every internet-reachable TeamCity endpoint identified
  [ ] Q8  every listener + bind address recorded (0.0.0.0:8111 = act now)
  [ ] ..  version recorded per server; patched or plugin applied
  [ ] Q9  no server JVM running as SYSTEM / root
  [ ] N2  proxy logs reviewed for 2026-07-27 -> patch date
  [ ] N3  TeamCity audit log reviewed for new admins / tokens / build-step edits
  [ ] ..  ALL stored credentials rotated on any server assessed as compromised
11

Detection Validation Gates

GateCheckPass criteria
1 · Telemetry readyRun #event_simpleName=/ProcessRollup2/ | groupBy(ComputerName, limit=5000) and confirm every host from Q7 appears100% of identified TeamCity servers report process telemetry. A CI host without a sensor makes every query in §8 silently useless on the one box that matters.
2 · Field populationOn one known TeamCity server, confirm ParentCommandLine and ContextBaseFileName are actually populatedBoth non-empty. Q1/Q2 depend entirely on ParentCommandLine; Q5/Q8 on ContextBaseFileName. If either is sparse in your tenant, fall back to ParentBaseFileName alone and accept the extra noise.
3 · Parent-string matchConfirm your servers' actual JVM command line matches the regex (teamcity-server|catalina|BuildServer|bootstrap\.jar|TeamCity)At least one Q7 row per server. Installation method varies (Windows service, Docker, tar.gz + runAll.sh) — if your servers do not match, widen the pattern before trusting Q1, or the flagship query returns a confident zero.
4 · Benign baselineRun Q1 and Q2 over 30 days before the advisory date (pre-2026-07-27)Q1 ideally empty. Whatever it returns is your benign set and becomes the IOA exclusion list. A non-empty Q1 baseline is itself a finding — investigate before excluding.
5 · Positive testOn a non-production TeamCity instance, have the platform owner add a temporary build feature or server-side script that invokes whoami from the server JVM, then run Q1/Q2The event appears within the expected telemetry delay. This is a detection-plumbing test using ordinary product functionality — do not attempt to exploit the CVE to test the query.
6 · Noise budgetQ3, Q4, Q5 measured over 7 daysEach under ~20 rows/day after the documented tuning. Above that, tighten before scheduling.
7 · PromotionIOA-1 runs in Detect mode for 7 consecutive daysZero unexplained detections in the final 48 hours, then switch to Block.
8 · Gap acknowledgementNative hunts N2, N4, N5 assigned to named ownersExploitation, webshell drop and build tampering have no EDR coverage. If nobody owns these three, the pack's real coverage is materially lower than §15 suggests.
12

Hardening — Tiered

Immediate — this week (KEV due date 2026-08-08)
#ControlWhy / authorityVerify
I-1Upgrade every TeamCity On-Premises server to 2025.11.7 or 2026.1.3. If you cannot upgrade, install the JetBrains security patch plugin (2017.1+).The only control that closes the vulnerability. MITRE M1051 Update Software; JetBrains advisory; CISA KEV / BOD 26-04.Server version in Administration | Server Administration; plugin listed under Administration | Plugins.
I-2Remove TeamCity from direct internet exposure. Put it behind VPN or an authenticating proxy; restrict the HTTP(S) and agent-polling ports to the trusted network and known agent addresses.Pre-auth RCE reachable by anyone who can hit the port. MITRE M1035 Limit Access to Resource Over Network + M1030 Network Segmentation; JetBrains explicitly: even exposing the login screen or REST API gives attackers an entry point.Q8 for listeners + N1 for external reachability; confirm from an off-network host that the endpoint no longer answers.
I-3Assume compromise on any instance that was internet-reachable and unpatched after 2026-07-27. Rotate every credential in the TeamCity secrets store and every token the server could reach.Patching does not evict an attacker who already read the vault. MITRE M1027; JetBrains: exploitation "could expose… stored credentials."Rotation log reconciled against the full credential inventory in Administration | Connections and per-project VCS roots.
I-4Re-host the server process under a dedicated, low-privilege OS account. Never SYSTEM, root or Administrator.Impact is bounded by the server process privileges. MITRE M1026 Privileged Account Management; JetBrains: "run the TeamCity server with the minimum operating system privileges required."Q9 returns zero rows.
I-5Set teamcity.superUser.disable=true if server logs are shipped anywhere off-box.The super-user administrator token is written to logs/teamcity-server.log; anyone who can read that log (or your log platform) is a system administrator. JetBrains Security Notes.Property present in internal.properties; attempting super-user login fails after restart.
I-6Deploy IOA-1 and IOA-2 in Detect mode and schedule Q1 at 15-minute intervals for the duration of the remediation window.Compensating detection while patching rolls out. MITRE M1047 Audit.Scheduled search present and firing on the §11 gate-5 positive test.
Near term — 1 to 4 weeks
#ControlWhy / authorityVerify
N-1Move the server onto a dedicated host with no co-located build agent, and restrict the data-directory ACLs to the service account and administrators only.JetBrains: servers "should also run on dedicated hosts separate from build agents"; the Windows installer already tightens the install directory and the vendor recommends the same for the data directory. MITRE M1022 Restrict File and Directory Permissions.icacls / getfacl on the data directory shows no broad groups; no agent process on the host.
N-2Enable Administration | Configs Repository so every settings change is committed to git.Turns build-step tampering — the supply-chain step with no EDR coverage — into a reviewable diff. MITRE M1047 Audit. JetBrains data-directory documentation.A test settings edit produces a commit; N5 can run.
N-3Move external database credentials out of config/database.properties into environment variables; use a dedicated least-privilege DB account.JetBrains: TeamCity "does not encrypt this file since it needs database connection before it fully launches." MITRE M1041 Encrypt Sensitive Information.database.properties contains no plaintext password; server starts from env vars.
N-4Enforce HTTPS-only via the reverse proxy; disable plain HTTP; confirm the proxy does not strip the Referer header. Disable guest login.JetBrains Security Notes: "Use HTTPS everywhere" and "Do not enable Guest Login."HTTP request returns a redirect or refusal; guest login absent from the login page.
N-5Ship reverse-proxy / Tomcat access logs and the TeamCity server log to the SIEM with at least 90-day retention.Without shipped access logs, native hunt N2 is impossible and you cannot answer "were we exploited before we patched?" MITRE M1047 Audit.A synthetic request appears in the SIEM within the ingest SLA.
N-6Replace long-lived REST credentials with auto-expiring access tokens on dedicated, least-privilege service users.JetBrains Security Notes: create a separate limited user for REST and prefer auto-expiring tokens. MITRE M1018 User Account Management.Token inventory under each user profile shows expiry dates; no shared admin credentials in scripts.
Strategic — 1 to 3 months
#ControlWhy / authorityVerify
S-1Segment the CI/CD tier: the server reaches VCS, artifact repos and agents only, via an explicit egress allowlist. Default-deny everything else outbound.Converts Q5 from a rarity hunt into a hard boundary and blocks C2 at the network. MITRE M1030 Network Segmentation + M1037 Filter Network Traffic.Egress test to an arbitrary internet host from the server fails; Q5 returns only allowlisted destinations.
S-2Move CI/CD secrets into an external secrets manager with short-lived, dynamically issued credentials. Stop storing long-lived secrets in TeamCity where possible.The vendor documents that settings passwords are stored scrambled with a fixed key, and that anyone who can read the settings repository can recover them. MITRE M1041.Secrets-manager audit log shows CI credential issuance; TeamCity credential inventory shrinks measurably.
S-3Adopt build provenance and artifact signing (SLSA-style attestation), and verify attestations at deploy time.The blast radius of a CI compromise is downstream artifacts. Verified provenance is the only control that detects a poisoned build after the fact. MITRE M1051 / supply-chain integrity (T1195.002).Deploy pipeline rejects an unsigned or mismatched artifact in a test.
S-4Use isolated, ephemeral, throw-away agents for untrusted work (public pull requests, personal builds) and separate agent pools for deployment chains.The server can force code execution on any connected agent (vendor-documented), and builds on the same agent are not isolated from each other. JetBrains Security Notes.Agent pool configuration review; PR builds land only on ephemeral agents.
S-5Establish a standing patch SLA for CI/CD control-plane software: critical vendor advisories applied within 72 hours, with an owner and an out-of-hours path.This CVE went from advisory to KEV in 9 days. A monthly patch cycle is structurally too slow for the build system. MITRE M1051.SLA documented and measured; this CVE's own remediation time recorded as the baseline.

Cited-authority note: every control above carries a MITRE mitigation plus either the JetBrains advisory or JetBrains' own product security documentation. There is no CIS Benchmark or DISA STIG for TeamCity, so the vendor's Security Notes are the strongest available authority for the product-specific items — treat those as ⚠ vendor best-practice, no formal benchmark. The OS-level and network items (I-4, N-1, S-1) additionally map to standard CIS host and network benchmarks for the underlying platform.

13

Deployable Playbooks

Playbook 1 · Emergency patch and verify (Linux server)

Prerequisites: root or sudo on the TeamCity server host; a verified backup of the data directory and database; a maintenance window; the fixed distribution downloaded from the JetBrains site and its checksum verified.
Reboot required: No host reboot. A TeamCity service restart is required (builds will queue during the restart).
Rollback: Stop the service, restore the previous TeamCity home directory from the pre-upgrade copy taken in step 2, restore the data directory and database from the step-1 backup, and start the service. Note that TeamCity upgrades may migrate the database schema — a rollback across a major version requires the database restore, not just the binaries. Vendor guidance: bugfix upgrades within the same minor line (the case here) are backwards compatible and roll back cleanly.

#!/usr/bin/env bash
# Playbook 1 - CVE-2026-63077 emergency patch, Linux tar.gz install.
# Run as root/sudo on the TeamCity SERVER host. Do NOT run on build agents.
set -euo pipefail

TC_HOME="${TC_HOME:-/opt/TeamCity}"
TC_DATA="${TEAMCITY_DATA_PATH:-$HOME/.BuildServer}"
STAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP_ROOT="/backups/teamcity/${STAMP}"

# 1. BACK UP FIRST. No backup, no upgrade.
mkdir -p "${BACKUP_ROOT}"
tar czf "${BACKUP_ROOT}/data-directory.tgz" -C "$(dirname "${TC_DATA}")" "$(basename "${TC_DATA}")"
echo "Database: take your DBA-approved dump into ${BACKUP_ROOT} NOW, then press enter."
read -r _

# 2. Record current state and preserve the binaries for rollback.
"${TC_HOME}/bin/teamcity-server.sh" stop || true
sleep 20
cp -a "${TC_HOME}" "${BACKUP_ROOT}/TeamCity-home-previous"
grep -i 'TeamCity Data Directory:' "${TC_HOME}/logs/teamcity-server.log" | tail -1 || true

# 3. Deploy the fixed distribution (2025.11.7 or 2026.1.3) already staged at
#    /tmp/TeamCity-fixed.tar.gz with its checksum verified against the vendor page.
rm -rf "${TC_HOME}.new" && mkdir -p "${TC_HOME}.new"
tar xzf /tmp/TeamCity-fixed.tar.gz -C "${TC_HOME}.new" --strip-components=1
mv "${TC_HOME}" "${TC_HOME}.old-${STAMP}" && mv "${TC_HOME}.new" "${TC_HOME}"
chown -R teamcity:teamcity "${TC_HOME}"          # dedicated low-priv account (I-4)

# 4. Start and verify the version actually changed.
sudo -u teamcity "${TC_HOME}/bin/teamcity-server.sh" start
sleep 60
grep -iE 'TeamCity (server )?version|Starting TeamCity' "${TC_HOME}/logs/teamcity-server.log" | tail -5

# 5. Confirm the service is NOT running as root (control I-4 / query Q9).
ps -o user= -p "$(pgrep -f 'teamcity-server|catalina' | head -1)"
# Expected: teamcity   -- if this prints root, STOP and fix the service account.

Playbook 2 · Apply the security patch plugin (cannot upgrade)

Prerequisites: TeamCity 2017.1 or newer; TeamCity system-administrator access; the plugin archive downloaded from JetBrains and checksum-verified; write access to the data directory's plugins folder.
Reboot required: No host reboot. TeamCity server restart IS required on 2017.1 through 2018.1; from 2018.2 onward the plugin can be enabled without a restart. On 2024.03+ the server can download the patch itself — check Administration | Updates → Available security updates before doing this manually.
Rollback: Remove the plugin archive from the plugins directory (or disable it under Administration | Plugins) and restart the server if your version requires it. This returns the server to its previous, vulnerable state — only roll back if the plugin causes a confirmed outage, and treat the server as exposed until it is patched again or upgraded.

# Playbook 2 - install the JetBrains security patch plugin for CVE-2026-63077.
# The plugin fixes ONLY this CVE. Upgrading is still the preferred path (I-1).

TC_DATA="${TEAMCITY_DATA_PATH:-$HOME/.BuildServer}"

# 1. Preserve the current plugins directory so rollback is a file move, not a guess.
cp -a "${TC_DATA}/plugins" "/backups/teamcity/plugins-pre-patch-$(date +%Y%m%d-%H%M%S)"

# 2. Stage the plugin. Verify the checksum against the JetBrains download page
#    BEFORE copying it in -- this directory is auto-loaded at server start, which
#    is exactly why it is also query Q4's persistence target.
sha256sum /tmp/fix_CVE_2026_63077.zip
cp /tmp/fix_CVE_2026_63077.zip "${TC_DATA}/plugins/"
chown teamcity:teamcity "${TC_DATA}/plugins/fix_CVE_2026_63077.zip"
chmod 640 "${TC_DATA}/plugins/fix_CVE_2026_63077.zip"

# 3. Enable it.
#    TeamCity 2018.2+ : Administration | Plugins -> enable, no restart needed.
#    TeamCity 2017.1 - 2018.1 : restart the server.
#      /opt/TeamCity/bin/teamcity-server.sh stop && sleep 20
#      sudo -u teamcity /opt/TeamCity/bin/teamcity-server.sh start

# 4. Verify: the plugin is listed and enabled under Administration | Plugins.
# 5. Tell the SOC the write happened, so Q4 does not open an incident on your own fix.

Playbook 3 · Restrict network exposure (control I-2)

Prerequisites: host firewall administration rights; the definitive list of build-agent source addresses and administrator networks; console or out-of-band access to the host in case you lock yourself out.
Reboot required: No. Rules apply immediately.
Rollback: firewall-cmd --reload discards un-persisted runtime rules; for persisted rules, remove the rich rules added below and reload. On Windows, Remove-NetFirewallRule -DisplayName "TeamCity-*". Take the out-of-band access path first — a mistake in the trusted-source list will lock administrators out of the web UI.

# Playbook 3 - restrict the TeamCity HTTP and agent-polling port to trusted sources.
# Adjust TC_PORT to your server's configured port (8111 is the default).

TC_PORT=8111
AGENT_NET="192.0.2.0/24"      # REPLACE: your build-agent network
ADMIN_NET="198.51.100.0/24"   # REPLACE: your administrator / proxy network

# --- Linux (firewalld) -------------------------------------------------------
firewall-cmd --permanent --new-zone=teamcity 2>/dev/null || true
firewall-cmd --permanent --zone=teamcity --add-source="${AGENT_NET}"
firewall-cmd --permanent --zone=teamcity --add-source="${ADMIN_NET}"
firewall-cmd --permanent --zone=teamcity --add-port="${TC_PORT}/tcp"
# Deny the port everywhere else.
firewall-cmd --permanent --zone=public --remove-port="${TC_PORT}/tcp" 2>/dev/null || true
firewall-cmd --reload
firewall-cmd --zone=teamcity --list-all

# --- Windows (PowerShell, run elevated) --------------------------------------
# New-NetFirewallRule -DisplayName "TeamCity-Allow-Trusted" -Direction Inbound `
#   -Protocol TCP -LocalPort 8111 -RemoteAddress @("192.0.2.0/24","198.51.100.0/24") `
#   -Action Allow
# New-NetFirewallRule -DisplayName "TeamCity-Block-Other" -Direction Inbound `
#   -Protocol TCP -LocalPort 8111 -Action Block

# VERIFY from an address outside both networks -- this must fail to connect:
#   curl -m 5 -sS "http://<teamcity-host>:8111/login.html" ; echo "exit=$?"

Playbook 4 · Harden the server account, super-user token and data directory

Prerequisites: root/Administrator on the host; TeamCity system-administrator access; a maintenance window (the property change needs a restart); confirmation of the account TeamCity currently runs as (from Q9).
Reboot required: No host reboot. A TeamCity server restart is required for teamcity.superUser.disable to take effect and for a service-account change.
Rollback: Remove or set teamcity.superUser.disable=false in internal.properties and restart to restore super-user login (do this only if you have lost administrator access by another route — the token in the log is a documented break-glass path). Restore the previous ACLs from the getfacl/icacls capture taken in step 1. Reverting the service account requires re-granting that account ownership of the data directory, so capture ownership before changing it.

# Playbook 4 - service account, super-user token, data-directory ACLs.

TC_DATA="${TEAMCITY_DATA_PATH:-$HOME/.BuildServer}"

# 1. CAPTURE CURRENT STATE FIRST (this is your rollback record).
getfacl -R "${TC_DATA}" > "/backups/teamcity/acl-before-$(date +%Y%m%d).txt"
stat -c '%U:%G %a %n' "${TC_DATA}"

# 2. Disable the super-user token path if logs leave the box (control I-5).
#    The super-user token is printed to logs/teamcity-server.log -- anyone who can
#    read your log platform is otherwise a TeamCity system administrator.
echo 'teamcity.superUser.disable=true' >> "${TC_DATA}/config/internal.properties"

# 3. Lock the data directory to the service account and administrators (N-1).
chown -R teamcity:teamcity "${TC_DATA}"
chmod -R o-rwx "${TC_DATA}"
chmod 700 "${TC_DATA}/config" "${TC_DATA}/plugins"
chmod 600 "${TC_DATA}/config/database.properties" 2>/dev/null || true
find "${TC_DATA}" -name 'credentials.json' -exec chmod 600 {} \;

# 4. Restart the server for the property to apply.
#    /opt/TeamCity/bin/teamcity-server.sh stop && sleep 20
#    sudo -u teamcity /opt/TeamCity/bin/teamcity-server.sh start

# 5. VERIFY
grep -c 'teamcity.superUser.disable=true' "${TC_DATA}/config/internal.properties"
ls -ld "${TC_DATA}" "${TC_DATA}/config" "${TC_DATA}/plugins"
# Then re-run Q9 in Falcon: it must return zero rows for this host.
14

Containment Runbook

Sequencing warning: on a CI/CD server, evidence lives in the data directory and the application logs, and credential exposure is the dominant risk. Preserve before you rebuild, and rotate before you restore. A rebuild that skips credential rotation hands the attacker persistent access through the keys they already took.

PhaseActionsOwnerEvidence to capture
0 · Triage
0–30 min
Confirm the host is a TeamCity server (Q7). Record version and patch state. Confirm whether it was internet-reachable. Decide: confirmed intrusion (Q1/Q2/Q6 hits) vs exposed but no evidence.SOC L2Q7 output, version string, N1 exposure record, the triggering detection.
1 · Isolate
0–1 h
Network-contain the host in Falcon. Block the TeamCity port at the perimeter. Pause all build queues and disconnect agents — a compromised server can force code execution on any connected agent. Do not power off: memory and running-process state are evidence.IR + CI/CD platform ownerContainment timestamp, list of agents connected at containment time, queued/running builds.
2 · Preserve
1–4 h
Snapshot the VM/disk. Copy the entire data directory (config, plugins, system, logs), the TeamCity home directory, logs/teamcity-server.log, reverse-proxy access logs, and a database dump. Export the TeamCity audit log.IR / forensicsDisk image, data-directory archive with hashes, access logs covering 2026-07-27 onward, audit-log export, chain of custody.
3 · Rotate
1–8 h — DO NOT DEFER
Rotate everything the server held or could reach: VCS tokens and deploy keys, artifact/container registry credentials, cloud keys and role trusts, signing keys, DB credentials, TeamCity user passwords and access tokens, LDAP/service-account bindings. Revoke existing TeamCity sessions and tokens. Rotate the super-user path by applying I-5.IAM + CI/CD platform ownerRotation register: every credential, old value revoked, new value issued, timestamp. Reconcile against Administration | Connections and every project's VCS roots.
4 · Scope
4–24 h
Run Q1–Q6 estate-wide from 2026-07-27 to now — a scanner that found one server usually found several. Review the audit log (N3) for new admins, tokens and build-step edits. Diff build configurations (N5). Search downstream systems for use of the exposed credentials (N6). File-integrity sweep for webshells (N4).SOC + CI/CD ownerEstate-wide query output, config diff, audit-log findings, downstream credential-use review.
5 · Eradicate
1–3 days
Rebuild the server from known-good media — do not clean in place. A CI server with in-process plugin persistence and unknown initial access cannot be credibly cleaned. Deploy 2025.11.7 or 2026.1.3. Restore configuration from a backup predating 2026-07-27 where possible; if you must restore a later backup, review the config diff (N5) line by line before importing. Rebuild or re-image every agent that was connected during the exposure window.CI/CD platform owner + InfraBuild record for the new host, restored-backup date and justification, config-diff review sign-off, agent rebuild list.
6 · Verify artifacts
2–7 days
Identify every artifact built during the exposure window. Compare published digests against build records. Rebuild and re-publish anything that cannot be positively verified. Assess and communicate customer impact if any released artifact is in question.Release engineering + SecurityArtifact inventory for the window, digest comparison results, rebuild/republish record, customer-notification decision and rationale.
7 · Recover & harden
3–10 days
Restore builds only after phases 3 and 5 are complete. Apply the Immediate and Near-term hardening tiers (§12) before returning to normal operation. Promote IOA-1 to Block. Keep Q1/Q2/Q6 scheduled for 30 days post-recovery.CI/CD owner + SOCHardening checklist sign-off, IOA promotion record, 30-day monitoring plan.
8 · Report
within 10 days
Document scope, dwell time, credentials exposed, artifacts affected. If a US federal civilian agency, meet BOD 26-04 obligations including the CISA forensics-triage requirements referenced in the KEV entry. Feed findings back into this pack at v0.2.IR leadFinal incident report, regulatory notifications, updated HuntPack with any indicators you observed.

If you find atomic indicators during this response — a C2 address in proxy logs, a payload hash, a webshell — put them into the §10 CSV in place of the REPLACE_WITH_ rows, record which log or artifact they came from, and bump the pack to v0.2. They will be the first real IOCs for this CVE that your environment has, and possibly that anyone has.

15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
T1190Exploitation of the agent polling protocol itselfGAP No published request signature or PoC. Covered only by N2 access-log review and by patching.
T1190Attack surface: reachable listenersQ8GOOD Pair with N1 for true external reachability.
T1059.001/.003/.004Server JVM spawns a command interpreterQ1IOA-1GOOD Primary detection; high confidence, low FP on a dedicated host.
T1082, T1016Post-exploitation discoveryQ2IOA-2GOOD Needs a 30-day baseline to suppress scheduled automation.
T1105Ingress tool transferQ2, Q5IOA-2GOOD
T1505.003Webshell drop (.jsp) into the webapp treeQ3 (partial)PARTIAL Falcon file-write events cover PE/ELF/JAR/ZIP but not .jsp. N4 is the real control here.
T1505, T1554Malicious plugin persistenceQ4PARTIAL Detectable, but FP-high while the official patch plugin is being deployed to the same directory.
T1552.001/.004Credential and secrets-store accessQ6GOOD Command-line based; a direct file read by the JVM itself would not appear.
T1078Super-user token abuse from the server logQ6 (partial)PARTIAL Catches a shell reading the log; a token read by the exploit process is invisible to EDR. Control I-5 is the real fix.
T1071.001C2 egress from the server JVMQ5PARTIAL Rarity-based; needs the Q7 host list and egress-allowlist tuning to be usable. S-1 converts it into a hard boundary.
T1213Source and artifact collection / exfiltrationQ5 (partial)PARTIAL Volume-based inference only.
T1195.002Build-step tampering → poisoned downstream artifactsGAP Application layer only. N5 (config-repo diff) is the sole detection; control N-2 must be enabled for it to work at all.
Asset and version scopingQ7GOOD
Blast-radius / service-account privilegeQ9GOOD
Atomic indicator matchingGAP No public IOCs exist. This is a limitation of the intelligence, not of the pack, and it is why every detection above is behavioral.

Summary of gaps

  • Exploitation itself is undetectable with what is public today. No PoC, no request signature, no IOCs. Everything in §8 fires on what happens after the exploit lands, which means an operator who exploits and does nothing else is invisible. Access-log review (N2) plus assumed-compromise credential rotation (I-3) is the compensating answer.
  • Webshell and build-tamper detection live outside EDR. N4 and N5 are not optional extras; without them, two of the nine attack-chain steps have zero coverage.
  • Containerised TeamCity degrades the file-drop hunts badly. If the server runs in a pod without a container-aware sensor, treat Q3 and Q4 as absent.
  • The parent-command-line assumption is the single point of failure. Q1 and Q2 both depend on the server JVM's command line matching the pattern in validation gate 3. Verify it against a real host before you trust a zero result.

Validation gates. The eight gates in §11 must pass before any of this is treated as coverage. Gate 1 (telemetry present on every Q7 host), gate 3 (the parent pattern actually matches your installs) and gate 8 (named owners for N2/N4/N5) are the three that most commonly turn an apparently-green coverage map into a false sense of security.

16

Hunt Summary Ticket

Copy into your ticketing system
TITLE:      HUNT - JetBrains TeamCity CVE-2026-63077 unauthenticated RCE (CISA KEV, exploited)
SEVERITY:   CRITICAL - CVSS 9.8, CWE-502, unauthenticated pre-auth RCE, KEV due 2026-08-08

SCOPE:      All JetBrains TeamCity On-Premises servers, any version before 2025.11.7 / 2026.1.3.
            TeamCity Cloud is NOT affected. Build agents are in scope for follow-on impact:
            a compromised server can force code execution on any connected agent.

HYPOTHESIS: An unauthenticated attacker reached a TeamCity server over HTTP(S), exploited the
            agent polling protocol via untrusted deserialization, and executed OS commands as
            the TeamCity server process - then read the credential store and/or established
            persistence to reach downstream CI/CD systems and build artifacts.

QUERIES:    Q1 TeamCity server JVM spawns a command shell            [PRIMARY]
            Q2 Server JVM spawns discovery / download tooling        [PRIMARY]
            Q3 Executable / JAR / archive written to the data dir
            Q4 Plugin archive dropped into .BuildServer/plugins
            Q5 Rare external destinations from the server JVM
            Q6 Access to credentials.json / database.properties / server log
            Q7 Estate inventory of TeamCity server hosts             [RUN FIRST]
            Q8 HTTP listeners and bind addresses                     [RUN FIRST]
            Q9 Server JVM running as SYSTEM / root
            N1-N6 native hunts: exposure, proxy logs, audit log, file integrity,
                  config-repo diff, downstream credential review

DO FIRST:   1. Run Q7 + Q8 and reconcile against the CMDB - find the servers you forgot.
            2. Patch to 2025.11.7 / 2026.1.3, or apply the JetBrains patch plugin (2017.1+).
            3. Take TeamCity off the internet: VPN or authenticating proxy (control I-2).
            4. Run Q1 and Q2 from 2026-07-27 to now, estate-wide.
            5. If ANY server was internet-reachable and unpatched after 2026-07-27,
               start credential rotation NOW (containment phase 3). Do not wait for
               confirmation of compromise - patching does not undo credential theft.

FINDINGS:   

GAPS:       - NO public atomic IOCs, no actor attribution, no exploitation scale as of
              2026-08-06. Detection is behavioral only. The Falcon import CSV in section 10
              contains placeholders, not indicators - do not import it as-is.
            - Exploitation itself has no EDR signature (no published PoC or request pattern).
            - .jsp webshell drops are not covered by Falcon file-write events -> native N4.
            - Build-step tampering is application layer only -> native N5, needs control N-2.
            - Q1/Q2 depend on the server JVM command line matching the pattern in
              validation gate 3. Verify against a real host before trusting a zero result.

ACTIONS:    [ ] Q7/Q8 estate + exposure inventory complete
            [ ] All servers patched or patch plugin applied
            [ ] Internet exposure removed (I-2)
            [ ] Q1/Q2/Q6 retrospective sweep from 2026-07-27 complete
            [ ] Q9 returns zero rows (service account de-privileged, I-4)
            [ ] teamcity.superUser.disable=true where logs are shipped off-box (I-5)
            [ ] Credentials rotated on every exposed instance (I-3)
            [ ] Proxy + TeamCity audit logs reviewed (N2, N3)
            [ ] IOA-1 / IOA-2 deployed in Detect mode (I-6)
            [ ] Configs Repository enabled so N5 is possible (N-2)
            [ ] Owners named for native hunts N2, N4, N5 (validation gate 8)

OWNER:      SOC hunt lead + CI/CD platform owner (joint - neither can close this alone)
VERSION:    v0.1 (Draft) - 2026-08-06
17

Changelog

v0.12026-08-06Initial pack. Built the day after CISA added CVE-2026-63077 to the KEV catalog (Date Added 2026-08-05, FCEB due 2026-08-08). Nine CQL queries, two Custom IOA candidates, six native audit-log hunts, tiered hardening with four deployable playbooks, and an eight-phase containment runbook. Deliberately ships with no atomic indicators — no hash, domain, IP or actor attribution had been published by any source at build time, so the IOC appendix carries labelled placeholders and the detection content is entirely behavioral. Twelve source snapshots archived for provenance.
v0.2pendingPlanned triggers: (a) first published atomic IOCs or actor attribution — replace the §10 placeholders and add an atomic-matching row to the coverage map; (b) a published PoC or request signature — add exploitation-stage detection and close the largest coverage gap; (c) Q1/Q2 baseline results from a live tenant — promote Q6 to IOA and tighten the Q3/Q4 exclusion lists; (d) confirmation of the fixed build numbers against the JetBrains download page.
18

References

TierSourceUsed forAccessed
1 · VendorJetBrains — Critical Security Issue Affecting TeamCity On-Premises (CVE-2026-63077)Primary advisory: affected/fixed versions, agent polling protocol, impact, patch plugin, best practices2026-08-06
1 · GovCISA Known Exploited Vulnerabilities CatalogKEV entry, CWE-502, Date Added 2026-08-05, due date 2026-08-08, BOD 26-04 action2026-08-06
1 · GovNVD — CVE-2026-63077CVSS 9.8 CRITICAL, weakness classification, affected version statement2026-08-06
2 · ResearchRapid7 — Emergent Threat Response: CVE-2026-63077CVSS + deserialization classification, KEV timeline, defense-in-depth guidance2026-08-06
2 · PressThe Hacker News — CISA Flags TeamCity CVE-2026-63077 Under Active ExploitationConfirmation that actor, method and scale are all unknown; BOD 26-04 deadline2026-08-06
2 · PressHelp Net Security — JetBrains fixes critical unauthenticated RCE in TeamCity On-PremisesResearcher credit, Cloud exploitation check, historical targeting context, KEV update2026-08-06
2 · PressBleepingComputer — JetBrains warns of critical TeamCity remote code execution flawDisclosure timeline, patch-plugin restart requirements by version2026-08-06
3 · AggregatorCyber Press — CISA Warns of Active Exploitation Targeting JetBrains TeamCity ServersCISA assessment none → active, automatable / total technical impact, Censys ~4,500 exposure figure, fixed build numbers (single-source)2026-08-06
3 · AggregatorSecurityOnline — TeamCity RCE CVE-2026-63077 (CVSS 9.8)Corroboration of root cause and versions; agent-polling-port restriction advice2026-08-06
3 · AggregatorSecurity Affairs — JetBrains patches CVSS 9.8 TeamCity flaw allowing server takeoverIndependent corroboration of severity and impact2026-08-06
1 · Vendor docsJetBrains — TeamCity Data DirectoryCanonical data-directory layout, secrets and config file locations, plugin auto-load behavior, TEAMCITY_DATA_PATH, configs-repository feature2026-08-06
1 · Vendor docsJetBrains — TeamCity Security NotesSuper-user token in the server log, teamcity.superUser.disable, DB credentials in env vars, HTTPS, guest login, REST token guidance, agent isolation2026-08-06

MITRE ATT&CK & mitigations referenced

Techniques: T1190, T1059.001/.003/.004, T1082, T1016, T1105, T1071.001, T1505, T1505.003, T1554, T1552.001, T1552.004, T1078, T1213, T1195.002. Mitigations: M1051 (Update Software), M1035 (Limit Access to Resource Over Network), M1030 (Network Segmentation), M1037 (Filter Network Traffic), M1026 (Privileged Account Management), M1018 (User Account Management), M1022 (Restrict File and Directory Permissions), M1027 (Password Policies), M1041 (Encrypt Sensitive Information), M1047 (Audit).

Source snapshots. Verbatim fetched text for every source above is archived in TeamCity-CVE-2026-63077-Hunt-sources/ alongside this file, one plain-text file per source, so that every claim and indicator in this pack can be traced to the page it came from on 2026-08-06.

Generated 2026-08-06 · HuntPack v0.1 (Draft) · Defensive content only — hunt, detection and hardening guidance. No offensive tooling or exploit code is included, and none of the sources consulted published any.