← 기술 블로그 목록으로 돌아가기
#944 • Endpoint Security Governance & On-Device Security Audit Architecture

국방·공공 전산실 엔드포인트 보안 감사와 데이터 유출 0초 방어: ZeliScan의 온디바이스 포트 스캐너·자격증명 누출 진단 및 USB 보안 거버넌스 아키텍처

"망분리가 완벽하다고 믿었던 국방 연구소와 공공기관 전산실에서 비인가 포트가 외부로 열려 있거나, USB에 악성 페이로드가 은닉되어 있거나, 레지스트리에 관리자 비밀번호가 평문으로 방치되어 있다면 어떻게 탐지하십니까?" 외산 무거운 EDR/SIEM 솔루션의 고가 구독료와 폐쇄망 연동 불가 딜레마를 돌파하는 Zero-Install 온디바이스 통합 보안 감사 런타임, SemaphoreSlim(50) 동시성 제어와 IAsyncEnumerable 스트리밍 기반의 고속 포트 스캐너 및 netstat PID 상관분석, QueryFullProcessImageName P/Invoke 무중단 프로세스 경로 및 Authenticode 디지털 서명 검증, Wi-Fi·AutoAdminLogon·RDP cmdkey·브라우저 자격증명 노출 진단, SYSTEM\CurrentControlSet\Enum\USBSTOR 레지스트리 과거 연결 이력 추적 및 BadUSB(Rubber Ducky/Flipper) 실시간 차단, Windows 방화벽 및 보안 이벤트 로그 감사 아키텍처 백서.

"물리적 망분리가 적용된 국방 부대나 국가 연구소, 교육청 산하 학교 전산실이라도 내부 엔드포인트 PC의 보안 취약점까지 자동으로 방어해주지는 못합니다. 자동 로그인을 위해 레지스트리(DefaultPassword)에 평문으로 적힌 시스템 관리자 비밀번호, 사용자가 과거에 꽂았던 미인가 외장 하드디스크, 원격 수업용으로 임의 개방된 RDP/VNC 포트, 개발자가 테스트용으로 방치한 평문 설정 파일(web.config) 등은 침해 사고의 가장 흔한 발화점입니다. ZeliScan은 클라우드로 단 1바이트의 텔레메트리도 전송하지 않고, 완전한 온디바이스(On-Device) 로컬 샌드박스 안에서 13개 보안 모듈을 가동하여 시스템 취약점을 0초 만에 규명하고 교정합니다."

1. 국방·공공기관과 학교 전산실의 엔드포인트 보안 맹점: "망분리 환경이라도 내부에서 무너진다"

보안 감사 현장에서 가장 빈번하게 지적되는 치명적 사고의 대부분은 외부 제로데이(0-day) 해킹이 아니라 단말 내부의 관리 부실과 자격증명 방치에서 시작됩니다:

2. 무거운 외산 EDR/SIEM 솔루션의 딜레마: "고가의 구독료, 폐쇄망 연동 불가, 시스템 프리징"

기관들이 상용 엔드포인트 탐지 및 대응(EDR) 솔루션을 전면 도입하려 할 때 다음과 같은 현실적 한계에 부딪힙니다:

  1. 클라우드 SaaS 의존성과 폐쇄망 차단: CrowdStrike, SentinelOne 등 최신 EDR은 지속적인 클라우드 통신을 전제로 설계되어 인터넷이 차단된 국방·공공 폐쇄망에서는 무용지물이거나 에이전트 업데이트가 불가능합니다.
  2. 치명적인 커널 충돌과 시스템 먹통: 커널 모드(Ring 0) 드라이버를 과도하게 후킹하는 외산 에이전트는 윈도우 블루스크린(BSOD)을 유발하거나, PC 부팅 속도를 1분 이상 지연시켜 교육 현장의 수업 진행을 방해합니다.
  3. 막대한 라이선스 비용: 단말 1대당 연간 수십만 원에 달하는 구독료는 전산 예산이 한정된 일선 초·중·고교나 공공 교육 기관에서 전사적 라이선스를 유지하기 불가능합니다.
