Generarea și gestionarea incertă a funcţiilor hash în KirbyCMS Starterkit

kirby-locked-logo
Postat pe 2018-06-27

Recent, în timpul unui test de penetrare cu cutie albă, realizat pentru unul dintre clienții noștri, am descoperit mai multe probleme de securitate legate de relativ popularul KirbyCMS (Starterkit). Vulnerabilitățile nu reprezintă vreun fel de preocupare majoră de securitate, dar sunt considerate a fi o practică defectuoasă și pot duce ulterior (în unele cazuri) la o vulnerabilitate mai severă legată de aceasta.

Vulnerabilitățile descoperite sunt următoarele:

Generarea și gestionarea nesigură a funcţiilor hash;
Posibilitatea atacurilor asupra sincronizării proceselor;
Nivel insuficient de entropie pentru metoda QuickRandom () (metodă de rezervă);
1. Generarea și gestionarea incertă a funcţiilor hash
 

Kirby CMS utilizează bcrypt drept funcție hash. În timp ce bcrypt în sine este o alegere bună, implementarea sa în acest caz este nesigură și nepractică. Mai jos este prezentat un fragment din codul sursă.

kirby/vendor/getkirby/toolkit/lib/password.php

public static function hash($plaintext) { $salt = substr(str_replace('+', '.', base64_encode(sha1(str::random(), true))), 0, 22); return crypt($plaintext, '$2a$10 . $salt); }
Există câteva probleme legate de cod şi acestea sunt prezentate mai jos, după cum urmează:

Semnătura bcrypt $2a$ este depreciată din cauza atacurilor high-bit. În ciuda faptului că este extrem de dificilă executarea unui astfel de atac, acesta reprezintă totuşi o vulnerabilitate. Acest lucru este specificat şi în documentația PHP.
Factorul de cost este ferm codificat în codul sursă (rounds of blowfish encryption = 2cost factor). Aceasta este valoarea după semnătura $10$. În acest fel, este posibil ca un cost mai mare să nu fie preluat decât dacă a fost modificat manual.
Valoarea „salt” este generată utilizând o funcție personalizată, care are un nivel scăzut de entropie, ceea ce face previzibilă generarea valorii „salt”. În PHP7 +, parametrul pentru specificarea unei valori „salt” este depreciat din cauza preocupărilor legate de securitate.
Am măsurat nivelul de entropie pentru mai mulți timpi de rulare, iar valoarea medie de entropie rezultată este 2.569, care este extrem de scăzută pentru utilizarea în criptografie, într-un limbaj de nivel înalt, cum ar fi PHP.

Rezultatele, la o limită recomandată de 11, sunt afișate mai jos.

Chiar și atunci când se definesc funcții de rezervă se recomandă utilizarea unei funcții criptografic securizate. Exemple de astfel de elemente sunt random_int (), random_bytes (). O asumpţie generală este că toate funcțiile care derivă din entropia bazei de date subiacente sunt considerate securizate din punct de vedere criptografic.

2. Posibilitatea atacurilor asupra sincronizării proceselor
 

Începând cu versiunea 2.1+, Kirby CMS (starterkit) implementează un algoritm de timp non-constant (! = O(1)) pentru compararea funcţiei hash în cadrul clasei Password.

Sursă: vendor/getkirby/toolkit/lib/password.php:

class Password { ... /** * Verifică dacă o parolă corespunde funcţiei hash criptată * * @param string $plaintext * @param string $hash * @return boolean */ public static function match($plaintext, $hash) { return crypt($plaintext, $hash) === $hash; } }
Timpul de execuție pentru un algoritm non-constant folosit în comparație logică depinde liniar de numărul de biți "1" din șir. În timp ce numărul de biți "1" reprezintă aproape insuficientă informație pentru a face posibilă găsirea șirului de retur bool (adevărat), execuțiile repetate cu aceiași (primi) biți și diferite intrări pot fi folosite pentru a efectua analiza de corelare statistică a informațiilor de sincronizare pentru recuperarea completă a valorii bool (adevărată), chiar și de către un atacator pasiv.

Un exemplu elementar este prezentat mai jos, unde a fost înregistrată o diagramă cu trei încercări de timp de funcționare. Observând datele, în coloana Medie apare un model, unde se poate observa un timp mai îndelungat de procesare pentru cel de-al 11-lea bit al testului nostru. Acest lucru ar însemna că bitul 11 este lungimea cea mai probabilă a valorii bool (true) (parola cu funcţie hash în acest caz).

Kirby (Starterkit) CMS este open-source și poate fi auditat în mod liber de orice terță parte. Acesta ar reprezenta un risc de securitate în anumite circumstanțe și, coroborat cu un tip de atac de căutare exhaustiv, ar putea conduce la preluarea contului și la posibilitatea de creștere a privilegiilor.

3. Nivel insuficient de entropie pentru metoda QuickRandom() (metodă de rezervă)
 

Metoda quickRandom() este o metodă de rezervă care se utilizează pentru a genera valori criptografice securizate, bazându-se pe faptul că acestea ar fi suficient de aleatoare pentru a nu fi ghicite. Cu toate acestea, metoda quickRandom() are la bază funcții PHP care nu trebuie utilizate în scopuri criptografice:

public static function quickRandom($length = false, $type = 'alphaNum') { if(!$length) $length = rand(5, 10); $pool = static::pool($type, false); // catch invalid pools if(!$pool) return false; return substr(str_shuffle(str_repeat($pool, $length)), 0, $length); }
Funcţiile utilizate aici sunt substr(), str_shuffle(), str_repeat(). În documentele PHP se remarcă în mod explicit că str_shuffle() nu trebuie utilizat la generarea de valori sigure criptografic:

Atenţie

Această funcție nu generează valori securizate criptografic și nu trebuie utilizată în scopuri criptografice. Dacă aveți nevoie de o valoare criptografică sigură, luați în considerare utilizarea, în schimb, a random_int(), random_bytes(), sau openssl_random_pseudo_bytes() .

 

Dacă utilizați KirbyCMS Starterkit, vă recomandăm să faceți upgrade la pretendentul publicat pe 27 iunie 2018. Mai multe informații pot fi găsite pe site-ul oficial al vânzătorului: https://getkirby.com/changelog/kirby-2-5-11

Comentarii

Nu există încă comentarii publicate.

Adaugă comentariu