1. 국방·공공기관과 학교 전산실의 엔드포인트 보안 맹점: "망분리 환경이라도 내부에서 무너진다"
보안 감사 현장에서 가장 빈번하게 지적되는 치명적 사고의 대부분은 외부 제로데이(0-day) 해킹이 아니라 단말 내부의 관리 부실과 자격증명 방치에서 시작됩니다:
- 비인가 원격 접속 포트 방치: 원격 유지보수나 편의를 위해 열어둔
TCP 3389(RDP),5900(VNC),23(Telnet)포트가 닫히지 않고 방치되어 내부 네트워크 래터럴 무브먼트(Lateral Movement)의 교두보가 됩니다. - 평문 자격증명의 위험한 보관: 무인 키오스크나 전산실 공용 PC의 편의를 위해 활성화된
AutoAdminLogon레지스트리의DefaultPassword값,cmdkey /list에 저장된 도메인 관리자 자격증명, 크롬/엣지 브라우저의Login DataSQLite DB는 비인가 접근자가 1초 만에 탈취할 수 있습니다. - 물리적 매체(USB)를 통한 악성 침투: 보안 규정을 위반하고 은밀히 연결된 외장 드라이브, 혹은 키보드 입력 장치로 위장하여 악성 파워셸 스크립트를 주입하는 BadUSB(Rubber Ducky, Flipper Zero) 공격은 기존 백신이 프로세스로 인지하지 못해 무력화됩니다.
2. 무거운 외산 EDR/SIEM 솔루션의 딜레마: "고가의 구독료, 폐쇄망 연동 불가, 시스템 프리징"
기관들이 상용 엔드포인트 탐지 및 대응(EDR) 솔루션을 전면 도입하려 할 때 다음과 같은 현실적 한계에 부딪힙니다:
- 클라우드 SaaS 의존성과 폐쇄망 차단: CrowdStrike, SentinelOne 등 최신 EDR은 지속적인 클라우드 통신을 전제로 설계되어 인터넷이 차단된 국방·공공 폐쇄망에서는 무용지물이거나 에이전트 업데이트가 불가능합니다.
- 치명적인 커널 충돌과 시스템 먹통: 커널 모드(Ring 0) 드라이버를 과도하게 후킹하는 외산 에이전트는 윈도우 블루스크린(BSOD)을 유발하거나, PC 부팅 속도를 1분 이상 지연시켜 교육 현장의 수업 진행을 방해합니다.
- 막대한 라이선스 비용: 단말 1대당 연간 수십만 원에 달하는 구독료는 전산 예산이 한정된 일선 초·중·고교나 공공 교육 기관에서 전사적 라이선스를 유지하기 불가능합니다.
(SemaphoreSlim + netstat PID)"] M2["🕵️ 프로세스 위협 분석
(QueryFullProcessImageName + 서명)"] M3["🔑 자격증명 노출 진단
(AutoLogon + WiFi + cmdkey)"] M4["🛑 USB 물리 보안 감사
(WMI + USBSTOR 레지스트리)"] M5["🔥 방화벽 거버넌스
(netsh advfirewall 3대 프로필)"] M6["📊 보안 이벤트 분석
(EventLog 4625 / 4672 / 4720)"] end subgraph ENGINE_LAYER["⚙️ Zero-Allocation 비동기 스트리밍 파이프라인"] ASYNC["IAsyncEnumerable<T> 동시성 스트림"] PINVOKE["Win32 P/Invoke 무중단 커널 쿼리"] CSPRNG["C# 암호학적 해시 & 3-Pass 영구 파기"] end subgraph OUTPUT_LAYER["📊 행정·감사용 원터치 산출물"] DASH["WinUI 3 다크 오로라 실시간 대시보드"] HTML["표준 준수 HTML 감사 종합 리포트"] TXT["TXT 브리핑 요약서 (출력/보고용)"] end M1 & M2 & M3 & M4 & M5 & M6 --> ASYNC & PINVOKE & CSPRNG ASYNC & PINVOKE & CSPRNG --> DASH & HTML & TXT
3. SemaphoreSlim + IAsyncEnumerable 기반 고속 비동기 포트 스캐너 & PID 상관분석 파이프라인
기존 포트 스캐너 도구(Nmap 등)는 외부 실행 파일을 호출하거나 스레드를 수백 개 생성하여 UI 스레드를 멈추게(Freezing) 만드는 고질적 문제가 있었습니다. ZeliScan의 PortScanService는 순수 .NET 비동기 소켓과 C# 8.0 IAsyncEnumerable을 결합하여 메모리 할당을 최소화하고 결과를 실시간으로 스트리밍합니다.
특히 수천 개의 포트를 동시에 타격할 때 발생할 수 있는 소켓 소진(Socket Exhaustion)과 네트워크 인터페이스 과부하를 방지하기 위해 SemaphoreSlim(maxParallel=50) 동시성 제어기를 배치하였습니다:
// ── SemaphoreSlim 병렬 제어와 IAsyncEnumerable 스트리밍 포트 스캔 ──
public static async IAsyncEnumerable<PortScanResult> ScanPortsAsync(
int[] ports,
string targetHost = "127.0.0.1",
int timeoutMs = 500,
int maxParallel = 50,
IProgress<(int scanned, int total, int openCount)> progress = null,
[EnumeratorCancellation] CancellationToken token = default)
{
var resultQueue = new ConcurrentQueue<PortScanResult>();
int scanned = 0, openCount = 0, total = ports.Length;
// netstat -ano 출력과 실행 프로세스 PID 매핑 딕셔너리 사전 수집
var pidMap = await GetPortPidMapAsync(token);
var semaphore = new SemaphoreSlim(maxParallel);
var tasks = new List<Task>();
foreach (var port in ports)
{
if (token.IsCancellationRequested) break;
await semaphore.WaitAsync(token);
tasks.Add(Task.Run(async () =>
{
try
{
bool isOpen = await IsPortOpenAsync(targetHost, port, timeoutMs, token);
if (isOpen)
{
var (serviceName, risk, detail, actionGuide, contextNote) = PortScanResult.LookupPort(port);
pidMap.TryGetValue(port, out var procInfo);
var result = new PortScanResult
{
Port = port,
Protocol = "TCP",
State = "Open",
ServiceName = serviceName,
ProcessName = procInfo.name ?? "",
ProcessId = procInfo.pid,
RiskLevel = risk,
RiskDetail = detail,
ActionGuide = actionGuide,
ContextNote = contextNote,
ScannedAt = DateTime.Now
};
resultQueue.Enqueue(result);
Interlocked.Increment(ref openCount);
}
Interlocked.Increment(ref scanned);
progress?.Report((scanned, total, openCount));
}
finally
{
semaphore.Release();
}
}, token));
}
// 결과 큐에 적재되는 즉시 UI 스레드로 비동기 yield 반환
while (tasks.Any(t => !t.IsCompleted) || !resultQueue.IsEmpty)
{
if (token.IsCancellationRequested) yield break;
while (resultQueue.TryDequeue(out var result))
yield return result;
try { await Task.Delay(30, token); }
catch (OperationCanceledException) { yield break; }
}
}
단순히 포트 개방 여부만 표시하는 데 그치지 않고, netstat -ano -p TCP의 출력 결과를 정규화하여 해당 포트를 바인딩하고 있는 프로세스 이름과 PID를 0.1초 만에 역추적합니다. 관리자는 열려 있는 TCP 8080 포트가 톰캣 웹서버인지, 파이썬 테스트 스크립트인지, 악성 리버스 셸인지 즉각 파악할 수 있습니다.
4. QueryFullProcessImageName (P/Invoke) 무중단 경로 추적과 Authenticode 디지털 서명 검증
일반적인 .NET 프로세스 모니터링은 Process.MainModule.FileName을 호출하지만, 64비트 OS에서 32비트 프로세스를 검사하거나 시스템 권한 프로세스에 접근할 때 Win32Exception(Access Denied) 크래시가 빈번하게 발생합니다.
ZeliScan의 ProcessAnalyzerService는 Win32 커널 API인 QueryFullProcessImageName을 PROCESS_QUERY_LIMITED_INFORMATION(0x1000) 플래그와 함께 직접 P/Invoke 호출하여, 예외 크래시 전혀 없이 모든 활성 프로세스의 실제 디스크 물리 경로를 100% 추출합니다:
// ── P/Invoke를 통한 무중단 프로세스 경로 조회 및 디지털 서명 검증 ──
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool QueryFullProcessImageName(
IntPtr hProcess, int dwFlags, StringBuilder lpExeName, ref int lpdwSize);
public static string GetProcessPath(int pid)
{
IntPtr hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid);
if (hProcess == IntPtr.Zero) return "";
try
{
var sb = new StringBuilder(1024);
int size = sb.Capacity;
if (QueryFullProcessImageName(hProcess, 0, sb, ref size))
return sb.ToString();
}
finally
{
CloseHandle(hProcess);
}
return "";
}
// ── 의심 프로세스 대상 Authenticode 전자서명 검증 (성능 최적화) ──
private static (bool isSigned, string signerName) CheckSignature(string filePath)
{
try
{
using var cert = X509Certificate.CreateFromSignedFile(filePath);
return (true, cert.Subject);
}
catch
{
return (false, ""); // 전자서명이 없거나 위조됨
}
}
또한 OpenProcessToken과 TokenElevation 구조체를 통해 해당 프로세스가 관리자 권한(Elevated)으로 실행되고 있는지 판별하고, \AppData\Local\Temp 또는 \Windows\Temp 등 비정상적인 임시 경로에서 실행되는 미서명 프로세스를 실시간으로 포착하여 경고를 발령합니다.
5. 5대 자격증명(Wi-Fi·AutoAdminLogon·RDP·브라우저·설정파일) 평문 노출 감사 엔진
전산실 감사에서 가장 충격적인 결과는 단말 내부에 관리자 계정 정보가 평문으로 널려 있는 현실입니다. ZeliScan의 CredentialScanService는 공격자가 주로 노리는 5대 공격 표면을 집중 진단합니다:
| 감사 대상 영역 | 탐지 기법 및 대상 경로 | 위험 등급 | 자동 권고 및 조치 가이드 |
|---|---|---|---|
| AutoAdminLogon 레지스트리 | HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 내 DefaultPassword |
치명적 (Critical) | AutoAdminLogon 값을 0으로 변경하고 DefaultPassword 키 즉각 파기 |
| 저장된 Wi-Fi 프로필 | netsh wlan show profiles 및 평문 WPA2 키 추출 취약성 |
주의 (Medium) | 사용하지 않는 교내/사내 무선망 프로필 일괄 삭제 및 802.1X 전환 |
| 원격 데스크톱 자격증명 | cmdkey /list 내 TERMSRV/ Windows 자격 증명 관리자 |
주의 (Medium) | 서버 관리용 저장 자격 증명 삭제 (cmdkey /delete) 유도 |
| 브라우저 패스워드 볼트 | Chrome / Edge Login Data SQLite DB 파일 크기(>44KB) |
주의 (Medium) | 공용 PC 브라우저 비밀번호 저장 기능 강제 비활성화 및 마스터키 사용 |
| IIS / 웹 개발 설정 파일 | web.config, appsettings.json 내 password= 검색 |
위험 (High) | 연결 문자열 환경변수 이관 또는 ASP.NET User Secrets 전환 |
6. WMI + USBSTOR 레지스트리 듀얼 추적: 과거 연결 이력 복원 및 BadUSB 하드웨어 공격 방어
보안 담당자가 순찰을 돌 때 사용자가 재빨리 USB를 뽑아버리면 일반적인 방법으로는 어떤 장치가 연결되었는지 증거를 찾기 어렵습니다. 또한 외형은 평범한 USB 드라이브지만 내부적으로 키보드 입력 장치(HID)로 위장해 윈도우 키와 파워셸 명령어를 1초에 1,000타 속도로 쏟아붓는 BadUSB(Rubber Ducky, Bash Bunny, Flipper Zero) 공격은 기존 백신이 전혀 방어하지 못합니다.
ZeliScan의 UsbSecurityService는 WMI 실시간 PnP 엔티티 감시와 Windows 커널 USBSTOR 레지스트리 딥 포렌식을 결합하여 이 문제를 완벽하게 해결합니다:
// ── USBSTOR 레지스트리를 통한 과거 연결 이력 복원 및 BadUSB 탐지 ──
private static List<UsbDeviceInfo> GetHistoricalDevices(List<UsbDeviceInfo> connected)
{
var result = new List<UsbDeviceInfo>();
var connectedIds = new HashSet<string>(connected.Select(d => d.SerialNumber), StringComparer.OrdinalIgnoreCase);
try
{
// 윈도우 커널이 영구 기록하는 USB 저장장치 연결 히스토리
using var key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\USBSTOR");
if (key == null) return result;
foreach (var devName in key.GetSubKeyNames())
{
using var devKey = key.OpenSubKey(devName);
if (devKey == null) continue;
foreach (var serial in devKey.GetSubKeyNames())
{
if (connectedIds.Contains(serial)) continue; // 현재 꽂혀 있는 장치는 제외
using var serialKey = devKey.OpenSubKey(serial);
string friendlyName = serialKey?.GetValue("FriendlyName") as string ?? devName;
result.Add(new UsbDeviceInfo
{
DeviceName = friendlyName,
DeviceId = $"USBSTOR\\{devName}\\{serial}",
DeviceType = "DiskDrive",
SerialNumber = serial,
IsCurrentlyConnected = false // 과거에 연결되었던 흔적!
});
}
}
}
catch { }
return result;
}
// ── 악성 공격 도구 시그니처 및 복합 HID 장치 판별 ──
private static void EvaluateSuspicious(UsbDeviceInfo device)
{
string combined = $"{device.DeviceName} {device.Manufacturer} {device.DeviceId}".ToLowerInvariant();
foreach (var keyword in SuspiciousKeywords)
{
if (combined.Contains(keyword))
{
device.IsSuspicious = true;
device.SuspiciousReason = $"알려진 하드웨어 해킹 공격 도구: {keyword}";
return;
}
}
// 대용량 저장장치 외형인데 HID 복합 장치로 인식되는 경우 -> BadUSB 의심
if (device.DeviceType == "HID" && device.DeviceName.Contains("Composite", StringComparison.OrdinalIgnoreCase))
{
device.IsSuspicious = true;
device.SuspiciousReason = "복합 HID 키보드 위장 장치 — BadUSB 주입 공격 의심";
}
}
7. Windows 방화벽 프로필 거버넌스 및 보안 이벤트 로그(4625/4672/4720) 감사 아키텍처
단말의 네트워크 방화벽은 도메인(Domain), 개인(Private), 공용(Public) 3대 프로필로 나뉘어 동작합니다. ZeliScan의 FirewallService는 netsh advfirewall 커널 명령을 비동기로 래핑하여, 현재 각 프로필의 방화벽 활성화 여부와 기본 인바운드/아웃바운드 정책이 Block으로 올바르게 설정되어 있는지 감시합니다.
아울러 EventLogAnalyzerService는 윈도우 보안 이벤트 로그(Security Event Log)를 실시간 분석하여 무차별 대입 공격(Brute Force)의 징후를 추적합니다:
- Event ID 4625 (로그온 실패): 동일 계정에 대해 짧은 시간 내 수십 회 이상의 실패 로그가 누적되면 계정 탈취 시도로 판정하고 공격 출발지 IP를 식별합니다.
- Event ID 4672 (특수 권한 할당): 일반 사용자 계정이 관리자 권한(SeDebugPrivilege 등)으로 승격된 비정상 세션을 추적합니다.
- Event ID 4720 (사용자 계정 생성): 공격자가 백도어 목적으로 은밀히 생성한 로컬 계정을 감지합니다.
8. 엔드포인트 보안 도구 비교 (외산 EDR vs 백신 단독 vs ZeliScan 온디바이스 거버넌스)
| 비교 항목 | 외산 클라우드 EDR (CrowdStrike 등) | 기본 백신 단독 (Defender 등) | ZeliDesk ZeliScan 온디바이스 런타임 |
|---|---|---|---|
| 배포 및 설치 방식 | 커널 에이전트 설치 필수 (재부팅 필요) | OS 기본 내장 | Zero-Install 무설치 단일 EXE |
| 국방·폐쇄망 환경 지원 | 불가 (클라우드 SaaS 통신 필수) | 제한적 (시그니처 업데이트 수동) | 100% 완전 오프라인 에어갭 동작 |
| 포트 스캔 & PID 역추적 | 기능 없음 (별도 솔루션 필요) | 기능 없음 | IAsyncEnumerable + netstat 즉각 매핑 |
| 자격증명 노출 진단 | AD 중심 감사, 로컬 평문 감사 부재 | 기능 없음 | AutoLogon, Wi-Fi, cmdkey, web.config |
| USB 과거 이력 & BadUSB | 장치 제어 라이선스 추가 구매 필요 | 기능 없음 (단순 악성코드만 검사) | USBSTOR 레지스트리 복원 + 키워드 차단 |
| 시스템 자원 소모율 | RAM 500MB~1GB, CPU 5~15% 점유 | 주기적 스캔 시 디스크 100% 점유 | 유휴 시 RAM 0MB / 실행 시 30MB 이하 |
| 라이선스 및 도입 비용 | 단말당 연간 수십만 원 고가 구독료 | 무료 (기본 방어에 국한) | 공교육·국방·공공 전산실 무상/영구 |
9. 결론: "외부 유출 걱정 없는 100% 온디바이스 로컬 엔드포인트 무결성 체계"
보안은 거창한 장비나 값비싼 구독형 클라우드 서비스만으로 완성되지 않습니다. 오히려 단말기 하나하나의 기본 설정, 열려 있는 통신 포트, 방치된 비밀번호, 그리고 무심코 꽂히는 USB 장치에 대한 철저하고 투명한 로컬 거버넌스가 사이버 방어의 성패를 가릅니다.
ZeliDesk의 ZeliScan은 국방부 군부대, 국가 연구소, 초·중·고교 스마트 교실의 단말기를 외부 침해와 내부 유출의 위험으로부터 가장 가볍고 강력하게 지켜내는 국산 온디바이스 보안 엔지니어링의 정점입니다. 관리자 권한 없는 학교 PC에서도, 인터넷이 없는 사령부 지하 벙커에서도 ZeliScan은 클릭 한 번으로 13개 핵심 보안 지표를 완벽하게 점검합니다.