Хуки

Хук crypto: обнаружение слабой криптографии

Проверьте кодовую базу на слабые криптографические примитивы или оцените отдельный фрагмент из командной строки.

Хук crypto помечает слабые криптографические примитивы в месте вызова: устаревший шифр, небезопасный режим или взломанную хеш-функцию. Он учитывает язык и читает каждый файл по его собственным правилам, поэтому конструкция Python никогда не помечается в файле Rust. Это детерминированный движок, стоящий за специализацией crypto, и вы можете запускать его сами в режиме scan или check.

Запуск​

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

Сканирование выводит до двух разделов. Weak cryptography found содержит находки (DES/3DES/RC4/Blowfish/RC2, режим ECB): каждая из них представляет собой взломанный примитив шифрования, поэтому хук завершается с ненулевым кодом. Cryptography to review manually содержит поводы для проверки, которые хук не может оценить сам: хеш MD5 или SHA-1 (непригоден для целей безопасности, но законен как обычная контрольная сумма, поэтому решает намерение), некриптографический генератор случайных чисел в контексте безопасности или сравнение, уязвимое к атакам по времени. Если ничего не найдено, выводится no weak cryptography found.

Как читать вердикт​

ВердиктЗначение
weakФрагмент использует взломанный примитив шифрования (DES/3DES, RC4, Blowfish, RC2 или режим ECB).
reviewПримитив, зависящий от намерения: хеш MD5 или SHA-1 либо некриптографический генератор случайных чисел в контексте безопасности.
safeФрагмент использует криптографию, и слабых примитивов не найдено.
invalidВо фрагменте нет узнаваемой криптографической конструкции, которую можно оценить.

Параметры CLI​

ПараметрЗначениеОписание
--patternфрагмент кодаПроверяет один фрагмент. Повторите, чтобы проверить несколько, по одному вердикту на строку.
--langязыкОбязателен с --pattern: один из javascript, python, go, java, kotlin, php, ruby, rust, csharp, c, cpp.
--dirдиректорияОграничивает сканирование директорией. Можно повторять и сочетать с --file.
--fileфайлОграничивает сканирование одним файлом. Можно повторять и сочетать с --dir.

Без параметров хук сканирует весь проект. --pattern требует --lang и не сочетается с --dir или --file.

Поддерживаемые языки​

Сканирование читает эти языки, определяя их по расширению файла, и проверяет каждый по его собственным криптографическим API.

ЯзыкСлабые шифры (находка) и хеши или генераторы случайных чисел (проверка)
JavaScript / TypeScriptcreateCipher, CryptoJS.DES/RC4, *-ecb в кавычках; 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()
По мере возможностей, а не исчерпывающе

Хук читает исходный код как текст, поэтому примитив, собранный во время выполнения, спрятанный за псевдонимом или записанный в нераспознаваемой форме, может проскользнуть. Считайте таблицу надежной отправной точкой, а не полной инвентаризацией.

подсказка

Хук гарантирует минимум (эти конструкции существуют): управление ключами, повторное использование IV и паддинг RSA остаются вопросами суждения, которые по-прежнему охватывает специализация crypto.

Частые вопросы

Запустите хук crypto без флага. Взломанные шифры и режим ECB считаются находками и дают ненулевой код выхода. Хеш MD5 или SHA-1 считается поводом для проверки, поскольку он непригоден для целей безопасности, но законен как обычная контрольная сумма.

Только как повод для проверки в контексте безопасности и никогда как автоматическую находку, поскольку случайность законна для джиттера или порядка элементов в интерфейсе.