CA3003 : Passez en revue le code pour détecter les vulnérabilités de l’injection de chemin de fichier
Propriété | Value |
---|---|
Identificateur de la règle | CA3003 |
Titre | Passez en revue le code pour détecter les vulnérabilités de l’injection de chemin de fichier |
Catégorie | Sécurité |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Une entrée de requête HTTP potentiellement non approuvée atteint le chemin d’une opération de fichier.
Par défaut, cette règle analyse l’intégralité du codebase, mais elle est configurable.
Description de la règle
Lorsque vous travaillez avec des entrées non approuvées provenant de requêtes web, veillez à utiliser une entrée contrôlée par l’utilisateur lors de la spécification des chemins d’accès aux fichiers. Un attaquant peut être en mesure de lire un fichier non prévu, ce qui entraîne la divulgation d’informations de données sensibles. Ou bien, un attaquant peut être en mesure d’écrire dans un fichier non prévu, ce qui entraîne une modification non autorisée de données sensibles ou compromet la sécurité du serveur. Une technique d’attaquant courante est l’attaque par chemin transversal pour accéder aux fichiers en dehors du répertoire prévu.
Cette règle tente de trouver des entrées à partir de requêtes HTTP qui atteignent un chemin dans une opération de fichier.
Notes
Cette règle ne peut pas suivre les données entre assemblys. Par exemple, si un assembly lit l’entrée de requête HTTP, puis la transmet à un autre assembly qui écrit dans un fichier, cette règle ne génère pas d’avertissement.
Notes
Il existe une limite configurable quant à la profondeur de l’analyse du flux de données entre les appels de méthode. Pour savoir comment configurer la limite dans un fichier EditorConfig, consultez Configuration de l’analyseur.
Comment corriger les violations
- Si possible, limitez les chemins d’accès aux fichiers en fonction de l’entrée de l’utilisateur à une liste sécurisée connue explicitement. Par exemple, si votre application doit uniquement accéder à « red.txt », « green.txt » ou « blue.txt », autorisez uniquement ces valeurs.
- Vérifiez les noms de fichiers non approuvés et validez que le nom est bien formé.
- Utilisez des noms de chemin d’accès complets lors de la spécification des chemins d’accès.
- Évitez les constructions potentiellement dangereuses, comme les variables d’environnement de chemin d’accès.
- Acceptez uniquement les noms de fichier longs et validez le nom long si l’utilisateur envoie des noms courts.
- Limitez l’entrée de l’utilisateur final aux caractères valides.
- Rejetez les noms où la longueur MAX_PATH est dépassée.
- Gérez les noms de fichiers littéralement, sans interprétation.
- Déterminez si le nom de fichier représente un fichier ou un appareil.
Quand supprimer les avertissements
Si vous avez validé l’entrée comme décrit dans la section précédente, vous pouvez supprimer cet avertissement.
Configurer le code à analyser
Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.
Vous pouvez configurer ces options pour cette règle uniquement, pour toutes les règles auxquelles elles s’appliquent ou pour toutes les règles de cette catégorie (Sécurité) auxquelles elles s’appliquent. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.
Exclure des symboles spécifiques
Vous pouvez exclure de l’analyse des symboles spécifiques, comme des types et des méthodes. Par exemple, pour spécifier que la règle ne doit pas s’exécuter sur du code dans des types nommés MyType
, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du symbole uniquement (inclut tous les symboles avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole. Chaque nom de symbole nécessite un préfixe de type symbole, comme
M:
pour les méthodes,T:
pour les types etN:
pour les espaces de noms. .ctor
pour les constructeurs et.cctor
pour les constructeurs statiques.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Correspond à tous les symboles nommés MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Correspond à tous les symboles nommés MyType1 ou MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Correspond à une méthode MyMethod spécifique avec la signature complète spécifiée. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Correspond à des méthodes MyMethod1 et MyMethod2 spécifiques avec la signature complète spécifiée. |
Exclure des types spécifiques et leurs types dérivés
Vous pouvez exclure de l’analyse des types spécifiques et leurs types dérivés. Par exemple, pour spécifier que la règle ne doit s’exécuter sur aucune méthode dans des types nommés MyType
et leurs types dérivés, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Formats de nom de symbole autorisés dans la valeur d’option (séparés par |
) :
- Nom du type uniquement (inclut tous les types avec le nom, quel que soit le type ou l’espace de noms qui les contient).
- Noms qualifiés complets au format d’ID de documentation du symbole, avec un préfixe
T:
facultatif.
Exemples :
Valeur d’option | Récapitulatif |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Correspond à tous les types nommés MyType et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Correspond à tous les types nommés MyType1 ou MyType2 , et à tous leurs types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Correspond à un type MyType spécifique avec un nom complet donné et tous ses types dérivés. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Correspond à des types MyType1 ou MyType2 spécifiques avec leur nom complet respectif et tous leurs types dérivés. |
Exemples de pseudo-code
Violation
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