id: Гость   вход   регистрация
текущее время 19:51 28/03/2024
создать
просмотр
редакции
ссылки

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


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


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

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


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


Созданный Энли демонстрационный файл вовсе не 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 в значительной мере полагается на безопасность используемой операционной системы.


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


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