Об одной ошибке

от автора

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

Скажу сразу, что себя я квалифицированным специалистом в области криптографии не считаю. Я имел дело с криптоалгоритмами, когда ситуация не оставляла мне другого выбора. Безусловно, было-бы лучше, если-бы этими работами занимался кто-то более разбирающийся в вопросе, но так получилось, что заниматься ими пришлось мне. В любом случае, я надеюсь, что мой рассказ будет интересен.

Эта история произошла в середине 90-х годов. Я учился на 4-ом курсе КАИ, попутно подрабатывая на кафедре ПМ. Помню, что я писал что-то на FoxBase для одного из местных «свечных заводиков», совместно с несколькими сотрудниками института. Сама работа на кафедре способствовала тому, что я постоянно был на виду и, в один прекрасный момент, мне предложили поучаствовать в новом проекте, связанным с разработкой «железа», занимающегося криптографией. Разумеется, я согласился.

Конечно, все было не так просто

Мне дали задание. Подробно рассказали о разработанном Устройстве и попросили подготовить его описание для надвигающейся выставки. За одну ночь работы в институте (дома у меня тогда никакого компьютера, конечно, не было), на Turbo Pascal-е с ассемблерными вставками я подготовил «презентацию» с EGA-видеоэффектами, кучей текста и картинками, нарисованными Line-ами и Fill-ами. Потенциальный Работодатель слегка офигел от проявленного мной трудолюбия и вопрос о моем трудоустройстве был решен положительно.

Наша группа состояла из пары вполне квалифицированных криптологов, электронщиков и программистов. Я, как молодой специалист, занимался HAL-ом. Ничего особенного, C++ и немного x86-го ассемблера. В последующем, мы, всей группой, весьма удачно трудоустроились в РЦИ НБ РТ.

Вот как выглядело одно из наших изделий (ISA-карта со съемным ключем):

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

Соединялось все следующим образом:

Внутри ключа располагалась обычная ПЗУ-шка:

При выполнении шифрования, из ПЗУ, по заданному адресу в Устройство считывались 16 байт ключа (подряд), после чего, на основании этого ключа и случайной синхропосылки, генерировалась гамма, используемая для шифрования. Сам ключ на ПК никогда не передавался.

Не помню уже кому пришло в голову (возможно, что и мне), что если выбирать ключ из ПЗУ не подряд, а побайтно (управляя выборкой каждого байта), то, при помощи всевозможных перестановок, ключей можно получить значительно больше. Это была действительно ужасная идея. Тихо и незаметно в архитектуре аппаратно-программного комплекса образовалась дыра, позволяющая программно читать содержимое всего ПЗУ ключа.

Подробности

Получить содержимое ПЗУ при наличии возможности побайтной загрузки ключа действительно легко. Например, чтобы определить значение любого байта адресного пространства ключа, достаточно сформировать ключ, состоящий из 16 байт, загруженных с одного и того-же адреса. Затем, на этом ключе, нужно зашифровать любую заранее выбранную последовательность (например последовательность нулей).

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

К счастью, эта уязвимость была вовремя замечена и устранена, но несколько устройств пришлось переделывать.

Этой небольшой статьей я хочу предостеречь Читателя от легкомысленного отношения к вопросам, связанным с криптографией. Криптография коварна и уязвимости легко могут возникнуть там, где их меньше всего ждешь. Вместе с тем, я не призываю «не профессионалов» к отказу от использования криптографии, подобно тому как это делается в этой статье.

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

ссылка на оригинал статьи http://habrahabr.ru/post/181954/