
Descubre superficies de entrada y problemas de seguridad en ensamblados .NET compilados, sin necesidad de ejecutarlos.
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.

dotnet tool install -g DllSpy
Install-Module -Name DllSpy
# 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
# 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'
# 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
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
Consulte LICENSE.