Новые возможности безопасности в Visual Studio 2005

Источник: MSDN Magazine
Брайан Джонсон (Brian Johnson), Корпорация Майкрософт

Введение

Разработчики хотят создавать безопасные приложения, но большинство не хочет тратить много времени на изучение того, как это делать. Многие предпочли бы быстро создавать код и алгоритмы, решающие поставленные задачи, и распространять свой продукт, не беспокоясь о безопасности. Однако в настоящее время такой возможности нет, и, принимая любое решение, нужно учитывать соображения безопасности. Средства, которые мы используем для разработки и распространения приложений, позволяют намного упростить создание безопасных приложений, и в этом документе я представлю некоторые из возможностей Visual Studio 2005. Применение большинства инструментов и средств Visual Studio 2005 требует совсем немного дополнительной работы, но при этом оказывает огромное влияние на общую безопасность приложения.

Повышение безопасности неуправляемого кода

Visual C++ - это единственный компилятор Visual Studio, который позволяет компилировать программы в кодах процессора (т. е.  создавать «неуправляемые» (native) EXE- и DLL-модули).

В этом разделе речь пойдет о повышении безопасности неуправляемого кода. Весь излагаемый здесь материал, если это не оговорено особо, относится только к Visual C++.

Подавляющее большинство проблем с безопасностью, обнаруживаемых в неуправляемом коде, связано с переполнением буфера. Переполнение буфера происходит, когда размер данных превышает размер выделенной под них области памяти, и часть данных попадает в ту часть памяти, которая является выполненяемым кодом. Это становится проблемой, когда злоумышленник, пытающийся получить несанкционированный доступ к программе, точно знает, насколько необходимо переполнить буфер, чтобы поместить инструкцию в тот блок памяти, откуда он сможет ее вызвать и перехватить выполнение программы.

Этого упрощенного определения переполнения буфера достаточно, чтобы рассмотреть четыре средства Visual Studio 2005, которые помогают разработчику устранить потенциальные уязвимости в коде. И даже предотвратить их использование злоумышленником, если окажется, что эти уязвимости все же в коде присутствуют.

Code Analysis /analyze

Code Analysis (анализатор кода) - это инструмент в Visual Studio 2005 Team Edition for Software Developers. Ранее он назывался PREfast и использовался в корпорации Майкрософт. Позже он был выпущен для всеобщего пользования в составе Microsoft Device Driver Kit (DDK). Анализатор кода Code Analysis просматривает исходный код на C и C++, перебирает все возможные способы исполнения каждой функции и моделирует процесс исполнения кода, чтобы выявить возможные источники проблем. Анализатор не выполняет программный код и не может найти все возможные ошибки, но он может найти ошибки, которые игнорируются компилятором. Code Analysis обнаруживает проблемы, которые связаны с приведением типов данных, производительностью и безопасностью кода, выражениями, циклами, распределением памяти, форматированием строк, возвращаемыми значениями функций и обработкой исключений. Если анализатор кода Code Analysis включен во время работы в среде Visual Studio 2005 Enterprise Edition, то выявленные ошибки выводятся в окне Error List. Включить его можно, используя параметр /analyze, или установив в диалоговом окне Property Pages (ветвь Code Analysis->General) значение Yes(/analyze) для параметра Enable code analysis for C/C++, как показано на рисунке 1.

Рис. 1. Управление безопасностью с помощью Code Analysis

Application Verifier

Служебная программа Application Verifier (AppVerifier, «проверка приложений») первоначально поставлялась как часть набора инструментов Application Compatibility Toolkit. AppVerifier - это набор тестов для программы во время ее выполнения, который помогает обнаружить соответствующие ошибки. Ошибки, обнаруженные с помощью Application Verifier, связаны в основном с совместимостью приложения, а также его устойчивостью и безопасностью. Они попадают в одну из трех категорий: проверка дескрипторов (handle), проверка блокировок и проверка области динамически распределяемой памяти (heap). Настройки для AppVerifier находятся в узле Application Verifier диалогового окна Property Pages. Application Verifier запускается в меню Debug командой Start with Application Verifier. Application Verifier может приостанавливать выполнение программы, чтобы сообщить об ошибках, найденных на различных уровнях проверки. Его можно настроить для выполнения тех или иных действий при возникновении останова - можно прервать выполнение программы и записать ошибку в журнал. На рисунке 2 показаны настройки Application Verifier в окне Property Pages.

Рис. 2. Действия при останове в Application Verifier

