Pytanie Jak stworzyć sandbox w C # dla zewnętrznego procesu?


Jak stworzyć sandbox w C # dla zewnętrznego procesu? Jako środowisko sandbox rozumiem środowisko dla procesu, które rozpoczynam od C #, które powstrzymuje ten proces od ingerowania w cokolwiek innego - jądro, zmienne systemowe, konfigurację systemu, pamięć, rejestr, dysk, sprzęt, lokalizację inną niż miejsce startu i tak dalej.

Chcę umieścić plik wykonywalny w jednym miejscu i mieć pewność, że to miejsce jest jedynym miejscem, które można zmienić w tym procesie. Dodatkowo, plik wykonywalny może być napisany w C, C ++, C # i itp.


12
2018-06-12 15:49


pochodzenie




Odpowiedzi:


Jeśli chcesz tylko uruchomić kod zarządzany, stosunkowo łatwo jest utworzyć środowisko Sandbox przy użyciu zestawu AppDomain w / ograniczony zestaw uprawnień:

        PermissionSet ps = new PermissionSet(PermissionState.None);
        // ps.AddPermission(new System.Security.Permissions.*); // Add Whatever Permissions you want to grant here

        AppDomainSetup setup = new AppDomainSetup();
        Evidence ev = new Evidence();

        AppDomain sandbox = AppDomain.CreateDomain("Sandbox",
            ev,
            setup,
            ps);

        sandbox.ExecuteAssembly("ManagedAssembly.exe");

Ale gdy tylko otworzysz drzwi niezarządzanego / niebezpiecznego kodu, wszystkie zakłady są wyłączone i bardzo trudno jest zabezpieczyć kod trzeciej strony. Jak już wspomniano, w zasadzie musisz utworzyć podkładkę pomiędzy wykonującym kodem a systemem operacyjnym, aby ograniczyć to, co może zrobić, chyba że jest wystarczająca, aby uruchomić go jako ograniczonego użytkownika i polegać wyłącznie na ACL / UAC w celu ochrony.

UWAGA: ten przykład kodu nie jest próbną próbką, tylko wyobrażenie, jak będzie wyglądał kod. Niektóre finagling w / Evidence i AppDomainSetup będą prawdopodobnie potrzebne, i powinieneś na pewno zbadać / przetestować to, biorąc pod uwagę implikacje bezpieczeństwa. Oto dobry artykuł na ten temat: http://msdn.microsoft.com/en-us/magazine/cc163701.aspx


4
2017-07-13 22:16



Co powiesz na niezarządzany / niebezpieczny kod i fragmenty kodu? - SuitUp
Szczerze mówiąc, tak naprawdę nie wiedziałbym, od czego zacząć od niezarządzanego / niebezpiecznego kodu, a ustalenie tego byłoby kilkumiesięcznym projektem wymagającym głębokiego zrozumienia systemu operacyjnego Windows, wywołań Kernel / System, alokacji pamięci i dostępu. Osoby pracujące w firmie Microsoft nie mogą nawet uzyskać tego. - Paul Wheeler
Moja rada: zmień swoje wymagania, zaakceptuj tylko kod zarządzany lub wyjaśnij użytkownikom, że powinni używać wyłącznie plików wykonywalnych innych firm, którym ufają. Chyba, że ​​chodzi tylko o uruchamianie procesu jako innego użytkownika, w takim przypadku sprawdź właściwości Domain / UserName / Password klasy ProcessStartInfo. - Paul Wheeler
Chodzi o to, że nie mogę zaakceptować tylko kodu zarządzanego (wydajność, potrzebuję czystego c przez większość czasu), a cała idea polega na użyciu plików wykonywalnych innych firm. Jest to główne zastosowanie całego systemu. Co mam teraz zrobić? Zrobić nowe pytanie lub co? - SuitUp


Za pomocą Sandboxie jako przykład tego, co myślę, że chcesz osiągnąć w pewnym stopniu. IMHO, nie będziesz w stanie tego zrobić czysty kod zarządzany.

Jeśli chcesz mieć możliwość ograniczenia działania i działania aplikacji, niezależnie od tego, czy jest to aplikacja zarządzana, czy natywna, czy nawet Java. Konsekwencją jest to, że będziesz musiał monitorować każde działanie podejmowane przez aplikację i podejmować odpowiednie działania, aby upewnić się, że nie ma to wpływu na twój system. Odpowiednie działanie może oznaczać przekierowanie zapisu aplikacji do alternatywnej lokalizacji na dysku, napisanie zwirtualizowanego rejestru, aby prawdziwy rejestr nie został naruszony itp. Wszystko to będzie wymagało dużo pracy niskiego poziomu, który zarządzany kod nie dostarcz dziś.

Uwaga Powiedziałem, że czysto zarządzany kod, można oczywiście korzystać z usług Interop itp., Aby skorzystać z niezarządzanej implementacji pewnych obszarów kodu, lub można użyć zarządzanego C ++. Jednak w zależności od dokładnych szczegółów tego, co chcesz zrobić, to prawdopodobnie będziesz musiał zaimplementować sterownik trybu jądra, aby zapewnić wystarczającą wirtualizację środowiska dla aplikacji trybu piaskownicy.


2
2018-06-12 17:39



Powiedziałeś o przekierowaniu do innego rejestru lub lokalizacji dysku. Co powiesz na pełne blokowanie rejestru i nie przejmuj się przekierowaniem? Czy będzie prostsze? Ponieważ te aplikacje nie wymagają żadnej z tych funkcji. Po prostu chcę je zablokować. - SuitUp
@SuitUp, chociaż może być łatwiejszy, ten sam lub podobny mechanizm jest nadal wymagany do przechwytywania połączeń i ich zawierania. Uproszczenie, które jest znaczące, polega na tym, że nie trzeba wirtualizować rejestru itp., Ale złożoność przechwytywania nadal istnieje. Możesz używać biblioteki takiej jak Detours do przechwytywania, ale szczerze mówiąc wątpię, czy da ci to solidne i niezawodne rozwiązanie dla piaskownicy, oczywiście zakładam, że potrzebujesz kompletnego, niezawodnego i bezpiecznego rozwiązania, które wymagałoby więcej niż podstawowego przechwytywania połączenia . - Chris Taylor
Twoje założenie jest poprawne. Czy możesz podać mi szczegóły techniczne? - SuitUp