DllSpy

Escanea ensamblados .NET compilados para descubrir superficies de entrada (puntos finales HTTP, concentradores SignalR, servicios WCF, servicios gRPC, páginas Razor, componentes Blazor, funciones de Azure, puntos finales OData), verificar la configuración de autorización y señalar problemas de seguridad, todo sin ejecutar la aplicación.
Disponible como herramienta CLI y módulo de PowerShell.

Instalación
CLI
dotnet tool install -g DllSpy
PowerShell
Install-Module -Name DllSpy
Uso
CLI
# List all surfaces
dllspy ./MyApi.dll
# Scan for security vulnerabilities
dllspy ./MyApi.dll -s
# Filter by surface type (HttpEndpoint, SignalRMethod, WcfOperation, GrpcOperation, RazorPage, BlazorComponent, AzureFunction, ODataEndpoint)
dllspy ./MyApi.dll -t HttpEndpoint
# Filter by HTTP method and class name
dllspy ./MyApi.dll -m DELETE -c User*
# Only authenticated / anonymous surfaces
dllspy ./MyApi.dll --auth
dllspy ./MyApi.dll --anon
# Only scan host (runnable) assemblies, skip class libraries
dllspy ./MyApi.dll --host-only
# Scan with minimum severity
dllspy ./MyApi.dll -s --min-severity High
# Output format: table (default), tsv, json
dllspy ./MyApi.dll -o json
dllspy ./MyApi.dll -o tsv
JSON + jq
# List all unprotected routes
dllspy ./MyApi.dll -o json | jq '[.[] | select(.requiresAuthorization == false) | .displayRoute]'
# Count surfaces by type
dllspy ./MyApi.dll -o json | jq 'group_by(.surfaceType) | map({type: .[0].surfaceType, count: length})'
# Security issues as compact table
dllspy ./MyApi.dll -s -o json | jq -r '.[] | [.severity, .surfaceRoute, .title] | @tsv'
PowerShell
# All surfaces
Search-DllSpy -Path .\MyApi.dll
# Filter by surface type
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
# Filter by HTTP method
Search-DllSpy -Path .\MyApi.dll -HttpMethod DELETE
# Filter by class name (supports wildcards)
Search-DllSpy -Path .\MyApi.dll -Class User*
# Only authenticated / anonymous surfaces
Search-DllSpy -Path .\MyApi.dll -RequiresAuth
Search-DllSpy -Path .\MyApi.dll -AllowAnonymous
# Only scan host (runnable) assemblies, skip class libraries
Search-DllSpy -Path .\bin\*.dll -HostOnly
# Find security issues
Test-DllSpy -Path .\MyApi.dll
# Only high-severity issues
Test-DllSpy -Path .\MyApi.dll -MinimumSeverity High
# Only scan host assemblies for security issues
Test-DllSpy -Path .\bin\*.dll -HostOnly
# Detailed view
Test-DllSpy -Path .\MyApi.dll | Format-List
Frameworks Soportados
| Framework | Método de Detección | Tipo de Superficie |
|---|
| ASP.NET Core / Web API | Clase base del controlador, [ApiController], convención de nombres | HttpEndpoint |
| SignalR | Herencia de Hub / Hub<T> | SignalRMethod |
| WCF | Interfaces [ServiceContract] + métodos [OperationContract] | WcfOperation |
| gRPC | Clase base generada con BindService | GrpcOperation |
| Razor Pages | Herencia de PageModel, métodos On{Verb}[Handler][Async] | RazorPage |
| Blazor | Herencia de ComponentBase + atributo [Route] | BlazorComponent |
| Azure Functions | [FunctionName] / [Function] + parámetro [HttpTrigger] | AzureFunction |
| OData | Herencia de ODataController | ODataEndpoint |
Reglas de Seguridad
Puntos Finales HTTP
| Severidad | Regla | Descripción |
|---|
| Alta | Punto final de cambio de estado no autenticado | DELETE, POST, PUT o PATCH sin [Authorize] |
| Media | Falta declaración de autorización | El punto final no tiene ni [Authorize] ni [AllowAnonymous] |
| Baja | Authorize sin rol/política | [Authorize] presente pero no se especifica Roles ni Policy |
Métodos de Concentrador SignalR
| Severidad | Regla | Descripción |
|---|
| Alta | Método de concentrador no autenticado | Método de concentrador sin [Authorize] (invocable directamente por los clientes) |
| Baja | Authorize sin rol/política | [Authorize] presente pero no se especifica Roles ni Policy |
Operaciones WCF
| Severidad | Regla | Descripción |
|---|
| Alta | Operación WCF no autenticada | Operación sin [PrincipalPermission] ni [Authorize] |
| Baja | Authorize sin rol | [PrincipalPermission] presente pero no se especifica Role |
Operaciones gRPC
| Severidad | Regla | Descripción |
|---|
| Alta | Operación gRPC no autenticada | Método de servicio sin [Authorize] |
| Baja | Authorize sin rol/política | [Authorize] presente pero no se especifica Roles ni Policy |
Manejadores de Páginas Razor
| Severidad | Regla | Descripción |
|---|
| Alta | Manejador de cambio de estado no autenticado | Manejador POST, PUT, DELETE o PATCH sin [Authorize] |
| Media | Falta declaración de autorización | El manejador no tiene ni [Authorize] ni [AllowAnonymous] |
| Baja | Authorize sin rol/política | [Authorize] presente pero no se especifica Roles ni Policy |
Componentes Blazor Enrutables
| Severidad | Regla | Descripción |
|---|
| Alta | Componente enrutable no autenticado | Componente con [Route] pero sin [Authorize] |
| Baja | Authorize sin rol/política | [Authorize] presente pero no se especifica Roles ni Policy |
Azure Functions
| Severidad | Regla | Descripción |
|---|
| Alta | Azure Function no autenticada | AuthorizationLevel.Anonymous y sin atributo [Authorize] |
| Baja | Authorize sin rol/política | [Authorize] presente pero no se especifica Roles ni Policy |
Puntos Finales OData
| Severidad | Regla | Descripción |
|---|
| Alta | Punto final de cambio de estado no autenticado | DELETE, POST, PUT o PATCH sin [Authorize] |
| Media | Falta declaración de autorización | El punto final no tiene ni [Authorize] ni [AllowAnonymous] |
| Baja | Authorize sin rol/política | [Authorize] presente pero no se especifica Roles ni Policy |
Licencia
Consulte LICENSE.