Buffer Security Check /GS

Параметр Buffer Security Check (/GS) компилятора Visual C++ используется, чтобы предотвратить намеренное переполнение буфера в вашей программе злоумышленником. Значительное количество уязвимостей в коде связано с переполнением буфера. Параметр /GS записывает в конце буфера некоторое зашифрованное значение (иногда его называют «canary»). Это значение проверяется в процессе выполнения программы, в случае его изменения выполнение прекращается, и возникает исключение безопасности.

Параметр /GS не предотвращает переполнения буфера, но защищает от возможного перехвата исполнения программы, останавливая ее выполнение.

Библиотеки Safe CRT

Библиотеки Safe CRT представляют собой усовершенствованные версии стандартных библиотек C и C++. Они разработаны для того, чтобы повысить безопасность приложений, скомпилированных в Visual C++, и добавляют контроль буфера для функций, уязвимых при атаках, и уменьшения уязвимости функций периода времени выполнения.

Эти изменения касаются всех важных программных библиотек, включая библиотеку C времени выполнения C Runtime Library (CRT), стандартную библиотеку C++ Standard C++ Library (SCL), базовые классы Microsoft Foundation Classes (MFC) и библиотеку активных шаблонов Active Template Library (ATL). Поскольку библиотеки MFC и ATL были усовершенствованы с использованием функций защищенной библиотеки Safe C Library, то перекомпиляция приложений MFC и ATL при помощи Visual C++ 2005 обеспечит некоторые из возможностей библиотек Safe CRT автоматически.

За дополнительной информацией о библиотеках Safe CRT обратитесь к статье Martyn Lovell в MSDN Magazine, Предотвращение атак на программы с помощью защищенных библиотек Visual Studio 2005 C и C++.

Повышение безопасности управляемого кода

Управляемый код является источником проблем безопасности немного иного рода. Поскольку в данном случае памятью управляет общая исполняющая система (common language runtime, CLR), опасность переполнения буфера является гораздо меньшей проблемой. В этом разделе я рассмотрю некоторые из средств безопасности Visual Studio 2005, которые наиболее важны для разработчиков управляемых приложения.

FxCop

Разработчики уже давно используют отдельный инструмент FxCop для проверки сборок на соответствие .NET Framework Design Guidelines. Теперь этот инструмент встроен в Visual Studio 2005.

FxCop осуществляет синтаксический разбор потока инструкций MSIL и анализирует схемы вызываемых функций, пытаясь обнаружить нарушения правил, которые пользователь может настроить, но обычно это .NET Framework Design Guidelines. Туда входят правила безопасности, правила разработки библиотек и правила глобализации, функциональной совместимости, сопровождения, присваивания имен, производительности, надежности, использования и другие.

Настройки FxCop в Visual Studio 2005 находятся в свойствах проекта на вкладке Code Analysis. На рисунке 3 показаны некоторые правила безопасности, которые можно проверять.

Рис. 3. Доступ к правилам анализа кода в Visual Studio 2005

Функция Code Analysis включается флажком Enable Code Analysis в свойствах проекта на странице свойств Code Analysis Properties Page. После этого в окне ошибок Visual Studio 2005 будут выдаваться дополнительные предупреждения. Их количество можно сократить, выбрав для анализа только интересующие вас правила. Например, это могут быть правила безопасности (Security Rules) и правила надежности (Reliability Rules).

Code Access Security/Least Privilege

Приложения .NET Framework работают под управлением модели безопасности Code Access Security (CAS). Это модель, опирающаяся на факты - в ней выделение прав, связанных с безопасностью, завситит отрасположения сборки и ее сигнатуры. Эти данные сравниваются с настройками политик безопасности на уровнях пользователя, рабочей станции или домена. Таким образомприложение выполняется с очень ограниченными правами. Эту концепцию называют «частичное доверие» (partial trust).

Одной из сложностей развертывания приложений частичного доверия является их тестирование в процессе разработки. Обычно разработчик имеет все права, и их же получает при запуске разрабатываемое приложение. Но для того, чтобы понять, как приложение будет работать в локальной сети или в Интернете, необходимо протестировать его в соответствующих условиях. Для того чтобы решать подобные задачи, в Visual Studio 2005 предоставляется набор средств, которые разработчик может использовать для тестирования и отладки своего приложения прямо из среды разработки, чтобы убедиться, что приложение будет правильно работать именно с теми правами доступа, которые будут предоставлены ему политикой безопасности после его развертывания.

