W ramach kontynuacji serii wpisów związanych Managed Add-in Framework (MAF / System.AddIn) ([1], [2], [3], [4]) chciałbym pokazać przykład pokazujący, w jaki sposób MAF rozwiązuje problem z izolacją ładowanych wtyczek, tak by nie pozwolić na uruchomienie niebezpiecznego kodu.
Tak jak pisałem wcześniej jedną z zalet MAF-a jest możliwość uruchamiania wtyczek w środowisku izolowanym, teraz przyjrzymy się w jaki sposób można to zrealizować. Podobne doświadczenie (jednak bez wykorzystania MAF) przeprowadzałem już wcześniej o czym pisałem we wpisie pt.: "Bezpieczne wykorzystanie obcych assembly (C# .NET 2.0 – 3.5)". Jako przykład szkodliwego kodu został wybrany dostęp do kartoteki Windows, np. odczyt zawartość pliku "C:\Windows\win.ini". Niniejszy przykład bazuje na wcześniej pokazanym przykładzie ([2], [4]) i rozszerza go o nową wtyczkę i rozważa różne sposoby jej aktywacji.
Wtyczka wykorzystująca MAF może wyglądać następująco:
[AddIn( "DoSthV2FileReader" )] public class FileReader: IDoSthAddInViewV2 { public string DoSth( string param ) { string winini = ""; using ( StreamReader reader = new StreamReader( @"C:\Windows\win.ini" ) ) { winini = reader.ReadToEnd(); } return " Plugin Class, Win.ini: " + winini; } }
Izolację można osiągnąć w prosty sposób, zmieniając po stronie
aplikacji host'a sposób aktywacji wtyczki, np.:
// restricted: IDoSthAppView plugin = token.Activate<IDoSthAppView>( AddInSecurityLevel.Internet ); // or full trust: IDoSthAppView plugin = token.Activate<IDoSthAppView>( AddInSecurityLevel.FullTrust );
Jak widać w prostu sposób zmuszamy MAF-a, by załadował wtyczkę
do osobnej domeny aplikacyjnej, której zabezpieczenia zostaną
skonfigurowane zgodnie z wybraną strefą (w powyższym przykładzie
strefą była strefa Full Trust lub Internet, ale może to być
również inna strefa wskazana przy pomocy odpowiedniego typu
wyliczeniowego: AddInSecurityLevel
Enumeration). Tym którym izolacja poprzez odrębną domenę
aplikacyjną nie wystarcza, mogą uruchomić wtyczkę w osobnym
procesie (w sensie systemu operacyjnego Windows), wykorzystuje się
do tego klasę: AddInProcess
Class. Warto przeczytać na MSDN artykuł: "How
to: Activate Add-ins with Different Isolation and Security Levels".
Na koniec chciałbym jeszcze przypomnieć ważne (ale chyba
oczywiste) kwestie:
- Ponieważ wtyczka jest uruchamiana w odrębnej domenie aplikacyjnej więc wszystkie obiekty wymieniane pomiędzy aplikację a wtyczką muszą być serializowalne lub muszą to być typy proste.
- Odrębna domena aplikacyjna pozwala na załadowanie innego (niż aplikacji hosta) pliku konfiguracyjnego (w sensie app.config).
Jak widać w wielu przypadkach MAF zdaje się być dość
skomplikowany, trzeba chyba jednak przyznać, że izolację można
osiągnąć w dość prosty sposób.
Bardzo dobry tekst, oby takich więcej. Aktualnie potrzeba nam w Polsce programistów, a takie artykuły są dobrym uzupełnieniem wiedzy dla początkujących programistów. Dlatego zawsze wspieram tego typu inicjatywy, bo blogi takie jak ten powinny istnieć i się rozwijać.
OdpowiedzUsuńCiekawy wpis
OdpowiedzUsuń