DllSpy

Analyse les assemblys .NET compilés pour découvrir les surfaces d'entrée (points de terminaison HTTP, hubs SignalR, services WCF, services gRPC, pages Razor, composants Blazor, fonctions Azure, points de terminaison OData), vérifier la configuration d'autorisation et signaler des problèmes de sécurité — le tout sans exécuter l'application.
Disponible en tant qu'outil CLI et module PowerShell.

Installation
CLI
dotnet tool install -g DllSpy
PowerShell
Install-Module -Name DllSpy
Utilisation
CLI
# Lister toutes les surfaces
dllspy ./MyApi.dll
# Analyser les vulnérabilités de sécurité
dllspy ./MyApi.dll -s
# Filtrer par type de surface (HttpEndpoint, SignalRMethod, WcfOperation, GrpcOperation, RazorPage, BlazorComponent, AzureFunction, ODataEndpoint)
dllspy ./MyApi.dll -t HttpEndpoint
# Filtrer par méthode HTTP et nom de classe
dllspy ./MyApi.dll -m DELETE -c User*
# Uniquement les surfaces authentifiées / anonymes
dllspy ./MyApi.dll --auth
dllspy ./MyApi.dll --anon
# Analyser uniquement les assemblys hôtes (exécutables), ignorer les bibliothèques de classes
dllspy ./MyApi.dll --host-only
# Analyser avec une sévérité minimale
dllspy ./MyApi.dll -s --min-severity High
# Format de sortie : table (par défaut), tsv, json
dllspy ./MyApi.dll -o json
dllspy ./MyApi.dll -o tsv
JSON + jq
# Lister toutes les routes non protégées
dllspy ./MyApi.dll -o json | jq '[.[] | select(.requiresAuthorization == false) | .displayRoute]'
# Compter les surfaces par type
dllspy ./MyApi.dll -o json | jq 'group_by(.surfaceType) | map({type: .[0].surfaceType, count: length})'
# Problèmes de sécurité sous forme de tableau compact
dllspy ./MyApi.dll -s -o json | jq -r '.[] | [.severity, .surfaceRoute, .title] | @tsv'
PowerShell
# Toutes les surfaces
Search-DllSpy -Path .\MyApi.dll
# Filtrer par type de surface
Search-DllSpy -Path .\MyApi.dll -Type HttpEndpoint
Search-DllSpy -Path .\MyApi.dll -Type SignalRMethod
Search-DllSpy -Path .\MyApi.dll -Type WcfOperation
Search-DllSpy -Path .\MyApi.dll -Type GrpcOperation
Search-DllSpy -Path .\MyApi.dll -Type RazorPage
Search-DllSpy -Path .\MyApi.dll -Type BlazorComponent
Search-DllSpy -Path .\MyApi.dll -Type AzureFunction
Search-DllSpy -Path .\MyApi.dll -Type ODataEndpoint
# Filtrer par méthode HTTP
Search-DllSpy -Path .\MyApi.dll -HttpMethod DELETE
# Filtrer par nom de classe (prend en charge les jokers)
Search-DllSpy -Path .\MyApi.dll -Class User*
# Uniquement les surfaces authentifiées / anonymes
Search-DllSpy -Path .\MyApi.dll -RequiresAuth
Search-DllSpy -Path .\MyApi.dll -AllowAnonymous
# Analyser uniquement les assemblys hôtes (exécutables), ignorer les bibliothèques de classes
Search-DllSpy -Path .\bin\*.dll -HostOnly
# Trouver les problèmes de sécurité
Test-DllSpy -Path .\MyApi.dll
# Uniquement les problèmes de haute sévérité
Test-DllSpy -Path .\MyApi.dll -MinimumSeverity High
# Analyser uniquement les assemblys hôtes pour les problèmes de sécurité
Test-DllSpy -Path .\bin\*.dll -HostOnly
# Vue détaillée
Test-DllSpy -Path .\MyApi.dll | Format-List
Frameworks pris en charge
| Framework | Méthode de détection | Type de surface |
|---|
| ASP.NET Core / Web API | Classe de base Controller, [ApiController], convention de nommage | HttpEndpoint |
| SignalR | Héritage de Hub / Hub<T> | SignalRMethod |
| WCF | Interfaces [ServiceContract] + méthodes [OperationContract] | WcfOperation |
| gRPC | Classe de base générée avec BindService | GrpcOperation |
| Razor Pages | Héritage de PageModel, méthodes On{Verb}[Handler][Async] | RazorPage |
| Blazor | Héritage de ComponentBase + attribut [Route] | BlazorComponent |
| Azure Functions | [FunctionName] / [Function] + paramètre [HttpTrigger] | AzureFunction |
| OData | Héritage de ODataController | ODataEndpoint |
Règles de sécurité
Points de terminaison HTTP
| Sévérité | Règle | Description |
|---|
| Élevée | Point de terminaison non authentifié modifiant l'état | DELETE, POST, PUT ou PATCH sans [Authorize] |
| Moyenne | Déclaration d'autorisation manquante | Le point de terminaison n'a ni [Authorize] ni [AllowAnonymous] |
| Basse | Authorize sans rôle/politique | [Authorize] présent mais aucun Roles ou Policy spécifié |
Méthodes de hub SignalR
| Sévérité | Règle | Description |
|---|
| Élevée | Méthode de hub non authentifiée | Méthode de hub sans [Authorize] (directement invocable par les clients) |
| Basse | Authorize sans rôle/politique | [Authorize] présent mais aucun Roles ou Policy spécifié |
Opérations WCF
| Sévérité | Règle | Description |
|---|
| Élevée | Opération WCF non authentifiée | Opération sans [PrincipalPermission] ou [Authorize] |
| Basse | Authorize sans rôle | [PrincipalPermission] présent mais aucun Role spécifié |
Opérations gRPC
| Sévérité | Règle | Description |
|---|
| Élevée | Opération gRPC non authentifiée | Méthode de service sans [Authorize] |
| Basse | Authorize sans rôle/politique | [Authorize] présent mais aucun Roles ou Policy spécifié |
Gestionnaires de pages Razor
| Sévérité | Règle | Description |
|---|
| Élevée | Gestionnaire non authentifié modifiant l'état | Gestionnaire POST, PUT, DELETE ou PATCH sans [Authorize] |
| Moyenne | Déclaration d'autorisation manquante | Le gestionnaire n'a ni [Authorize] ni [AllowAnonymous] |
| Basse | Authorize sans rôle/politique | [Authorize] présent mais aucun Roles ou Policy spécifié |
Composants Blazor routables
| Sévérité | Règle | Description |
|---|
| Élevée | Composant routable non authentifié | Composant avec [Route] mais sans [Authorize] |
| Basse | Authorize sans rôle/politique | [Authorize] présent mais aucun Roles ou Policy spécifié |
Fonctions Azure
| Sévérité | Règle | Description |
|---|
| Élevée | Fonction Azure non authentifiée | AuthorizationLevel.Anonymous et aucun attribut [Authorize] |
| Basse | Authorize sans rôle/politique | [Authorize] présent mais aucun Roles ou Policy spécifié |
Points de terminaison OData
| Sévérité | Règle | Description |
|---|
| Élevée | Point de terminaison non authentifié modifiant l'état | DELETE, POST, PUT ou PATCH sans [Authorize] |
| Moyenne | Déclaration d'autorisation manquante | Le point de terminaison n'a ni [Authorize] ni [AllowAnonymous] |
| Basse | Authorize sans rôle/politique | [Authorize] présent mais aucun Roles ou Policy spécifié |
Licence
Voir LICENSE.