Развертывание ClickOnce

ClickOnce - это технология, встроенная в Visual Studio 2005 и позволяющая упростить создание приложений, которые будут развернуты для пользователей с ограниченными правами. Эти приложения можно выполнять локально, на общем ресурсе локальной сети или на веб-странице. Приложения, запускаемые через сеть, помещаются в кэш и запускаются локально, но при этом права предоставляются только на тот ресурс, где изначально размещено приложение. Если разработчик устанавливает на сетевом ресурсе новую версию приложения, то при запуске приложения пользователем сначала проверяется этот ресурс, и кэш обновляется.

Visual Studio 2005 предоставляет разработчику возможность протестировать выполнение приложений с частичным доверием прямо из среды разработки. Это экономит массу времени и усилий по сборке и развертыванию приложений под управлением политики безопасности CAS.

Отладка «в зоне» с ограничениями по безопасности

При использовании ClickOnce важно, чтобы разработчики могли протестировать свои приложения с теми правами доступа, которые будут предоставлены приложениям после их развертывания. Возможности Debug in Zone позволяют задавать во время разработки и отладки приложения различные наборы разрешений, что делает возможным тестирование приложения в таких режимах, как если бы оно было развернуто в сети с разными ограничениями доверия. Для управляемых приложений эти настройки доступны в свойствах проекта на вкладке Security.

Чтобы использовать эти настройки, откройте в свойствах проекта вкладку Security и укажите, что разрабатываемое приложение будет работать с использованием политики частичного доверия («This is a partial trust application»). На этой же вкладке можно выбрать зону, в которой вы хотите установить приложение, и указать, какие права предоставить приложению после развертывания (см. рис. 4).

Рис. 4. Определение ограничений прав доступа для приложения на вкладке Security

Усовершенствованные исключения безопасности при отладке

После указания зоны установки работающее приложение будет генерировать исключения безопасности для этой зоны. На рисунке 5 показано новое диалоговое окно Security Exception, дает представление о том, как может выглядеть процесс отладки при возникновении исключения.

Рис. 5. Диалоговое окно «Security exceptions» в Visual Studio 2005

В окне Security Exception видно не только само сообщение. В нем также выводятся рекомендации, следуя которым, вы сможете изменить свое приложение таким образом, чтобы оно работало в соответствии с политикой частичного доверия. Например, разрешение на файловый ввод / вывод FileIOPermission отсутствует в зоне, в которой исполняется приложение, показанное на рисунке 4. Одно из предлагаемых решений этой проблемы - использование изолированного хранилища для этого приложения.

IntelliSense in Zone (средство для Visual Basic)

IntelliSense in the Zone - это средство безопасности, разработанное специально для Visual Basic. Настройки для зоны на вкладке Security учитываются при работе подсказки IntelliSense, и предлагаются только те API, которые разрешены в данной зоне. Функции, недоступные в данной зоне, показываются серым цветом. Таким образом, разработчики, которые создают приложения с использованием политики частичного доверия, могут выбирать только те API, которые разрешены для данной конкретной зоны исполнения.

PermCalc

PermCalc - это автономное приложение, используемое разработчиками .NET для расчета прав доступа, необходимых для успешной работы управляемого приложения. Это средство в настоящее время добавлено в Visual Studio 2005 и запускается одним щелчком на вкладке Security в окне Project Properties управляемого приложения.

Чтобы использовать PermCalc в интегрированной среде разработки, задайте зону установки вашего приложения и щелкните по кнопке Calculate Permissions. Если приложению необходимы более широкие права, чем доступные для выбранной области, вы увидите слово «Include» в столбце Settings таблицы разрешений, как показано на рисунке 6. Эти элементы списка помечены предупредительным знаком, чтобы показать, что требуемое разрешение не доступно по умолчанию в выбранной зоне. Если PermCalc определит, что приложению для правильной работы необходим полный набор прав доступа, то будет выдано сообщение об этом.

Рис. 6. Calculate Permissions высчитывает необходимые права доступа для правильной работы приложения

Другие способы повышения безопасности

Ниже описываются некоторые средства Visual Studio 2005 для повышения безопасности, которые могут быть полезны как для управляемых, так и для Windows-проектов. Сейчас мы рассмотрим процесс разработки с минимальным набором прав и тестирование.

Разработка и отладка с минимальным набором прав

