Модифицируем подписанные библиотеки в .NETАлексей Бойко (alexeybbb@gmail.com) Задумался я тут над смыслом подписания компоновочных блоков .Net. Наверняка, ты тоже подписывал свои библиотеки, чтобы установить их в GAC. В ходе сегодняшнего расследования мы научимся изменять подписанные сборки, не обладая исходниками и секретными ключами. Приватные сборкиПри подписании библиотеки (назначении строгого имени) открытый ключ записывается в манифест. Таким образом, чтобы внести изменения в чужую подписанную библиотеку, нужно просто заменить публичный ключ на свой. Или — еще проще — сделать новую сборку с таким же именем и подписать на своем ключе. При использовании библиотеки любой публичный ключ будет принят как доверенный. Проведем эксперимент, создадим небольшую библиотечку: Подпишем ее и добавим к проекту консольного приложения: Затем скомпилируем релиз проекта. С помощью .NET Reflector [1] и плагина Reflexil [2] отредактируем IL-код подписанной библиотеки (signedLib.dll), так что GetNumber() будет возвращать не «1», а «2». Консольное приложение не заметило подмены и вывело «2». Вывод: подменить/изменить приватную сборку со строгим именем очень просто. Другие сборки, ссылающиеся на измененную, никак на это не реагируют, несмотря на то, что они были скомпилированы с оригинальной. Обращаю внимание, что речь идет именно о приватных сборках, со сборками в GAC дело обстоит иначе. Сборки в GACКак мы только что убедились, подписанные приватные компоновочные блоки можно легко модифицировать. При этом необязательно обладать ни исходниками, ни секретным ключом, ни правами администратора. Сборки, устанавливаемые в GAC, должны иметь так называемое строгое имя. Сборка получает строгое имя в момент ее подписания. Идентификаторы сборок в GAC дополняются параметрами публичного ключа, подписи проверяются. Замуровали, демоны! Что же это получается? Окружили со всех сторон:
Тем не менее, не нужно быть криптографом, чтобы все же изменить библиотеку в GAC. Требуется всего лишь обладать правами администратора и знать параметры утилиты sn.exe (страдальцы, не имеющие Студии, вручную используют стандартную утилиту sn.exe для подписания компоновочных блоков). Итак, возьмем проект уже знакомой библиотеки signedLib.dll (смотри выше). Подпишем ее и установим в GAC.
Добавим референс к консольному приложению changeKey.exe. Компилируем релиз, убеждаемся, что в папке с программой нет файла signedLib.dll (это значит, что сборка будет загружена из GAC). Запускаем changeKey.exe - приложение показывает «1». С этого момента воображаем себя атакующими - у нас нет исходников, нет секретного ключа. Но надо, чтобы метод GetNumber() возвращал не 1, а 2. Структуру файлов ниже C:\Windows\assembly проводник Windows не показывает. Создадим псевдодиск, на который будет проецироваться нужный каталог:
В проводнике появился диск B. .Net сборки попадают в папку GAC_MSIL; находим нужную папку (ее название совпадает с названием .dll файла). Внутри будет еще одна папка, а в ней, наконец, signedLib.dll. Копируем signedLib.dll на рабочий стол. После правки IL-кода и сохранения изменений программа сообщит о том, что цифровая подпись нарушена и предложит варианты дальнейших действий. Нажимаем «Remove Strong Name» - удалить цифровую подпись. Закрываем сборку (теоретически закрывать сборку нет необходимости и нам должен подойти вариант «Register it for verification skipping», однако у меня эта операция заканчивается ошибкой; к тому же, в обучающих целях лучше проделать все операции вручную). Теперь у нас есть:
Осталось установить ее в GAC. Для этого воспользуемся механизмом отложенной подписи. Если сборка содержит информацию о публичном ключе, но не имеет цифровой подписи – говорят, что она имеет отложенную подпись (придумал это какой-то надмозг из Майкрософт «с целью тестирования»). Сделать такую сборку с помощью .NET Reflector не составляет никакой сложности - нужно заполнить соответствующие поля, они выделены желтым на рисунке «Параметры публичного ключа» (помнишь, мы копировали их значения в блокнот?). И не забудь поставить галочку «HasPublicKey» (в теории публичный ключ нужно извлекать из секретного с помощью утилиты sn.exe и потом с помощью нее же создавать отложенную подпись). Чтобы отключить проверку подписи dll на данном компьютере, нужно воспользоваться sn.exe:
Удаляем оригинальную сборку из GAC:
И устанавливаем измененную:
Радуемся, глядя на выведенную gacutil.exe надпись:
Вот мы и добились желаемого - изменили библиотеку, установленную в GAC. Чтобы еще раз порадоваться (и проверить результат), запускаем наше приложение changeKey.exe, которое в начале статьи выводило 1. Ура, теперь он покажет 2! Подведем итогСамое время подвести итог нашим сегодняшним свершениям. Сделаем это по пунктам:
Чтобы изменить сборку в CAG, нужно:
Для реализации шагов 5-7 нужно обладать правами администратора. Вот и все! На этом позволь откланяться и пожелать тебе огромных творческих узбеков на ниве исследований программного обеспечения. DVDУпомянутый в статье софт и некоторые дополнительные ништяки от автора ты можешь найти на нашем диске. INFOДля комфортного чтения статьи нужно обладать базовыми знаниями в области криптографии с открытым ключом. |