2011-12-19 23 views
21

Staram się zrozumieć problem z kodowaniem i silnym nazywaniem kodu źródłowego.Czy podpisywanie kodu bez silnego nazewnictwa pozostawia otwartą aplikację na nadużycia?

Mam rację myśląc, że jeśli podpisze kod exe, który odwołuje się do kilku bibliotek dll (nie silnych nazwanych), że złośliwy użytkownik może zastąpić moje biblioteki DLL i rozpowszechniać aplikację w sposób, który wygląda tak, jakby był podpisany przeze mnie , ale uruchamia swój kod?

Zakładając, że to prawda, wygląda na to, że nie chcesz podpisywać aplikacji .NET bez wyraźnego nazwania całości, w przeciwnym razie dajesz ludziom możliwość wykonywania kodu pod postacią aplikacji, którą napisałeś ?

Powodem, dla którego nie jestem pewien, jest to, że żaden z artykułów, które znalazłem w Internecie (w tym dokument MSDN o użyciu SN + Authenticode) nie wspomina o tym, i wydaje się, że jest to dość ważny punkt do zrozumienia (jeśli " właściwie zrozumiane)?

Odpowiedz

15

mam rację sądząc, że jeśli kod podpisać exe, który odwołuje się do kilku bibliotek DLL (nie silne nazwie), że złośliwy użytkownik może zastąpić mój DLL i dystrybucji aplikacji w taki sposób, że wydaje się jakby jest podpisany przeze mnie, ale uruchamia swój kod?

Tak, jeśli pozostała część biblioteki DLL są podpisane i nie tylko silne nazwie mogą być wymieniane bez NET podnoszenie wyjątek. Wewnątrz exe można sprawdzić, czy biblioteki DLL są podpisane tym samym kluczem co exe. Żadne z tych podejść nie uniemożliwia zastąpienia plików DLL lub EXE.

Zakładając, że to prawda, wydaje się, że nie bardzo chce podpisać aplikację .NET bez silnej nazywając całość, w przeciwnym razie jesteś dając ludziom możliwość wykonywania kodu pod przykrywką twoją aplikację?

Generalnie sądzę, że jest to „najlepsze praktyki”, ale znowu nie zapobiegły czegokolwiek. Gdy użytkownik ma prawo do zmiany plików w systemie lokalnym, niewiele można zrobić, aby powstrzymać ich przed złośliwą działalnością.

Istnieje kilka technologii obfuskacji, które budują kompletne projekty .NET w jednym exe, może to być "najbezpieczniejsze" podejście, ale wciąż może zostać zmienione.

Prawdziwe pytanie brzmi: co próbujesz im uniemożliwić? Mam na myśli powiedzieć, dlaczego ktoś byłby zainteresowany zastąpieniem biblioteki dll? Co chcieliby osiągnąć, jaki jest ich cel? Jeśli próbujesz uniemożliwić komuś czytanie wrażliwych informacji z procesu, w którym jesteś, czeka Cię ciężka droga rozczarowania. Załóżmy, że złośliwa strona ma pełny dostęp do Twojego kodu źródłowego i wszystkich informacji użytych w twoim procesie, ponieważ tak robią. Załóżmy, że mogą one zastąpić cały lub część twojego kodu, ponieważ mogą.

Updated

Więc wiązania przekierowanie działa tylko z zespołów silnej nazwie z tym samym kluczem, a zatem nie chroni cię od DLL zostanie zmieniona?

Zgadza się, z wyjątkiem zauważyć, że wstrzyknięcie kodu nadal można zrobić na wiele sposobów.

... i powrót do pierwotnego pytania, czy podpisywania kodu bez silnej nazywania trochę osłabić punkt podpisywania kodu?

Niezupełnie. Podpisywanie kodu (niezbyt silna nazwa) ma dwa różne cele:

  1. Uwierzytelnienie. Sprawdzanie, kto jest autorem oprogramowania.
  2. Uczciwość. Sprawdzanie, czy oprogramowanie nie zostało zmienione od czasu podpisania.

Często jest to tylko uwierzytelniane i sprawdzane podczas instalacji. Właśnie dlatego podpisujemy nasz plik setup.exe, aby upewnić się, że klient otrzymał od nas niezmodyfikowany instalator. Zostają one poproszone o "Czy ufasz firmie XXXX" i tym samym udzielają autoryzacji instalatorowi uwierzytelnionemu/podpisanemu. Po zainstalowaniu jest jednak mało wbudowanego użycia podpisywania kodu przez system operacyjny (z wyjątkiem sterowników i niektórych innych niejasnych przypadków).

Silne nazewnictwo z drugiej strony ma zupełnie inny cel. Jest całkowicie skoncentrowany na "integralności" aplikacji. Nie ma certyfikatu, żadnego urzędu podpisującego (CA), aby go zweryfikować, żadnych informacji wyświetlanych przez użytkownika, aby je potwierdzić, i żaden system operacyjny nie może zweryfikować pliku wykonywalnego, który ma zostać uruchomiony.

.NET Framework używa silnych nazw dla wielu rzeczy, wszystkie z nich ja luźno kategoryzować jako integralności aplikacji:

  1. zawartość dll/exe ma podpisaną mieszania tak, że nie może być naruszone.
  2. Każda referencja musi być silnie nazwana i zweryfikowana podczas ładowania zależności.
  3. Zespoły można zarejestrować w GAC i można użyć zasad wydawcy.
  4. Natywne obrazy mogą wygenerować skompilowany obraz IL zespołu.

Jestem pewien, że brakuje tu innych rzeczy, ale są to podstawowe zastosowania, o których wiem.

Najlepsze praktyki do podpisywania i Strong nazewnictwa

  • Użyj podpisaną instalatorowi
  • użyć kodu podpisany wykonywalny
  • Użyj silny nazwie pliku wykonywalnego
  • Strong nazwa wszystkie zależności i odniesienia do nich
  • Zależności podpisywania kodu nie są na ogół wymagane *
  • Rozważmy GAC rejestracji zespołów w czasie instalacji

* Uwaga: podpisanie Kod może być przydatna w niektórych przypadkach do DLL dla obiektów przykład COM oznaczony jako „bezpieczne” i osadzony w przeglądarce powinna zostać podpisana i silne nazwany jeśli był to plik wykonywalny. Podpisywanie kodu może być również przydatne w zewnętrznie weryfikowaniu zależności bez ładowania zespołu lub odzwierciedlania jego atrybutów.

+0

Nie mam przykładu, który próbuję chronić, po prostu staram się w pełni zrozumieć podpisywanie kodu/SN :-) Sugerujesz, że SN może być ominięty z powiązaniami przekierowania ... Czy to nie jest taka porażka? punkt SN całkowicie? –

