Di recente è uscita una advisory di Okta, un provider di autenticazione molto usato. Qui il link
https://trust.okta.com/security-advisories/okta-ad-ldap-delegated-authentication-username
Sostanzialmente erano vulnerabili in quanto utilizzano la funzione hash bcrypt
ma non controllavano la lunghezza dell’input.
La funzione bcrypt
accetta un massimo numero di bytes. Questo numero dipende anche dalle specifiche implementazioni, ma al massimo è possibile avere 72 bytes. Qui un thread di interesse
Per provare in pratica questa cosa si può utilizzare il seguente codice nodeJS
const bcrypt = require('bcrypt');
const saltRounds = 10;
bcrypt.genSalt(saltRounds, function(err, salt) {
bcrypt.hash("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPASSWORD1", salt, function(err, hash) {
console.log(hash);
});
bcrypt.hash("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPASSWORD2", salt, function(err, hash) {
console.log(hash);
});
});
Per testare il codice serve npm
npm init
npm install bcrypt
node init.js
Entrambe le computazioni di hash danno lo stesso risultato, anche se l’input è diverso. Questo in quanto tutti i caratteri dopo il 72-esimo sono ignorati.
$2b$10$Rk5ClxwQSRynUKzBzdSaV.Xlywc5nDOBhlisNJ.ci3NUXIG5TJLI2
$2b$10$Rk5ClxwQSRynUKzBzdSaV.Xlywc5nDOBhlisNJ.ci3NUXIG5TJLI2
Quindi, state attenti se implementate una logica di auth utilizzando bcrypt
. Ci sono due possibili strategie per sistemare questo problema:
- Effettuare dei controlli sulla lunghezza di username e password imponendo dei controlli di lunghezza massima (questo potrebbe diminuire sicurezza delle password però)
- Altrimenti è possibile effettuare un pre-processamento dell’input con un’altra funzione hash, sempre crittograficamente forte, che abbia un digest < 72 bytes. Tipo sha256sum.
Ad esempio in Okta calcolavano bcrypt(userId + username + password)
, si poteva fare invece bcrypt(sha256(userid + username + password))
, sempre considerando il salt.
Ho fatto un video sul canale inglese in cui parlo della stesa cosa.