Подтвердить что ты не робот

Подписывается ли подписание кода без сильного имени, чтобы ваше приложение было открыто для злоупотреблений?

Попытка разобраться в подписи под псевдонимом и сильном названии.

Я правильно понимаю, что если я подкодирую код exe, ссылающийся на несколько dll (не сильно названных), что вредоносный пользователь может заменить мои DLL и распространять приложение так, как будто он подписан мной, но работает их код?

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

Причина, по которой я не уверен, заключается в том, что ни одна из статей, которые я нашел в Интернете (включая документ MSDN об использовании SN + Authenticode), похоже, не упоминает об этом, и кажется, что это довольно важный момент для понимания (если я правильно поняли)?

4b9b3361

Ответ 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-объекты, помеченные как "безопасные" и встроенные в браузер, должны быть подписаны и пронумерованы так, как если бы они были исполняемыми. Подписание кода также может быть полезно при проверке внешних зависимостей без загрузки сборки или отражения ее атрибутов.

Ответ 2

Как только кто-то может заменить dll или запустить код на вашей машине, существует много гарантий, предоставленных вам. В моем случае все Dll имеют код, подписанный индивидуально. Мой код отказывается загружать Dll, которые не подписаны как часть самообновления. Однако любое приложение, работающее на моем уровне целостности или выше в моей системе (в случае >= Vista Windows), все еще может вставлять dll в мой exe с чем-то вроде CreateRemoteThread и т.д. (Http://www.codeguru.com/Cpp/WP/dll/article.php/c105) Но опять же, если предположить, что кто-то может получить внешний код в систему, это сложная часть. Остальное легко.

Ответ 3

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

Вот почему многие популярные библиотеки не называют имя dll

Ответ 4

После поиска того же и чтения многих вещей. Я, наконец, могу ответить на ваш вопрос: "Да, сильное имя для зависимостей необходимо, если вы собираетесь подписывать свое приложение exe."

Предположим, что если ваши зависимости не имеют сильного имени. И они заменяются. Ваше приложение будет загружать их без каких-либо проблем. И пользователь увидит диалог "Verified Publisher: Your Name". Хотя исполняемый файл был нетронутым, но изменения были изменены.

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