Эксперименты над устройством

В устройстве DS1991 объем энергонезависимой памяти составляет 1152 бита. Вся энергонезависимая память разбита на три блока по 384 бита (48 байт) в каждом, которые называются подключами. Каждый подключ защищен независимым восьмибайтовым паролем. Только при указании правильного пароля можно получить доступ и прочитать сохраненные в области подключа данные. При указании неправильного пароля устройство DS1991 возвратит 48 байт случайных данных, пытаясь предотвратить сравнение полученных данных с известными константами. В рекламных материалах компании Dallas Semiconductor (www.ibutton.com/software/softauth/feature.html) утверждается, что «запись в устройство DS1991 ложных паролей автоматически включает встроенный в устройство генератор случайных чисел, который выдает ложные ответы. Тем самым устраняются попытки преодоления системы защиты c помощью подбора подходящих образцов. В обычных системах защиты устройств эта возможность не реализована».

При помощи программного обеспечения iButton-TMEX (www.ibutton.com/software/tmex/index.html), в состав которого входит программа iButton Viewer, позволяющая анализировать устройство iButton и подключения к ним, было выяснено, что возвращаемые при вводе неправильного пароля данные на самом деле вовсе не случайные. Оказывается, они вычисляются на основе введенного пароля и постоянного блока данных, который записан в устройстве DS1991. На рисунке 14.12 показаны значения данных устройства DS1991. Обратите внимание на одинаковые значения, которые были возвращены подключами Subkey IDs 1 и 2 при вводе неверного пароля «hello».

Рис. 14.12. Просмотр данных устройства DS1991 при помощи программы iButton Viewer

