2026년 9월 10일, Windows Defender 가 울타리 NEO 를 악성코드로 분류해 사용자 PC 에서 삭제했습니다. 실행 파일뿐 아니라 시작 메뉴 바로가기와 레지스트리 항목까지 함께 지웠습니다. 이 글은 무슨 일이 있었고, 저희가 무엇을 측정했고, 무엇을 틀렸는지에 대한 기록입니다.
무슨 일이 있었나
최신 판(build 65)을 설치한 직후 Windows 보안이 다음 이름으로 탐지했습니다.
- 사용자 PC:
Trojan:Win32/Sabsik.FL.A!ml - 마이크로소프트 제출 후 클라우드 검사:
Trojan:Win32/Wacatac.C!ml
두 이름 모두 끝에 !ml 이 붙어 있습니다. 머신러닝 모델의 판정이라는 뜻입니다. 사람이 만든 시그니처에 걸린 것이 아니라, 모델이 통계적으로 「악성 같다」고 점수를 매긴 것입니다. Sabsik 과 Wacatac 은 서명 없는 새 실행 파일에 붙는 대표적인 일반명이기도 합니다.
측정한 것
짐작으로 넘어가지 않으려고, 같은 PC·같은 정의판(1.459.133.0)·같은 시점에 세 판을 명령줄 검사(MpCmdRun -Scan -ScanType 3)로 돌렸습니다.
| 빌드 | 결과 |
|---|---|
| build 63 | found no threats |
| build 64 | found no threats |
| build 65 | found 1 threats |
정의판이 바뀌어서 생긴 일이 아니었습니다. 세 판 모두 같은 정의판에서 검사했고, 앞의 두 판은 깨끗했습니다.
우리가 틀렸던 가설
처음 세운 가설은 「제품 안에 들어 있는 탐지용 문자열 때문」이었습니다. 울타리 NEO 는 보안 점검 도구라 악성코드를 식별하는 문자열을 갖고 있습니다 — 랜섬노트 문구, 해킹 도구 이름, 채굴기 이름 같은 것들입니다. 이런 것들이 한 실행 파일에 모여 있으면 백신이 오해할 수 있다고 본 것입니다.
그래서 세 판의 바이너리를 직접 열어 문자열을 대조했습니다. 결과는 가설과 반대였습니다.
문제의 문자열들은 build 63·64·65 에 개수까지 똑같이 들어 있었습니다. 그런데 63 과 64 는 깨끗했습니다.
문자열이 원인이면 앞의 두 판도 걸렸어야 합니다. 가설은 틀렸습니다. 그리고 그 사실을 확인한 것이 이 조사에서 가장 쓸모 있는 결과였습니다. 틀린 가설을 붙잡고 며칠을 쓸 뻔했기 때문입니다.
그래서 원인이 무엇인가 — 모릅니다
build 65 에서 늘어난 코드 중 정확히 무엇이 방아쇠였는지는 특정하지 못했습니다. 문자열 단위·토큰 단위로 두 번 비교했지만 의미 있는 차이를 분리해 내지 못했습니다.
그리고 이것은 더 파면 나올 성질의 문제가 아닐 수 있습니다. 머신러닝 판정은 근거를 공개하지 않습니다. 파일 전체의 바이트 분포·구조·크기 같은 특징으로 점수를 매기기 때문에, 하는 일이 똑같은 두 빌드가 결정 경계 양쪽에 떨어질 수 있습니다. 사람이 납득할 만한 「이유」가 아예 없을 수도 있습니다.
확실한 것은 네 가지
특정 원인 대신, 애초에 오탐 확률을 높이는 조건들은 분명합니다.
- 코드 서명 인증서가 없습니다. 가장 큰 요인입니다.
- 새 빌드는 사용 이력이 0입니다. 판을 낼 때마다 평판이 처음으로 리셋됩니다.
- 보안 도구라 행동이 악성코드와 겹칩니다. 자동 실행 목록을 읽고, 프로세스를 훑고, 방화벽 규칙을 쓰고, 파일을 격리합니다. 전부 제품의 기능이지만, 모델이 보기에는 악성코드가 하는 일과 같습니다.
- 설치 형태가 지속성 패턴과 같습니다. 사용자 폴더에 실행 파일을 두고 자동 시작을 등록합니다. Defender 가 지목한 것도 실행 파일 하나가 아니라 이 조합이었습니다.
하지 않기로 한 것
탐지를 피할 때까지 바이너리를 이리저리 고쳐 보는 방법이 있습니다. 하지 않기로 했습니다.
그건 악성코드 제작자가 쓰는 작업 방식이고, 보안 제품을 만드는 회사가 자기 릴리스 절차에 심을 수 있는 것이 아닙니다. 성공한다 해도 다음 기능을 넣을 때 또 걸릴 것이고, 그때마다 같은 짓을 반복하게 됩니다. 결국 제품을 백신 분류기가 설계하게 됩니다.
대신 하고 있는 것
- 마이크로소프트에 오탐 정정 요청을 접수했습니다. 위 측정 결과를 근거로 제출했고 검토를 기다리는 중입니다.
- 코드 서명 인증서를 발급받고 있습니다. 위 1·2번을 동시에 없애는 유일한 수단입니다. 다만 서명한다고 오탐이 즉시 사라지지는 않습니다 — 평판은 다운로드 이력이 쌓이면서 붙습니다.
- 설치 위치를 바꾸는 것을 검토 중입니다(4번 대응).
- 그동안 홈페이지에 오탐 안내와 검사에서 깨끗한 이전 판을 함께 올려 두었습니다.
받으신 파일을 직접 확인하는 법
「이 회사가 오탐이라고 하니 믿으라」고 말할 생각은 없습니다. 저희 제품 자체가 근거를 보고 직접 판단하라는 원칙으로 만든 것이라, 여기서도 같은 것을 드립니다.
다운로드 페이지에 모든 배포 파일의 SHA-256 을 적어 두었습니다. 받으신 파일이 저희가 올린 그 파일인지 명령 한 줄로 확인할 수 있습니다.
certutil -hashfile "받은파일경로" SHA256
값이 다르면 그건 저희 파일이 아닙니다. 그 경우에는 실행하지 마시고 알려 주세요.
이 글을 남기는 이유
보안 제품이 백신에 악성으로 잡혔다는 사실은 숨기고 싶은 종류의 일입니다. 그런데 숨기면 사용자는 검색해서 아무 설명도 못 찾고, 「이 프로그램은 바이러스였다」로 결론을 내립니다. 그게 사실보다 나쁩니다.
그리고 저희가 세운 가설이 측정 앞에서 틀렸다는 것도 그대로 적었습니다. 판정 근거를 보여 주겠다고 만든 제품이 자기 문제에서만 근거를 감추면, 그 제품이 하는 말을 믿을 이유가 없어집니다.
진행 상황이 바뀌면 이 글을 갱신합니다. 문의: [email protected]