Поделиться через


Предупреждения безопасности

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

В этом подразделе

Правило

Описание

CA2100: проанализируйте SQL-запросы с целью выявления уязвимостей безопасности

Метод задает свойство System.Data.IDbCommand.CommandText с использованием строки, созданной из строкового аргумента метода. Это правило предполагает, что строковый аргумент содержит введенные пользователем данные. Созданная из введенных пользователем данных командная строка SQL уязвима перед атаками путем внедрения кода SQL.

CA2102: перехватывайте исключения, не являющиеся CLSCompliant, с помощью общих обработчиков

Элемент в сборке, не помеченной атрибутом RuntimeCompatibilityAttribute или помеченной атрибутом RuntimeCompatibility(WrapNonExceptionThrows = false), содержит блок catch, который обрабатывает исключения System.Exception, однако непосредственно за этим блоком не следует общий блок catch.

CA2103: проверьте императивную безопасность

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

CA2104: не объявляйте изменяемые ссылочные типы, доступные только для чтения

Видимый извне тип содержит видимое извне и доступное только для чтение поле, являющееся изменяемым ссылочным типом. Изменяемый тип — это тип, экземпляр которого может быть изменен.

CA2105: поля массивов не должны быть доступны только для чтения

При применении модификатора "только для чтения" (ReadOnly в Visual Basic) к полю, содержащему массив, это поле нельзя изменить, связав его с другим массивом. Однако элементы массива, хранящегося в доступном только для чтения поле, можно будет изменить.

CA2106: обеспечьте безопасность утверждений

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

CA2107: проверьте использование deny и permit only

Метод PermitOnly и действия безопасности CodeAccessPermission.Deny следует использовать только в том случае, когда разработчик хорошо разбирается в работе системы безопасности .NET Framework. Код, который использует эти действия безопасности, должен быть тщательно проанализирован на предмет безопасности.

CA2108: проверьте объявляемые параметры безопасности типов значений

Открытый или защищенный тип значения защищен средствами доступа к данным или требованиями ссылки.

CA2109: проверьте видимые обработчики событий

Обнаружен открытый или защищенный метод обработки событий. Методы обработки событий следует раскрывать только в тех случаях, когда это совершенно необходимо.

CA2111: указатели не должны быть видимыми

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

CA2112: защищенные типы не должны предоставлять поля

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

CA2114: безопасность метода должна быть надмножеством типа

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

CA2115: вызывайте GC.KeepAlive при использовании собственных ресурсов

Данное правило обнаруживает ошибки, которые могут возникать из-за завершения неуправляемых ресурсов, по-прежнему используемых в машинном коде.

CA2116: методы APTCA должны вызывать только методы APTCA

Если в полностью доверенной сборке присутствует атрибут APTCA (AllowPartiallyTrustedCallers) и она выполняет код в другой сборке, для которой не разрешены частично доверенные вызовы, возможно возникновение уязвимости безопасности.

CA2117: APTCA-типы должны расширять только базовые APTCA-типы

Если в полностью доверенной сборке присутствует атрибут APTCA (AllowPartiallyTrustedCallers), а тип в сборке унаследован от типа, для которого не разрешены частично доверенные вызовы, возможно возникновение уязвимости безопасности.

CA2118: обзор использования SuppressUnmanagedCodeSecurityAttribute

Атрибут SuppressUnmanagedCodeSecurityAttribute изменяет поведение системы безопасности, определенное по умолчанию, для элементов, выполняющих неуправляемый код за счет COM-взаимодействия или вызова неуправляемого кода. Этот атрибут служит в основном для повышения производительности; однако, прирост производительности сопряжен со значительными рисками безопасности.

CA2119: запечатайте методы, соответствующие частным интерфейсам

Наследуемый открытый тип предоставляет реализацию переопределяемого метода внутреннего (Friend в Visual Basic) интерфейса. Для устранения нарушения данного правила следует исключить возможность переопределения метода за пределами сборки.

CA2120: обеспечьте безопасность конструкторов сериализации

