EdDSA. Исследуем криптоподпись и учимся с ней бороться
2024
Практический разбор распространённого, но малоизвестного алгоритма криптоподписи EdDSA + SHA-512. Каждый уважающий себя хакер обязан знать врага в лицо: EdDSA при широком использовании (I2P, OpenBSD, OpenSSH и др.), в отличие от своей эллиптической “сестры” ECDSA, сильно обделена реализациями в стандартных криптобиблиотеках — её можно найти разве что в узкоспецифических проектах (NaCl, SUPERCOP, python-ed25519). Сложностей добавляет и то, что каждый автор реализует хеширование и генерацию ключей/сигнатур по-своему.
Предмет исследования — приложение, при первом запуске скачивающее триальную лицензию с сервера (обнаруживается в реестре через ProcMon). В лицензии в понятном текстовом виде хранятся версия, ID оборудования, время начала и конца действия — можно править! Но в конце — поле signature: 64-байтовый (512-битный) блок в шестнадцатеричном виде. Замена любого байта в текстовой части или в самой сигнатуре делает лицензию невалидной — программа немедленно скачивает её заново. Первый пришедший в голову 512-битный хеш — SHA-512; его наличие подтверждает Krypto Analyzer при анализе исполняемого модуля, а IDA по предоставленному адресу показывает реальную инициализацию подсчёта SHA-512. Но контрольная сумма SHA-512 совершенно не похожа на значение signature — подпись считается иным способом.
Поиск проверки подписи. Программа на чистом C++, без защиты и антиотладчиков — проверка в x64dbg находится элементарно (в псевдокоде IDA). Финальную проверку выполняет функция, сравнивающая на тождественное равенство две 32-байтовые последовательности: первая — первые 32 байта сигнатуры, вторая — вычисляемое проверочное значение. Тревожный звоночек: “почему проверяется только первая половина сигнатуры — зачем тогда вторая?”. Попытка переподписать лицензию вычисленным значением (меняем байт в тексте, ставим breakpoint, подставляем новое значение вместо первых 32 байт сигнатуры) не работает: после замены значение снова меняется — первая половина сигнатуры входит в обе части криптоуравнения. Вторая половина тоже быстро находится — она является аргументом функций в цепочке головоломного расчёта проверочного значения.
Опознание алгоритма. Потыкавшись по функциям, характерного не обнаруживаем — лишь долгие вычисления, напоминающие операции с BigInteger (коими они и являются). Самой перспективной для анализа представляется конкретная функция в этой цепочке (в статье — с разбором её псевдокода и структур).
Это первая часть материала: далее в статье по шагам разбирается математика EdDSA (кривая, скалярные произведения, восстановление открытого ключа) и то, как в итоге корректно переподписать лицензию собственным ключом.
Это краткая аннотация статьи, полную версию читайте в первоисточнике.
Первоисточник: Журнал “Хакер” (xakep.ru), 2024
Эксперт: Редакционный эксперт
