cfgfile
y copia la entrada en inputbuf
mediante strcpy()
. El código presupone incorrectamente que inputbuf
siempre contendrá un terminador null.
#define MAXLEN 1024
...
char *pathbuf[MAXLEN];
...
read(cfgfile,inputbuf,MAXLEN); //does not null-terminate
strcpy(pathbuf,inputbuf); //requires null-terminated input
...
Example 1
presentará un comportamiento correcto si los datos leídos desde cfgfile
se finalizan con null en el disco, tal y como se espera. Sin embargo, si el usuario malintencionado puede modificar esta entrada para que no contenga el carácter null
esperado, la llamada a strcpy()
continuará con el proceso de copia desde la memoria hasta que encuentre un carácter null
arbitrario. Es probable que esto desborde el búfer de destino y, si el atacante puede controlar el contenido de la memoria que aparece justo después de inputbuf
, este puede conseguir que la aplicación sea susceptible a un ataque de desbordamiento del búfer.readlink()
amplía el nombre de un vínculo simbólico almacenado en el búfer path
para que el búfer buf
contenga la ruta absoluta del archivo al que hace referencia este vínculo. A continuación, la longitud del valor resultante se calcula mediante strlen()
.
...
char buf[MAXPATH];
...
readlink(path, buf, MAXPATH);
int length = strlen(buf);
...
Example 2
no presentará un comportamiento correcto debido a que el valor leído en buf
por readlink()
no se finalizará con null. En las pruebas, es posible que no se detecten vulnerabilidades como esta debido a que el contenido de buf
no utilizado y la memoria que aparece justo después pueden ser null
, lo que provocaría que strlen()
mostrase aparentemente un comportamiento correcto. Sin embargo, en un entorno real, strlen()
seguirá recorriendo la memoria hasta que detecte un carácter null
arbitrario en la pila, lo que genera un valor de length
mucho más grande que el tamaño de buf
y podría provocar un desbordamiento del búfer en los usos posteriores de este valor.snprintf()
para copiar una cadena de entrada de usuario y colocarla en múltiples cadenas de salida. A pesar de proporcionar protecciones adicionales en comparación con sprintf()
, en particular la especificación de un tamaño máximo de salida, la función snprintf()
aún es susceptible a un error de terminación de cadena cuando el tamaño de salida especificado es mayor que la entrada prospectiva. Los errores de terminación de cadena pueden provocar problemas posteriores, como una pérdida de memoria o un buffer overflow.
...
char no_null_term[5] = getUserInput();
char output_1[20];
snprintf(output_1, 20, "%s", no_null_term);
char output_2[20];
snprintf(output_2, 20, "%s", no_null_term);
printf("%s\n", output_1);
printf("%s\n", output_2);
...
Example 3
demuestra una pérdida de memoria. Cuando la output_2
incluye no_null_term
, snprintf()
debe leerse desde la ubicación de no_null_term
hasta que se encuentre un carácter nulo o se alcance el límite de tamaño especificado. Como no hay terminación en no_null_term
, snprintf
continúa leyendo los datos de output_1
, donde finalmente alcanza un carácter de terminación nulo proporcionado por la primera llamada de snprintf()
. La pérdida de memoria se demuestra mediante printf()
de output_2
, que contiene la secuencia de caracteres de no_null_term
dos veces.null
. Los métodos de administración de cadenas anteriores utilizaban frecuentemente este carácter null
para determinar la longitud de la cadena. Si un búfer que no contiene un terminador null se transfiere a una de estas funciones, la función leerá más allá del final del búfer.
...
PKCS5_PBKDF2_HMAC(pass, strlen(pass), "2!@$(5#@532@%#$253l5#@$", 2, ITERATION, EVP_sha512(), outputBytes, digest);
...
...
private static final String salt = "2!@$(5#@532@%#$253l5#@$";
...
PBEKeySpec pbeSpec=new PBEKeySpec(password);
SecretKeyFactory keyFact=SecretKeyFactory.getInstance(CIPHER_ALG);
PBEParameterSpec defParams=new PBEParameterSpec(salt,100000);
Cipher cipher=Cipher.getInstance(CIPHER_ALG);
cipher.init(cipherMode,keyFact.generateSecret(pbeSpec),defParams);
...
...
const salt = "some constant value";
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
passwordLen,
"2!@$(5#@532@%#$253l5#@$",
2,
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
$hash = hash_pbkdf2('sha256', $password, '2!@$(5#@532@%#$253l5#@$', 100000)
...
...
from hashlib import pbkdf2_hmac
dk = pbkdf2_hmac('sha256', password, '2!@$(5#@532@%#$253l5#@$', 100000)
...
...
dk = OpenSSL::PKCS5.pbkdf2_hmac(password, '2!@$(5#@532@%#$253l5#@$', 100000, 256, digest)
...
...
let ITERATION = UInt32(100000)
let salt = "2!@$(5#@532@%#$253l5#@$"
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
passwordLength,
salt,
salt.lengthOfBytesUsingEncoding(NSUTF8StringEncoding),
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
ITERATION,
derivedKey,
derivedKeyLength)
...
...
crypt(password, "2!@$(5#@532@%#$253l5#@$");
...
...
salt := "2!@$(5#@532@%#$253l5#@$"
password := get_password()
sha256.Sum256([]byte(salt + password)
...
...
Encryptor instance = ESAPI.encryptor();
String hash1 = instance.hash(input, "2!@$(5#@532@%#$253l5#@$");
...
javap -c
para acceder al código desensamblado, que contiene los valores de la sal usada.
...
crypt($password, '2!@$(5#@532@%#$253l5#@$');
...
...
from django.contrib.auth.hashers import make_password
make_password(password, salt="2!@$(5#@532@%#$253l5#@$")
...
require 'openssl'
...
password = get_password()
salt = '2!@$(5#@532@%#$253l5#@$'
hash = OpenSSL::Digest::SHA256.digest(salt + password)
...
...
byte[] passwd = Encoding.UTF8.GetBytes(txtPassword.Text);
Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(passwd, passwd,10001);
...
...
let password = getPassword();
let salt = password;
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
function register(){
$password = $_GET['password'];
$username = $_GET['username'];
$hash = hash_pbkdf2('sha256', $password, $password, 100000);
...
import hashlib, binascii
def register(request):
password = request.GET['password']
username = request.GET['username']
dk = hashlib.pbkdf2_hmac('sha256', password, password, 100000)
hash = binascii.hexlify(dk)
store(username, hash)
...
require 'openssl'
...
req = Rack::Response.new
password = req.params['password']
...
key = OpenSSL::PKCS5::pbkdf2_hmac(password, password, 100000, 256, 'SHA256')
...
...
String minimumBits = prop.getProperty("minimumbits");
Hashing.goodFastHash(minimumBits).hashString("foo", StandardCharsets.UTF_8);
...
Example 1
se ejecuta correctamente, pero cualquier persona con acceso a esta funcionalidad puede manipular los bits mínimos utilizados para aplicar hash a la contraseña modificando la propiedad minimumBits
. Una vez que se haya distribuido el programa, puede resultar difícil deshacer un problema relacionado con bits mínimos controlados por el usuario, dado que no puede saber si un usuario malintencionado ha configurado los bits mínimos del hash de la contraseña.
string salt = ConfigurationManager.AppSettings["salt"];
...
Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes("password", Encoding.ASCII.GetBytes(salt));
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando la propiedad salt
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
...
salt = getenv("SALT");
PKCS5_PBKDF2_HMAC(pass, sizeof(pass), salt, sizeof(salt), ITERATION, EVP_sha512(), outputBytes, digest);
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando la variable de entorno SALT
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
...
Properties prop = new Properties();
prop.load(new FileInputStream("local.properties"));
String salt = prop.getProperty("salt");
...
PBEKeySpec pbeSpec=new PBEKeySpec(password);
SecretKeyFactory keyFact=SecretKeyFactory.getInstance(CIPHER_ALG);
PBEParameterSpec defParams=new PBEParameterSpec(salt,100000);
Cipher cipher=Cipher.getInstance(CIPHER_ALG);
cipher.init(cipherMode,keyFact.generateSecret(pbeSpec),defParams);
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando la propiedad salt
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
app.get('/pbkdf2', function(req, res) {
...
let salt = req.params['salt'];
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
}
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando la propiedad salt
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
...
@property (strong, nonatomic) IBOutlet UITextField *inputTextField;
...
NSString *salt = _inputTextField.text;
const char *salt_cstr = [salt cStringUsingEncoding:NSUTF8StringEncoding];
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
passwordLen,
salt_cstr,
salt.length,
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando el texto de UITextField inputTextField
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
function register(){
$password = $_GET['password'];
$username = $_GET['username'];
$salt = getenv('SALT');
$hash = hash_pbkdf2('sha256', $password, $salt, 100000);
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando la variable de entorno SALT
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
import hashlib, binascii
def register(request):
password = request.GET['password']
username = request.GET['username']
salt = os.environ['SALT']
dk = hashlib.pbkdf2_hmac('sha256', password, salt, 100000)
hash = binascii.hexlify(dk)
store(username, hash)
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando la variable de entorno SALT
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
...
salt=io.read
key = OpenSSL::PKCS5::pbkdf2_hmac(pass, salt, iter_count, 256, 'SHA256')
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando el texto de salt
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
...
@IBOutlet weak var inputTextField : UITextField!
...
let salt = (inputTextField.text as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let saltPointer = UnsafePointer<UInt8>(salt.bytes)
let saltLength = size_t(salt.length)
...
let algorithm : CCPBKDFAlgorithm = CCPBKDFAlgorithm(kCCPBKDF2)
let prf : CCPseudoRandomAlgorithm = CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256)
CCKeyDerivationPBKDF(algorithm,
passwordPointer,
passwordLength,
saltPointer,
saltLength,
prf,
100000,
derivedKeyPointer,
derivedKeyLength)
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad podrá manipular la sal utilizada para derivar la clave o la contraseña modificando el texto de UITextField inputTextField
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
...
salt = getenv("SALT");
password = crypt(getpass("Password:"), salt);
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta función podrá manipular la sal utilizada para aplicar hash a la contraseña modificando la variable de entorno SALT
. Además, este código utiliza la función crypt()
, que no debería emplearse para el hash criptográfico de las contraseñas. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
salt := r.FormValue("salt")
password := r.FormValue("password")
...
sha256.Sum256([]byte(salt + password))
}
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad puede manipular sal utilizada para aplicar hash a la contraseña modificando la variable de entorno salt
. Además, este código utiliza la función hash criptográfico Sum256
, que no debería emplearse para hashes criptográficos de contraseñas. Una vez distribuido el programa, resulta muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado determinó sal de un hash de contraseña.
...
Properties prop = new Properties();
prop.load(new FileInputStream("local.properties"));
String salt = prop.getProperty("salt");
...
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
return digest.digest(password.getBytes("UTF-8"));
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta función podrá manipular la sal utilizada para aplicar hash a la contraseña modificando la propiedad salt
. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado o no sal del hash de la contraseña.
import hashlib, binascii
def register(request):
password = request.GET['password']
username = request.GET['username']
salt = os.environ['SALT']
hash = hashlib.md5("%s:%s" % (salt, password,)).hexdigest()
store(username, hash)
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta función podrá manipular la sal utilizada para aplicar hash a la contraseña modificando la variable SALT
. Además, este código utiliza la función hash criptográfico md5()
, que no debería emplearse para hashes criptográficos de contraseñas. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
...
salt = req.params['salt']
hash = @userPassword.crypt(salt)
...
Example 1
se ejecutará correctamente, pero cualquier persona con acceso a esta función podrá manipular la sal utilizada para aplicar hash a la contraseña modificando el parámetro salt
. Además, este código utiliza la función String#crypt()
, que no debería emplearse para el hash criptográfico de las contraseñas. Una vez que se haya distribuido el programa, puede resultar muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado ha determinado la sal de un hash de contraseña.
let saltData = userInput.data(using: .utf8)
sharedSecret.hkdfDerivedSymmetricKey(
using: SHA256.self,
salt: saltData,
sharedInfo: info,
outputByteCount: 1000
)
Ejemplo 1
se ejecutará correctamente, pero cualquier persona con acceso a esta funcionalidad puede manipular sal utilizada para derivar la clave de cifrado modificando el valor userInput
. Una vez distribuido el programa, resulta muy difícil deshacer un problema relacionado con sal controlada por el usuario, dado que probablemente no habría forma de saber si un usuario malintencionado determinó sal de un hash de contraseña.
...
String seed = prop.getProperty("seed");
Hashing.murmur3_32_fixed(Integer.parseInt(seed)).hashString("foo", StandardCharsets.UTF_8);
...
Example 1
se ejecuta correctamente, pero cualquier persona con acceso a esta funcionalidad puede manipular el valor de inicialización utilizado para aplicar hash a la contraseña modificando la propiedad seed
. Una vez que se haya distribuido el programa, puede resultar difícil deshacer un problema relacionado con valores de inicialización controlados por el usuario, dado que no puede saber si un usuario malintencionado ha determinado o no el valor de inicialización del hash de la contraseña.