Для этого типа предусмотрен конструктор, который принимает объекты System.Runtime.Serialization.SerializationInfo и System.Runtime.Serialization.StreamingContext (сигнатура конструктора сериализации). Этот конструктор не защищен проверкой безопасности, однако один или несколько обычных конструкторов этого типа защищены.

CA2121: статические конструкторы должны быть частными

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

CA2122: не используйте косвенное представление методов с запросами компоновки

У открытого или защищенного элемента есть требования ссылки, и он вызывается элементом, который не выполняет какие-либо проверки безопасности. Запрос компоновки проверяет разрешения только непосредственно вызывающего метода.

CA2123: запросы компоновки переопределения должны быть идентичны базовым

Это правило сравнивает метод с его базовым методом (который является интерфейсом или виртуальным методом другого типа), а затем сравнивает запросы ссылок для каждого из них. Если это правило нарушается, то вредоносный вызывающий объект может обойти запрос ссылок путем вызова небезопасного метода.

CA2124: помещайте уязвимые предложения finally во внешний блок try

Открытый или защищенный метод содержит блок try/finally. Блок finally сбрасывает состояние безопасности и не заключен в блок finally.

CA2126: запросы компоновки типа требуют запросы наследования

Открытый незапечатанный тип защищен требованием ссылки и имеет переопределяемый метод. Ни тип, ни метод не защищены требованием наследования.

CA2136: элементы не должны иметь конфликтующие пометки прозрачности

В сборке, прозрачной на 100 %, не может содержаться критический код. Данное правило позволяет проанализировать сборки, прозрачные на 100 %, в поисках аннотаций SecurityCritical на уровне типов, полей и методов.

CA2147: прозрачные методы могут не использовать утверждения безопасности

Это правило позволяет проанализировать все методы и типы в сборке, которая является либо на 100% прозрачной, либо смешанной (прозрачной и критической), и пометить декларативное и императивное использование Assert.

CA2140: прозрачный код не должен ссылаться на элементы, критичные в плане безопасности

Методы, помеченные атрибутом SecurityTransparentAttribute, вызывают закрытые элементы, помеченные как SecurityCritical. Это правило позволяет проанализировать все методы и типы в смешанной (прозрачной и критической) сборке и пометить все вызовы закрытого критического кода из прозрачного кода, которые не помечены как SecurityTreatAsSafe.

CA2130: константы критической безопасности должны быть прозрачными

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

CA2131: типы критической безопасности могут не участвовать в эквивалентности типа

Тип участвует в эквивалентности типов, а сам тип либо член или поле типа помечены атрибутом SecurityCriticalAttribute. Это правило применяется ко всем критическим типам или к типам, содержащим критические методы или поля, участвующие в эквивалентности типов. Когда среда CLR обнаруживает такой тип, она не загружает его и выдает исключение TypeLoadException во время выполнения. Обычно это правило срабатывает, только если пользователи реализуют эквивалентность типов вручную вместо того, чтобы позволить tlbimp и компиляторам обработать эквивалентность типов.

CA2132: конструкторы по умолчанию должны быть по крайней мере настолько критичными, как и конструкторы базовых типов по умолчанию

Типы и члены с атрибутом SecurityCriticalAttribute не могут использоваться в коде приложений Silverlight. Критичные в плане безопасности типы и элементы могут использоваться только надежным кодом в среде .NET Framework для библиотеки классов Silverlight. Поскольку открытая или защищенная конструкция в производном классе должна иметь ту же или большую прозрачность, чем ее базовый класс, класс в приложении не может быть производным от класса, помеченного как SecurityCritical.

CA2133: делегаты должны привязываться к методам с согласованной прозрачностью

Это предупреждение вызывается методом, который привязывает делегат, помеченный атрибутом SecurityCriticalAttribute, к методу, который является прозрачным или помечен атрибутом SecuritySafeCriticalAttribute. Предупреждение также запускает метод, который привязывает прозрачный или безопасный делегат к критическому методу.

CA2134: методы должны сохранять согласованную прозрачность при переопределении базовых методов

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

CA2135: сборки уровня 2 не должны содержать требования LinkDemand

