Use of a One-Way Hash with a Predictable Salt

Incomplete Variant
Structure: Simple
Description

This vulnerability occurs when an application uses a one-way hash (like for password storage) but combines it with a predictable or easily guessed salt. This undermines the security benefit of salting, making pre-computed attack methods like rainbow tables highly effective.

Extended Description

Using a predictable salt, such as a username or a static string, allows attackers to bypass the primary defense salting provides. Attackers can pre-generate massive lookup tables (rainbow tables) for that specific salt, enabling them to quickly reverse hashes and recover credentials. This effectively nullifies the security advantage that a random, unique salt is meant to deliver. It's important to understand that even a strong, random salt is not a complete solution against determined attackers with significant resources, as hashing algorithms are designed for speed. Modern password cracking using cloud or specialized hardware can still be effective. For robust protection, consider adaptive, computationally expensive hash functions (like Argon2, scrypt, or bcrypt) designed specifically for passwords. Identifying and fixing these predictable salt patterns across a large codebase can be challenging; an ASPM platform like Plexicus can automatically detect such flaws via SAST and use AI to provide specific remediation guidance, streamlining the fix process.

Common Consequences 1
Scope: Access Control

Impact: Bypass Protection Mechanism

Detection Methods 1
Automated Static AnalysisHigh
Automated static analysis, commonly referred to as Static Application Security Testing (SAST), can find some instances of this weakness by analyzing source code (or binary/compiled code) without having to execute it. Typically, this is done by building a model of data flow and control flow, then searching for potentially-vulnerable patterns that connect "sources" (origins of input) with "sinks" (destinations where the data interacts with external components, a lower layer such as the OS, etc.)
Potential Mitigations 2
Phase: Architecture and Design
Use an adaptive hash function that can be configured to change the amount of computational effort needed to compute the hash, such as the number of iterations ("stretching") or the amount of memory required. Some hash functions perform salting automatically. These functions can significantly increase the overhead for a brute force attack compared to intentionally-fast functions such as MD5. For example, rainbow table attacks can become infeasible due to the high computing overhead. Finally, since computing power gets faster and cheaper over time, the technique can be reconfigured to increase the workload without forcing an entire replacement of the algorithm in use. Some hash functions that have one or more of these desired properties include bcrypt [REF-291], scrypt [REF-292], and PBKDF2 [REF-293]. While there is active debate about which of these is the most effective, they are all stronger than using salts with hash functions with very little computing overhead. Note that using these functions can have an impact on performance, so they require special consideration to avoid denial-of-service attacks. However, their configurability provides finer control over how much CPU and memory is used, so it could be adjusted to suit the environment's needs.

Effectiveness: High

Phase: Implementation
If a technique that requires extra computational effort can not be implemented, then for each password that is processed, generate a new random salt using a strong random number generator with unpredictable seeds. Add the salt to the plaintext password before hashing it. When storing the hash, also store the salt. Do not use the same salt for every password.

Effectiveness: Limited

Observed Examples 4
CVE-2008-4905Blogging software uses a hard-coded salt when calculating a password hash.
CVE-2002-1657Database server uses the username for a salt when encrypting passwords, simplifying brute force attacks.
CVE-2001-0967Server uses a constant salt when encrypting passwords, simplifying brute force attacks.
CVE-2005-0408chain: product generates predictable MD5 hashes using a constant value combined with username, allowing authentication bypass.
References 17
bcrypt
Johnny Shelley
ID: REF-291
Tarsnap - The scrypt key derivation function and encryption utility
Colin Percival
ID: REF-292
RFC2898 - PKCS #5: Password-Based Cryptography Specification Version 2.0
B. Kaliski
2000
ID: REF-293
How To Safely Store A Password
Coda Hale
31-01-2010
ID: REF-294
How Companies Can Beef Up Password Security (interview with Thomas H. Ptacek)
Brian Krebs
11-06-2012
ID: REF-295
Password security: past, present, future
Solar Designer
2012
ID: REF-296
Our password hashing has no clothes
Troy Hunt
26-06-2012
ID: REF-297
Password Storage Cheat Sheet
OWASP
ID: REF-631
Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes
Thomas Ptacek
10-09-2007
ID: REF-632
The Importance of Being Canonical
Robert Graham
02-02-2009
ID: REF-633
Password Hashing
James McGlinn
ID: REF-634
Rainbow Hash Cracking
Jeff Atwood
08-09-2007
ID: REF-635
Speed Hashing
Jeff Atwood
06-04-2012
ID: REF-636
Rainbow table
Wikipedia
03-03-2009
ID: REF-637
Writing Secure Code
Michael Howard and David LeBlanc
Microsoft Press
04-12-2002
ID: REF-7
The Art of Software Security Assessment
Mark Dowd, John McDonald, and Justin Schuh
Addison Wesley
2006
ID: REF-62
Modes of Introduction
Implementation
Notes
MaintenanceAs of CWE 4.5, terminology related to randomness, entropy, and predictability can vary widely. Within the developer and other communities, "randomness" is used heavily. However, within cryptography, "entropy" is distinct, typically implied as a measurement. There are no commonly-used definitions, even within standards documents and cryptography papers. Future versions of CWE will attempt to define these terms and, if necessary, distinguish between them in ways that are appropriate for different communities but do not reduce the usability of CWE for mapping, understanding, or other scenarios.