{"id":"CVE-2026-30789","state":"PUBLISHED","title":"RustDesk Auth Proof Uses Server-Controlled Salt/Challenge and Fast Double-SHA256, Enabling Offline Brute-Force","description":"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.","publishedAt":"2026-03-05T15:41:51.417Z","updatedAt":"2026-06-22T13:16:30.794Z","severity":{"score":5.7,"label":"Medium","version":"4.0","vector":"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","source":"VULSec"},"assigner":"VULSec","products":["rustdesk-client RustDesk Client"],"affected":[{"vendor":"rustdesk-client","product":"RustDesk Client","packageName":"rustdesk-client","defaultStatus":"affected","versions":[{"version":"0","status":"affected","lessThanOrEqual":"1.4.8","versionType":"custom"}],"platforms":["Windows","MacOS","Linux","iOS","Android"],"collectionURL":"https://github.com/rustdesk/rustdesk/releases","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)"}]}],"references":["https://rustdesk.com/docs/en/client/","https://docs.google.com/document/d/e/2PACX-1vSds6jjpd38oO_yIAyd1HYtKNUuea-I-ozAPpGhYI7QgAU-QGJ7D8a4rOZVj1vmiUXV1EcdRHf9aZAW/pub","https://www.vulsec.org/"],"weaknesses":["CWE-916"],"ingestedAt":"2026-10-29T20:11:31.369Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/30xxx/CVE-2026-30789.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-30789","state":"PUBLISHED","datePublished":"2026-03-05T15:41:51.417Z","dateUpdated":"2026-06-22T13:16:30.794Z","assignerShortName":"VULSec","assignerOrgId":"2fdefc65-d750-4b8d-96ee-6e2c0c42dbfe","dateReserved":"2026-03-05T14:13:37.202Z"},"containers":{"cna":{"title":"RustDesk Auth Proof Uses Server-Controlled Salt/Challenge and Fast Double-SHA256, Enabling Offline Brute-Force","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."}],"affected":[{"vendor":"rustdesk-client","product":"RustDesk Client","packageName":"rustdesk-client","defaultStatus":"affected","versions":[{"version":"0","status":"affected","lessThanOrEqual":"1.4.8","versionType":"custom"}],"platforms":["Windows","MacOS","Linux","iOS","Android"],"collectionURL":"https://github.com/rustdesk/rustdesk/releases","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)"}]}],"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"}}],"problemTypes":[{"descriptions":[{"cweId":"CWE-916","lang":"en","description":"CWE-916 Use of Password Hash With Insufficient Computational Effort","type":"CWE"}]}],"providerMetadata":{"shortName":"VULSec","orgId":"2fdefc65-d750-4b8d-96ee-6e2c0c42dbfe","dateUpdated":"2026-06-22T13:16:30.794Z"},"datePublic":"2026-03-05T13:45:00.000Z","impacts":[{"capecId":"CAPEC-49","descriptions":[{"lang":"en","value":"CAPEC-49 Password Brute Forcing"}]}],"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"}],"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.<br>"}]}],"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":[{"title":"CISA ADP Vulnrichment","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"}}}],"providerMetadata":{"shortName":"CISA-ADP","orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","dateUpdated":"2026-03-17T14:32:45.784Z"}}]}}}