Требования LinkDemand являются устаревшими в наборе правил безопасности уровня 2. Вместо использования требования LinkDemand для обеспечения безопасности во время JIT-компиляции пометьте методы, типы и поля атрибутом SecurityCriticalAttribute.

CA2136: элементы не должны иметь конфликтующие пометки прозрачности

Атрибуты прозрачности применяются из элементов кода большей области к элементам меньшей области. Атрибуты прозрачности элементов кода с большей областью имеют приоритет по сравнению с атрибутами прозрачности элементов кода, которые содержатся в первом элементе. Например, класс, помеченный атрибутом SecurityCriticalAttribute, не может содержать метод, помеченный атрибутом SecuritySafeCriticalAttribute.

CA2137: прозрачные методы должны содержать только проверяемые IL

Метод содержит непроверяемый код или возвращает тип по ссылке. Это правило срабатывает при попытках прозрачного кода безопасности выполнить непроверяемый MSIL. Однако это правило не содержит полную проверку IL, и вместо нее использует эвристику для выявления большинства нарушений проверки MSIL.

CA2138: прозрачные методы не должны вызывать методы с атрибутом SuppressUnmanagedCodeSecurity

Прозрачный с точки зрения безопасности метод вызывает метод, помеченный атрибутом SuppressUnmanagedCodeSecurityAttribute.

CA2139: прозрачные методы могут не использовать атрибут HandleProcessCorruptingExceptions

Это правило запускается любым прозрачным методом, который пытается обработать исключение повреждения процесса с помощью атрибута HandleProcessCorruptedStateExceptionsAttribute. Исключение повреждения процесса — это классификация версии 4.0 среды CLR таких исключений, как AccessViolationException. Атрибут HandleProcessCorruptedStateExceptionsAttribute может использоваться только критичными в плане безопасности методами и будет игнорироваться при применении для прозрачного метода.

CA2140: прозрачный код не должен ссылаться на элементы, критичные в плане безопасности

Элемент кода, помеченный атрибутом SecurityCriticalAttribute, является критическим с точки зрения безопасности. Прозрачный метод не может использовать элемент, критический с точки зрения безопасности. Если прозрачный тип пытается использовать тип, критический с точки зрения безопасности, то вызывается исключение TypeAccessException, MethodAccessException или FieldAccessException.

CA2141: прозрачные методы не должны удовлетворять требования LinkDemand

Прозрачный с точки зрения безопасности метод вызывает метод в сборке, не помеченной атрибутом AllowPartiallyTrustedCallersAttribute (APTCA), либо прозрачный с точки зрения безопасности метод удовлетворяет требованию LinkDemand по типу или методу.

CA2142: прозрачный код не должен быть защищен с помощью требований LinkDemand

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

CA2143: прозрачные методы не должны использовать требования безопасности

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

CA2144: прозрачный код не должен загружать сборки из массивов байтов

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

CA2145: прозрачные методы не должны быть снабжены атрибутом SuppressUnmanagedCodeSecurityAttribute

Методы, оснащенные атрибутом SuppressUnmanagedCodeSecurityAttribute, имеют неявную проверку LinkDemand, применяемую к любому вызывающему их методу. Для этой проверки LinkDemand требуется, чтобы вызывающий код был критическим с точки зрения безопасности. Пометка метода, который использует SuppressUnmanagedCodeSecurity с атрибутом SecurityCriticalAttribute, делает это требование более очевидным для тех, кто вызывает этот метод.

CA2146: типы должны быть по крайней мере настолько же критичны, как их базовые типы и интерфейсы

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

CA2147: прозрачные методы могут не использовать утверждения безопасности

Коду, помеченному атрибутом SecurityTransparentAttribute, не предоставляются достаточные для утверждения разрешения.

CA2149: прозрачные методы не следует вызывать в машинном коде

Это правило срабатывает для любого прозрачного метода, который вызывается непосредственно в машинном коде, например, с помощью вызова P/Invoke. Нарушение этого правила приводит к исключению MethodAccessException на уровне 2 модели прозрачности и вызову полного требования UnmanagedCode на уровне 1 модели прозрачности.