링크 한 번으로 로그인 파일이 새었다: 텔레그램의 자동 다운로드가 만든 연결고리

텔레그램 데스크톱의 자동 저장과 브라우저 경유 링크가 로컬 파일 전송으로 이어진 취약점을 살펴봅니다. 9월 17일 출시된 7.2.9 이상 업데이트와 저장·초대 설정 점검 방법을 설명합니다.

Telegram 공식 개인 대화의 First Impression.pdf 첨부를 크롭하고 파일명과 크기 및 다운로드를 외부 한국어로 주석한 화면
공식 제품 화면의 PDF 첨부 크롭에 외부 한글 주석을 붙였다. 제품 기능 예시이며 자동 저장 동작이나 공격 실행을 보여주는 화면은 아니다. 아래 상세 화면은 첨부의 위치와 각 표시값을 함께 해석한다. 출처: Telegram Desktop

텔레그램 데스크톱에서 링크를 여는 동작이 컴퓨터의 파일을 다른 대화방으로 보내는 경로로 이어질 수 있었다. 보안 연구자 BeakSec가 10월 3일 공개하고 7일 갱신한 분석은 Windows에서 이 연결을 실증했다. 대상은 Telegram Desktop 7.2.8까지이며, 수정판 7.2.9는 이미 9월 17일 출시됐다.

사용자는 먼저 데스크톱 앱의 버전을 확인하고 7.2.9 이상으로 업데이트해야 한다. 자동 다운로드를 끄거나 로컬 암호를 설정하는 조치는 노출을 줄이지만 업데이트를 대신하지 못한다. 첨부파일을 직접 실행하지 않아도 파일의 자동 저장과 브라우저에서 돌아온 링크 처리가 맞물리면 이 경로가 열렸다.

공식 제품 화면의 PDF 첨부 크롭에 외부 한글 주석을 붙였다. 제품 기능 예시이며 자동 저장 동작이나 공격 실행을 보여주는 화면은 아니다. 아래 상세 화면은 첨부의 위치와 각 표시값을 함께 해석한다.

그룹에서 받은 파일은 열지 않아도 저장될 수 있다

원문이 분석한 기본 설정에서는 그룹에서 받은 8 MiB 이하 파일이 자동 다운로드 대상이었다. Windows에서는 일반 파일이 다운로드 폴더 아래의 Telegram Desktop 폴더에 발신자가 정한 이름으로 저장됐다. 같은 이름의 파일이 이미 있으면 이름이 달라질 수 있고, 저장 위치를 바꾼 사용자도 있으므로 모든 컴퓨터에서 경로가 같다고 볼 수는 없다. 스티커나 GIF처럼 내부 캐시에 들어가는 자료와 일반 첨부파일도 구분해야 한다.

연구자의 실증에서는 피해자가 공격자의 슈퍼그룹을 열었을 때 작은 지시 파일들이 저장됐다. 이 파일은 악성 실행 프로그램이 아니라, 어디로 어떤 로컬 파일을 보낼지 적은 텍스트였다. 방송용 채널에서는 기본 자동 다운로드가 꺼져 있었다는 점도 원문에 명시돼 있다. 그룹과 채널을 같은 조건으로 묶어 설명하면 공격이 성립하는 범위를 놓친다.

공식 제품 화면의 개인 대화에 PDF가 첨부돼 있다. 파일명·크기·다운로드 버튼을 읽는 원문 기반 한글 주석이다.

텔레그램 공식 데스크톱 개인 대화의 PDF 첨부 원본과 파일명·크기·다운로드 버튼의 한국어 주석
출처: Telegram Desktop

브라우저를 거쳐 돌아온 링크가 다른 명령이 됐다

텔레그램 전용 링크인 tg 링크를 외부에서 열면 운영체제가 데스크톱 앱을 실행한다. 앱이 이미 켜져 있으면 새로 뜬 프로세스는 기존 프로세스에 링크를 넘기고 종료한다. 두 프로세스가 같은 컴퓨터에서 정보를 주고받는 통로를 IPC라고 한다. 이때 링크를 텍스트로 바꾸는 과정에서 명령 구분자인 세미콜론을 안전하게 처리하지 않았다. 링크 안의 문자가 기존 프로세스에서는 추가 명령의 경계로 읽힐 수 있었다.

이 오류만으로 컴퓨터의 모든 명령을 실행한 것은 아니다. 여기에 앱 내부의 오래된 파일 전송 기능이 연결됐다. interpret라는 내부 경로는 원래 개발자가 새 버전 파일을 채널에 올릴 때 쓰던 도구였다. 지시 파일을 읽고 지정된 파일을 채널이나 슈퍼그룹으로 보내면서 요청자의 권한과 전송 확인을 충분히 검사하지 않았다. 외부 링크에서 그 기능까지 도달하면서 로컬 파일 읽기와 외부 전송이 가능해졌다.

