Запретить ненадежному коду C # запускать новые потоки ИЛИ API черных / белых списков

Я реализую приложение, которое будет загружать и выполнять сторонний код.

Хотя с .NET Sandboxing все в порядке, я не могу найти способ предотвратить запуск новых потоков кодом.

Это проблема, потому что AFAIK мы не можем перечислить и безопасно прервать их, чтобы выгрузить песочницу AppDomain - мы должны выйти из всего процесса.

Как я могу запретить Thread.Start или (лучше) добавить в белый / черный список конкретные API-интерфейсы CLR?


person wizzard0    schedule 01.04.2011    source источник


Ответы (1)


Вам нужно будет создать среду сценариев, а не запускать скомпилированный код. В этой среде вы можете анализировать неподдерживаемые / нежелательные ключевые слова.

http://msdn.microsoft.com/en-us/library/ms974577.aspx

http://osherove.com/blog/2004/2/17/make-your-net-application-support-scripting-a-practical-appr.html

http://www.codeproject.com/KB/library/Dotnet_Scriptor.aspx

Может быть какой-то способ ограничить разрешения кода, выполняемого в домене приложений, это то, о чем вы говорите с песочницей?

Хороший пример использования AppDomain

Вы потенциально могли принудительно выгрузить AppDomain, если "плохие вещи" происходили с процессором и памятью.

совсем недавно в .net 4 я заметил, но не исследовал разрешения HostProtection ...

System.Security.Permissions атрибут hostprotection

=== РЕДАКТИРОВАТЬ ===

Похоже, хостинг CLR с установленным разрешением безопасности будет подходящим вариантом. Ссылки ...

Что такое хостинг CLR?

http://msdn.microsoft.com/en-us/library/hbzz1a9a(v=vs.90).aspx

http://msdn.microsoft.com/en-us/library/h846e9b3(v=vs.90).aspx

http://msdn.microsoft.com/en-us/library/system.security.permissions.securitypermission(v=vs.90).aspx

person JTew    schedule 01.04.2011
comment
Это сильно снизит производительность. Я создаю распределенную вычислительную среду, и скорость тоже важна, 2x штраф (C # против C ++) - это нормально, а 10-20x (языки на основе DLR и / или интерпретируемые языки) - нет. Тогда я бы лучше использовал движок V8 JS, он быстрее, чем DLR .... - person wizzard0; 01.04.2011
comment
имеет смысл ... как насчет применения атрибута защиты хоста к разделам кода, которые вы просматриваете, вызывая сторонние библиотеки DLL. т.е. самовлияние потоков и внешних потоков? - person JTew; 01.04.2011
comment
Сейчас я изучаю неуправляемые API-интерфейсы хостинга .NET, например эти - stackoverflow.com/questions/3269290/, и вручную проверять библиотеки DLL, как это делает Terrarium (см. terrarium2.codeplex.com/SourceControl/changeset/view/), уродливый взломать, но похоже, что это поможет - person wizzard0; 01.04.2011
comment
это потребовало от меня изучения неуправляемых хостов, что не идеально, но работает. - person wizzard0; 01.04.2011
comment
Возможно, стоит вернуться к этому с появлением Roslyn. - person JTew; 07.10.2014