Как мы исследовали исходные тексты


Наиболее свежие исходники, доступные к началу нашего проекта, принадлежали PGP версии 6.5.8. Из этого исходного кода могут быть получены любые варианты Windows-версии PGP 6.5.8 (как бесплатные, так и коммерческие) путём установки нужных параметров сборки. Исходники новейшей на сегодня версии 7.0 недоступны, но эти версии довольно похожи. В начале проекта мы ожидали выпуска исходных кодов PGP 7.0, но теперь очевидно, что это едва ли когда-нибудь случится.

Программа написана на языке C. Чтобы изготовить Windows-версию вам понадобятся Microsoft Visual C 6.0, несколько дополнительных утилит (SDK разработчика ПО и драйверов Windows), а также пара сторонних приложений (вроде InstallShield). С помощью исходного кода можно собрать целиком весь продукт, в свою очередь состоящий из ряда компонентов. Главный компонент, реализующий всю криптография — это pgpsdk.dll. Было установлено, что он может быть собран, не прибегая к какому-либо стороннему ПО, которым мы просто не располагали. Мы дезассемблировали скомпилированный файл, поставляющийся в дистрибутиве, и скомпилированный лично нами, и обнаружили между ними множество расхождений. Наибольшие различия можно объяснить разными настройками компиляторов, тогда как менее значительные могли быть обусловлены какими-то произвольными вариациями решений на этапе сборки. Мы считаем, что скорее всего NAI распространяет реальный исходный код PGP, а не "исходники без закладок". Заметьте, что каждый может найти в исходниках те же ошибки, что и в объектном коде.

Мы отказались от установки сторонних программ, поскольку не собирались учиться с ними работать.

Работая на C, принято разбивать код на множество небольших файлов. Файлы с расширением .c содержат основную часть кода, а в одноимённых файлах с расширением .h содержатся объявления из соответствующих модулей C, которые необходимы где-то ещё. Файлы обоих типов включают в себя множество комментариев — дополнительного текста, который игнорируется компилятором, но помогает в понимании программы. Комментарии в .h-файлах обычно разъясняют назначение кода, а комментарии в файлах .c описывают происходящее на данном участке кода. Большинство комментариев представляют собой лишь краткие ремарки, но некоторые файлы содержат подробные истории о базовых идеях PGP. Зачастую комментарии отсылают к статьям и работам (как в случае с [12][link1]), на которых основан данный код.

Первоначальный план заключался в том, чтобы прочитать исходный код от начала до конца, попутно проверяя и глубже исследуя всё, что отклоняется от нормы. Это бы привело к обнаружению множества багов.

Однако, чтение исходников оказалось не столь простым, как мы ожидали. Программа содержит 1620 файлов C-кода и заголовков, суммарно занимающих 15 Мб. Большинство из этих файлов вовсе не имеют дела с криптографией. И хотя исходный текст снабжён комментариями, читать его обычно не весело. Язык C — не из числа самых продвинутых: он позволяет писать быстрые высокоэффективные программы, но не обеспечивает той же степени понятности исходного кода, как другие языки программирования.

Методика, к который мы прибегли взамен доскональному прочтению кода, — поиск наиболее интересных фрагментов, больших комментариев, особых ключевых слов и проверка вызываемых методов и процедур, эти методы вызывающих. Утилита WinGrep от Хава Миллингтона оказала нашим поискам неоценимую помощь.

Назад[link2] | Дальше[link3]

Ссылки
[link1] http://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bibliografija#b12

[link2] http://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bagiataki/mnozhestvennyeid

[link3] http://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/analizishodnogokoda/upravleniepamjatjju