Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

“Мы спасём мир!” или как контролировать исполнение процесса

#c_sharp #net


У вас есть exe-файл. Если вы его запустите, то может произойти следующее:

либо вы спасаете мир от 3-ей мировой войны (программка активирует нанороботов, которые
уничтожат всё оружие воюющих сторон)
либо эта программа на самом деле - вирус, который удалит всю информацию, историю,
достижения за всё время существования человечества, хранящуюся на компе, где этот вирус
находится.

Как запустить эту программку не боясь за уничтожение информации?
P.S. Грубо говоря: у нас есть exe-файл, который необходимо запустить, но мы не знаем
что он может сделать. Хотелось бы ограничить его возможности, чтобы он, например, не
смог перезагрузить комп или завершить процесс или вообще разрешить ему работать только
с файлами в единственном каталоге (например, в домашнем).    


Ответы

Ответ 1



Практическое руководство. Выполнение не вполне безопасного кода в изолированной среде AppDomain - класс + PermissionSet - класс + CodeAccessPermission - класс Пример - ораничение разрешений на конкретный каталог в PermissionSet'е: permissionset.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, @"c:\Users\Homedir\SandboxFolder")); Так-же гляньте: Managed Sandbox UPD: Вот простейший пример песочницы для какого-то консольного приложения, которому нужно открывать файлы (System.IO.File.OpenRead) на диске: using System; using System.Security; using System.Security.Permissions; using System.Security.Policy; class Sandboxer { public static void Main(string[] args) { string programmname = "angryprogramm.exe"; // Это программа которая хочет прочитать все наши файлы Console.WriteLine("Сейчас мы сделаем попытку выполнить программу " + programmname + " с ограничением доступа"); Console.Write("Разрешить доступ программы к файлам? [y/n]: "); bool allow = (Convert.ToChar(Console.Read()).ToString() == "y"); Console.WriteLine(); Console.WriteLine(); // минимальный набор разрешений для консольного приложения PermissionSet permissionset = new PermissionSet(PermissionState.None); // По умолчанию всё запрещено permissionset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); // Разрешение на выполнение программы :-) permissionset.AddPermission(new UIPermission(PermissionState.Unrestricted)); // Разрешение на UI // Если разрешаем доступ к файлам if(allow) { permissionset.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); // Разрешение на неограниченный доступ к файлам } // Настройка песочницы AppDomainSetup domaininfo = new AppDomainSetup(); domaininfo.ApplicationBase = System.Environment.CurrentDirectory; AppDomain sandbox = AppDomain.CreateDomain("Sandbox", new Evidence() , domaininfo, permissionset); try { sandbox.ExecuteAssembly(programmname); Console.WriteLine("Всё получилось и программа выполнилась!"); }catch(SecurityException e) { Console.WriteLine("Ничего не получилось: " + e.Message); } } } А в качестве песочницы для native - как вариант поставить виртуалку. Настолько тонко контролировать разрешения вы конечно же не сможете, но зато (при правильной настройке), программа вряд ли сможет вылезти из ВМ и удалить всю информацию, историю и достижения за всё время существования человечества, хранящиеся на хост-компьютере.

Комментариев нет:

Отправить комментарий