Один из способов, с помощью которого пользователи могут защитить свою систему от воздействия вредоносных программ, - снижение уровня прав, с которыми они выполняются. Вредоносная программа, которая обладает правами администратора, получает полный доступ к компьютеру. С точки зрения общей безопасности, следует избегать запуска программы с правами администратора.

Кроме того, разработчики, работающие с правами администратора, не замечают проблем, с которыми сталкиваются пользователи с более низкими правами при работе приложения. К примеру, приложение, которое выполняет запись в папку «Program Files» или в системные папки, может работать без проблем с правами администратора. Но для учетных записей типа «Пользователь» это запрещено, поэтому попытки приложения записать туда данные закончатся неудачей.

В предыдущих версиях Visual Studio было не так просто разрабатывать и отлаживать приложения с пониженными правами, так как сама среда Visual Studio эффективнее работала с высокими правами. В Visual Studio 2005 ситуация изменилась. Visual Studio 2005 корректно работает под учетной записью типа User, и приложения так же легко разрабатывать и отлаживать, как раньше в Administrator или Debugger User.

Имейте в виду, что при использовании Visual Studio 2005 вы можете столкнуться с проблемой использования дополнительных расширений пакета, которые могут быть разработаны для более высокого уровня прав. Если вы столкнулись с такой ситуацией, известите разработчиков расширения о том, что их продукт требует больше прав, чем необходимо. В большинстве случаев переориентация хранилищ или запросов к реестру в подходящее место позволяет расширениям работать нормально.

Средства тестирования

Тестирование с целью выявления проблем безопасности является чрезвычайно важным этапом разработки приложения, работающего в сети. Visual Studio 2005 Team System предоставляет несколько средств тестирования, которые помогут в разработке более безопасных приложений.

Тестирование программных модулей (Unit testing)

Одна из задач, для которых применяется тестирование модулей, - проверка правильности значения, возвращаемого методом, после обработки переданных ему аргументов. В процессе обработки пользовательских данных важно быть уверенным в их правильности. Это включает в себя анализ типа и размера данных, - двух факторов, которые должны быть проверены до начала процесса обработки. С помощью Unit testing можно передать в функцию случайные входные данные и убедиться в том, что приложение обрабатывает данные правильно и выполняется без ошибок.

Кроме того, можно включить показ «покрытия» кода тестами. Функция покрытия кода поможет проконтролировать, что весь код приложения был протестирован и избежать пропуска при тестировании редко используемых блоков кода (например, обработчиков исключений). Код, который не является частью нормального потока приложения, может оказаться особенно уязвимым для атак. Было множество случаев, когда злоумышленники использовали дефекты в тех частях кода, которые вызываются при сбоях работы приложения.

Visual Studio 2005 предоставляет несколько средств для тестирования программных модулей. В Visual C++, Visual C# или Visual Basic можно создать тест модуля вручную в диалоговом окне Add New Test, показанном на рисунке 7.

Рис. 7. Создание нового теста модуля в диалогового окна Add New Test в Visual Studio 2005

Также тесты можно создавать с помощью мастера Unit Test Wizard. Он поможет вам составить представление о том, как работают различные типы тестов.

Нагрузочное тестирование

Нагрузочное тестирование важно, так как помогает смоделировать и отладить поведение приложений даже в случае атаки типа «отказ в обслуживании» (denial-of-service). При выборе шаблона Load Test в диалоговом окне Add New Test, запускается мастер New Load Test Wizard, показанный на рисунке 8. Кроме нагрузочного тестирования приложения, этот инструмент можно использовать для моделирования работы в аварийных ситуациях. Аварийную ситуацию можно смоделировать с помощью посылки большого числа запросов вашему приложению, чтобы посмотреть, как оно выдерживает нагрузку. При таком тщательном наблюдении за поведением приложения, вы сможете распознать начало атаки и при необходимости спланировать ответные действия на каждый из типов атаки.

Рис. 8. Подготовка нагрузочного теста в Visual Studio 2005

Заключение

В этом документе мы кратко рассмотрели некоторые средства обеспечения безопасности, благодаря которым Visual Studio 2005 является таким важным новым инструментом для разработчиков. Программируете ли вы маленькие сервисные программы или огромные системы для решения критически важных, ответственных задач, безопасность компьютеров ваших заказчиков и безопасность разработанных приложений должна быть главным приоритетом. С помощью новых средств, встроенных в Visual Studio 2005, создавать, тестировать и устанавливать безопасные приложения можно намного проще, чем раньше.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=5742