Безопасность и создание кода "на лету"
Обновлен: Ноябрь 2007
Некоторые библиотеки генерируют и запускают код, выполняя определенную операцию для вызывающего кода. Основной проблемой является генерация кода по требованию со стороны менее доверяемого кода и запуск сгенерированного кода с более высоким уровнем доверия. Проблема обостряется, когда вызывающий может влиять на генерацию кода, поэтому необходимо убедиться, что генерируется лишь безопасный код.
Всегда необходимо точно знать, какой код генерируется. Это значит, что нужно строго контролировать любые значения, получаемые от пользователя: строки в кавычках (их следует избегать, так как в них можно помещать непредсказуемые элементы кода), идентификаторы (проверяйте их на допустимость) и любые другие данные. Идентификаторы могут быть опасными, поскольку появляется возможность изменить скомпилированную сборку так, чтобы ее идентификаторы содержали "странные" символы, а это, вероятно, нарушит работу сборки (хотя во многих случаях это не создает уязвимости в защите).
Рекомендуется генерировать код с помощью порождаемого отражения, что позволяет избежать многих описанных выше проблем.
При компиляции кода продумайте, не может ли вредоносная программа изменить его. Проверьте, не возникает ли небольшой промежуток времени, в течение которого вредоносный код способен изменить исходный код на диске перед чтением компилятором или загрузкой DLL кодом. Если да, защищайте каталог с этими файлами, используя в зависимости от ситуации управление доступом для кода или список управления доступом (ACL) файловой системы.
Если вызывающий объект может воздействовать на генерируемый код, вызывая ошибки компиляции, это тоже может угрожать безопасности.
Выполняйте сгенерированный код с наименьшими возможными разрешениями (используя PermitOnly или Deny).