Aller au contenu principal

C# (.NET) · SAST

SAST C# / .NET qui tourne entièrement hors-ligne

Auditez ASP.NET Core, Entity Framework, Dapper et NHibernate contre les vulnérabilités OWASP Top 10, gadgets de désérialisation et dérive de configuration — sans quitter votre machine.

Frameworks & bibliothèques scannés

Nous testons la couverture sur ces frameworks via fixtures. De nouveaux patterns sont ajoutés à chaque release de règles builtin.

ASP.NET Core ASP.NET MVC Entity Framework Core Dapper NHibernate Razor Blazor SignalR IdentityServer NewtonsoftJson System.Text.Json BouncyCastle.NetCore Polly AutoMapper

Principales classes CWE détectées

Ces classes CWE apparaissent le plus souvent dans les codebases modernes de ce langage. StaticCodeAudit livre des règles dédiées pour chacune, mappées à OWASP Top 10 / ISO 27001 / ASVS quand pertinent.

CWE-89

Injection SQL

Concaténation de strings dans SqlCommand.CommandText, Dapper Execute($"..."), EF Core FromSqlRaw avec interpolation, NHibernate HQL avec concat.

Détecté par la règle SCA : sql_injection_concat_csharp

CWE-78

Injection de commande OS

Process.Start(new ProcessStartInfo { FileName = "cmd", Arguments = userInput }) avec parsing shell. UseShellExecute = true augmente la surface d'attaque.

Détecté par la règle SCA : command_injection_csharp

CWE-502

Désérialisation non sécurisée

BinaryFormatter.Deserialize (obsolète depuis .NET 5 mais encore trouvé), NetDataContractSerializer, SoapFormatter sur streams non fiables.

Détecté par la règle SCA : unsafe_deserialization

CWE-79

Cross-Site Scripting (XSS)

Razor @Html.Raw(model.Bio) avec données non fiables, MVC HttpUtility.HtmlEncode bypassé, Blazor MarkupString sur entrée user.

Détecté par la règle SCA : xss_raw_html

CWE-798

Identifiants en dur

Chaînes de connexion dans appsettings.json committé, clé de signature JWT en const string, secrets Azure dans web.config.

Détecté par la règle SCA : hardcoded_secret

CWE-352

CSRF

[ValidateAntiForgeryToken] manquant sur actions POST, options.SuppressXFrameOptionsHeader = true dans Startup.

Détecté par la règle SCA : csrf_missing_aspnet

Vulnérable vs. sain — trois exemples rapides

CWE-89 Détecté par la règle SCA : sql_injection_concat_csharp
❌ Vulnérable
// Vulnérable — SqlCommand concat
var cmd = new SqlCommand(
    $"SELECT * FROM users WHERE name = \'{name}\'", conn);
var reader = cmd.ExecuteReader();
✅ Sain
// Sain — paramètres
var cmd = new SqlCommand(
    "SELECT * FROM users WHERE name = @name", conn);
