백신이 내 앱을 트로이 목마로 보고 지웠다
같은 파일인데 받는 경로에 따라 판정이 갈렸습니다. 그게 오탐이라는 증거였습니다.
Summary
- 과제
- 윈도우에서 내려받으면 Windows Defender 가 트로이 목마로 판정하고 파일을 지웠다.
- 수단
- 자기압축을 푸는 onefile 이 원인으로 보여 onedir 로 바꿨다. 그것으로는 안 풀려 마이크로소프트에 오탐 신고를 했다.
DETAILED DESCRIPTION
윈도우에서 docx2patent를 내려받았더니 파일이 사라졌습니다.
Windows Defender가 이렇게 판정하고 지운 것입니다.
Trojan:Win32/Sabsik.TE.A!ml 심각
이름 끝의 !ml 이 단서였다
!ml은 machine learning의 약자입니다.
"알려진 악성코드와 일치함"이 아니라 **"모양이 수상해 보인다는 기계학습 모델의 추측"**이라는 뜻입니다.
확정 판정이 아니라는 신호이긴 한데, 결과는 같습니다. 파일은 이미 지워졌습니다.
결정적인 건 맥에서 옮기면 됐다는 것
이상한 일이 있었습니다.
- 윈도우에서 크롬으로 받으면 → 지워짐
- 맥에서 받아 윈도우로 옮기면 → 멀쩡히 실행됨
같은 파일입니다. 바이트 하나 다르지 않습니다. 그런데 판정이 갈립니다. 파일 내용이 문제라면 이럴 수가 없습니다. 이게 오탐이라는 가장 확실한 증거였습니다.
이유는 "인터넷에서 받은 파일"이라는 꼬리표입니다. 윈도우에서 브라우저로 파일을 받으면 그 파일에 표시가 하나 붙고, 디펜더는 그 표시가 붙은 파일을 훨씬 빡빡하게 검사합니다. 맥에서 USB나 공유폴더로 옮기면 그 표시가 안 붙습니다. 맥 쪽 파일 시스템이 윈도우의 그 표시를 담지 못하기 때문입니다.
즉 파일이 아니라 출처 표시가 판정을 갈랐습니다.
진짜 원인 — 실행파일을 한 덩어리로 만든 것
이 앱은 파이썬으로 만들어서, 실행파일 안에 파이썬 실행환경과 라이브러리를 통째로 넣어 배포합니다.
그 방식이 두 가지인데 윈도우 쪽은 onefile 을 쓰고 있었습니다.
onefile 로 만든 exe는 실행할 때마다 이렇게 동작합니다.
- exe가 켜짐
- 자기 안에 압축돼 있던 파일 수십 개를 임시 폴더에 풀어놓음
- 그제서야 진짜 프로그램이 시작됨
- 끄면 임시 폴더를 지움
문제는 이 동작이 악성코드가 백신을 피할 때 쓰는 수법과 구조가 똑같다는 것입니다. 겉보기엔 파일 하나, 실행하면 뭔가를 몰래 풀어놓고, 그걸 실행함. 디펜더 입장에서는 구별할 방법이 없습니다.
여기에 두 가지가 겹쳤습니다.
- 서명이 없습니다 — 누가 만들었는지 증명할 수 없습니다
- 쓰는 사람이 없습니다 — 디펜더는 "전 세계에서 몇 명이나 이 파일을 실행해봤는지"를 신뢰도로 삼습니다. 어제 처음 생긴 파일은 0입니다
수상한 동작 + 신원 불명 + 전례 없음. 셋이 모이면 지워집니다.
고친 방법
onedir 로 바꿨습니다. 압축해 넣지 않고 폴더에 그냥 풀어놓는 방식입니다.
풀어놓는 동작 자체가 없어지니 의심받을 이유가 사라집니다.
받는 사람 입장에서 달라지는 건 거의 없습니다. 어차피 zip으로 받으니까, 열었을 때 exe 하나 대신 폴더 하나가 나오는 차이뿐입니다. 덤으로 켤 때마다 압축을 풀지 않으니 실행도 빨라졌습니다.
맥은 원래 이 방식이었습니다. 윈도우만 "배포가 간단해서" 다르게 해뒀던 게 화근이었습니다.
그리고 한 번 더 틀렸다
고쳐놓고 배포했는데 여전히 지워지는 파일이 올라갔습니다.
버전 태그를 붙인 자리가 고친 커밋보다 한 칸 앞이었습니다. 그래서 자동 빌드가 고치기 직전 코드로 만들어 올렸습니다. 저는 다 됐다고 생각하고 있었고, 사이트는 그 파일을 열심히 가리키고 있었습니다.
이미 나간 태그를 슬쩍 옮길 수도 있었지만 그러지 않았습니다. 파일이 실제로 달라졌으니 번호도 달라야 하고, 무엇보다 옛 버전을 받아간 사람이 "다시 받아야 하는구나"를 알 수 있어야 하기 때문입니다. 그래서 번호를 올려 다시 냈습니다.
남는 것
근본 해결은 코드 서명 인증서입니다. "내가 만들었다"를 증명하면 이 의심이 통째로 사라집니다. 맥도 같은 문제로 막혀 있으니, 결국 양쪽 다 돈으로 푸는 문제가 하나씩 남아 있는 셈입니다.
당장은 안 하려고 합니다. 대신 이 글을 남깁니다. 받자마자 파일이 사라지는 경험은 꽤 당황스러운데, 왜 그런지 알고 나면 덜 무섭습니다.
Troubleshooting
- 증상
- 윈도우에서 내려받으면 Windows Defender 가 Trojan:Win32/Sabsik.TE.A!ml 로 판정하고 파일을 지운다
- 원인
- PyInstaller onefile 이 실행할 때마다 자기 안의 파이썬 런타임을 임시 폴더에 푼다. 이 동작이 악성코드가 백신을 피하는 수법과 구조가 같다. 서명이 없고 사용자 수가 0 인 것도 겹친다
- 해결
- onedir 로 바꿨다(오탐은 줄었으나 안 없어짐). 마이크로소프트 오탐 신고(wdsi 제출, Software developer 유형)로 푼다
- 확인
- 윈도우에서 크롬으로 받아 압축을 풀었을 때 파일이 남아 있으면 해결. 맥에서 옮겨 넣은 것으로는 시험이 안 된다 — 출처 표시가 안 붙어 검사가 느슨해진다