+0

Masz rację, wiążące przekierowanie nie może zmienić klucza podpisu. Mam zamiar sprawdzić moje fakty po opublikowaniu, ale się rozproszyłem. –

+0

Tak wiążące przekierowanie działa tylko w przypadku zestawów o silnych nazwach z tym samym kluczem, a zatem * nie * chroni przed zmianami bibliotek DLL? (iz powrotem do pierwotnego pytania, czy podpisywanie kodu bez silnego nazewnictwa podkopuje sens podpisywania kodu?) –

1

Gdy ktoś może zamienić kod dll lub uruchomić na komputerze, nie ma już tylu zabezpieczeń. W moim przypadku wszystkie dll to kod podpisany indywidualnie. Mój kod odmawia pobierania Dll, które nie są podpisane jako część samoaktualizacji. Jednak każda aplikacja działająca na moim poziomie integralności lub wyższym w moim systemie (w przypadku> = Vista Vista) nadal może wstrzyknąć dll do mojego exe z czymś takim jak CreateRemoteThread etc (http://www.codeguru.com/Cpp/WP /dll/article.php/c105) Ale ponowne założenie, że ktoś może dostać obcy kod do systemu, jest trudną częścią. Reszta jest łatwa.

0

Należy również pamiętać, że Podpisywanie kodu często wprowadza wiele bólu podczas aktualizacji bibliotek DLL bez wdrażania innych części aplikacji.

To dlatego wielu popularnych bibliotek nie silnie wymienić dll na

0

Po tym poszukiwanie samo i przeczytaniu wielu rzeczy. W końcu mogę odpowiedzieć na twoje pytanie, TAK, silna nazwa zależności jest koniecznością, jeśli zamierzasz podpisywać cyfrowo swoją aplikację exe.

Załóż to, jeśli twoje zależności nie mają silnej nazwy. I zostają zastąpieni. Twoja aplikacja załaduje je bez problemu. I użytkownik zobaczy okno dialogowe "Verified Publisher: Your Name". Chociaż plik wykonywalny był nietknięty, ale zmieniły się zależności.

Problem nie jest tym użytkownikiem, ale dystrybucją tego pakietu ze zmienionymi zależnościami, podczas gdy wszyscy zobaczą na nim twoje imię.