유니코드 RLO 공격: 파일명 1글자로 확장자가 뒤집히는 원리 | T1036.002
RTLO 문자 U+202E 하나로 .exe를 .pdf로 위장하는 공격 원리와 탐지법을 실제 코드와 함께 분석합니다. 보안 전문가가 알려주는 방어 전략까지.
2024년 MITRE ATT&CK 프레임워크에는 총 196개의 공격 기법이 등록되어 있다. 그 중에서도 T1036.002 Right-to-Left Override 기법은 단 1개의 보이지 않는 유니코드 문자로 파일명을 완전히 다르게 보이게 만드는 공격이다.
이 기법이 등장하기 전, 공격자들은 파일 확장자를 위장하기 위해 복잡한 방법들을 사용해야 했다. 아이콘을 변경하거나, 파일명 끝에 수많은 공백을 추가하거나, 이중 확장자를 사용하는 등의 방법이었다. 하지만 이런 방법들은 쉽게 탐지되거나 사용자가 의심할 수 있었다.
유니코드 Right-to-Left Override (RTLO) 문자는 이런 한계를 완전히 해결했다. 보이지 않는 제어 문자 1개만으로 텍스트 표시 방향을 뒤바꿔 버리기 때문이다. 이 기술은 다국어 텍스트 표시 문제를 해결하기 위해 만들어졌지만, 파일명 위장의 이상적인 도구가 되어버렸다.
Right-to-Left Override (RTLO)는 유니코드 문자 U+202E로, 뒤따르는 텍스트를 우에서 좌로 표시하도록 강제하는 보이지 않는 제어 문자이다.
Right-to-Left Override는 양방향(bidirectional) 텍스트에서 뒤따르는 모든 텍스트를 우에서 좌로 표시하도록 하며, 방향 변경 시 미러링되지 않습니다.
— Unicode Standard, General Punctuation Block
RTLO는 원래 아랍어, 히브리어, 페르시아어 같은 우-좌(RTL) 언어와 영어 같은 좌-우(LTR) 언어가 섞인 텍스트를 올바르게 표시하기 위해 설계되었다.
‮ 또는 ‮| 용어 | 설명 |
|---|---|
| RTLO | 유니코드: U+202E / 기능: 뒤따르는 텍스트를 우→좌로 강제 표시 / 사용 목적: 방향 완전 변경 |
| LTRO | 유니코드: U+202D / 기능: 뒤따르는 텍스트를 좌→우로 강제 표시 / 사용 목적: 좌우 방향 강제 |
| RLE | 유니코드: U+202B / 기능: 우→좌 임베딩 시작 / 사용 목적: 부분적 방향 변경 |
| LRE | 유니코드: U+202A / 기능: 좌→우 임베딩 시작 / 사용 목적: 부분적 방향 변경 |
| 유니코드: U+202C / 기능: 방향 포맷팅 종료 / 사용 목적: Override/Embedding 해제 |
일반적인 파일명 "document.pdf"는 왼쪽에서 오른쪽으로 순서대로 표시된다. 하지만 RTLO 문자가 중간에 삽입되면 상황이 완전히 바뀝니다.
실제 파일명이 invoice\u202Etxt.exe라고 가정해봅시다. 여기서 \u202E는 RTLO 문자이다.
원본 문자열: invoice[RTLO]txt.exe
표시 결과: invoiceexe.txt
RTLO 문자 뒤의 "txt.exe" 부분이 "exe.txt"로 뒤바뀌어 표시된다. 사용자는 "invoiceexe.txt"라는 텍스트 파일로 인식하지만, 실제로는 "invoice[RTLO]txt.exe"라는 실행 파일이다.
# 실제 파일명 생성 예시
import os
# RTLO 문자 (U+202E)
rtlo = '\u202E'
# 실제 파일명
actual_filename = f"document{rtlo}txt.exe"
# 파일 생성
with open(actual_filename, 'w') as f:
f.write("악성 코드")
# 파일 시스템에서의 실제 이름
print(f"실제 파일명: {repr(actual_filename)}")
# 출력: 실제 파일명: 'document\u202etxt.exe'
# 화면에 표시되는 이름
print(f"표시되는 이름: {actual_filename}")
# 출력: 표시되는 이름: documentexe.txt
여기서 중요한 점은 파일 시스템은 RTLO 문자를 포함한 원본 이름을 저장하지만, 화면 표시는 유니코드 렌더링 엔진이 처리한다는 것이다.
| 운영체제 | 설명 |
|---|---|
| Windows | 파일 탐색기: RTLO 적용됨 / 명령줄: cmd: 적용 안됨, PowerShell: 적용됨 / 특이사항: 레지스트리에서도 동작 |
| macOS | 파일 탐색기: Finder에서 적용됨 / 명령줄: Terminal: 적용 안됨 / 특이사항: 일부 앱에서만 동작 |
| Linux | 파일 탐색기: 배포판별 차이 / 명령줄: 터미널별 차이 / 특이사항: 폰트 의존성 높음 |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<a href="malware.exe" download="report‮exe.pdf">
보고서 다운로드
</a>
</body>
</html>
브라우저는 다운로드 대화상자에서 reportpdf.exe로 표시하지만, 실제로는 report[RTLO]exe.pdf라는 이름으로 저장된다.
공격자 입장에서 RTLO는 거의 이상적인 위장 도구이다. 왜냐하면:
시나리오 1: 이메일 첨부파일 공격
공격자는 Financial_Report_2024\u202Etxt.exe라는 파일을 만들어 이메일로 전송한다. 피해자는 Financial_Report_2024exe.txt라는 텍스트 파일로 보고 안심하고 실행하게 된다.
시나리오 2: 웹사이트 다운로드 속임수
// 악성 웹사이트의 JavaScript 코드
function createMaliciousDownload() {
const rtlo = '\u202E';
const link = document.createElement('a');
// 실제 파일: backdoor.exe
link.href = 'backdoor.exe';
// 표시되는 이름: softwareexe.pdf
link.download = `software${rtlo}exe.pdf`;
link.textContent = 'PDF 다운로드';
document.body.appendChild(link);
}
레지스트리 조작
REM Windows 레지스트리에서 RTLO 사용
REM 실제 키 이름: malware[RTLO]txt.reg
REM 표시되는 이름: malwareger.txt
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" ^
/v "UpdateService%RTLO%txt.exe" ^
/d "C:\malware.exe" ^
/f
regedit.exe에서는 UpdateServiceexe.txt로 표시되지만, 실제로는 실행파일을 가리키는 레지스트리 항목이다.
다중 RTLO 사용
파일명: document[RTLO]pdf[RTLO]exe.scr
표시명: documentrcs.pdfexe
여러 개의 RTLO를 사용하면 더욱 복잡한 위장이 가능한다.
2019년 금융기관 대상 피싱 캠페인에서 공격자들은 Invoice\u202Eexe.doc이라는 첨부파일을 사용했다. 이 파일은 화면에서 Invoicedoc.exe로 표시되어 Word 문서로 위장했지만, 실제로는 실행파일이었다.
BlackBasta 랜섬웨어 그룹도 2023년부터 RTLO 기법을 활용해 초기 침투 단계에서 탐지를 회피하고 있다.
파일명 검사 도구
def detect_rtlo_in_filename(filename):
"""파일명에서 RTLO 문자 탐지"""
rtlo_chars = [
'\u202E', # Right-to-Left Override
'\u202D', # Left-to-Right Override
'\u202A', # Left-to-Right Embedding
'\u202B', # Right-to-Left Embedding
]
for char in rtlo_chars:
if char in filename:
return True, f"발견된 제어문자: U+{ord(char):04X}"
return False, "안전"
# 테스트
test_files = [
"document.pdf",
"invoice\u202Etxt.exe",
"report\u202Dpdf.scr"
]
for filename in test_files:
is_suspicious, result = detect_rtlo_in_filename(filename)
print(f"{repr(filename)}: {result}")
이메일 보안 정책
시스템 레벨 방어
# PowerShell: 시스템 전체 RTLO 파일 검색
Get-ChildItem -Recurse -File | Where-Object {
$_.Name -match '[\u202A-\u202E]'
} | Select-Object FullName, Name
# Linux: find 명령으로 RTLO 파일 검색
find / -type f -name "*$(printf '\u202E')*" 2>/dev/null
RTLO 공격은 1개의 보이지 않는 유니코드 문자로 파일명을 완전히 다르게 보이게 만드는 정교한 사회공학 공격이다.
이 기법은 이중 확장자 공격과 함께 사용되면 더욱 강력한 위장 효과를 낼 수 있으며, 매직 바이트 조작 기법과 조합하면 파일 내용까지 속일 수 있다.
다음에는 T1036.003 기법인 정상 도구 이름 위장에 대해 알아보겠다. rundll32.exe나 svchost.exe 같은 시스템 프로세스 이름을 악용하는 방법과 그 탐지법을 다룰 예정이다.
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.