CA3003: Revisión de código en busca de vulnerabilidades de inyección de rutas de acceso a archivos
Propiedad | Value |
---|---|
Identificador de la regla | CA3003 |
Título | Revisión de código en busca de vulnerabilidades de inyección de rutas de acceso a archivos |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | No |
Causa
Una entrada de solicitud HTTP que puede no ser de confianza llega a la ruta de acceso de una operación de archivo.
De forma predeterminada, esta regla analiza todo el código base, pero esto es configurable.
Descripción de la regla
Al trabajar con una entrada que no es de confianza desde solicitudes web, piense en usar entradas controladas por el usuario al especificar las rutas de acceso a los archivos. Un atacante puede leer un archivo no deseado, lo que da lugar a la divulgación de información confidencial. O bien, un atacante puede escribir en un archivo no deseado, lo que produce una modificación no autorizada de los datos confidenciales o pone en peligro la seguridad del servidor. Una técnica que suelen utilizar los atacantes para acceder a archivos fuera del directorio previsto es el ataque transversal de directorio.
Esta regla intenta buscar la entrada de las solicitudes HTTP que llega a una ruta de acceso de una operación de archivo.
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 escribe en un archivo, 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
- Si es posible, limite las rutas de acceso a archivos en función de la entrada del usuario a una lista segura conocida explícitamente. Por ejemplo, si la aplicación solo necesita acceder a "red.txt", "green.txt" o "blue.txt", permita solo esos valores.
- Compruebe si hay nombres de archivo que no son de confianza y asegúrese de que el nombre sea correcto.
- Utilice nombres de ruta de acceso completa al especificar las rutas de acceso.
- Evite construcciones potencialmente peligrosas como las variables de entorno PATH.
- Acepte solo nombres de archivo largos y valide el nombre largo si el usuario envía nombres cortos.
- Restrinja la entrada del usuario final a caracteres válidos.
- Rechace nombres que excedan la longitud MAX_PATH.
- Controle los nombres de archivo literalmente, sin interpretaciones.
- Determine si el nombre de archivo representa un archivo o un dispositivo.
Cuándo suprimir las advertencias
Si ha validado la entrada como se describe en la sección anterior, puede suprimir esta advertencia.
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.IO;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string userInput = Request.Params["UserInput"];
// Assume the following directory structure:
// wwwroot\currentWebDirectory\user1.txt
// wwwroot\currentWebDirectory\user2.txt
// wwwroot\secret\allsecrets.txt
// There is nothing wrong if the user inputs:
// user1.txt
// However, if the user input is:
// ..\secret\allsecrets.txt
// Then an attacker can now see all the secrets.
// Avoid this:
using (File.Open(userInput, FileMode.Open))
{
// Read a file with the name supplied by user
// Input through request's query string and display
// The content to the webpage.
}
}
}
Imports System
Imports System.IO
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim userInput As String = Me.Request.Params("UserInput")
' Assume the following directory structure:
' wwwroot\currentWebDirectory\user1.txt
' wwwroot\currentWebDirectory\user2.txt
' wwwroot\secret\allsecrets.txt
' There is nothing wrong if the user inputs:
' user1.txt
' However, if the user input is:
' ..\secret\allsecrets.txt
' Then an attacker can now see all the secrets.
' Avoid this:
Using File.Open(userInput, FileMode.Open)
' Read a file with the name supplied by user
' Input through request's query string and display
' The content to the webpage.
End Using
End Sub
End Class