공격 링크는 브라우저를 거쳐야 했다. 텔레그램 대화 안에서 tg 링크를 직접 클릭하면 앱 내부에서 처리해 이 IPC 경로에 들어가지 않는다. 원문의 시나리오는 평범한 HTTPS 링크를 브라우저에서 연 뒤, 공격자의 서버가 조작된 tg 링크로 돌려보내는 방식이었다. 브라우저와 기존 허용 설정에 따라 앱 열기 확인창이 나타날 수 있다. 따라서 링크 한 번이라는 설명을 아무 링크나 누르면 확인 없이 탈취된다는 뜻으로 읽어서는 안 된다.

원문 실증의 연결 구조를 재구성했다. 앱 실행 중, 지시 파일의 자동 저장, 브라우저 경유가 각각 필요한 조건이다.

그룹 첨부 자동 저장과 브라우저 링크 입력이 실행 중인 앱에 합류하고 내부 전송으로 이어지는 실측 경계 화살표
출처: BeakSec

2단계 인증과 저장된 로그인 보호는 다르다

텔레그램 데스크톱은 로컬 데이터를 암호화한다. 그러나 로컬 암호를 설정하지 않으면 데이터 암호화 키를 여는 데 필요한 정보가 저장 파일에 함께 남는다. 연구자는 로그인 권한과 키, 데이터 인덱스에 해당하는 파일을 가져와 별도 환경에서 피해자의 세션을 열었다. 세션은 이미 로그인한 상태를 서버가 알아보는 정보다. 암호화 파일이라는 이름만으로 복사 뒤 재사용까지 막힌다고 판단할 수 없다.

로그인 2단계 인증은 새로 로그인할 때 추가 암호를 요구한다. 이번 분석처럼 이미 발급된 세션 정보를 가져오는 문제는 보호 대상이 다르다. 강한 로컬 암호는 훔친 세션 파일의 재사용을 어렵게 하지만 파일 유출 자체를 막지는 않는다. 다른 로컬 파일을 읽어 보내는 경로까지 없애려면 패치가 필요하다. 데이터 암호화, 새 로그인 확인, 기존 세션 종료는 각각 별도의 조치다.

이번 파일 전송 경로에 대한 조치와 로그인 보호를 구분했다.

업데이트는 취약 경로를 닫고 저장 확인과 그룹 초대 제한은 노출을 줄이며 로컬 암호와 2단계 인증은 서로 다른 대상을 보호하는 비교표
출처: BeakSec · Telegram FAQ

버전 확인 뒤 저장 방식과 초대 범위를 바꾼다

설정에서 앱 버전을 확인하고 업데이트를 적용한 뒤 재시작한다. 공식 다운로드 페이지에서 받는 경우에도 설치 뒤 표시된 버전이 7.2.9 이상인지 확인한다. 수정 커밋은 9월 16일에 들어갔고 실제 릴리스는 다음 날 공개됐다. 릴리스 설명에는 렌더링 수정만 적혀 있지만, 해당 커밋은 내부 interpret 기능을 제거하고 IPC 구분 문자를 안전하게 주고받도록 바꿨다.

다음으로 고급 설정에서 그룹의 미디어 자동 다운로드 항목과 다운로드 경로를 점검한다. 파일마다 저장 위치를 묻는 옵션을 켜면 원문 시나리오의 지시 파일이 자동 저장되는 단계를 막을 수 있다. 개인정보 및 보안에서는 그룹에 나를 추가할 수 있는 사람을 연락처로 제한하고 예외 목록도 살핀다. 익숙하지 않은 그룹에서 규칙이나 안내로 제시한 링크라도 브라우저가 앱을 열겠다고 물으면 바로 허용하지 않는다.

로컬 암호는 추측하기 어려운 것으로 설정하고 자동 잠금도 함께 사용한다. 로그인 2단계 인증도 유지한다. 의심스러운 링크를 열었거나 모르는 접속이 보인다면 설정의 기기 또는 활성 세션 목록에서 낯선 세션을 종료한다. 업데이트를 했다는 사실만으로 이미 유출됐을 수 있는 파일과 로그인 상태가 회수되는 것은 아니다.

개별 기능만 보면 파일 저장과 링크 열기는 평범한 편의 기능이다. 이번에는 자동 저장된 텍스트가 개발자용 전송 도구의 지시 파일이 될 수 있었고, 링크를 기존 프로세스에 넘기는 통로가 그 도구에 닿았다. 패치는 구분 문자 처리와 오래된 기능 제거를 함께 바꿔 이 연결을 끊었다.

출처: BeakSec의 Telegram Desktop 취약점 분석 · 수정 커밋 · 7.2.9 릴리스 · Telegram FAQ