JetBrains TeamCity On-Premises — CVE-2026-63077
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.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| 1 · Vendor | JetBrains 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 publication | Yes |
| 1 · Gov | CISA 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 = Unknown | Yes |
| 1 · Gov | NVD CVE-2026-63077 | CVSS 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 research | Rapid7 Emergent Threat Response | Confirms CVSS 9.8 + deserialization classification; notes KEV addition on Aug 5; recommends restricting network access as defense-in-depth; detection content shipped Jul 28 | Yes |
| 2 · Press | The Hacker News (2026-08-06) | Explicitly: exploitation method, actor identity and scale are all unknown; JetBrains advisory not yet updated to confirm ITW | Yes — this is the basis for the no-IOC posture |
| 2 · Press | Help 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 TeamCity | Yes — historical precedent only, not attribution for this CVE |
| 2 · Press | BleepingComputer (2026-07-30) | Private report date 2026-07-10; patch-plugin restart requirements by version; vendor best-practice guidance | Partial |
| 3 · Aggregator | Cyber 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 · Aggregator | SecurityOnline / Security Affairs | Corroborate CVSS 9.8, agent-polling-protocol root cause, affected/fixed versions; recommend restricting the agent polling port to trusted ranges | Partial |
| 1 · Vendor docs | JetBrains "TeamCity Data Directory" help | Canonical 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.log | Yes — these are the hunt targets in Q3/Q4/Q6 |
| 1 · Vendor docs | JetBrains "Security Notes" help | Super-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 monitoring | Yes — 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.
Hunt Brief & Attack Chain
Hunt hypotheses (ordered by fidelity)
| # | Hypothesis | MITRE | Falcon telemetry | Conf |
|---|---|---|---|---|
| H1 | The 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/.004 | ProcessRollup2, SyntheticProcessRollup2 | HIGH |
| H2 | The server JVM has spawned discovery or ingress-transfer tooling (whoami, id, curl, wget, certutil) — the standard first minute after a web RCE lands. | T1082, T1105 | ProcessRollup2, SyntheticProcessRollup2 | HIGH |
| H3 | An 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, T1554 | NewExecutableWritten, PeFileWritten, JarFileWritten, ZipFileWritten | MEDIUM |
| H4 | A 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, T1554 | ZipFileWritten, JarFileWritten | MEDIUM |
| H5 | The server JVM is making outbound connections to infrastructure that is not VCS, artifact-repository or JetBrains update infrastructure. | T1071.001, T1105 | NetworkConnectIP4 | MEDIUM |
| H6 | A 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.001 | ProcessRollup2, SyntheticProcessRollup2 | HIGH |
| H7 | Estate scoping: some TeamCity servers are unknown to the patching programme. Enumerate every host running a TeamCity server JVM. | — | ProcessRollup2, SyntheticProcessRollup2 | HIGH |
| H8 | Exposure scoping: TeamCity server JVMs are listening on HTTP ports, and some of those listeners are reachable beyond the trusted network. | T1190 | NetworkListenIP4 | HIGH |
| H9 | Blast-radius scoping: the TeamCity server process is running as SYSTEM / root / Administrator, so any exploitation is an immediate full-host compromise. | — | ProcessRollup2, SyntheticProcessRollup2 | HIGH |
Attack chain
| Step | Attacker action | Telemetry | Hunt angle |
|---|---|---|---|
| 1 · Recon | Locate an internet-reachable TeamCity server (login page or REST API is enough to fingerprint) | Perimeter/WAF logs, external ASM; not visible to EDR | Native hunt N1 · Q8 for internal exposure |
| 2 · Exploit | Crafted request to the agent polling protocol; server deserializes untrusted data and bypasses auth (CWE-502) | Reverse-proxy / Tomcat access logs on the server | Native hunt N2 — EDR GAP: no published request signature exists |
| 3 · Execution | Arbitrary OS commands run with the privileges of the TeamCity server process | ProcessRollup2 / SyntheticProcessRollup2 | Q1, Q2 — primary detection |
| 4 · Discovery | Identify the account, host, and reachable network from inside the CI/CD trust zone | ProcessRollup2 | Q2 |
| 5 · Credential access | Read the TeamCity secrets store, DB credentials, auth config, and the server log's super-user token | ProcessRollup2 command lines; file access auditing | Q6 · native hunt N3 |
| 6 · Persistence | Drop a webshell into the web application tree, or a malicious plugin into .BuildServer/plugins | NewExecutableWritten, PeFileWritten, JarFileWritten, ZipFileWritten | Q3, Q4 · native hunt N4 |
| 7 · Pipeline tampering | Add or modify build steps so the poisoned payload is compiled into downstream artifacts | TeamCity audit log + config VCS repo | Native hunt N5 — EDR GAP: application-layer only |
| 8 · C2 / exfil | Egress from the server JVM to attacker infrastructure; artifact and source theft | NetworkConnectIP4, DnsRequest | Q5 |
| 9 · Downstream impact | Compromised artifacts and deployment connections reach production and customers | Artifact signing / SBOM / release attestation systems | Native hunt N6 — outside EDR scope |
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.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| Vulnerable version | TeamCity On-Premises < 2025.11.7 (11.x line) | HIGH | detect | Vendor + NVD: all On-Premises versions before the fix are affected | 2027-02-06 |
| Vulnerable version | TeamCity On-Premises < 2026.1.3 (2026.1 line) | HIGH | detect | Vendor + NVD | 2027-02-06 |
| Fixed build | 2026.1.3 = build 222742 · 2025.11.7 = build 208264 | MEDIUM | enrich | Single-source (aggregator) — verify against the JetBrains download page before using as a patch gate | 2026-09-06 |
| Behavior | TeamCity server JVM as parent of cmd/powershell/sh/bash | HIGH | detect | Direct consequence of "executes arbitrary OS commands with the privileges of the TeamCity server process" | 2027-02-06 |
| Behavior | TeamCity server JVM as parent of curl/wget/certutil/whoami/id | HIGH | detect | Standard post-RCE discovery and ingress transfer | 2027-02-06 |
| Behavior | Unexpected archive/JAR written to .BuildServer/plugins | MEDIUM | hunt | TeamCity auto-loads plugins from this directory at start — also the legitimate patch-plugin path | 2026-11-06 |
| Behavior | Command line referencing pluginData/secure/credentials.json, config/database.properties, auth-config.xml | HIGH | detect | Vendor-documented locations of stored secrets | 2027-02-06 |
| Behavior | Command line reading logs/teamcity-server.log from a non-admin context | MEDIUM | hunt | Vendor security notes: the super-user administrator token is written to this log | 2026-11-06 |
| Config weakness | TeamCity server JVM running as SYSTEM / root / Administrator | HIGH | hunt | Vendor: impact "depends on the privileges granted to the TeamCity server process" | 2027-02-06 |
| Filename | fix_CVE_2026_63077.zip | HIGH | enrich | Benign — the official JetBrains security patch plugin. Listed so triage does not mistake it for the H4 persistence signal. | 2027-02-06 |
| Actor | None published | — | — | No attribution exists as of 2026-08-06 | — |
| Hash / domain / IP | None published | — | — | No atomic indicator has been released by any source; see §10 for placeholder-only import CSV | — |
Affected Surface & Telemetry Matrix
| Surface | Exposure | Required telemetry | Priority | Gap risk |
|---|---|---|---|---|
| TeamCity server host — Windows | Direct RCE target; commands run as the service account | Falcon sensor, ProcessRollup2, file-write events, NetworkConnectIP4 | CRITICAL | LOW — standard sensor coverage |
| TeamCity server host — Linux | Direct RCE target; commands run as the service account | Falcon Linux sensor, ProcessRollup2, NetworkConnectIP4 | CRITICAL | MEDIUM — CI hosts are frequently unmanaged or sensor-exempt |
| TeamCity server in a container / Kubernetes pod | Same RCE; ephemeral filesystem hides file-drop evidence | Falcon container sensor or node-level sensor | CRITICAL | HIGH — file-write hunts (Q3/Q4) degrade badly without container visibility |
TeamCity data directory (.BuildServer) | Holds config, plugins, artifacts and the secrets store | File-write events; OS file-integrity monitoring for non-executable drops | CRITICAL | MEDIUM — .jsp/.xml writes are not covered by Falcon's executable-write events |
| Agent polling endpoint / HTTP listener | The exploited interface itself | Reverse proxy or Tomcat access logs; NetworkListenIP4 for exposure | CRITICAL | HIGH — no published request signature; access logs must be shipped to be useful |
| Build agents | Server can force code execution on any connected agent (vendor-documented) | ProcessRollup2 on agent hosts | HIGH | MEDIUM |
| Stored credentials & VCS connections | Post-exploitation prize: source access, deploy keys, registry tokens | TeamCity audit log; downstream VCS / cloud / registry audit logs | CRITICAL | HIGH — outside EDR entirely |
| Downstream artifacts & deployment targets | Supply-chain blast radius | Artifact registry logs, signing/attestation records, SBOM diffs | HIGH | HIGH — rarely instrumented |
| TeamCity Cloud (JetBrains-hosted) | Not affected — vendor applied measures and found no exploitation evidence | — | N/A | — |
ATT&CK Mapping
| Tactic | Technique | Observed / expected behavior | Query or control |
|---|---|---|---|
| Initial Access | T1190 — Exploit Public-Facing Application | Crafted request to the TeamCity agent polling protocol; auth bypass via untrusted deserialization | Q8 (exposure), N1/N2 (access logs), M1051 patch |
| Execution | T1059.003 — Windows Command Shell | Server JVM spawns cmd.exe | Q1 |
| Execution | T1059.004 — Unix Shell | Server JVM spawns sh / bash | Q1 |
| Execution | T1059.001 — PowerShell | Server JVM spawns powershell.exe / pwsh | Q1 |
| Discovery | T1082 — System Information Discovery | whoami, id, hostname, uname, systeminfo under the server JVM | Q2 |
| Discovery | T1016 — System Network Configuration Discovery | ipconfig, ifconfig, nltest, net under the server JVM | Q2 |
| Command & Control | T1105 — Ingress Tool Transfer | curl, wget, certutil, bitsadmin pulling a second stage | Q2, Q5 |
| Command & Control | T1071.001 — Application Layer Protocol: Web | Server JVM beaconing outbound to non-build infrastructure | Q5 |
| Persistence | T1505.003 — Server Software Component: Web Shell | Webshell dropped into the TeamCity web application tree | Q3, N4 (file integrity — Falcon has no .jsp-write event) |
| Persistence | T1505 — Server Software Component | Malicious plugin placed in .BuildServer/plugins, auto-loaded at server start | Q4 |
| Persistence / Defense Evasion | T1554 — Compromise Host Software Binary | Tampering with TeamCity binaries, JARs or bundled plugins | Q3, Q4 |
| Credential Access | T1552.001 — Unsecured Credentials: Credentials In Files | Reading pluginData/secure/credentials.json, config/database.properties, auth-config.xml | Q6, N3 |
| Credential Access | T1552.004 — Private Keys | Theft of SSH/deploy keys and signing material held by the CI server | Q6, N3, containment phase 3 |
| Privilege Escalation | T1078 — Valid Accounts | Super-user token harvested from logs/teamcity-server.log grants system-administrator login | Q6, hardening (teamcity.superUser.disable) |
| Collection / Exfiltration | T1213 — Data from Information Repositories | Source, artifacts and build logs pulled from .BuildServer/system/artifacts | Q5, N6 |
| Initial Access (downstream) | T1195.002 — Compromise Software Supply Chain | Poisoned build steps propagate to downstream artifacts and deployment targets | N5 — EDR GAP |
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.
CrowdStrike LogScale CQL Hunt Queries
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).
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
| Field | Value |
|---|---|
| Rule group | Process Creation — Windows and Linux (two rules, one per platform) |
| Rule name | DETECT — 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 FileName | leave unset — the service wrapper varies by install method |
| Image FileName | .*\\(cmd|powershell|pwsh|wscript|cscript|mshta)\.exe (Windows) · .*/(sh|bash|dash|zsh|ksh) (Linux) |
| Action | Start at Detect / Critical for 7 days, then move to Block once the benign set is empty |
| Exclusions | Hosts confirmed to run a build agent under the server JVM; any server-side plugin shell invocation identified during Q1 baselining |
| Deployment path | Falcon 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)
| Field | Value |
|---|---|
| Rule name | DETECT — CI Server JVM Spawns Ingress Transfer Tool |
| Parent Image FileName / Command Line | as IOA-1 |
| Image FileName | .*\\(curl|wget|certutil|bitsadmin)\.exe (Windows) · .*/(curl|wget) (Linux) |
| Action | Detect / High — keep as detect; blocking downloaders on a CI host has real breakage potential |
| Exclusions | Scheduled server-side jobs identified during Q2 baselining |
Investigate-only (do not promote yet)
| Query | Why it stays a hunt |
|---|---|
| Q3, Q4 | The legitimate patch plugin and the in-product upgrade flow write to the same paths. An IOA here would fire on your own remediation. |
| Q5 | Rarity hunts have no fixed pattern to encode as an IOA. Convert to a scheduled search with a rarity threshold once baselined. |
| Q6 | Promotable after backup and log-shipper accounts are excluded — revisit at v0.2. |
| Q7, Q8, Q9 | Inventory and hardening posture questions, not detections. |
Scheduled search & alert package (Q1)
| Item | Content |
|---|---|
| Scheduled Search name | DETECT — TeamCity Server JVM Spawns Shell (CVE-2026-63077) |
| Schedule | Every 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 body | The 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. |
| Escalation | SOC 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)
- Confirm the host is a TeamCity server (Q7), not a build agent — this changes everything about the response.
- 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.
- Pull the full process tree for the
TargetProcessIdand capture every child command line. - Run Q6 scoped to the same
aidfor the surrounding 24 hours — credential access is the objective. - Run Q3 and Q4 scoped to the same
aidfor persistence drops. - Run Q5 scoped to the same
ComputerNameand look at the ascending tail for new destinations. - Pull reverse-proxy access logs for that host ±60 seconds around the process event (N2) and identify the source address.
- Review the TeamCity audit log (N3) for new administrators, tokens, or build-step changes.
- 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 byComputerName, to find where that identity has been used off the server.
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.
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.
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.
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
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
Detection Validation Gates
| Gate | Check | Pass criteria |
|---|---|---|
| 1 · Telemetry ready | Run #event_simpleName=/ProcessRollup2/ | groupBy(ComputerName, limit=5000) and confirm every host from Q7 appears | 100% 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 population | On one known TeamCity server, confirm ParentCommandLine and ContextBaseFileName are actually populated | Both 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 match | Confirm 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 baseline | Run 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 test | On 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/Q2 | The 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 budget | Q3, Q4, Q5 measured over 7 days | Each under ~20 rows/day after the documented tuning. Above that, tighten before scheduling. |
| 7 · Promotion | IOA-1 runs in Detect mode for 7 consecutive days | Zero unexplained detections in the final 48 hours, then switch to Block. |
| 8 · Gap acknowledgement | Native hunts N2, N4, N5 assigned to named owners | Exploitation, 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. |
Hardening — Tiered
| # | Control | Why / authority | Verify |
|---|---|---|---|
| I-1 | Upgrade 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-2 | Remove 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-3 | Assume 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-4 | Re-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-5 | Set 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-6 | Deploy 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. |
| # | Control | Why / authority | Verify |
|---|---|---|---|
| N-1 | Move 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-2 | Enable 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-3 | Move 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-4 | Enforce 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-5 | Ship 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-6 | Replace 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. |
| # | Control | Why / authority | Verify |
|---|---|---|---|
| S-1 | Segment 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-2 | Move 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-3 | Adopt 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-4 | Use 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-5 | Establish 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.
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.
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.
| Phase | Actions | Owner | Evidence 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 L2 | Q7 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 owner | Containment 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 / forensics | Disk 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 owner | Rotation 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 owner | Estate-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 + Infra | Build 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 + Security | Artifact 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 + SOC | Hardening 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 lead | Final 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.
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 | Exploitation of the agent polling protocol itself | — | — | GAP No published request signature or PoC. Covered only by N2 access-log review and by patching. |
| T1190 | Attack surface: reachable listeners | Q8 | — | GOOD Pair with N1 for true external reachability. |
| T1059.001/.003/.004 | Server JVM spawns a command interpreter | Q1 | IOA-1 | GOOD Primary detection; high confidence, low FP on a dedicated host. |
| T1082, T1016 | Post-exploitation discovery | Q2 | IOA-2 | GOOD Needs a 30-day baseline to suppress scheduled automation. |
| T1105 | Ingress tool transfer | Q2, Q5 | IOA-2 | GOOD |
| T1505.003 | Webshell drop (.jsp) into the webapp tree | Q3 (partial) | — | PARTIAL Falcon file-write events cover PE/ELF/JAR/ZIP but not .jsp. N4 is the real control here. |
| T1505, T1554 | Malicious plugin persistence | Q4 | — | PARTIAL Detectable, but FP-high while the official patch plugin is being deployed to the same directory. |
| T1552.001/.004 | Credential and secrets-store access | Q6 | — | GOOD Command-line based; a direct file read by the JVM itself would not appear. |
| T1078 | Super-user token abuse from the server log | Q6 (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.001 | C2 egress from the server JVM | Q5 | — | PARTIAL Rarity-based; needs the Q7 host list and egress-allowlist tuning to be usable. S-1 converts it into a hard boundary. |
| T1213 | Source and artifact collection / exfiltration | Q5 (partial) | — | PARTIAL Volume-based inference only. |
| T1195.002 | Build-step tampering → poisoned downstream artifacts | — | — | GAP 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 scoping | Q7 | — | GOOD |
| — | Blast-radius / service-account privilege | Q9 | — | GOOD |
| — | Atomic indicator matching | — | — | GAP 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.
Hunt Summary Ticket
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
Changelog
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| 1 · Vendor | JetBrains — Critical Security Issue Affecting TeamCity On-Premises (CVE-2026-63077) | Primary advisory: affected/fixed versions, agent polling protocol, impact, patch plugin, best practices | 2026-08-06 |
| 1 · Gov | CISA Known Exploited Vulnerabilities Catalog | KEV entry, CWE-502, Date Added 2026-08-05, due date 2026-08-08, BOD 26-04 action | 2026-08-06 |
| 1 · Gov | NVD — CVE-2026-63077 | CVSS 9.8 CRITICAL, weakness classification, affected version statement | 2026-08-06 |
| 2 · Research | Rapid7 — Emergent Threat Response: CVE-2026-63077 | CVSS + deserialization classification, KEV timeline, defense-in-depth guidance | 2026-08-06 |
| 2 · Press | The Hacker News — CISA Flags TeamCity CVE-2026-63077 Under Active Exploitation | Confirmation that actor, method and scale are all unknown; BOD 26-04 deadline | 2026-08-06 |
| 2 · Press | Help Net Security — JetBrains fixes critical unauthenticated RCE in TeamCity On-Premises | Researcher credit, Cloud exploitation check, historical targeting context, KEV update | 2026-08-06 |
| 2 · Press | BleepingComputer — JetBrains warns of critical TeamCity remote code execution flaw | Disclosure timeline, patch-plugin restart requirements by version | 2026-08-06 |
| 3 · Aggregator | Cyber Press — CISA Warns of Active Exploitation Targeting JetBrains TeamCity Servers | CISA assessment none → active, automatable / total technical impact, Censys ~4,500 exposure figure, fixed build numbers (single-source) | 2026-08-06 |
| 3 · Aggregator | SecurityOnline — TeamCity RCE CVE-2026-63077 (CVSS 9.8) | Corroboration of root cause and versions; agent-polling-port restriction advice | 2026-08-06 |
| 3 · Aggregator | Security Affairs — JetBrains patches CVSS 9.8 TeamCity flaw allowing server takeover | Independent corroboration of severity and impact | 2026-08-06 |
| 1 · Vendor docs | JetBrains — TeamCity Data Directory | Canonical data-directory layout, secrets and config file locations, plugin auto-load behavior, TEAMCITY_DATA_PATH, configs-repository feature | 2026-08-06 |
| 1 · Vendor docs | JetBrains — TeamCity Security Notes | Super-user token in the server log, teamcity.superUser.disable, DB credentials in env vars, HTTPS, guest login, REST token guidance, agent isolation | 2026-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.