Hooki

Hook crypto: Wykrywanie słabej kryptografii

Przeszukaj bazę kodu pod kątem słabych prymitywów kryptograficznych albo oceń pojedynczy fragment kodu z wiersza poleceń.

Hook crypto zgłasza słabe prymitywy kryptograficzne bezpośrednio w miejscu wywołania: przestarzały szyfr, niebezpieczny tryb albo złamaną funkcję skrótu. Rozpoznaje język i czyta każdy plik według jego własnych reguł, więc nigdy nie zgłosi konstrukcji z Pythona w pliku napisanym w Rust. Jest deterministycznym silnikiem stojącym za specjalizacją crypto, a ty możesz go uruchomić samodzielnie w trybie scan lub check.

Uruchamianie​

npx lagune read crypto # scans the whole project
npx lagune read crypto --dir src # scans a directory
npx lagune read crypto --file hash.ts # scans a single file

Skanowanie wypisuje do dwóch sekcji. Sekcja Weak cryptography found zawiera ustalenia (DES/3DES/RC4/Blowfish/RC2, tryb ECB): każde z nich to złamany prymityw szyfrujący, więc hook kończy działanie z niezerowym kodem wyjścia. Sekcja Cryptography to review manually zawiera wskazówki, których hook nie potrafi ocenić sam: skrót MD5 lub SHA-1 (złamany do zastosowań związanych z bezpieczeństwem, ale uzasadniony jako zwykła suma kontrolna, więc decyduje intencja), niekryptograficzny generator liczb losowych w kontekście bezpieczeństwa albo porównanie podatne na ataki czasowe. Gdy nic nie znajdzie, wypisuje no weak cryptography found.

Jak czytać werdykt​

WerdyktZnaczenie
weakFragment kodu używa złamanego prymitywu szyfrującego (DES/3DES, RC4, Blowfish, RC2 lub trybu ECB).
reviewPrymityw, którego ocena zależy od intencji: skrót MD5 lub SHA-1 albo niekryptograficzny generator liczb losowych w kontekście bezpieczeństwa.
safeFragment kodu korzysta z kryptografii i nie znaleziono w nim słabego prymitywu.
invalidFragment kodu nie zawiera rozpoznawalnej konstrukcji kryptograficznej, którą można by ocenić.

Opcje CLI​

OpcjaWartośćOpis
--patternfragment koduSprawdza jeden fragment kodu. Powtórz opcję, aby sprawdzić kilka, po jednym werdykcie na wiersz.
--langjęzykWymagana z --pattern: jeden z javascript, python, go, java, kotlin, php, ruby, rust, csharp, c, cpp.
--dirfolderZawęża skanowanie do folderu. Można ją powtarzać i łączyć z --file.
--fileplikZawęża skanowanie do jednego pliku. Można ją powtarzać i łączyć z --dir.

Bez żadnej opcji przeszukuje cały projekt. Opcja --pattern wymaga --lang i nie można jej łączyć z --dir ani --file.

Wybierz, co przeszukuje​

Pomija to, co Git ignoruje. Aby pominąć więcej albo przeszukać to, co Git ignoruje, nadaj hookowi crypto własne ustawienia:

npx lagune write add --ignore test/fixtures --checker crypto
{
"checkers": {
"crypto": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

Wszystkie ustawienia opisuje strona Konfiguracja hooków.

Obsługiwane języki​

Skanowanie czyta te języki, rozpoznając je po rozszerzeniu pliku, i sprawdza każdy pod kątem jego własnych API kryptograficznych.

JęzykSłabe szyfry (ustalenie) oraz skróty i generatory liczb losowych (do przeglądu)
JavaScript / TypeScriptcreateCipher, CryptoJS.DES/RC4, *-ecb w cudzysłowie; MD5/SHA-1 createHash/subtle.digest; Math.random()
Pythonpycryptodome DES/ARC4/Blowfish.new, algorithms.TripleDES, MODE_ECB; hashlib.md5/sha1; random.*
Godes.NewCipher, rc4.NewCipher, blowfish.NewCipher, NewECBEncrypter; md5/sha1.Sum; math/rand
Java / KotlinCipher.getInstance("DES"/…/ECB"); MessageDigest.getInstance("MD5"), HmacMD5; java.util.Random
PHPopenssl_encrypt("des-…"/"…-ecb"), mcrypt_*; md5()/sha1(), hash("md5", …); rand()/mt_rand()
RubyOpenSSL::Cipher.new("des-…"), :ECB; Digest::MD5/SHA1; rand()/Random
RustRc4::, Blowfish::, des::, ecb::; Md5::, Sha1::, Hmac<Md5>; SmallRng/XorShiftRng
C#DES/TripleDES/RC2.Create, CipherMode.ECB; MD5/SHA1.Create, HMACMD5; new Random()
C / C++OpenSSL DES_*/RC4/EVP_des_*, EVP_*_ecb; MD5()/SHA1(), EVP_md5; rand()/random()
W miarę możliwości, bez gwarancji kompletności

Hook czyta kod źródłowy jako tekst, więc może przeoczyć prymityw składany w czasie działania programu, ukryty za aliasem albo zapisany w formie, której nie rozpoznaje. Traktuj tabelę jako solidny punkt wyjścia, a nie pełną inwentaryzację.

wskazówka

Hook gwarantuje minimum (że te konstrukcje występują w kodzie): zarządzanie kluczami, ponowne użycie IV i padding RSA wymagają oceny, którą nadal zapewnia specjalizacja crypto.

Najczęściej zadawane pytania

Uruchom hook crypto bez żadnej opcji. Złamane szyfry i tryb ECB to ustalenia, przy których hook kończy działanie z niezerowym kodem wyjścia. Skrót MD5 lub SHA-1 to wskazówka do przeglądu, bo jest złamany do zastosowań związanych z bezpieczeństwem, ale uzasadniony jako zwykła suma kontrolna.

Tylko jako wskazówkę do przeglądu w kontekście bezpieczeństwa, nigdy jako automatyczne ustalenie, bo losowość jest uzasadniona przy jitterze albo przy ustalaniu kolejności elementów w interfejsie.