{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2026-30789", "assignerOrgId": "2fdefc65-d750-4b8d-96ee-6e2c0c42dbfe", "state": "PUBLISHED", "assignerShortName": "VULSec", "dateReserved": "2026-03-05T14:13:37.202Z", "datePublished": "2026-03-05T15:41:51.417Z", "dateUpdated": "2026-06-22T13:16:30.794Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "2fdefc65-d750-4b8d-96ee-6e2c0c42dbfe", "shortName": "VULSec", "dateUpdated": "2026-06-22T13:16:30.794Z" }, "title": "RustDesk Auth Proof Uses Server-Controlled Salt/Challenge and Fast Double-SHA256, Enabling Offline Brute-Force", "datePublic": "2026-03-05T13:45:00.000Z", "problemTypes": [ { "descriptions": [ { "lang": "en", "cweId": "CWE-916", "description": "CWE-916 Use of Password Hash With Insufficient Computational Effort", "type": "CWE" } ] } ], "impacts": [ { "capecId": "CAPEC-49", "descriptions": [ { "lang": "en", "value": "CAPEC-49 Password Brute Forcing" } ] } ], "affected": [ { "vendor": "rustdesk-client", "product": "RustDesk Client", "platforms": [ "Windows", "MacOS", "Linux", "iOS", "Android" ], "collectionURL": "https://github.com/rustdesk/rustdesk/releases", "packageName": "rustdesk-client", "repo": "https://github.com/rustdesk/rustdesk,https://github.com/rustdesk/hbb_common", "modules": [ "Client login", "peer authentication" ], "programFiles": [ "src/client.rs" ], "programRoutines": [ { "name": "handle_hash()" }, { "name": "handle_login_from_ui() (login proof construction)" } ], "versions": [ { "status": "affected", "version": "0", "lessThanOrEqual": "1.4.8", "versionType": "custom" } ], "defaultStatus": "affected" } ], "cpeApplicability": [ { "nodes": [ { "cpeMatch": [ { "criteria": "cpe:2.3:a:rustdesk-client:rustdesk_client:*:*:windows:*:*:*:*:*", "versionEndIncluding": "1.4.8", "versionStartIncluding": "0", "vulnerable": true }, { "criteria": "cpe:2.3:a:rustdesk-client:rustdesk_client:*:*:macos:*:*:*:*:*", "versionEndIncluding": "1.4.8", "versionStartIncluding": "0", "vulnerable": true }, { "criteria": "cpe:2.3:a:rustdesk-client:rustdesk_client:*:*:linux:*:*:*:*:*", "versionEndIncluding": "1.4.8", "versionStartIncluding": "0", "vulnerable": true }, { "criteria": "cpe:2.3:a:rustdesk-client:rustdesk_client:*:*:ios:*:*:*:*:*", "versionEndIncluding": "1.4.8", "versionStartIncluding": "0", "vulnerable": true }, { "criteria": "cpe:2.3:a:rustdesk-client:rustdesk_client:*:*:android:*:*:*:*:*", "versionEndIncluding": "1.4.8", "versionStartIncluding": "0", "vulnerable": true } ], "negate": false, "operator": "OR" } ], "operator": "OR" } ], "descriptions": [ { "lang": "en", "value": "Use of Password Hash With Insufficient Computational Effort, Improper Restriction of Excessive Authentication Attempts vulnerability in rustdesk-client RustDesk Client rustdesk-client on Windows, MacOS, Linux, iOS, Android (Client login, peer authentication modules) allows Password Brute Forcing.\n\nThe authentication proof is SHA256(SHA256(password + salt) + challenge), where both the salt and the challenge are generated entirely by the server with no client-side nonce, and the hash uses no slow key-derivation function. A rogue or on-path API/relay server (see CVE-2026-30794 / CVE-2026-30797) can issue a chosen salt and challenge, capture the resulting proof, and recover the password offline. The capture-replay claim (CWE-294) is withdrawn: the challenge is regenerated per connection (challenge = Config::get_auto_password(6)), so a captured proof is not replayable against the legitimate server. The 1.4.7 OTP brute-force limiter and the existing LOGIN_FAILURES counter constrain only ONLINE attempts and do not address offline recovery.\n\nThis vulnerability is associated with program files src/client.rs and program routines handle_hash(), handle_login_from_ui() (login proof construction).\n\nThis issue affects RustDesk Client: through 1.4.8.", "supportingMedia": [ { "type": "text/html", "base64": false, "value": "Use of Password Hash With Insufficient Computational Effort, Improper Restriction of Excessive Authentication Attempts vulnerability in rustdesk-client RustDesk Client rustdesk-client on Windows, MacOS, Linux, iOS, Android (Client login, peer authentication modules) allows Password Brute Forcing.

The authentication proof is SHA256(SHA256(password + salt) + challenge), where both the salt and the challenge are generated entirely by the server with no client-side nonce, and the hash uses no slow key-derivation function. A rogue or on-path API/relay server (see CVE-2026-30794 / CVE-2026-30797) can issue a chosen salt and challenge, capture the resulting proof, and recover the password offline. The capture-replay claim (CWE-294) is withdrawn: the challenge is regenerated per connection (challenge = Config::get_auto_password(6)), so a captured proof is not replayable against the legitimate server. The 1.4.7 OTP brute-force limiter and the existing LOGIN_FAILURES counter constrain only ONLINE attempts and do not address offline recovery.

This vulnerability is associated with program files src/client.rs and program routines handle_hash(), handle_login_from_ui() (login proof construction).

This issue affects RustDesk Client: through 1.4.8." } ] } ], "references": [ { "url": "https://rustdesk.com/docs/en/client/", "tags": [ "technical-description", "x_--config documentation" ] }, { "url": "https://docs.google.com/document/d/e/2PACX-1vSds6jjpd38oO_yIAyd1HYtKNUuea-I-ozAPpGhYI7QgAU-QGJ7D8a4rOZVj1vmiUXV1EcdRHf9aZAW/pub", "tags": [ "third-party-advisory", "exploit" ] }, { "url": "https://www.vulsec.org/", "tags": [ "vdb-entry", "third-party-advisory" ] } ], "metrics": [ { "format": "CVSS", "scenarios": [ { "lang": "en", "value": "GENERAL" } ], "cvssV4_0": { "attackVector": "LOCAL", "attackComplexity": "LOW", "attackRequirements": "PRESENT", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "HIGH", "subConfidentialityImpact": "NONE", "vulnIntegrityImpact": "NONE", "subIntegrityImpact": "NONE", "vulnAvailabilityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED", "version": "4.0", "baseSeverity": "MEDIUM", "baseScore": 5.7, "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N" } } ], "configurations": [ { "lang": "en", "value": "Default — any password-based authentication", "supportingMedia": [ { "type": "text/html", "base64": false, "value": "Default — any password-based authentication" } ] } ], "workarounds": [ { "lang": "en", "value": "Use long (16+ char) random passwords. Enable 2FA where available.", "supportingMedia": [ { "type": "text/html", "base64": false, "value": "Use long (16+ char) random passwords. Enable 2FA where available." } ] } ], "solutions": [ { "lang": "en", "value": "Add a client-side nonce to the auth proof and use a slow KDF (e.g., Argon2id). Transition to SRP.", "supportingMedia": [ { "type": "text/html", "base64": false, "value": "Add a client-side nonce to the auth proof and use a slow KDF (e.g., Argon2id). Transition to SRP." } ] } ], "exploits": [ { "lang": "en", "value": "PoC available.", "supportingMedia": [ { "type": "text/html", "base64": false, "value": "PoC available.
" } ] } ], "credits": [ { "lang": "en", "value": "Erez Kalman", "type": "finder" }, { "lang": "en", "value": "Erez Kalman", "type": "reporter" } ], "source": { "discovery": "UNKNOWN" }, "x_generator": { "engine": "Vulnogram 0.5.0" } }, "adp": [ { "metrics": [ { "other": { "type": "ssvc", "content": { "timestamp": "2026-03-17T14:32:41.844771Z", "id": "CVE-2026-30789", "options": [ { "Exploitation": "poc" }, { "Automatable": "yes" }, { "Technical Impact": "total" } ], "role": "CISA Coordinator", "version": "2.0.3" } } } ], "title": "CISA ADP Vulnrichment", "providerMetadata": { "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "shortName": "CISA-ADP", "dateUpdated": "2026-03-17T14:32:45.784Z" } } ] } }