Парсинг файлов


В главе об OpenPGP[link1] мы показали, что формат файлов, реализованный в PGP, довольно сложен. Баг в кодировке ASCII[link2] дал понять, что в процессе чтения данных может случиться много непредсказуемого. По этим причинам мы исследовали исходный код, ответственный за чтение файлов. Парсинг файлов — постоянно плодородная почва для поиска проблем безопасности: программисты привычно пишут парсеры, рассчитывающие на корректный ввод и делающие лишь то, что им в таком случае положено делать, тогда как обычно парсер применяется на любом вводе, и это его первостепенная задача — убедиться, что ввод корректен. Это особенно справедливо, когда правила, по которым сформирован ввод, не имеют чёткого определения: формат OpenPGP допускает множество любопытных комбинаций пакетов, но сам PGP при этом производит только вполне определённые комбинации.

Рассматриваемый код находится в директории /libs/pgpcdk/priv/keys/keys.

Сеть доверия


Код, связанный с Сетью доверия, находится в pgpRngMnt.c. Файл содержит код, реализующий три модели доверия. Модель 0 — это модель из ранних версий PGP. Модель 1 — это приближение полной модели: полная модель очень тяжела в вычислительном плане, поэтому данный код отбрасывает комплексные пути и возвращает немного заниженный показатель доверия 1 по сравнению с реальным. Модель 2 реализует полную модель Маурера с лимитом глубины (просчитываются пути до 10 степеней разделения) и, если нужно, другими ограничениями. По умолчанию используется модель 2, но я допускаю, что для очень больших связок ключей может применяться и модель 1.

Вот один из комментариев в файле:



Мне это показалось настолько странным, что, начав разбираться в смысле написанного и ставить эксперименты, я выявил описанную ранее атаку на множественные ID[link3]. Баги, на которых базируется атака, никак не связаны с кодом из данного файла, однако этот комментарий демонстрирует, что вся концепция множественных ID слишком сложна, и на нескольких этапах в коде приходится делать выбор между двумя из возможных методик. В этом случае анализ исходного кода привёл к обнаружению ошибок, что показывает важность такого инструмента исследований.

Ууу, двоичное сообщение PGP


Файл /pgpsrc/libs/pgpcdk/priv/crypto/pipe/file/pgpprsasc.c содержит баг[link2], обнаруженный Крисом Энли, и ошибка происходит в районе строк, помеченных следующим образом:



Этот файл огромен (3500 строк кода), и, глядя на исходник, трудно понять, что именно там происходит. Для парсинга нескольких частей, из которых может состоять ASCII-кодированное сообщение PGP, он реализует конечный автомат.

Назад[link4] | Дальше[link5]


1 У автора. Вероятно, здесь имелся в виду "показатель достоверности", который вычисляют модели на основе данных о доверии, — прим. пер.

Ссылки
[link1] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/formatfajjlovpgp

[link2] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bagiataki/bagascii

[link3] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bagiataki/mnozhestvennyeid

[link4] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/analizishodnogokoda/upravleniepamjatjju

[link5] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/analizishodnogokoda/asimmetrichnoekripto