DllSpy

컴파일된 .NET 어셈블리를 스캔하여 입력 표면(HTTP 엔드포인트, SignalR 허브, WCF 서비스, gRPC 서비스, Razor Pages, Blazor 컴포넌트, Azure Functions, OData 엔드포인트)을 발견하고, 인증 구성을 확인하며, 보안 문제를 플래그합니다. 애플리케이션을 실행하지 않고 수행합니다.
CLI 도구와 PowerShell 모듈로 사용 가능합니다.

설치
CLI
dotnet tool install -g DllSpy
PowerShell
Install-Module -Name DllSpy
사용법
CLI
# 모든 표면 나열
dllspy ./MyApi.dll
# 보안 취약점 스캔
dllspy ./MyApi.dll -s
# 표면 유형별 필터링 (HttpEndpoint, SignalRMethod, WcfOperation, GrpcOperation, RazorPage, BlazorComponent, AzureFunction, ODataEndpoint)
dllspy ./MyApi.dll -t HttpEndpoint
# HTTP 메서드 및 클래스 이름별 필터링
dllspy ./MyApi.dll -m DELETE -c User*
# 인증된/익명 표면만
dllspy ./MyApi.dll --auth
dllspy ./MyApi.dll --anon
# 호스트(실행 가능) 어셈블리만 스캔, 클래스 라이브러리 건너뛰기
dllspy ./MyApi.dll --host-only
# 최소 심각도로 스캔
dllspy ./MyApi.dll -s --min-severity High
# 출력 형식: table(기본값), tsv, json
dllspy ./MyApi.dll -o json
dllspy ./MyApi.dll -o tsv
JSON + jq
# 보호되지 않은 모든 경로 나열
dllspy ./MyApi.dll -o json | jq '[.[] | select(.requiresAuthorization == false) | .displayRoute]'
# 표면 유형별 개수 세기
dllspy ./MyApi.dll -o json | jq 'group_by(.surfaceType) | map({type: .[0].surfaceType, count: length})'
# 보안 문제를 간결한 표로 출력
dllspy ./MyApi.dll -s -o json | jq -r '.[] | [.severity, .surfaceRoute, .title] | @tsv'
PowerShell
# 모든 표면
Search-DllSpy -Path .\MyApi.dll
# 표면 유형별 필터링
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
# HTTP 메서드별 필터링
Search-DllSpy -Path .\MyApi.dll -HttpMethod DELETE
# 클래스 이름별 필터링 (와일드카드 지원)
Search-DllSpy -Path .\MyApi.dll -Class User*
# 인증된/익명 표면만
Search-DllSpy -Path .\MyApi.dll -RequiresAuth
Search-DllSpy -Path .\MyApi.dll -AllowAnonymous
# 호스트(실행 가능) 어셈블리만 스캔, 클래스 라이브러리 건너뛰기
Search-DllSpy -Path .\bin\*.dll -HostOnly
# 보안 문제 찾기
Test-DllSpy -Path .\MyApi.dll
# 높은 심각도 이슈만
Test-DllSpy -Path .\MyApi.dll -MinimumSeverity High
# 보안 문제에 대해 호스트 어셈블리만 스캔
Test-DllSpy -Path .\bin\*.dll -HostOnly
# 상세 보기
Test-DllSpy -Path .\MyApi.dll | Format-List
지원 프레임워크
| 프레임워크 | 탐지 방법 | 표면 유형 |
|---|
| ASP.NET Core / Web API | 컨트롤러 기본 클래스, [ApiController], 명명 규칙 | HttpEndpoint |
| SignalR | Hub / Hub<T> 상속 | SignalRMethod |
| WCF | [ServiceContract] 인터페이스 + [OperationContract] 메서드 | WcfOperation |
| gRPC | BindService가 포함된 생성된 기본 클래스 | GrpcOperation |
| Razor Pages | PageModel 상속, On{Verb}[Handler][Async] 메서드 | RazorPage |
| Blazor | ComponentBase 상속 + [Route] 특성 | BlazorComponent |
| Azure Functions | [FunctionName] / [Function] + [HttpTrigger] 매개변수 | AzureFunction |
| OData | ODataController 상속 | ODataEndpoint |
보안 규칙
HTTP 엔드포인트
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 상태 변경 엔드포인트 | [Authorize] 없이 DELETE, POST, PUT 또는 PATCH |
| 중간 | 권한 부여 선언 누락 | 엔드포인트에 [Authorize]도 [AllowAnonymous]도 없음 |
| 낮음 | 역할/정책 없는 권한 부여 | [Authorize]는 존재하지만 Roles 또는 Policy 미지정 |
SignalR 허브 메서드
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 허브 메서드 | [Authorize] 없이 클라이언트가 직접 호출 가능한 허브 메서드 |
| 낮음 | 역할/정책 없는 권한 부여 | [Authorize]는 존재하지만 Roles 또는 Policy 미지정 |
WCF 작업
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 WCF 작업 | [PrincipalPermission] 또는 [Authorize] 없는 작업 |
| 낮음 | 역할 없는 권한 부여 | [PrincipalPermission]은 존재하지만 Role 미지정 |
gRPC 작업
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 gRPC 작업 | [Authorize] 없는 서비스 메서드 |
| 낮음 | 역할/정책 없는 권한 부여 | [Authorize]는 존재하지만 Roles 또는 Policy 미지정 |
Razor Page 핸들러
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 상태 변경 핸들러 | [Authorize] 없이 POST, PUT, DELETE 또는 PATCH 핸들러 |
| 중간 | 권한 부여 선언 누락 | 핸들러에 [Authorize]도 [AllowAnonymous]도 없음 |
| 낮음 | 역할/정책 없는 권한 부여 | [Authorize]는 존재하지만 Roles 또는 Policy 미지정 |
Blazor 라우팅 가능 컴포넌트
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 라우팅 가능 컴포넌트 | [Route]는 있지만 [Authorize] 없는 컴포넌트 |
| 낮음 | 역할/정책 없는 권한 부여 | [Authorize]는 존재하지만 Roles 또는 Policy 미지정 |
Azure Functions
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 Azure Function | AuthorizationLevel.Anonymous이고 [Authorize] 특성 없음 |
| 낮음 | 역할/정책 없는 권한 부여 | [Authorize]는 존재하지만 Roles 또는 Policy 미지정 |
OData 엔드포인트
| 심각도 | 규칙 | 설명 |
|---|
| 높음 | 인증되지 않은 상태 변경 엔드포인트 | [Authorize] 없이 DELETE, POST, PUT 또는 PATCH |
| 중간 | 권한 부여 선언 누락 | 엔드포인트에 [Authorize]도 [AllowAnonymous]도 없음 |
| 낮음 | 역할/정책 없는 권한 부여 | [Authorize]는 존재하지만 Roles 또는 Policy 미지정 |
라이선스
LICENSE 파일을 참조하세요.