Okta Advistory - Hashing con bcrypt

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:

  1. Effettuare dei controlli sulla lunghezza di username e password imponendo dei controlli di lunghezza massima (questo potrebbe diminuire sicurezza delle password però)
  2. 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.

1 Like