С другой стороны, чип может оказаться по своей сложности сравнимым с небольшим микропроцессором или встроенной вычислительной системой. В последнем случае для определения соответствия между входными и выходными сигналами методом проб и ошибок потребуется рассмотреть слишком много комбинаций. Вполне возможно, что во встроенной системе окажутся аналоговые компоненты (например, динамик), которые сведут на нет все попытки установления закономерностей двоичной логики.
С образцами подобных устройств можно познакомиться по адресу www.parallaxinc.com/html_files/products/Basic_Stamps/module_bs2p.asp. Parallax производит семейство чипов со встроенным интерпретатором BASIC, отличающихся различными комбинациями входных и выходных интерфейсов. Главная сложность подобного устройства заключается в том, что число его состояний заведомо больше, чем можно перечислить. Даже крошечный компьютер с небольшим количеством памяти может сгенерировать бесконечно большое число неповторяющихся результатов. В качестве простого примера представьте себе компьютер на одном чипе, который складывает большие целые числа. Все, что он может сделать, – это выполнить простую программу добавления 1 к введенному числу и вывести результат. Вероятно, исследователь быстро определит, что на компьютере выполняется простая программа сложения чисел, но определить другие возможности компьютера практически невозможно. Иными словами, ничего нельзя сказать о том, является ли это устройство компьютером общего назначения или оно выполняет единственную функцию.
Сложно найти закономерность при исследовании систем методом «черного ящика». Но некоторые извлекают пользу из этого. Закономерности могут быть найдены случайно или в результате активных исследований. Прежде чем попытаться скрыть какую-либо закономерность, следует удостовериться в том, что число вариантов ее проявления достаточно велико. Конкретный пример приведен в статье по адресу www.casinoguru.com/features/0899/f_080399_tocatch.htm. В статье говорится o жуликоватом технике игорных автоматов, который заменил чип в некоторых автоматах. В результате каждый раз при вбрасывании определенной последовательности монет в автомат и дерганья за ручку автомат выплачивал джек-пот. Речь идет об основных приемах «зашивки» в программы «секретных» недокументированных сообщений!
Если из результатов исследования и доступной информации непонятно, что это за чип, то вскройте его! Вскрыть чип? Именно так. Исследователям защитного корпуса таких устройств, как смарт-карты (smart card – кредитная карточка с микропроцессором), известно много способов их изучения, включая выжигание корпуса чипа кислотой и исследование его структуры под микроскопом. Подробнее эти вопросы освещены в главе 14.
Итак, если исследователь с помощью метода «черного ящика» не может разобраться с устройством чипа, то он должен вскрыть его. Опыт посещения автором копий обсидиана (вулканического стекла) в Аризоне наглядно демонстрирует это. Если держать обсидиан на расстоянии вытянутой руки, то он выглядит как черный камень. Но при ярком свете обсидиан становится немного прозрачнее. Таким образом, он не вполне «черный ящик», а скорее в той или иной степени прозрачный «ящик из обсидиана». Другими словами, у исследователя всегда есть возможность получить информацию о решаемой задаче.
Резюме
Методологии поиска уязвимости часто используют принципы аудита безопасности систем. Изучение исходного текста программ начинается с выявления потенциально небезопасных функций, например strcpy и sprintf. Другой способ заключается в тщательной построчной экспертизе исходного текста программы в соответствии с логикой ее работы. Анализ различий – еще один способ поиска уязвимостей, при котором широко применяется утилита diff. Утилита diff, сравнивая две версии программы, позволяет найти внесенные в программу исправления. При исследовании выполнимого кода программы применяются различные средства: программы трассировки, отладчики, анализаторы, а также аудит документации.
Аудит исходного текста программы предполагает поиск потенциально опасных функций и применение методологии построчного аудита. В этой главе были рассмотрены примеры, демонстрирующие переполнение буфера при использовании функций strcpy, sprintf, strcat и gets. Были рассмотрены такие ошибки проверки входных данных, как уязвимость форматирующей строки функции printf и функции open в программе, написанной на языке Perl. Также был рассмотрен пример конкуренции программ за ресурсы и сопутствующая ей ошибка условия гонок на примере функции mktemp.