poniedziałek, 12 marca 2012

[MAF 05] Managed Add-in Framework (System.AddIn), a bezpieczeństwo wywołania obcego assembly [PL]

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.
Promuj

2 komentarze:

  1. 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ń

Posty powiązane / Related posts