텔레그램의 로컬 데이터 암호화 체계 자체는 빈틈없이 설계되어 있습니다. 사용자의 세션 데이터는 전용 데이터 암호화 키(DEK)로 암호화되며, 이 DEK는 사용자가 설정한 비밀번호로부터 유도된 키 암호화 키(KEK)로 다시 한번 보호됩니다. 하지만 윈도우 데스크톱 환경에서는 악의적으로 조작된 단 하나의 링크만으로 이 암호학적 방어선이 완전히 무력화될 수 있었습니다. 보안 연구원 beaksec은 텔레그램 데스크톱에서 동작하는 원클릭 계정 탈취 취약점 CVE-2026-107181을 공개했습니다. 공격자가 피해자를 유도해 조작된 링크를 클릭하게 만들기만 하면, 피해자의 핵심 세션 파일이 지정된 그룹으로 조용히 업로드되어 계정이 그대로 탈취됩니다.
CNA 기관인 VulnCheck는 이 취약점에 대해 CVSS 4.0 기준 8.6점, 기본 CVSS 3.1 기준 8.1점을 부여했습니다. 점수 차이가 발생하는 핵심 이유는 사용자의 가벼운 상호작용으로 인해 연쇄적으로 촉발되는 시스템 수준의 영향을 새 기준에서 더욱 무겁게 평가했기 때문입니다. 이 공격 체인이 성립할 수 있었던 근본 원인은 텔레그램 데스크톱이 내부의 신뢰된 호출과 외부의 신뢰할 수 없는 입력을 아무런 검증 없는 단일 통신 통로로 합류시켰기 때문입니다. 데이터 파이프라인의 앞단에서 입력을 비신뢰 데이터로 취급하지 않는다면, 내부에 아무리 견고한 암호화 요새를 구축해 두었더라도 경계 붕괴를 막을 수 없습니다.
이스케이프되지 않은 구분자가 촉발한 내부 특권 백도어
전체 공격 체인의 첫 번째 고리는 로컬 단일 인스턴스 소켓의 레코드 구분자 처리 미흡(CWE-143)입니다. 텔레그램 데스크톱이 이미 실행 중인 상태에서 사용자가 외부 링크를 클릭하면 운영체제는 새 프로세스로 링크를 넘깁니다. 새 프로세스는 로컬 소켓을 통해 열고자 하는 링크를 OPEN:<url>; 형식으로 가공하여 실행 중인 기본 인스턴스로 전달하며, 수신 측은 세미콜론을 기준으로 명령을 분리합니다. 여기서 발생한 엔지니어링 결함은 입력된 URL 내의 세미콜론을 이스케이프 처리하지 않았다는 점입니다. sandbox.cpp:295-297의 문자열 조립과 sandbox.cpp:453-463의 분리 로직 모두 특수 문자를 제한하지 않았습니다. 이로 인해 세미콜론이 포함된 악성 링크 tg://x?a=1;CMD:quit가 전달되면 두 개의 별도 명령으로 강제 분리되어, 외부 비신뢰 입력이 내부 제어 흐름으로 곧바로 탈출하게 됩니다.
그림: 조작된 링크 클릭부터 피해자 세션 파일 유출까지의 공격 흐름도. 출처: beaksec.github.io
탈출한 명령은 공격 체인의 두 번째 단계인 내부 URI 스킴 interpret:를 장악합니다. application.cpp:1162-1164 구현에 따라 클라이언트는 지정된 경로를 실행 대기열에 추가합니다. 이어지는 InterpretSendPath 함수(support_helper.cpp:673-680)는 지시 파일에 정의된 로컬 파일을 읽어 특정 채널이나 슈퍼그룹으로 전송하는데, 이 전체 과정에서 권한 검증이나 사용자 확인 팝업은 전혀 이루어지지 않습니다. 이 프로토콜은 본래 공식 업데이트 배포 도구 체인(build/updates.py)에서 빌드 패키지를 전달하기 위해 만들어진 것이었습니다. 지시 파일에는 원래 현재 로그인된 계정을 대조하기 위한 from: 필드가 포함되어야 하지만, 해당 행이 누락되면 시스템은 검사를 아예 건너뛰었습니다. 무방비한 프로토콜 파싱으로 인해 외부 공격자에게 핵심 내부 특권 함수의 실행 권한이 고스란히 넘어간 셈입니다.
자동 다운로드 기능이 완성한 결정론적 공격 체인
취약점 자체는 실행 진입로에 불과하며, 이를 온전한 계정 탈취로 전환하려면 정교한 상태 머신 엔지니어링이 필요했습니다. 공격자는 먼저 슈퍼그룹을 개설하고, 사전 동의 없이 상대를 그룹에 초대할 수 있는 텔레그램 기본 개인정보 설정을 악용해 피해자를 끌어들입니다. 이어서 피해자의 로컬 비밀 파일을 가리키는 interpret: 명령이 담긴 일반 텍스트 지시 파일 세 개를 그룹에 전송합니다. 8 MiB 미만 첨부파일을 자동으로 다운로드하는 텔레그램의 기본 동작 특성 덕분에, 이 세 파일은 C:\Users\<user>\Downloads\Telegram Desktop\ 폴더에 조용히 저장됩니다.
interpret: 프로토콜은 상대 경로를 지원하며, 경로 해석의 기준은 윈도우 환경 내 텔레그램 작업 디렉터리인 %APPDATA%\Telegram Desktop입니다. 공격자는 ../../../Downloads/Telegram%20Desktop/instructions.txt 경로를 지정함으로써 구체적인 윈도우 사용자 이름을 몰라도 자동 저장된 페이로드 파일을 정확하게 찾아낼 수 있습니다. 그 후 공격자는 그룹에 HTTP 링크를 전송하고 조작된 tg:// 링크로 302 리다이렉트를 유도하여, 피해자가 클릭하는 즉시 인젝션을 실행시킵니다.
세 개의 지시 파일은 계정 탈취에 필수적인 핵심 데이터를 순차적으로 읽어 외부로 전송합니다. 암호화되지 않은 솔트(salt)가 보관된 tdata/key_datas, 기본 데이터 이름을 바탕으로 생성된 하위 디렉터리 내의 D877F783D5D3EF8Cs, 그리고 인덱스 파일인 maps가 그 대상입니다. 디렉터리 이름 D877F783D5D3EF8C는 무작위 값이 아니라 기본 명칭인 data로부터 유도된 고정 문자열로, storage_file_utilities.cpp:241-250에 명시된 대로 표준 설치 환경마다 완전히 동일합니다. 기본 상태에서는 로컬 비밀번호가 설정되어 있지 않아 빈 문자열로 처리됩니다. 따라서 공격자는 탈취한 솔트와 공개 알고리즘을 결합해 KEK를 다시 계산하고 DEK를 복호화하여 로컬 환경에서 피해자의 MTProto 인증 세션을 온전히 재구성할 수 있습니다. 자동 다운로드, 상대 경로 지원, 기본 비밀번호 미설정은 개별적으로는 편리한 기능이지만, 동일한 실행 컨텍스트 안에서 맞물리며 치명적인 익스플로잇 체인을 형성했습니다.
통신 경계를 재구축한 네 가지 소스 코드 수정
이 공격 체인에 대응하기 위해 텔레그램은 위험한 레거시 로직을 완전히 걷어내는 방식을 택했습니다. 2026년 9월 16일의 커밋 db3405699f에서 개발팀은 네 가지 핵심 수정을 적용했습니다. 첫째, interpret:// 스킴과 보조 전송 함수인 Support::InterpretSendPath를 코드베이스에서 완전히 삭제했습니다. 둘째, 소켓 통신의 레코드 구분자에 퍼센트 16진수 이스케이프를 적용해 다중 명령 주입 가능성을 차단했습니다. 셋째, 동일한 연결에서 OPEN:이 감지되면 CMD:와 CTRL: 레코드를 건너뛰도록 보호 단언을 추가했습니다. 넷째, 비로컬 URL이 감지된 이후에는 이어지는 로컬 경로 요청을 즉시 폐기하도록 개선했습니다.
이 모든 패치는 이튿날 배포된 7.2.9 버전에 포함되었습니다. 그러나 해당 버전의 릴리스 노트에는 렌더링 결함 수정만 언급되었을 뿐, 보안 권고문이나 취약점 영향도에 대한 안내는 전혀 없었습니다. 전체 일정을 살펴보면 2026년 6월 25일 ZDI에 취약점이 접수되었고, 개발사는 9월 16일 독자적으로 코드를 수정했으며, 9월 30일 ZDI가 조치 완료로 사안을 종결했습니다. 이후 10월 3일 연구원 beaksec이 독자 분석을 공개하고 나서야 10월 7일에 공식 CVE가 부여되었습니다. 보안 권고 없는 조용한 패치 관행은 기업 고객이 내부 클라이언트 위험을 능동적으로 평가할 수 있는 정보 흐름을 가로막습니다. 현재 CISA의 SSVC 평가 체계는 이 취약점의 악용 상태를 “poc”로 분류하고 있으며, KEV(알려진 악용 취약점) 목록에는 포함되지 않았습니다.
업데이트 없이도 공격을 차단하는 3단계 방어선
이번 취약점 검증은 윈도우 환경 6.9.3 버전에서 진행되었으나, 7.2.9 이상으로 즉각 업데이트하기 어려운 환경이라도 클라이언트 내 설정을 조정하여 위험을 크게 낮출 수 있습니다. 고급 설정에서 ‘각 파일마다 저장 위치 확인’ 옵션을 켜두면 정적 경로에 의존하는 공격 전제가 무너져 악성 파일이 의도된 위치에 자동으로 저장되지 않습니다. 또한 ‘나를 그룹에 추가할 수 있는 사람’을 ‘내 연락처’로 제한하면 공격자가 피해자를 임의의 공격 그룹으로 강제 초대하는 경로를 차단할 수 있습니다. 아울러 웹 브라우저에서 ‘Telegram 열기’를 요청하는 팝업이 뜰 때 주의를 기울이고, 활성 세션 목록에서 의심스러운 기기 접속이 없는지 정기적으로 점검하는 습관이 필요합니다.
가장 근본적이고 확실한 암호학적 방어책은 텔레그램에 로컬 비밀번호를 설정하는 것입니다. 이번 공격은 로컬 비밀번호가 비어 있어 기본값과 유출된 솔트만으로 복호화가 가능하다는 점을 노렸습니다. 로컬 비밀번호를 등록하면 올바른 KEK를 유도하기 위해 사용자가 직접 입력한 일반 텍스트 비밀번호가 반드시 요구됩니다. 이 경우 공격자가 key_datas를 비롯한 핵심 파일을 통째로 빼돌리더라도 비밀번호 없이는 내용을 해독할 수 없습니다. 비즈니스 로직의 신뢰 경계가 무너졌을 때, 엄격하게 설정된 보안 기준이야말로 계정 탈취를 막아내는 최후의 보루입니다.
참고 링크:
- Telegram Desktop 원클릭 계정 탈취 취약점 분석 (beaksec)
- VulnCheck 취약점 평가 개요