
클릭 한 번이면 충분했다
전 세계 수억 명이 쓰는 메신저 텔레그램의 데스크톱 클라이언트(Telegram Desktop)에서 꽤 심각한 취약점이 공개됐어요. 보안 연구자가 공개한 내용의 핵심은 ‘원클릭’이에요. 공격자가 보낸 무언가를 피해자가 한 번 클릭하기만 하면 PC에 있는 파일이 공격자에게 넘어갈 수 있었어요. 그리고 이게 계정 탈취로까지 이어질 수 있었다는 거예요.
구체적인 공격 단계는 연구자의 원문에 자세히 정리돼 있으니, 보안에 관심 있다면 직접 읽어보세요. 여기서는 이 사건이 왜 무서운지, 앱을 만드는 개발자로서 뭘 배워야 하는지에 집중해볼게요.
‘원클릭’이 왜 이렇게 위험할까
보안 업계에서는 공격에 필요한 사용자 행동의 수로 위험도를 가늠하곤 해요. 아무것도 안 해도 당하는 제로클릭, 한 번만 클릭하면 당하는 원클릭, 그리고 파일을 받아서 실행하고 경고창까지 넘겨야 하는 여러 단계짜리 공격이 있죠.
원클릭이 무서운 건 메신저에서 링크를 누르는 게 너무 일상적이라서예요. 하루에도 수십 번씩 링크를 누르면서 매번 의심하는 사람은 거의 없잖아요. 게다가 텔레그램은 공개 채널과 대형 그룹이 많아서 모르는 사람한테 메시지를 받는 일이 흔해요. 공격자 입장에서는 미끼를 던질 곳이 넘쳐나는 셈이에요.
파일 유출이 어떻게 계정 탈취가 될까: tdata 이야기
“파일을 훔쳐 갔는데 왜 계정까지 넘어가?” 싶을 수 있어요. 텔레그램 데스크톱의 구조를 알면 이해가 돼요.
텔레그램 데스크톱은 로그인 세션 정보를 tdata라는 로컬 폴더에 저장해요. 이 폴더를 통째로 다른 PC에 복사하면, 비밀번호나 SMS 인증 없이 로그인된 상태로 열리는 경우가 많아요. 그래서 PC 정보를 빼가는 악성코드(인포스틸러)들이 tdata를 단골 표적으로 삼아요.
비유하자면 2단계 인증은 새로 들어오는 사람을 검사하는 경비원이에요. 그런데 이미 발급된 출입증을 복사해 가면 경비원 앞을 지나갈 필요가 없죠. 웹 개발자라면 익숙한 세션 쿠키 탈취와 똑같은 원리예요. 그래서 메신저 앱에서 ‘원하는 파일을 읽어 갈 수 있다’는 건 곧 계정 전체가 위험하다는 뜻이 될 수 있어요.
데스크톱 메신저가 자꾸 뚫리는 이유
브라우저는 웹페이지를 샌드박스라는 격리된 공간에 가둬요. 그래서 악성 페이지가 내 PC 파일을 마음대로 읽지 못하죠. 반면 네이티브 데스크톱 앱은 기본적으로 사용자 권한으로 파일 시스템에 폭넓게 접근할 수 있어요. 텔레그램 데스크톱도 C++과 Qt로 만든 네이티브 앱이에요. 공격자가 노려볼 만한 입구도 많아요. tg:// 같은 커스텀 URL 스킴, 링크 미리보기, 파일 자동 다운로드, 미디어 파서 같은 것들이죠.
텔레그램 데스크톱은 전에도 비슷한 일을 겪었어요. 2024년 윈도우 버전에서는 위험 확장자 목록에 .pyzw가 pywz로 오타가 나 있었어요. 그 탓에 영상처럼 위장한 파이썬 스크립트가 클릭 한 번에 실행될 수 있었죠. 같은 해 안드로이드 버전에서는 악성 APK를 영상처럼 위장하는 ‘EvilVideo’ 취약점도 보고됐어요. 메신저는 남이 보낸 데이터를 하루 종일 처리하는 앱이라 구조적으로 위험할 수밖에 없어요.
개발자가 배워야 할 점
첫째, 외부 입력은 메시지 본문만이 아니에요. 파일명, 확장자, MIME 타입, URL 파라미터, 링크 미리보기 메타데이터까지 전부 공격자가 조작할 수 있는 값이에요.
둘째, 블랙리스트보다 화이트리스트예요. 위험한 걸 막는 목록은 오타 하나, 빠뜨린 항목 하나로 무너져요. .pyzw 사례가 정확히 그걸 보여줬죠. 허용할 것만 정해두는 쪽이 훨씬 안전해요.
셋째, 커스텀 URL 스킴과 딥링크는 공개 API처럼 다루세요. 파일 경로를 받는다면 꼭 정규화하고, 허용된 디렉터리를 벗어나지 않는지 확인하세요.
const base = path.resolve(downloadDir);
const target = path.resolve(base, fileNameFromUser);
if (!target.startsWith(base + path.sep)) {
throw new Error('허용되지 않은 경로입니다');
}
넷째, 세션 같은 민감 정보는 OS 키체인이나 자격 증명 저장소에 두세요. 그래야 파일 하나 복사해 간다고 끝나지 않아요.
사용자로서 지금 할 일
이런 상세 분석은 보통 패치가 나온 뒤에 공개돼요. 그래도 텔레그램 데스크톱을 쓴다면 최신 버전인지 꼭 확인하세요. 설정에서 로컬 암호(Local passcode)를 걸어두면 로컬 데이터 보호에 도움이 돼요. 활성 세션 목록에 모르는 기기가 있으면 바로 종료하고, 모르는 사람이 보낸 링크와 파일은 한 번 더 의심하세요.
마무리
클릭 한 번이 계정 전체가 될 수 있어요. 그리고 그 클릭을 막는 건 사용자의 주의력이 아니라 개발자의 설계여야 해요.
여러분이 만드는 앱의 딥링크나 파일 처리 로직, 보안 관점에서 마지막으로 리뷰한 게 언제인가요?
🔗 출처: Hacker News