flowchart TD subgraph AUDIT_CORE["🛡️ ZeliScan 온디바이스 13대 통합 보안 감사 코어"] M1["🔌 포트 스캐너
(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
▲ [그림 1] ZeliDesk ZeliScan의 13대 온디바이스 보안 감사 모듈 및 무중단 파이프라인 구조

3. SemaphoreSlim + IAsyncEnumerable 기반 고속 비동기 포트 스캐너 & PID 상관분석 파이프라인

기존 포트 스캐너 도구(Nmap 등)는 외부 실행 파일을 호출하거나 스레드를 수백 개 생성하여 UI 스레드를 멈추게(Freezing) 만드는 고질적 문제가 있었습니다. ZeliScan의 PortScanService는 순수 .NET 비동기 소켓과 C# 8.0 IAsyncEnumerable을 결합하여 메모리 할당을 최소화하고 결과를 실시간으로 스트리밍합니다.

특히 수천 개의 포트를 동시에 타격할 때 발생할 수 있는 소켓 소진(Socket Exhaustion)과 네트워크 인터페이스 과부하를 방지하기 위해 SemaphoreSlim(maxParallel=50) 동시성 제어기를 배치하였습니다:

C# (PortScanService.cs) ZeliScan/Services/PortScanService.cs
// ── 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% 추출합니다:

C# (ProcessAnalyzerService.cs) ZeliScan/Services/ProcessAnalyzerService.cs
// ── 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 레지스트리 딥 포렌식을 결합하여 이 문제를 완벽하게 해결합니다:

C# (UsbSecurityService.cs) ZeliScan/Services/UsbSecurityService.cs
// ── 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 주입 공격 의심";
    }
}
sequenceDiagram autonumber actor Attacker as 비인가 사용자 / 침입자 participant PC as 전산실 PC (USB Port) participant Kernel as Windows 커널 (PnP & Registry) participant ZeliScan as ZeliScan 보안 거버넌스 Attacker->>PC: BadUSB(Flipper/Rubber Ducky) 삽입 Kernel->>Kernel: PNPDeviceID 등록 및 USBSTOR 레지스트리에 영구 시리얼 기록 ZeliScan->>Kernel: Win32_PnPEntity WMI 쿼리 (실시간 장치 감지) ZeliScan->>Kernel: HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR 조회 ZeliScan->>ZeliScan: 시그니처 대조 & Composite HID 복합장치 여부 분석 alt 악성 하드웨어 시그니처 일치 ZeliScan-->>PC: 🔴 즉시 적색 경고 팝업 및 장치 식별자/시리얼 리포트 적재 else 일반 저장장치 탈거 후 도주 ZeliScan-->>PC: 🟡 과거 연결 이력(시리얼/장치명/타임스탬프) 포렌식 복원 end
▲ [그림 2] WMI 및 USBSTOR 레지스트리 기반의 실시간 BadUSB 탐지 및 과거 이력 추적 시퀀스

7. Windows 방화벽 프로필 거버넌스 및 보안 이벤트 로그(4625/4672/4720) 감사 아키텍처

단말의 네트워크 방화벽은 도메인(Domain), 개인(Private), 공용(Public) 3대 프로필로 나뉘어 동작합니다. ZeliScan의 FirewallService는 netsh advfirewall 커널 명령을 비동기로 래핑하여, 현재 각 프로필의 방화벽 활성화 여부와 기본 인바운드/아웃바운드 정책이 Block으로 올바르게 설정되어 있는지 감시합니다.

아울러 EventLogAnalyzerService는 윈도우 보안 이벤트 로그(Security Event Log)를 실시간 분석하여 무차별 대입 공격(Brute Force)의 징후를 추적합니다:

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개 핵심 보안 지표를 완벽하게 점검합니다.

← 이전 기술 백서 #945 SW 수업 깃(Git) 실습 파괴 사고와 강제 푸시 0초 차단: ZeliGit의 UTF-8 비동기 프로세스 스트리밍과 파괴적 명령(push/reset/clean) 안전 방어벽 아키텍처 다음 기술 백서 → #943 공교육 교무행정과 군 연구실 태스크 유출 0초 차단: ZeliTodo의 온디바이스 로컬 태스크 거버넌스와 비동기 일정 영속화 아키텍처
🛡️ ZeliDesk ZeliScan 온디바이스 통합 보안 감사 엔진 체험하기
외산 무거운 EDR 없이 0초 만에 포트를 스캔하고, 숨은 평문 비밀번호와 BadUSB 위험을 완전히 차단하세요.
72종 유틸리티 전체 둘러보기 →