Баг ASCII-кодировки


Эта ошибка была обнаружена в апреле 2001 года Крисом Энли, работающим в специализирующейся на компьютерной безопасности компании @stake[link1]. Вот как он сам характеризует проблему:

Открытие ASCII-кодированного файла (вроде открытого ключа или съёмной подписи) может привести к созданию в целевой системе произвольного файла. На Windows-платформах это способно повлечь исполнение произвольного кода.

Проблема заключается в том, что парсер ASCII-кодировки[link2] PGP может создавать временные файлы, и не удаляет их, если что-то непредсказуемое происходит при обработке ввода. Становится возможным создать такой (некорректный) ASCII-кодированный файл, который при двойном щелчке по нему заставит парсер кодировки записать на диск любой нужный вам файл, который так и останется в системе. Энли расширяет атаку, создавая на диске файл DLL. DLL-файл — это библиотека динамической компоновки, содержащая вызываемые программами подпроцедуры. Все приложения в Windows состоят из исполняемых .exe-файлов и файлов .dll. Если сохранённый файл имеет характерное имя, совпадающее с именем существующей легитимной DLL, допустим, с DLL, используемой программой Acrobat Reader, содержащийся в нём код будет исполняться всякий раз, когда пользователь открывает PDF-файл в том же каталоге.

Уязвимы версии PGP с 5.0 по 7.0.4. NAI выпустила патч, заставляющий PGP выдавать предупреждение, если временный файл остаётся на диске. Также он гарантирует, чтобы PGP использовал верные DLL, а не одноимённые DLL в текущем каталоге. Дополнительную информацию о баге можно найти на этой странице[link3]. Соответствующий файл исходного кода будет рассмотрен в следующей главе в разделе "Парсинг файлов"[link4].

Созданный Энли демонстрационный файл вовсе не ASCII-кодирован. Название "Баг ASCII-кодировки" получилось оттого, что именно парсер кодировки вызывает проблему. Демонстрационный файл, названный notes.doc.sig, содержит единственный пакет исходных данных. Он начинается так:



В первой строке af, или 10 1011 11, кодирует тип пакета (старый формат, десятичное обозначение типа 11, двухбайтовая длина), 30 c4 кодирует длину, а 70–6c 6c читается как pgpsc.dll. 00 завершает имя файла. Остальная часть поля нужна только для более длинных имён и в данном случае игнорируется. Крис Энли заполнил его произвольным именем и пробелами. Непосредственно данные начинаются с байта 4d (последняя строка), и всё, начиная с него и далее, копируется во вновь созданный файл с заданным именем. Файл pgpsc.dll — это враждебная замена одноимённого файла PGP, которая должна сверять все подписи как верные, даже если они неверны. (Правда, на моей машине она лишь приводит к выводу невразумительной ошибки от PGP.) Демонстрационный файл не в должной мере соответствует стандарту OpenPGP на формат пакета исходных данных, и именно это сбивает PGP с толку и заставляет сохранить временный файл.

Тот факт, что PGP использует DLL из текущей директории, — это ещё и баг PGP, но никак не криптографическая ошибка. Это известная компании Microsoft слабость Windows, и Microsoft на своём веб-сайте приводит решение для неё. А данная атака показывает, что надёжность PGP в значительной мере полагается на безопасность используемой операционной системы.

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

Ссылки
[link1] http://www.atstake.com

[link2] http://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/formatfajjlovpgp/ascii

[link3] http://www.atstake.com/research/advisories/2001/a040901-1.txt

[link4] http://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/analizishodnogokoda/parsingfajjlov

[link5] http://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/bagiataki/cheshskajaataka

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