cmd.Parameters.AddWithValue("@name", name);
var reader = cmd.ExecuteReader();
CWE-502 Détecté par la règle SCA : unsafe_deserialization
❌ Vulnérable
// Vulnérable — BinaryFormatter sur stream non fiable
var bf = new BinaryFormatter();
var obj = bf.Deserialize(networkStream);
✅ Sain
// Sain — System.Text.Json avec schéma connu
var obj = JsonSerializer.Deserialize<UserDto>(
    networkStream,
    new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
CWE-79 Détecté par la règle SCA : xss_raw_html
❌ Vulnérable
// Vulnérable — Razor @Html.Raw sur données user
@Html.Raw(Model.Bio)
✅ Sain
// Sain — sortie encodée par défaut
@Model.Bio

Ce que StaticCodeAudit détecte (ce langage)

  • Injection SQL dans SqlCommand concat, Dapper interpolation, EF Core FromSqlRaw, NHibernate HQL concat
  • XSS dans Razor @Html.Raw, Blazor MarkupString, MVC bypass d'encodage manuel
  • Injection de commande dans Process.Start avec parsing shell
  • Désérialisation BinaryFormatter sur streams non fiables (encore présent malgré la dépréciation .NET)
  • Secrets en dur dans appsettings.json, web.config committés
  • CSRF : [ValidateAntiForgeryToken] manquant sur actions POST
  • Cookies non sécurisés (CookieOptions.Secure, HttpOnly, SameSite off)
  • Path traversal dans File.ReadAllBytes, Path.Combine avec chemins user
  • XXE dans XmlDocument, XmlReaderSettings.DtdProcessing = Parse
  • Crypto non sécurisée (MD5/SHA1 sécurité, mode ECB, clés en dur)
  • JWT algorithme none, secret HS256 en dur, pas de claim d'expiration
  • Open redirect via Redirect(Request.Query["url"])
  • APIs dépréciées (BinaryFormatter, NetDataContractSerializer, SHA1Managed)
  • Misconfigurations CI/CD (.gitlab-ci, GitHub Actions, feed NuGet non sécurisé)

Envie de savoir comment la qualité de détection est réellement mesurée ? Consultez la méthodologie complète des benchmarks multi-langages (OWASP Benchmark, NIST Juliet, précision/recall/F1 par langage) →

CVE Test Suite — le chiffre honnête pour ASP.NET

StaticCodeAudit a été mesuré sur un CVE Test Suite réel : 45 cas reconstitués à partir de CVE publiées et historiques, sur 8 frameworks et 5 langages. ASP.NET en fait partie — et c'est le framework le moins bien noté de toute la suite.

66,7 %
Score F1
66,7 %
Rappel
45
CVE Test Suite (total, tous langages)

ASP.NET, reconstitué depuis CVE

66,7 %
ASP.NET (reconstitué depuis CVE)

Divulgué, pas caché : ASP.NET/C# est le framework le moins bien noté du tableau cross-langage, précision et rappel autour de 66,7 %. Les CVE historiques du type chaînes de désérialisation façon log4shell et chemins de taint multi-sauts complexes dans ASP.NET sont précisément les cas que le moteur de règles rate encore. Détail complet cross-langage (y compris où Python et PHP obtiennent un meilleur score) sur la <a href="/fr/language-benchmarks.php" class="text-primary font-semibold hover:underline">page des benchmarks par langage</a>.

Les vraies failles tiennent rarement dans un seul fichier

Les applications ASP.NET répartissent la logique en couches : un contrôleur reçoit la requête, un repository construit la requête SQL. Un scanner limité à un seul fichier à la fois ne fait jamais le lien — il voit la donnée utilisateur dans OrdersController.cs et l'appel base de données dans OrderRepository.cs, mais jamais la connexion entre les deux. StaticCodeAudit suit la donnée à travers les fichiers.

OrdersController.cs
[HttpGet("orders/{id}")]
public IActionResult GetOrder(string id)
{
    return Ok(_repo.FindOrder(id));
}
OrderRepository.cs
public Order FindOrder(string id)
{
    var sql = $"SELECT * FROM Orders WHERE Id = \'{id}\'";
    return _connection.QueryFirst<Order>(sql);
}

id provient du paramètre de route dans le contrôleur, et atteint la requête SQL un fichier plus loin, sans modification — StaticCodeAudit le signale à la ligne exacte où la requête s'exécute.

Comment ça se compare à Security Code Scan ou Semgrep ?

Security Code Scan et Semgrep sont les deux outils qui reviennent en premier quand une équipe .NET cherche un scanner de sécurité gratuit. Les deux sont légitimes, et beaucoup d'équipes en utilisent déjà un — voici un comparatif honnête, pas un dénigrement.

Security Code Scan

Gratuit, open source

Analyseur Roslyn conçu spécifiquement pour les problèmes de sécurité .NET (injection SQL, XSS, XXE, crypto faible), s'exécute dans le compilateur au moment du build. Bonne couverture par défaut, mais analyse limitée à un projet : pas de suivi de taint inter-fichiers sur une solution multi-projets, et les findings ne sont pas mappés CWE/ISO 27001/ASVS par défaut.

Semgrep (Community)

Gratuit, moteur open source

Moteur de pattern-matching couvrant de nombreux langages, avec un support C# plus récent et moins mature que sa couverture Python/Java/JS. Le tier gratuit couvre l'essentiel du quotidien ; le suivi de taint inter-fichiers, le reporting de conformité et certaines intégrations entreprise sont réservés aux tiers payants de Semgrep.

Comparatif complet StaticCodeAudit vs Semgrep →

Aucun des deux n'est remplacé par l'installation de StaticCodeAudit — si Security Code Scan couvre déjà ce dont votre équipe a besoin, continuez à l'utiliser. Ce que StaticCodeAudit ajoute : des findings déjà mappés CWE/OWASP/ISO 27001/ASVS/NIST CSF (un finding prêt pour un dossier d'audit, pas juste un identifiant de règle), un suivi de taint inter-fichiers sur toute votre solution par défaut, et 7 autres langages couverts par le même binaire — pas de scanner séparé à configurer par langage. Beaucoup d'équipes utilisent les deux.

Auditez votre code

Auditez ASP.NET Core, Entity Framework, Dapper et NHibernate contre les vulnérabilités OWASP Top 10, gadgets de désérialisation et dérive de configuration — sans quitter votre machine.

Télécharger le binaire démo Réserver une démo guidée