초기에 .NET 취약점 포착하기: Puma Scan과 함께하는 실전 가이드
Source: Dev.to
왜 Puma Scan인가?
공식 OWASP 소스 코드 분석 도구 목록에는 많은 SAST 도구가 존재하지만, 이번 과제에서는 Sonar, Snyk, Semgrep, Veracode를 제외했습니다. C#/.NET 용으로 남은 옵션 중 Puma Scan이 눈에 띈 이유는 다음과 같습니다:
- .NET 및 C# 전용으로 설계되었습니다
- Visual Studio, VS Code, 그리고 명령줄과 통합됩니다
- SQL Injection 및 Cross‑Site Scripting (XSS) 과 같은 일반적인 OWASP Top 10 이슈를 탐지합니다
- Community Edition이 무료로 제공되어 학습 및 테스트에 적합합니다
전체 데모(코드, 자동화 스크립트, 스캔 결과 포함)는 GitHub에 공개되어 있습니다.
취약한 코드 샘플
데모를 간단하고 재현 가능하게 만들기 위해, 고전적인 SQL 인젝션 취약점을 가진 최소한의 C# 클래스를 사용합니다:
// TestVuln.cs
using System;
using System.Data.SqlClient;
public class VulnerableClass
{
public void UnsafeQuery(string userInput)
{
// ⚠️ SQL Injection: user input concatenated directly into query
string query = "SELECT * FROM Users WHERE Id = " + userInput;
SqlCommand cmd = new SqlCommand(query);
}
}
공격자가 1 OR 1=1을 입력하면, 쿼리는 다음과 같이 변형됩니다:
SELECT * FROM Users WHERE Id = 1 OR 1=1
→ 모든 사용자 레코드가 노출됩니다.
이는 CWE‑89 및 OWASP Top 10: A03:2021 – Injection에 해당합니다.
Puma Scan을 이용한 자동 탐지
단계 1: 프로젝트에 Puma Scan 추가
dotnet add package Puma.Security.Rules
단계 2: PowerShell 스크립트 (scan.ps1)
# scan.ps1 - PumaScan SAST Analysis Script
Write-Host "======================================" -ForegroundColor Cyan
Write-Host " PumaScan - SAST Security Analysis" -ForegroundColor Cyan
Write-Host "======================================" -ForegroundColor Cyan
Write-Host ""
# Build the project with PumaScan analysis
Set-Location PumaScanner
dotnet clean | Out-Null
dotnet build
Write-Host ""
Write-Host "======================================" -ForegroundColor Green
Write-Host " Analysis Complete!" -ForegroundColor Green
Write-Host "======================================" -ForegroundColor Green
Write-Host ""
Write-Host "Look for security warnings above:" -ForegroundColor Yellow
Write-Host " - SEC0107: SQL Injection vulnerability" -ForegroundColor Yellow
Write-Host ""
Set-Location ..
단계 3: 결과 확인
다음 명령으로 스크립트를 실행합니다:
powershell -ExecutionPolicy Bypass -File .\scan.ps1
출력에는 다음과 같은 명확한 경고가 포함됩니다:
SEC0107: SQL Injection vulnerability
이는 Puma Scan이 샘플 코드에서 인젝션된 쿼리를 성공적으로 식별했음을 의미합니다.