Поделиться через


Общие сведения о подписи исполняемого файла

В Windows цифровая подпись файла может храниться в подписи каталога, внедренной подписи или обоих. Подписи каталога — это файлы, содержащие подписи для одного или нескольких других файлов, а внедренные подписи хранятся в структурах, зависящих от формата файла, которые позволяют внедрять подпись в байтах самого файла. Например, формат файла переносимого исполняемого файла Windows (PE) позволяет внедрить таблицу сертификатов в раздел каталога данных; Данные подписи содержат хэши подписанных компонентов кода файла.

Вычисления подписи

Определенные байты, защищенные сигнатурой файла, зависят от пакета интерфейса субъекта (SIP), используемого для создания и последующей проверки подписи для заданного типа файла. Инфраструктура подписывания Windows расширяема, что позволяет сторонним сторонам регистрировать дополнительные SI-адреса для поддержки подписывания дополнительных типов файлов за пределами форматов, входящих в состав Windows.

В случае типов файлов, для которых не установлен SIP, все содержимое файла может быть хэшировано (как в случае текстового файла) и сохранено в файле каталога.

Для типов файлов, поддерживаемых SIP, таких как выполнимые файлы Windows Portable (PE), SIP может исключить некоторые разделы файла из вычисления хэша и может хранить результирующую сигнатуру в самом файле или в отдельном каталожном файле. В файле Windows PE цифровые подписи могут быть "встроены" в расположение, указанное записью в Таблице сертификатов необязательных каталогов данных заголовка. При использовании Authenticode для подписи файла PE Windows алгоритм, вычисляющий хэш-значение файла, исключает определенные поля PE. При внедрении подписи в файл процесс подписи может изменять эти поля, не затрагивая хэш-значение файла.

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

Последствия для безопасности

SIP поставщика доверия издателя программного обеспечения для PE-файлов хэширует исполняемое содержимое файла, но обязательно пропускает контрольную сумму файла (которая изменяется при внедрении подписи) и каталог таблицы сертификатов (который заполняется подписями файла во время подписи).

Тот факт, что SIP поставщика доверия издателя программного обеспечения не хэширует все байты файла (т. е. это не "хэш неструктурированных файлов") при вычислении подписи означает, что можно внедрить дополнительное содержимое в подписанный PE-файл без нарушения подписи. Например, некоторые службы внедряют метаданные в уже подписанные установщики программного обеспечения, сохраняя метаданные в области заполнения PKCS#7 в структуре WIN_CERTIFICATE, добавляя непроверенные атрибуты в подпись или добавляя дополнительную подпись, подписанную самоподписанным сертификатом. Каждый из этих методов представляет риск. Хотя внедренное содержимое не является прямым исполняемым, уязвимое приложение может неправильно ожидать, что оно будет надежным (так как остальная часть файла правильно подписана) и действует над ним.

Эта возможность использования внедрения без подписи была использована в атаках, начиная с 2013 года, что привело к введению EnableCertPaddingCheck переопределения реестра для CVE-2013-3900. Если параметр EnableCertPaddingCheck DWORD присутствует и установлен в 1, WinVerifyTrust проверит, что все байты PKCS#7 в структуре WIN_CERTIFICATE имеют значение 0. Если найдены другие значения, SIP сочтет подпись недействительной.

Заметки о подписях каталога

Проверка подписи каталога не поддерживает каждый SIP. При проверке подписанного каталогом файла SIP загружается только для подписывания и проверки типов PE и CAB-файлов. Другие типы файлов подписываются и проверяются с помощью хэша плоского файла.

Включение ключа реестра EnableCertPaddingCheck не влияет на оценку WinVerifyTrust для файла PE, подписанного каталогом. Если исполняемый файл подписан с использованием каталога, встроенная подпись не проверяется, поэтому заполнение сертификата не оценивается на наличие непредвиденного содержимого, даже если установлен ключ реестра EnableCertPaddingCheck.

Предостережения при использовании подписи кода Authenticode