2012-07-06 21 views
7

Obecnie pracuję nad bardzo modularną i opartą na wtyczkach ramą dla mojej pracy licencjackiej. Główną ideą jest to, że w mojej strukturze aplikacji znajduje się folder o nazwie plugins, w którym można upuścić skompilowane wtyczki (na przykład .dll -files), które są zgodne ze specjalnym interfejsem IPlugin. Następnie aplikacja wykonuje zadania za pomocą wtyczki wybranej przez użytkownika. Tak więc, jeśli chcę wykonać zadanie raz w pliku PDF, wybrałbym PdfPlugin i raz w dokumencie tekstowym, wybrałbym DocPlugin do pracy.Jak zabezpieczyć wtyczki przed szkodliwym kodem

Dane wyjściowe są również definiowane w interfejsach, więc każda wtyczka zwraca tę samą strukturę danych. Faktyczna praca różni się dla każdej biblioteki.

Teraz, ponieważ aplikacja po prostu wywołuje metody zdefiniowane w interfejsie, np. ParseDocument() i tym podobne, w jaki sposób mogę zapobiec temu, aby wtyczki (które mogły zostać opracowane przez osoby trzecie) mogły wykonywać szkodliwy kod?

Pracuję na .NET3.5 (może zmienię na 4, jeszcze nie zdecydowałem) i C#.

Odpowiedz

8

pracuję nad .NET3.5

W tym przypadku, chciałbym wyizolować swoje wtyczki do uruchomienia w osobnym AppDomain użyć Code Access Security i ograniczyć zestaw zgody App Domain. To "piaskownice" złożeń wtyczek.

Na przykład można zabrać wszystkie uprawnienia do kodu niezarządzanego i uprawnienia do plików IO, a wtyczka nigdy nie będzie mogła zapisywać danych w systemie plików.

To nie jest dla osób o słabym sercu. AppDomains może być trudne do pracy i wymagać serializacji, polityki życia obiektu, itp. Można użyć MAF, ponieważ zabiera dużo instalacji hydraulicznej.

+0

Czy można zapytać wtyczkę o uprawnienia Code Access Security, jakich chce? W porównaniu do czegoś takiego jak zamiary na Androida? To znaczy. Prawdopodobnie chciałbym struktury wtyczek, która pozwala mi określić, jakie uprawnienia prosi wtyczka, więc mogę poprosić użytkownika o potwierdzenie przed załadowaniem wtyczki. Czy jest odwrotnie, że egzekwuję uprawnienia w mojej aplikacji, a następnie wtyczka po prostu zawiesza się/wyrzuca wyjątek, jeśli próbuje coś zrobić poza dozwolonymi uprawnieniami? – AaronLS

+0

Nie pytając o "jak", ponieważ jest to rodzaj poza zakresem pytania, ale ciekawe, które z tych dwóch różnych podejść CAS jest odpowiednie. – AaronLS

0

Wiem, że w tej dziedzinie przeprowadzono wiele badań. Jednym ze sposobów podejścia jest sprawdzenie kodu IL i poszukiwanie niedozwolonych sygnatur metod. Następnie możesz przekierować je do haka błędu, który zatrzyma wtyczkę vom wykonując kolejny kod.

Jedna aplikacja to np. zwiększone bezpieczeństwo smartfonów, w których można sprawdzać kod IL z pobranych aplikacji w poszukiwaniu metod dostępu do modułu GPS, kamery, mikrofonu ... Aplikacja bezpieczeństwa może następnie załatać te metody dostępu i zapytać użytkownika, czy aplikacja naprawdę powinna być dozwolone włączanie mikrofonu.

Dzięki .NET można użyć czytnika IL, takiego jak Mono.Cecil, do sprawdzenia kodu IL pod kątem szkodliwych podpisów. Ale zawsze są na to sposoby, ponieważ wciąż możesz generować kod dynamicznie lub po prostu przechowywać kod jako zasób i ładować go w rumtime z zasobu. Aby uzyskać dowód koncepcji, podejście to jest dość łatwe.

Można nawet napisać regułę FXCop i użyć jej do statycznego sprawdzania wtyczek dla zabronionych wywołań metod.

+2

"Jednym ze sposobów podejścia jest sprawdzenie kodu IL i poszukiwanie niedozwolonych sygnatur metod" ick. A co z wywołaniami metod przeprowadzonymi za pomocą dynamicznej wysyłki, takich jak DLR, odbicie itp.? – vcsjones

+0

Nie mówię, że to zrobiłem. Powiedziałem tylko, że naukowcy to zrobili i uzyskali całkiem sporo echa (bezpieczeństwo smartfonów jest fajne). Sądzę, że nie byli tak hard core'owymi programistami jak przeciętni użytkownicy Stackoverflow. Być może powinni byli zapytać na SO, czy ich pomysł był dobrym pomysłem. –

-2

Nie możesz.

Pliki DLL są kodami binarnymi wykonywanymi z uprawnieniami programu wywołującego. Gdy wywoływana jest metoda z biblioteki DLL, nie masz żadnej kontroli nad tym, co robi.

Jeśli chcesz ograniczyć możliwości wtyczki, musisz przenieść ją do głównego programu.Dobrym sposobem na to byłoby implementacja wtyczek w języku skryptowym, który jest analizowany i wykonywany przez twój program zamiast bibliotek binarnych.

+0

* DLLs to kod binarny * - nie w .Net – DaveShaw

+1

"Nie możesz." tak, możesz. Właśnie to zaprojektował CAS. Pamiętaj, że .NET Framework jest maszyną wirtualną, więc może egzekwować te reguły w czasie wykonywania. – vcsjones

Powiązane problemy