2011-02-01 15 views
5

Podpisanie z silną nazwą (keypair przechowywane w pliku .snk) jest (między innymi) przeznaczone na protect against forging assemblies.W jaki sposób podpisywanie pod silną nazwą chroni przed tworzeniem zestawu złożeń?

Na przykład: Wysyłam moje zgłoszenie podpisane silną nazwą, następnie jakiś inny programista używa mojego zestawu, więc jego zestaw zawiera teraz odniesienie do mojego, wspominając o kluczu publicznym mojego klucza. Niektórzy użytkownicy instalują ten zestaw deweloperski i mój zespół iz przyjemnością używają kodu tego dewelopera. Jeśli ktokolwiek spróbuje wyprodukować zestaw wyglądający jak moja wersja i przekonać użytkownika, że ​​jest to "aktualizacja warta instalacji", to podrobiony montaż nie zostanie załadowany, ponieważ kontroluję mój klucz i ten sfałszowany montaż nie jest podpisany za pomocą tego samego klucza. . Ok spoko.

Co jednak powstrzymuje złośliwą stronę przed wykuwaniem zarówno mojego zespołu, jak i tego zależnego zespołu innego programisty i "wysyłania" ich obu? Chwytają mój zespół i ten zespół dewelopera, manipulują obydwoma, podpisują fałszywą wersję mojego zespołu za pomocą dowolnego klucza, a następnie dodają do niego odwołanie do sfałszowanej wersji zespołu zależnego, podpisują go również, a następnie wysyłają oba. Mam na myśli złośliwie "wysyłanie" dwóch zestawów nie powinno być dużo trudniejsze niż "wysyłka" jednego zestawu.

W jaki sposób podpisywanie z silnymi nazwami chroni przed fałszowaniem wielu zespołów?

+0

Cóż, mocne imię również tego zespołu. Ciągnij ten ciąg, a skończysz na EXE. Jeśli atakujący może to również zastąpić, nie ma sensu używanie silnych nazw. –

+0

@Hans Passant: Chyba masz rację.Czy możesz dodać to jako odpowiedź? – sharptooth

Odpowiedz

5

Mocne nazewnictwo zespołu nie ma na celu ochrony podpisanego zespołu. Ma on chronić drugi zespół, który ładuje podpisany zespół.

Na przykład, jeśli plik EXE jest zaufany i chce załadować znaną bibliotekę DLL ze znanej lokalizacji (takiej jak GAC, udział sieciowy, internet itd.), Może to zrobić, używając silnej nazwy z pewnym poziomem pewność, że montaż nie został naruszony.

Ale jeśli cały zestaw złożeń zostanie zdemontowany, a następnie ponownie złożony i ponownie podpisany, to tak, masz rację, że można po prostu ponownie napisać linie kodu, które ładują pozostałe zespoły, tak aby ładuje je nowym (fałszywym) kluczem.

Ale ten rodzaj ingerencji byłby oczywisty. Innymi słowy, silne podpisywanie nazw zapewnia wyraźne dowody manipulacji, ale nie zapobiega mu we wszystkich przypadkach. Dodajmy do tego fakt, że administrator lokalny może całkowicie wyłączyć silną weryfikację nazwy (w celu "rozwoju") i oczywiste jest, że silne podpisywanie nazw nie jest kuloodpornym mechanizmem bezpieczeństwa.

To samo dotyczy podpisu Authenticode i kierowcy. Wszyscy widzieliśmy produkt, który poleca użytkownikom "zignorować ostrzeżenie o zabezpieczeniach". Zasadniczo to, co zrobiłby EXE, gdyby silna weryfikacja nazwy była wyłączona lub cały zestaw złożeń był pozbawiony sygnatur - byłoby ignorowanie ostrzeżenia.

0

Silne Nazewnictwo to wszystko, cóż ... "Nazywanie". Cytuję stąd: Using Strong Name Signatures

"Silne nazwy oferują potężny mechanizm zapewniający niepowtarzalne tożsamości zestawów .NET Framework."

To wszystko, co dostaniesz z tego mechanizmu. Oznacza to, że mogę wykuć twoje zgromadzenie i wszystkie zgromadzenia, do których się odwołuje, ale nie będę w stanie udawać, że "to zrobiłeś". Nie będę mógł udawać, że jesteś jednym z wydawców tych zespołów.

+0

Problemem, który widzę, jest to, że cała infrastruktura nie obejmuje publikowania klucza publicznego. Załóżmy, że pobieram zestaw i chcę się dowiedzieć, czy to od ciebie. Jak mogę to zrobić? – sharptooth

+0

@sharptooh - Jest kilka rzeczy, które możesz zrobić z nowym interfejsem ICLRStrongName (http://msdn.microsoft.com/en-us/library/dd409349.aspx), na przykład StrongNameCompareAssemblies, ale jeśli dodasz tego rodzaju kontrole W Twojej aplikacji połączenia mogą być również fałszywe :-) –

+0

Tak, dokładnie, a problem polega na tym, że nie ma centralnego sposobu, w jaki mógłbyś opublikować swój klucz publiczny. Dzieje się tak dlatego, że cały mechanizm nie służy do sprawdzania, czy zgromadzenie pochodzi od Ciebie - służy tylko do sprawdzenia, czy wszystkie kolejne wersje pochodzą od tego samego wydawcy, co wersja początkowa. – sharptooth

Powiązane problemy