2011-12-27 15 views
6

Przygotowałem mały przykład, w którym załadowałem zespół do nowej AppDomain bez żadnych uprawnień. To działa dobrze, zespół nie może uzyskać dostępu do systemu plików i nie może słuchać gniazd.Zapobieganie tworzeniu wątków w AppDomain

Ale jest jeszcze jedna rzecz, którą chcę zapobiec: Tworzenie nici. Czemu? Teoretycznie ten zespół może stworzyć wątek, który tworzy jeszcze więcej wątków i zalewa moją pamięć.

Pomyślałem o (moim zdaniem) najlepszym sposobie: Ograniczenie pamięci AppDomain. czy to możliwe? A jeśli nie, co mogę zrobić, aby uniknąć tworzenia wątków?

używany ten kod, aby utworzyć wątek

Thread t = new Thread(this.DoWork); 
t.Start(); 

i ten kod AppDomain

PermissionSet set = new PermissionSet(PermissionState.None); 
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read | 
             FileIOPermissionAccess.PathDiscovery, 
             this.path)); 

AppDomainSetup info = new AppDomainSetup { ApplicationBase = this.path }; 

this.domain = AppDomain.CreateDomain("Sandbox", null, info, set, null); 

(Ok, dałem dostęp do systemu plików w folderze, gdzie chcę, aby załadować montaż, to tylko dlatego, StrongName fullTrustAssembly = typeof(SecureInstance).Assembly.Evidence.GetHostEvidence<StrongName>(); nie działają na mnie albo

Nadzieja s/o może pomóc (:..

+1

Nie można tego zrobić AFAIK :) Jedyne co możesz zrobić, to ustawić limit wątków w puli wątków – Elastep

+1

AFAIK każda AppDomain musi utworzyć co najmniej jeden wątek - w przeciwnym razie nie może działać ... więc wyłączenie tworzenia wątku oznaczałoby, że nie może działać na wszystkich IMHO. Co próbujesz osiągnąć ? – Yahia

+0

@Elastep Dzięki za odpowiedź, ale czy to jest bezpieczne? Myślę, że można rozszerzyć limit nici w dowolnym oprogramowaniu. Całość daje Javie wielki plus. W Javie program SecurityManager jest pytany przed utworzeniem wątku. –

Odpowiedz

2

Wygląda na to, że nie ma na to łatwej odpowiedzi. Możesz zrobić to za pomocą interfejsu API .NET Profiling, aby spróbować monitorować wykorzystanie pamięci w swojej domenie AppDomain. Możesz dowiedzieć się więcej na ten temat tutaj, ale trzeba zrobić kilka kopania: http://msdn.microsoft.com/en-us/library/bb384493.aspx

W każdym razie, nie jest to lepiej uruchomić cokolwiek chcesz uruchomić w osobnym procesie o niższym priorytecie, więc jeśli to szaleje z przydziałami pamięci, nie ma wpływu na proces, system operacyjny go zabija i nie ma wpływu na główny proces?

+0

Świetnie, dzięki, spróbuję! –

+0

Problem z izolacją na poziomie procesu jest obciążeniem dla wielu procesów. Ponieważ wątki nie mogą zostać bezpiecznie przerwane przez hosting AppDomain, muszę się upewnić, że nie można ich utworzyć. Jeśli nie da się tego zrobić, to muszę monitorować "naruszenia" i zabić cały proces. Łatwiejsze, ale gorsze dla wydajności jest pesymistyczne zabicie procesu za każdym razem. Ale to boli występ wszystkich, którzy się zachowują. –

Powiązane problemy