CA3005: Revisión de código en busca de vulnerabilidades de inyección de LDAP
Propiedad | Value |
---|---|
Identificador de la regla | CA3005 |
Título | Revisión de código en busca de vulnerabilidades de inyección de LDAP |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Poco problemático |
Habilitado de forma predeterminada en .NET 8 | No |
Causa
Una entrada de solicitudes HTTP que puede no ser de confianza llega a una instrucción LDAP.
De forma predeterminada, esta regla analiza todo el código base, pero esto es configurable.
Descripción de la regla
Cuando trabaje con una entrada que no sea de confianza, tenga en cuentan los ataques por inyección del protocolo ligero de acceso a directorios (LDAP). Un atacante podría ejecutar instrucciones LDAP malintencionadas en directorios de información. Las aplicaciones que usan la entrada del usuario para construir instrucciones LDAP dinámicas para acceder a los servicios de directorio son especialmente vulnerables.
Esta regla intenta buscar la entrada de las solicitudes HTTP que llega a una instrucción LDAP.
Nota
Esta regla no puede realizar el seguimiento de los datos entre ensamblados. Por ejemplo, si un ensamblado lee la entrada de la solicitud HTTP y, a continuación, la pasa a otro ensamblado que ejecuta una instrucción LDAP, esta regla no generará ninguna advertencia.
Nota
Existe un límite configurable para el nivel de profundidad con que esta regla analizará el flujo de datos a través de las llamadas a métodos. Vea Configuración del analizador para saber cómo configurar el límite en un archivo EditorConfig.
Cómo corregir infracciones
Para la parte controlada por el usuario de las instrucciones LDAP, considere alguna de las opciones siguientes:
- Permitir solo una lista segura de caracteres no especiales.
- No permitir caracteres especiales.
- Escapar caracteres especiales.
Consulte la hoja de referencia de prevención de inyección de LDAP de OWASP para obtener más información.
Cuándo suprimir las advertencias
Si sabe que la entrada se ha validado o se ha convertido en un carácter de escape para que sea segura, puede suprimir esta advertencia.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA3005
// The code that's violating the rule is on this line.
#pragma warning restore CA3005
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA3005.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Configuración del código para analizar
Use las opciones siguientes para configurar en qué partes del código base se va a ejecutar esta regla.
Puede configurar estas opciones solo para esta regla, para todas las reglas a las que se aplica o para todas las reglas de esta categoría (Seguridad) a las que se aplica. Para más información, vea Opciones de configuración de reglas de calidad de código.
Exclusión de símbolos específicos
Puede excluir símbolos específicos, como tipos y métodos, del análisis. Por ejemplo, para especificar que la regla no se debe ejecutar en ningún código dentro de los tipos con el nombre MyType
, agregue el siguiente par clave-valor a un archivo .editorconfig en el proyecto:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Formatos de nombre de símbolo permitidos en el valor de opción (separados por |
):
- Solo nombre de símbolo (incluye todos los símbolos con el nombre, con independencia del tipo contenedor o el espacio de nombres).
- Nombres completos en el formato de id. de documentación del símbolo. Cada nombre de símbolo necesita un prefijo de tipo símbolo, como
M:
para los métodos,T:
para los tipos yN:
para los espacios de nombres. .ctor
para los constructores y.cctor
para los constructores estáticos.
Ejemplos:
Valor de la opción | Resumen |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Coincide con todos los símbolos denominados MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Coincide con todos los símbolos denominados MyType1 o MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Coincide con un método MyMethod concreto con la signatura completa especificada. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Coincide con los métodos MyMethod1 y MyMethod2 concretos con las signaturas completas especificadas. |
Exclusión de tipos específicos y sus tipos derivados
Puede excluir tipos específicos y sus tipos derivados del análisis. Por ejemplo, para especificar que la regla no se debe ejecutar en ningún método dentro de los tipos con el nombre MyType
y sus tipos derivados, agregue el siguiente par clave-valor a un archivo .editorconfig en el proyecto:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Formatos de nombre de símbolo permitidos en el valor de opción (separados por |
):
- Solo nombre de tipo (incluye todos los tipos con el nombre, con independencia del tipo contenedor o el espacio de nombres).
- Nombres completos en el formato de identificador de documentación del símbolo, con un prefijo
T:
opcional.
Ejemplos:
Valor de la opción | Resumen |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Coincide con todos los tipos denominados MyType y todos sus tipos derivados. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Coincide con todos los tipos denominados MyType1 o MyType2 , y todos sus tipos derivados. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Coincide con un tipo MyType específico con el nombre completo dado y todos sus tipos derivados. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Coincide con los tipos MyType1 y MyType2 específicos con los correspondientes nombres completos y todos sus tipos derivados. |
Ejemplos de pseudocódigo
Infracción
using System;
using System.DirectoryServices;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string userName = Request.Params["user"];
string filter = "(uid=" + userName + ")"; // searching for the user entry
// In this example, if we send the * character in the user parameter which will
// result in the filter variable in the code to be initialized with (uid=*).
// The resulting LDAP statement will make the server return any object that
// contains a uid attribute.
DirectorySearcher searcher = new DirectorySearcher(filter);
SearchResultCollection results = searcher.FindAll();
// Iterate through each SearchResult in the SearchResultCollection.
foreach (SearchResult searchResult in results)
{
// ...
}
}
}
Imports System
Imports System.DirectoryServices
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(send As Object, e As EventArgs)
Dim userName As String = Me.Request.Params(""user"")
Dim filter As String = ""(uid="" + userName + "")"" ' searching for the user entry
' In this example, if we send the * character in the user parameter which will
' result in the filter variable in the code to be initialized with (uid=*).
' The resulting LDAP statement will make the server return any object that
' contains a uid attribute.
Dim searcher As DirectorySearcher = new DirectorySearcher(filter)
Dim results As SearchResultCollection = searcher.FindAll()
' Iterate through each SearchResult in the SearchResultCollection.
For Each searchResult As SearchResult in results
' ...
Next searchResult
End Sub
End Class