ASCII Smuggling 피싱 대응: 숨은 문자 탐지와 메일 신고
ASCII Smuggling 피싱은 보이지 않는 유니코드로 이메일 필터의 해석을 흐린다. 탐지 수치의 의미, 관리자의 태그 문자 검사와 오탐 구분, 이용자의 링크 확인·신고 방법을 설명한다.
핵심 요약
- 보이지 않는 Unicode Tags 문자를 단어 사이에 넣어 이메일 필터를 피하는 수법이다.
- 이용자는 보낸 사람과 링크의 실제 주소를 확인하고, 의심 메일은 신고 기능으로 신고한다.
- 관리자는 분석용 문자열에서 U+E0000~U+E007F를 처리하되 깃발 이모지 오탐을 구분한다.
이 글의 목차
ASCII Smuggling 피싱은 눈에 안 보이는 유니코드 문자를 단어 사이에 끼워 메일 필터를 피한다. 문구가 자연스러워 보여도 안전하다는 뜻이 아니다. 이용자는 보낸 사람과 링크의 실제 주소를 확인하고 신고한다. 관리자는 숨은 태그 문자를 탐지한다. (Microsoft 분석)

어떤 수법인가
유니코드에는 Tags 블록(U+E0000~U+E007F)이라는 영역이 있다. 인쇄 가능한 ASCII 문자의 그림자 사본이다(U+E0041은 A에 대응). 원래 언어 표시용으로 만들었고 지금은 대부분 사용이 권장되지 않는다. 화면에는 보이지 않지만 프로그램은 문자로 읽는다. 사람이 보는 것과 기계가 읽는 것이 갈리는 지점이다.
Microsoft 연구진이 9월 3일 공개한 분석에서 공격자는 ‘funding’(자금 지원) 같은 금융 미끼 단어 가운데에 이 문자(U+E0020)를 끼웠다. 받는 사람에게는 같은 단어로 보인다. 하지만 ’funding’이라는 글자를 그대로 찾는 탐지기에서는 이어진 단어가 사라진다. 실제로 빠져나가는지는 필터가 비교 전에 이 문자를 정규화하는지에 달렸다. 단어를 토큰으로 나누는 머신러닝 분류기도 익숙한 단어로 알아보지 못할 수 있다. AI 프롬프트 인젝션 연구로 알려진 방법을 필터 회피에 쓴 것이다. (Microsoft 분석)
직접 만들어 보면 차이가 보인다. Techies Note가 9월 28일 이 PC의 PowerShell 5.1에서 회의 자료 확인 부탁드립니다(15자) 뒤에 태그 문자로 ignore를 숨겨 붙이니, 문자열 길이가 27이 됐다. 태그 문자 하나가 UTF-16에서 두 칸을 차지하기 때문이다. 아래 명령으로 숨은 문자 6개를 찾아 ignore로 풀어냈다.
$found = [regex]::Matches($text, '\uDB40[\uDC00-\uDC7F]')
$found.Count
-join ($found | ForEach-Object { [char]([char]::ConvertToUtf32($_.Value, 0) - 0xE0000) })
$text에 검사할 메일 본문을 넣는다. 의심 메일 원문을 저장해 두었다면 이 방법으로 태그 문자가 있는지 먼저 볼 수 있다.
이용자가 할 일
보이지 않는 문자는 눈으로 알 수 없으니, 문구가 자연스럽다는 것은 안전의 근거가 못 된다. 이번 캠페인의 미끼는 사업 대출·신용 한도·선지급 자금 제안과 비슷했다. 아래는 Microsoft 피싱 도움말의 확인 방법이다. (피싱으로부터 보호)
- 처음 받는 보낸 사람이나 외부 보낸 사람의 메일은 속도를 줄이고 주의해서 본다.
- 링크를 누르지 말고 마우스를 올려 실제 주소가 메시지의 링크와 맞는지 본다. Android는 링크를 길게 누르면 실제 대상이 보인다.
- 지금 행동하라고 재촉하는 메일은 의심한다. 거짓 긴박감은 피싱의 흔한 속임수다.
- 걱정되면 메일의 링크 대신 즐겨찾기나 검색으로 그 회사 웹사이트에 직접 들어간다.
- Outlook에서는 메시지를 고르고 피싱 신고를 누른다.
관리자가 할 일
Microsoft 권고의 핵심은 두 가지다. 스팸·피싱 콘텐츠 규칙을 적용하기 전에 제목과 본문에서 태그 문자와 다른 보이지 않는 문자를 제거하거나 정규화하고, U+E0000~U+E007F가 있다는 사실 자체를 강한 이상 신호로 본다. 처리 방식은 제품마다 달라서, 자기 메일 파이프라인의 정규화·토큰화 단계가 이 문자를 어떻게 다루는지 시험하라고 권한다. 이메일을 읽는 AI 도구 앞에도 같은 정규화를 둔다.
문자가 있다는 것만으로 잡으면 오탐이 난다. 잉글랜드·스코틀랜드·웨일스 깃발 이모지가 이 문자를 정상적으로 쓴다. Microsoft의 첫 탐지 규칙도 이 세 깃발에 걸렸다. 다음을 함께 본다.
| 신호 | 판단 |
|---|---|
| 태그 문자가 단어 중간에 끼어 있다 | 회피 의심 |
| 태그 문자가 깃발 이모지 조합의 일부다 | 정상 사용 |
| 금융 단어를 조합한 새 발신 도메인이 계속 바뀐다 | 위험도 올림 |
| 평일에 대량으로 오고 주말에 거의 멈춘다 | 이번 캠페인의 발송 패턴 |
받은 메일은 .eml로 저장해 아래 Python 스크립트(scan_email_tags.py)로 검사할 수 있다. 표준 라이브러리만 쓰고, 원본을 바꾸거나 링크·HTML을 실행하지 않는다. python scan_email_tags.py suspect.eml로 실행하면 태그 문자의 위치와 앞뒤 문맥이 \U000e0020 같은 형태로 나온다. 9월 28일 이 PC의 Python 3.13에서 본문에 fun+U+E0020+ding을 넣은 시험 메일로 돌리니 “offset 12, U+E0020”과 “발견한 태그 문자: 1개”가 나왔다.
import sys
from pathlib import Path
from email import policy
from email.parser import BytesParser
message = BytesParser(policy=policy.default).parsebytes(Path(sys.argv[1]).read_bytes())
total = 0
for n, part in enumerate(message.walk(), 1):
if part.is_multipart() or part.get_content_type() not in ("text/plain", "text/html"):
continue
if part.get_content_disposition() == "attachment":
continue
try:
body = part.get_content()
except (LookupError, UnicodeError):
print(f"part {n}: 문자 인코딩을 해석하지 못함")
continue
positions = [i for i, ch in enumerate(body) if 0xE0000 <= ord(ch) <= 0xE007F]
total += len(positions)
for i in positions[:20]:
print(f"part {n}, offset {i}, U+{ord(body[i]):05X}", ascii(body[max(0, i - 12):i + 13]))
print(f"발견한 태그 문자: {total}개")
결과가 0개면 검사한 본문에서 찾지 못했다는 뜻이다. 첨부 파일, 암호화된 메일, 해석하지 못한 인코딩은 이 검사로 판정할 수 없다. 발견 개수만으로 삭제·차단하지 말고 문맥을 본다. 금칙어 필터, 검색 색인, 로그 분석처럼 문자열을 그대로 비교하는 자체 시스템도 같은 점검이 필요하다.
230만 건의 의미
Microsoft 원격 분석에서 태그 문자 탐지 규칙이 2026년 2월 11일 하루 230만 건 넘게 걸렸다. 피해자 수나 클릭 수가 아니라 탐지 규칙에 걸린 메시지 수다.
| 시점(2026년) | 관측 |
|---|---|
| 2월 8일 | 약 2만 1천 건 |
| 2월 9일 | 130만 건 넘게 급증 |
| 2월 11일 | 하루 230만 건 초과 |
| 첫 단계(2월) | 평일 하루 100만~237만 건, 2월 26일 최고 |
| 3월 말 | 평일 물량이 약 80% 줄어듦 |
| 5월 15일 이후 | 크게 감소, 6월 중순까지 적은 양 |
Microsoft Defender for Office 365에서는 이 메시지의 99% 넘게 태그 문자 탐지가 아닌 다른 방어 계층(발신자·IP·URL·도메인 평판, 머신러닝 스팸·피싱 분류, 브랜드 사칭 탐지, 인증 검사 등)에 걸렸다. 같은 캠페인은 이 수법을 쓰기 전에도, 그만둔 뒤에도 이어졌다.
자주 묻는 질문
메일 앱에서 숨은 문자를 볼 수 있나? 화면에 그려지지 않는 문자라 눈으로는 찾기 어렵다. 의심되는 메일은 원본(.eml)을 저장해 위 명령이나 스크립트로 검사하거나, 회사라면 신고 기능으로 넘긴다.
수상한 메일을 AI 챗봇에 붙여 넣어 요약시켜도 되나? 조심한다. 이 문자는 AI에게 사람 눈에 안 보이는 지시를 심는 프롬프트 인젝션 연구로 알려졌다. 모르는 사람이 보낸 글을 AI에 넣었다면, 요약이 링크를 누르거나 답장하라고 권해도 따르지 말고 원문을 직접 확인한다.
링크를 눌러 정보를 입력했다면? Microsoft 도움말은 공유한 정보를 기록하고, 영향받은 계정과 같은 암호를 쓰는 모든 곳의 암호를 바로 바꾸고, 다단계 인증을 켜라고 안내한다. 회사·학교 계정이면 IT 담당자에게, 카드·계좌 정보를 넣었다면 그 회사에도 알린다. (피싱으로부터 보호) 인증 방식은 2단계 인증 방법 비교: SMS·인증 앱·패스키·보안 키를 본다.



첫 댓글을 남겨 보세요.
로그인은 계정 확인에만 사용하며 이메일 원문은 저장하거나 공개하지 않습니다.
댓글은 공개됩니다. 개인정보·광고·비방성 내용은 남기지 마세요. 운영 기준은이용 안내에서 확인할 수 있습니다.