DllSpy

Analisa assemblies .NET compilados para descobrir superfícies de entrada (HTTP endpoints, SignalR hubs, WCF services, gRPC services, Razor Pages, Blazor components, Azure Functions, OData endpoints), verifica configuração de autorização e sinaliza problemas de segurança — tudo sem executar a aplicação.
Disponível como uma ferramenta CLI e um módulo PowerShell.

Instalação
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 Suportados
| Framework | Método de Detecção | Tipo de Superfície |
|---|
| ASP.NET Core / Web API | Classe base Controller, [ApiController], convenção de nomenclatura | HttpEndpoint |
| SignalR | Herança de Hub / Hub<T> | SignalRMethod |
| WCF | Interfaces [ServiceContract] + métodos [OperationContract] | WcfOperation |
| gRPC | Classe base gerada com BindService | GrpcOperation |
| Razor Pages | Herança de PageModel, métodos On{Verb}[Handler][Async] | RazorPage |
| Blazor | Herança de ComponentBase + atributo [Route] | BlazorComponent |
| Azure Functions | [FunctionName] / [Function] + parâmetro [HttpTrigger] | AzureFunction |
| OData | Herança de ODataController | ODataEndpoint |
Regras de Segurança
Endpoints HTTP
| Severidade | Regra | Descrição |
|---|
| Alta | Endpoint de alteração de estado não autenticado | DELETE, POST, PUT, ou PATCH sem [Authorize] |
| Média | Declaração de autorização ausente | Endpoint não possui nem [Authorize] nem [AllowAnonymous] |
| Baixa | Authorize sem role/policy | [Authorize] presente, mas sem Roles ou Policy especificados |
Métodos de Hub SignalR
| Severidade | Regra | Descrição |
|---|
| Alta | Método de hub não autenticado | Método de hub sem [Authorize] (invocável diretamente por clientes) |
| Baixa | Authorize sem role/policy | [Authorize] presente, mas sem Roles ou Policy especificados |
Operações WCF
| Severidade | Regra | Descrição |
|---|
| Alta | Operação WCF não autenticada | Operação sem [PrincipalPermission] ou [Authorize] |
| Baixa | Authorize sem role | [PrincipalPermission] presente, mas sem Role especificada |
Operações gRPC
| Severidade | Regra | Descrição |
|---|
| Alta | Operação gRPC não autenticada | Método de serviço sem [Authorize] |
| Baixa | Authorize sem role/policy | [Authorize] presente, mas sem Roles ou Policy especificados |
Handlers de Páginas Razor
| Severidade | Regra | Descrição |
|---|
| Alta | Handler de alteração de estado não autenticado | Handler POST, PUT, DELETE, ou PATCH sem [Authorize] |
| Média | Declaração de autorização ausente | Handler não possui nem [Authorize] nem [AllowAnonymous] |
| Baixa | Authorize sem role/policy | [Authorize] presente, mas sem Roles ou Policy especificados |
Componentes Blazor Roteáveis
| Severidade | Regra | Descrição |
|---|
| Alta | Componente roteável não autenticado | Componente com [Route] mas sem [Authorize] |
| Baixa | Authorize sem role/policy | [Authorize] presente, mas sem Roles ou Policy especificados |
Funções Azure
| Severidade | Regra | Descrição |
|---|
| Alta | Função Azure não autenticada | AuthorizationLevel.Anonymous e nenhum atributo [Authorize] |
| Baixa | Authorize sem role/policy | [Authorize] presente, mas sem Roles ou Policy especificados |
Endpoints OData
| Severidade | Regra | Descrição |
|---|
| Alta | Endpoint de alteração de estado não autenticado | DELETE, POST, PUT, ou PATCH sem [Authorize] |
| Média | Declaração de autorização ausente | Endpoint não possui nem [Authorize] nem [AllowAnonymous] |
| Baixa | Authorize sem role/policy | [Authorize] presente, mas sem Roles ou Policy especificados |
Licença
Veja LICENSE.