Возвращаемые данные никак не связаны с правильным паролем, который хранится во внутренней памяти устройства DS1991. Постоянный блок данных, который является массивом размером в 12 Кб из 256 элементов по 48 байт в каждом, на самом деле содержит одни и те же данные для всех устройств DS1991 и не имеет никакого отношения к данным, хранимым в подключевых областях памяти. Это означает, что в ответ на любой введенный символ (1 байт = 256 возможностей) устройство iButton возвращает 48-байтовый уникальный ответ. Для определения данных константного блока компания Dallas Semiconductor написала тестовую программу (основанную на примере программы TDS1991.c, ftp://ftp.dalsemi.com/pub/auto_id/softdev/tds1991.zip), которая 256 раз перебирает однобайтовый пароль в пределах от 0x00 к 0xFF и записывает ответ, полученный по последовательному порту устройства. Далее потребовалось решить достаточно трудную задачу по определению возвращаемых величин при вводе более длинных паролей. Если можно было бы предварительно вычислить возвращаемое значение при попытке ввода неверного пароля, то стало бы возможным определить, был ли введен правильный пароль, поскольку при вводе правильного пароля устройство DS1991 возвратит фактические данные, сохраненные в области подключа, а не величину, возвращаемую при вводе неверного пароля.

Из-за ограниченности быстродействия устройства DS1991 и быстродействия шины его однопроводного интерфейса время транзакции при каждой попытке ввода пароля ограничено 0,116 с. Поэтому нельзя атаковать устройство способом грубой силы, перебирая всевозможные значения пароля в 64-битном ключевом пространстве. Только на перебор печатных символов ASCII потребовалось бы около 22 406 645 лет. Но успешная атака со словарем из обычно используемых паролей вполне возможна.

Реинжиниринг «случайного» ответа

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

Пусть A_j – j-ый байт восьмибайтового пароля A (в случае, если длина пароля меньше 8 байт, то остаток области пароля дополняется до 8 байт константами 0x20)

Пусть B_k – k-ый байт 12 Кб константного блока B (массива из 256 48 байтовых элементов)

Пусть C_m – m-ый байт C 48-байтового кода возврата устройства (инициализированного константами 0x00)

for (j = 0; j < 8; ++j) // For each remaining character in p/w

{

for (m = 0; m < 48; ++m) // For each byte in the response

{

if (m + j < 48) // Catch overflow above 48-bytes long

{

k = A_j; // Perform a look-up into the constant block

// based on the jth byte of the password

C_(m + j) ^= B_k; // XOR the response with the value

// of the constant block (shifted

// j bytes)

}

}

}

В случае если последний символ пароля (A_7) является числом со знаком (значение символа больше величины 0x7F), предпринимается дополнительный шаг. В этом случае предварительно вычисленное значение подключа складывается по модулю 2 (выполняется операция XOR) со значением другого константного блока, представленного в виде массива из 128 элементов по 48 байт каждый. Неясно, почему устройство iButton так делает. Возможно, чтобы еще больше запутать исследователя и добавить таинственности «случайному» ответу. Как видно из только что приведенного программного кода, константный блок используется для поиска 48-байтной строки для каждого байта введенного пароля. В случае ввода неправильного пароля для получения окончательного ответа каждая строка складывается по модулю 2 и возвращается устройством iButton. Для приведенного ниже примера рассмотрим использование пароля «hello» (дополненного до 8 символов байтом пробела 0x20) и вычислим 48 байт строки «неверного пароля». В целях экономии места рассмотрим только первые 16 байт результирующего 48-байтного кода возврата.

Пусть A = “hello ” = 68 65 6C 6C 6F 20 20 20

B_68 (“h”) = D8 F6 57 6C AD DD CF 47 CC 05 0B 5B 9C FC 37 93 ...

B_65 (“e”) = 03 08 DD C1 18 26 36 CF 75 65 6A D0 0F 03 51 81 ...

B_6C (“l”) = A4 33 51 D2 20 55 32 34 D8 BF B1 29 40 03 5C 9C ...

B_6C (“l”) = A4 33 51 D2 20 55 32 34 D8 BF B1 29 40 03 5C 9C ...

B_6F (“o”) = 45 E0 D3 62 45 F3 33 11 57 4C 42 0C 59 03 33 98 ...

B_20 (“ “) = E0 2B 36 F0 6D 44 EC 9F A3 D0 D5 95 E3 FE 5F 7B ...

B_20 (“ “) = E0 2B 36 F0 6D 44 EC 9F A3 D0 D5 95 E3 FE 5F 7B ...

B_20 (“ “) = E0 2B 36 F0 6D 44 EC 9F A3 D0 D5 95 E3 FE 5F 7B ...

D8 F6 57 6C AD DD CF 47 CC 05 0B 5B 9C FC 37 93 ...

03 08 DD C1 18 26 36 CF 75 65 6A D0 0F 03 51 ...

A4 33 51 D2 20 55 32 34 D8 BF B1 29 40 03 ...

A4 33 51 D2 20 55 32 34 D8 BF B1 29 40 ...

45 E0 D3 62 45 F3 33 11 57 4C 42 0C ...

E0 2B 36 F0 6D 44 EC 9F A3 D0 D5 ...

E0 2B 36 F0 6D 44 EC 9F A3 D0 ...

E0 2B 36 F0 6D 44 EC 9F A3 ...

Результирующий предварительно вычисленный код возврата складывается по модулю 2 со всеми вышерасположенными строками, сохраняя наиболее значащие 48 байт. Обратите внимание, что эта строка является шестнадцатеричным представлением «мусора» на рис. 14.12, который был возвращен в ответ на ввод неправильного пароля «hello»:

D8 F5 FB 26 4B 46 03 9B CC 2E 68 82 22 F7 F3 2B ...

Если вводится неверный пароль, то устройство DS1991 возвращает 48-байтную строку «неверного пароля», как это было продемонстрировано в нашем примере. При вводе одинаковых паролей предварительно вычисленное значение для любого устройства будет всегда одним и тем же. Поэтому если предварительно вычисленное значение совпадает с кодом возврата, возвращенным устройством DS1991, то введенный пароль неверен, а если не совпадает, то предполагаемый пароль – правильный. Так происходит из-за того, что устройство возвращает записанные в области подключа данные быстрее «случайных» данных, обычно возвращаемых при вводе неверного пароля.

Инструментарий демонстрации правильности идеи концепции вместе с исходным текстом доступен по адресу www.atstake.com/research/advisories/2001/ds1991.zip. Он отображает содержимое 12 Кб константного блока и демонстрирует возможность атаки со словарем на устройство DS1991 iButton. Демонстрационный пример выполняет следующие действия.

1. Находит устройство DS1991 iButton на определенном по умолчанию COM-порте.

2. Считывает входной файл, в котором записаны слова словаря атаки. Вычисляет предполагаемый 48-байтный код возврата устройства при вводе неверного пароля.

3. Выбрав в качестве пароля первое слово из словаря паролей, пытается прочитать данные подключевой области № 1. В случае успеха отображает защищенные данные из области подключа. В противном случае повторяется второй шаг с очередным словом из файла словаря.

Загрузка...