VS Code 웹 편집기 버그를 통한 GitHub 토큰 탈취

Visual Studio Code의 웹 기반 버전(vscode.devgithub.dev)에서 중요한 취약점이 발견되어 공격자가 단 한 번의 클릭으로 사용자의 GitHub 인증 토큰을 탈취할 수 있게 되었습니다. 이 악용은 편집기가 노트북을 처리하고 확장 프로그램을 설치하는 방식과 관련된 일련의 버그를 이용해 퍼블리셔 신뢰 시스템을 우회하고 사용자의 세션에서 악성 코드를 실행합니다.

악용 체인: 토큰이 탈취되는 방식

이 공격은 보안 경계를 우회하고 브라우저 세션에서 민감한 자격 증명을 탈취하기 위해 다단계 프로세스에 의존합니다.

퍼블리셔 신뢰 우회

VS Code는 신뢰되지 않은 확장 프로그램 설치를 방지하기 위해 퍼블리셔 신뢰 시스템을 구현합니다. 그러나 연구자는 이 검사를 우회하는 방법을 발견했습니다:

  1. Local Workspace Extensions: 공격자는 마켓플레이스 확장과 동일한 퍼블리셔 검사를 거치지 않는 로컬 워크스페이스 확장 프로그램을 사용할 수 있습니다.
  2. CSP Bypass: 일반적으로 콘텐츠 보안 정책(CSP)은 로컬 확장 프로그램에서 JavaScript 실행을 차단하지만, 공격자는 로컬 확장 프로그램을 사용해 키보드 단축키를 install extension without checking publisher 명령에 바인딩할 수 있습니다.
  3. The Payload: 이 단축키를 트리거함으로써, 공격자는 신뢰 시스템을 완전히 우회하는 두 번째, "실제" 악성 확장 프로그램의 설치를 강제할 수 있습니다.

노트북을 통한 토큰 탈취

악성 확장 프로그램이 설치되면 편집기의 내부 상태에 접근할 수 있습니다. 이 취약점은 웹 편집기가 노트북을 처리하는 방식에 의해 더욱 증폭됩니다. 공격자가 피해자를 속여 웹뷰에서 악성 노트북을 열게 하면 교차 사이트 스크립팅(XSS)을 수행할 수 있습니다. 웹 편집기가 GitHub에 로그인된 상태이므로, 이 XSS를 이용해 세션에 저장된 GitHub 인증 토큰에 접근할 수 있습니다.

완화 및 해결 방안

Microsoft는 이 취약점을 해결하기 위해 임시 방편을 적용했습니다. 주요 변경 사항은 다음과 같습니다:

  • Notebook Confirmation: 웹 버전 VS Code에서 노트북을 열 때 확인 프롬프트를 추가하여 악성 콘텐츠의 자동 실행을 방지합니다.
  • Command Restrictions: 명령을 통해 신뢰된 퍼블리셔 검사를 건너뛰는 기능을 비활성화하여, 신뢰되지 않은 확장 프로그램을 조용히 설치하던 취약점을 차단합니다.

이러한 변경 사항은 6월 3일경 VS Code 코드베이스에 병합되었으며(PR #319705 참조).

기술 분석 및 커뮤니티 인사이트

보안 연구원과 개발자들은 이 취약점을 가능하게 만든 여러 시스템적 문제점을 강조했습니다.

웹 기반 IDE의 "원죄"

일부 커뮤니티 구성원은 github.dev의 근본적인 설계가 보안 위험이라고 주장합니다. 브라우저 기반 IDE가 광범위한 권한을 가지고 GitHub에 완전히 로그인하도록 허용함으로써 공격 표면이 크게 확대됩니다.

웹에 내장된 VSCode 편집기가 GitHub에 로그인된 것이 안타깝습니다... 이상적인 세상이라면, 브라우저 내 IDE가 해당 저장소에 대한 풀 및 푸시만 허용하는 일시적인 저장소별 권한 범위 또는 토큰으로 실행되면 좋겠으며, github.com 웹 세션은 전혀 없을 것입니다.

확장 프로그램 신뢰 수준

또 다른 중요한 실패 지점은 확장 프로그램에 부여된 신뢰 수준입니다. 현재 VS Code 확장 프로그램은 편집기 자체와 동일한 신뢰 수준으로 실행되므로, 손상된 확장 프로그램은 편집기 환경에 광범위하게 접근할 수 있습니다.

특히 위험한 점은 VSCode 확장 프로그램이 편집기와 동일한 신뢰 수준으로 실행되며, 대부분의 개발자는 권한을 검토하지 않은 채 수십 개를 설치하고 있다는 것입니다.

위험 요약

개발자에게 가장 중요한 교훈은 완전히 신뢰되지 않은 저장소에 대해 웹 기반 편집기를 사용할 때 극도로 주의해야 한다는 것입니다. 단 한 번의 클릭으로 토큰을 탈취할 수 있다는 점은 브라우저 환경에서 광범위한 세션 권한과 확장 가능한 플러그인 아키텍처를 결합했을 때의 위험성을 보여줍니다.

Sources