id: Гость   вход   регистрация
текущее время 09:18 18/09/2019
создать
просмотр
редакции
ссылки

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


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


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

Сеть доверия


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


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



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

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


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



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


Назад | Дальше



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


 
Комментариев нет [показать комментарии/форму]
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3