Содержание статьи
Что такое Tally.ERP 9
Несмотря на более чем сомнительное описание, Tally.ERP 9 достаточно популярный в Индии продукт с более чем двумя миллионами пользователей. С учетом размера целевой аудитории, Tally — одно из самых популярных решений такого рода в Индии.
Неудивительно, что индийская полиция обратилась к разработчикам «Элкомсофт» с просьбой взломать защищенное хранилище Tally.ERP 9. В таких случаях мы стараемся не просто взломать конкретную базу данных, а добавить поддержку соответствующего формата в один из наших продуктов. Именно по этому сценарию и начали развиваться события.
Каким образом обычно шифруют документы и внутренние базы данных? Как правило, компании действуют без огонька. В качестве алгоритма шифрования выбирают AES с ключом длиной 128, 192 или 256 бит. Ключ шифрования данных Media Encryption Key (MEK) создается одним из стандартных криптографически стойких алгоритмов генерации случайных чисел, после чего этот ключ шифруется ключом шифрования ключа шифрования Key Encryption Key (KEK). KEK, в свою очередь, генерируется на основе комбинации пароля пользователя и соли с помощью одной из стандартных хеш-функций (чаще всего это SHA-1, SHA-256 или SHA-512). Стойкость алгоритма усиливается увеличением числа итераций хеш-функции; нам попадались варианты от 10 тысяч итераций (это очень быстрый перебор) до миллиона (соответственно, перебор очень медленный) включительно. Если упростить до предела, для того чтобы добавить поддержку нового формата, нам нужно просто определить, каким именно алгоритмом хеширования воспользовался производитель, найти число итераций и место, куда сохраняется соль.
В случае с Tally.ERP 9 все пошло не так.
Шифрование Tally Vault
В состав Tally.ERP 9 входит реализация безопасного хранилища под названием Tally Vault. Шифрование в ERP 9 опциональное; пароль задавать совершенно не обязательно. Пароль хранилища можно задать как при создании компании, так и в любой момент после этого.
Когда пользователь задает пароль, система создает новое, защищенное хранилище. Старое, незащищенное, остается; впоследствии пользователь может его удалить. Для нас же эта схема чрезвычайно удобна: зашифрованную копию хранилища можно напрямую сравнить с незашифрованной.
Вот как выглядит выбор компании, если есть и зашифрованная, и незашифрованная версия данных.
Данные в последних версиях Tally.ERP 9 по умолчанию сохраняются в c:\Users\Public\Tally.ERP9\Data\(1nnnn)
.
Зашифрованы будут все файлы с расширением .900, размер которых превышает 512 байт. Основной файл хранилища — Company.900
. В этом файле сохраняется информация о пользователях, если включена опция Use security control. Вот как выглядит этот файл в hex-редакторе до шифрования.
А вот так — после.
Формат файла
Файл логически разбит на секторы/страницы по 512 байт. В начале каждой страницы записаны четыре байта контрольной суммы (CRC). При проверке блока на целостность вычисляется CRC остальных 512 – 4 байт и сравнивается с первыми четырьмя байтами.
Ключ шифрования
Ключ шифрования получается из пароля напрямую; никакой соли и тем более разделения на Media Encryption Key и Key Encryption Key здесь нет. Индийские разработчики решили не полагаться на существующие криптографические преобразования и создали свой собственный вариант, настоящий кошмар криптографа.
Все алгоритмы хеширования без исключений гарантируют, что изменение всего одного бита в хешируемой последовательности приведет к сильнейшему изменению в хеше. Индийским разработчикам удалось сделать невероятное: они создали хеш-функцию, в которой при небольшом изменении пароля результат тоже меняется очень незначительно. Более того, у нас создалось впечатление, что при определенных условиях этот хеш можно обратить, получив из него оригинальный пароль (разумеется, если энтропия пароля не превышает энтропии его контрольной суммы). Вишенка на торте: преобразование применяется ровно один раз.
К примеру, вот так выглядят ключи шифрования на основе паролей, в которых попарно различается один символ:
Пароль | Ключ | |
---|---|---|
pwd1 | 0x653C68AC 0x4BA84BA8 | (ac 68 3c 65 a8 4b a8 4b) |
pwd2 | 0x653C69A7 0x4BA84BA8 | (a7 69 3c 65 a8 4b a8 4b) |
password1 | 0x74258DD3 0x57CE36D7 | (d3 8d 25 74 d7 36 ce 57) |
password2 | 0x90A78DD3 0xB34C36D7 | (d3 8d a7 90 d7 36 4c b3) |
password12345678 | 0xC6C57C3D 0xE52EC739 | (3d 7c c5 c6 39 c7 2e e5) |
password12345679 | 0xC6C51936 0xE52EA232 | (36 19 c5 c6 32 a2 2e e5) |
qwertyui123456789 | 0xD15D72DD 0x06309E8D | (dd 72 5d d1 8d 9e 30 06) |
qwertyuj123456789 | 0xD15D4D77 0x0630A127 | (77 4d 5d d1 27 a1 30 06) |
Алгоритм шифрования
Страницы шифруются алгоритмом, принцип работы которого сильно напоминает обычный DES. Для шифрования используется 64-битный ключ (который во время работы разворачивается в расширенный 128-битный, как и у настоящего DES). Шифрование блочное, размер блока — привычные для алгоритма DES 64 бита. Алгоритм используется в режиме CBC с первоначальной инициализацией IV нулями.
Напомню, DES (Data Encryption Standard) — алгоритм симметричного шифрования, утвержденный правительством США в 1977 году в качестве официального стандарта. В 2001-м от использования DES отказались; ему на смену пришел привычный нам алгоритм AES. Что заставило индийских разработчиков взять за основу принципы работы именно этого алгоритма — для нас загадка, но если ставку сделали на «никто не догадается», то они ошиблись.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»