Ответ 1
Я правильно понимаю, что если я подкодирую код exe, ссылающийся на несколько dll (не сильно названных), что вредоносный пользователь может заменить мои DLL и распространять приложение так, как будто он подписан мной, но работает их код?
Да, если остальная часть DLL только подписана и не имеет сильного имени, они могут быть заменены без .NET, создающих исключение. Вы можете, внутри exe, проверить, что библиотеки DLL подписаны тем же ключом, что и exe. Ни один из этих подходов не позволяет кому-то заменить ваши библиотеки DLL или EXE.
Предполагая, что это правда, похоже, что вы действительно не хотите подписывать приложение .NET без сильного названия всего, иначе вы даете людям возможность выполнять код под прикрытием приложения, которое вы написали?
В общем, я полагаю, что это "лучшая практика", но опять-таки вы ничего не препятствовали. Как только пользователь имеет право изменять файлы в локальной системе, вы не можете сделать это, чтобы остановить их от злонамеренной активности.
Существует несколько технологий обфускации, которые строят полные .NET-проекты в один exe, что может сделать "самый безопасный" подход, но все же может быть подделано.
Реальный вопрос: что вы пытаетесь помешать им? Я хочу сказать, почему кто-то заинтересован в замене вашей dll? На что они надеются достичь, какова их цель? Если вы пытаетесь запретить кому-либо читать конфиденциальную информацию из процесса, в котором вы находитесь, это долгий трудный путь разочарования. Предположим, что злонамеренная сторона имеет полный доступ к вашему исходному коду и каждой части информации, используемой вашим процессом, потому что они это делают. Предположим, что они могут заменить весь или часть вашего кода по своему усмотрению, потому что они могут.
Обновление
Таким образом, переадресация привязки будет работать только с узлами с сильным именем с одним и тем же ключом и, следовательно, защитит вас от изменяемых DLL?
Исправить, с отмеченным исключением, что инъекция кода все еще может быть выполнена различными способами.
... и вернемся к исходному вопросу, действительно ли подписание кода без сильного названия подрывает точку подписи кода?
Не совсем. Подписание кода (не сильное именование) имеет две различные цели:
- Аутентификация. Проверка того, кто является автором программного обеспечения.
- Integrity. Проверка того, что программное обеспечение не было подделано с момента его подписания.
Часто это выполняется только при аутентификации и проверке. Именно поэтому мы подписываем наш setup.exe, чтобы гарантировать, что клиент получил от нас немодифицированный установщик. Они запрашиваются с помощью "Доверяете ли вы компании XXXX" и тем самым предоставляют авторизацию аутентифицированному/подписанному установщику. После установки, однако, мало встроенного использования подписи кода ОС (за исключением драйверов и некоторых других неясных случаев).
Сильное Именование на другом имеет совершенно другую цель для его существования. Он полностью сосредоточен на "целостности" приложения. Отсутствует сертификат, нет полномочий подписи (CA), чтобы проверить его, нет информации, отображаемой пользователем, для подтверждения, и ни одна ОС не может проверить исполняемый файл, который он будет запускать.
.NET framework использует сильные имена для многих вещей, все они я категоризирую как целостность приложения:
- Содержимое dll/exe имеет подписанный хэш, поэтому его нельзя подделать.
- Каждая ссылка должна быть сильной и подтверждена при загрузке зависимостей.
- Абоненты могут быть зарегистрированы в GAC, и могут использоваться политики издателей.
- Собственные изображения могут быть ngen'd для создания скомпилированного изображения сборки IL.
Я уверен, что есть другие вещи, которые мне здесь не хватает, но это основное использование, о котором я знаю.
Рекомендации по подписке и сильному наименованию
- Использовать подписанный установщик
- Использовать исполняемый код с кодовым названием
- Использовать исполняемый файл с сильным именем
- Сильное имя всех зависимостей и ссылок на них
- Зависимости подписи кода обычно не требуются *
- Учитывайте регистрацию сборок GAC во время установки
* Примечание. Подписание кода может быть полезно в некоторых случаях для DLL, например, COM-объекты, помеченные как "безопасные" и встроенные в браузер, должны быть подписаны и пронумерованы так, как если бы они были исполняемыми. Подписание кода также может быть полезно при проверке внешних зависимостей без загрузки сборки или отражения ее атрибутов.