Почему сборки со строгими именами не могут использовать сборки без подписи?

Чтобы подписать сборку A, вы должны убедиться, что все сборки B, C, D, которые используются A, подписаны, а затем все сборки, которые используются B, C, D и так далее. Я не понимаю, в чем преимущество этого для безопасности. Я думаю, что это должно предотвратить подделку, но сборке A разрешено открывать любой файл, и они могут быть подделаны. То же самое и с внешним веб-сервером.

Кроме того, слишком легко подписать сборку с помощью файла .snk, который вы публикуете, в обход требования.


person Bruno Martinez    schedule 15.05.2009    source источник
comment
слишком легко подписать сборку с помощью файла .snk, который вы делаете общедоступным: так что не делайте свой файл snk общедоступным ...   -  person Marc Gravell    schedule 15.05.2009
comment
Я имел в виду это как обходной путь к требованию транзитивности. Я считаю, что это не так просто; отсутствие требования транзитивности было бы проще и равносильно тому же.   -  person Bruno Martinez    schedule 15.05.2009
comment
Эрик Липперт недавно писал об этом в блоге: blogs .msdn.com / ericlippert / archive / 06.04.2009 /   -  person Marc Gravell    schedule 05.06.2009


Ответы (3)


Дело в том, что иначе вы могли бы заменить сборку B / C / D на другую (взломанную), и A никогда бы не заметил; он загрузит их и выполнит код. С сильным именованием вы не можете сделать это без повторной подписи взломанного B / C / D тем же ключом или взлома A.

person Marc Gravell    schedule 15.05.2009
comment
Вы не смогли бы заменить B / C / D, если бы они были подписаны, только если бы они не были. Это звонок А. - person Bruno Martinez; 15.05.2009
comment
Но сейчас это работает не так. A не может решить, зависит от B / C / D со знаком или без него. Они должны быть подписаны, потому что А. - person Bruno Martinez; 15.05.2009
comment
Это НЕ призыв А. Это звонок клиента А. Если клиент A доверяет A, A не может изменить ситуацию и отбросить доверие с помощью ненадежных сборок. Если вы доверяете мне свой секрет, тогда я должен давать секрет только тем людям, которым доверяю, ради ВАС. - person Lucas; 05.06.2009
comment
Для информации, Эрик Липперт совсем недавно написал об этом в блоге: blogs.msdn.com/ericlippert/archive/2009/06/04/ - person Marc Gravell; 05.06.2009

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

ИЗМЕНИТЬ

Пример сценария: если вы помещаете сборку в GAC, она должна иметь строгое имя, чтобы обеспечить параллельное управление версиями. Однако вы не могли бы поместить его в GAC, если бы его зависимости не были там (иначе они не загрузились бы во время выполнения). Чтобы эти сборки загружались надежно, они также должны иметь строгие имена и в GAC.

person user96705    schedule 15.05.2009
comment
да. Я согласен, что сильное именование имеет свои преимущества. Я не вижу преимущества требования транзитивности. - person Bruno Martinez; 15.05.2009

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

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

person kemiller2002    schedule 15.05.2009
comment
Вы можете перезаписать обычные файлы, от которых зависит сборка A, или поддельные веб-серверы, к которым она подключается. Возможно, A собирает исполняемый код из этих источников, и риск для безопасности такой же. Это призыв A использовать неподписанные сборки и открываться для атак. Обратите внимание, что A уже может это сделать: просто подпишите B ключом и сделайте его общедоступным. Это просто неудобно. - person Bruno Martinez; 15.05.2009