Как подпись со строгим именем защищает от подделки набора сборок? - PullRequest
6 голосов
/ 01 февраля 2011

Подпись со строгим именем (пара ключей, хранящаяся в файле .snk) предназначена (среди прочего) для защиты от подделки сборок .

Например: я отправляю свою сборку, подписанную строгим именем, затем какой-то другой разработчик использует мою сборку, и теперь его сборка содержит ссылку на мою, упоминая открытый ключ моей пары ключей. Какой-то пользователь устанавливает эту сборку разработчика и мою сборку и с радостью использует код этого разработчика. Если кто-то еще попытается создать сборку, которая выглядит как моя версия, и убедить пользователя, что это «обновление, которое стоит установить», то поддельная сборка не будет загружаться, потому что я контролирую свою пару ключей, и эта поддельная сборка не подписана той же парой ключей , Хорошо, круто.

Но что мешает злоумышленнику подделать мою сборку и эту зависимую сборку другого разработчика и "отправить" их обоих? Они берут мою сборку и сборку этого разработчика, подделывают обе, подписывают поддельную версию моей сборки любым ключом, затем добавляют ссылку на нее в поддельную версию зависимой сборки, подписывают ее также и затем отправляют обе. Я имею в виду, что «отгрузка» двух сборок не должна быть намного сложнее, чем «отгрузка» одной сборки.

Как подпись со строгими именами защищает от подделки нескольких сборок?

Ответы [ 2 ]

5 голосов
/ 01 февраля 2011

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

Например, если EXE является доверенным и хочет загрузить известную DLL из известного местоположения (например, GAC, сетевой ресурс, Интернет и т. Д.), Это можно сделать, используя строгое имя с некоторым уровнем уверенность в том, что сборка не была подделана.

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

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

То же самое касается Authenticode и подписи драйверов. Мы все видели продукт, который инструктирует пользователей «игнорировать предупреждение системы безопасности». Это в основном то, что сделал бы EXE, если бы проверка строгого имени была отключена или подписи были удалены из всего набора сборок - это игнорировало бы предупреждение.

0 голосов
/ 01 февраля 2011

Strong Naming - это все, ну ... "naming" . Я цитирую здесь: Использование строгих подписей

«Сильные имена предлагают мощный механизм для предоставления сборкам .NET Framework уникальных идентификаторов.»

Это все, что вы когда-либо получите от этого механизма. Это означает, что я могу подделать вашу сборку и все сборки, на которые она ссылается, но я не смогу притвориться, что «вы это сделали» Я не смогу притвориться, что вы являетесь издателем этих сборок.

...