SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

github.dev 원클릭 GitHub OAuth 토큰 탈취 제로데이

EQST Now | 2026.06.08

NOW Briefing

Brief 1 github.dev(웹 기반 VS Code)에서 악성 스크립트가 삽입된 노트북(.ipynb) 파일이 포함된 리포지토리 링크를 한 번 클릭하는 것만으로 피해자의 GitHub OAuth 토큰을 탈취할 수 있는 제로데이가 공개됐습니다. 연구자 Ammar Askar는 2026-06-02 자신의 블로그와 PoC 저장소를 통해 사전 협의 없이 즉시 공개했습니다.
Brief 2 노트북 웹뷰가 합성한 키 이벤트를 메인 워크벤치 윈도우가 실제 사용자 입력으로 간주하면서 신뢰 경계가 무너졌고, 워크스페이스 확장이 skipPublisherTrust: true 컨텍스트로 자동 설치되는 구조입니다. 탈취된 토큰은 피해자가 접근 가능한 모든 비공개 리포지토리로 권한이 확장됩니다.
Brief 3 Microsoft는 2026-06-03 github.dev 서비스 측에 임시 확인 대화 상자를 적용하고, 같은 날 microsoft/vscode PR #319813을 머지해 키 이벤트에 isTrusted 플래그 검증을 추가했습니다. 사용 조직은 github.dev 사이트 데이터를 삭제하고 토큰 재발급과 OAuth 앱 권한 재검토를 즉시 진행해야 합니다.

github.dev 원클릭 GitHub OAuth 토큰 탈취 제로데이

■ 개요

Ammar Askar는 2026-06-02 블로그(blog.ammaraskar.com)와 PoC 저장소(ammaraskar/github-dev-token-steal-poc)를 동시에 공개하며, github.dev에서 한 번의 클릭으로 GitHub OAuth 토큰이 탈취될 수 있음을 입증했습니다. PoC는 .vscode/extensions/my-extension/README.ipynb로 구성된 리포지토리로, 피해자가 github.dev에서 해당 링크를 열기만 해도 노트북에 삽입된 스크립트가 동작하는 구조입니다. github.dev는 세션 시작 시 GitHub가 브라우저 측 VS Code 인스턴스로 OAuth 토큰을 전달하며, 이 토큰은 열람 중인 단일 리포지토리가 아닌 사용자 계정 전체 권한을 지닙니다.

이 토큰 범위를 기준으로 볼 때, 영향은 github.dev와 동일 웹뷰 스택을 사용하는 vscode.dev 웹 환경에 한정되며, VS Code 데스크톱 빌드는 영향을 받지 않는다는 것이 Microsoft 공식 입장입니다. 다만 한 번이라도 악성 링크에 노출된 계정은 모든 비공개 리포지토리 코드와 그 안에 포함된 토큰이 노출된 것으로 간주해 대응해야 합니다. GitHub 작업 토큰(gho_*)을 평문으로 전달하는 구조는 변하지 않았으므로, 위험 평가의 핵심은 "토큰이 노출됐다면 무엇이 함께 노출되는가"입니다.

공개 방식도 위험을 키웠습니다. 연구자는 공개 약 한 시간 전에야 GitHub 보안팀에 알린 뒤, 작동하는 PoC와 함께 곧바로 전체 내용을 공개했습니다. 방어 측이 패치할 시간이 거의 없었던 셈입니다. 연구자는 이렇게 서둘러 공개한 이유로, 과거 MSRC(Microsoft Security Response Center)가 자신이 보고한 VS Code 취약점을 크레딧 없이 조용히 수정한 일을 들었습니다.

■ 요약

항목 내용
식별자 github.dev VS Code Webview OAuth Token Theft(CVE 미부여)
심각도 공식 CVSS 없음 — 연구자 평가: 원클릭·광범위 권한 토큰 탈취로 실질 위험 매우 높음
취약점 유형 - 웹뷰 신뢰 경계 우회
- 합성 키 이벤트를 통한 워크벤치 명령 트리거
- skipPublisherTrust 컨텍스트 강제 적용
영향/위험 - 단일 클릭으로 피해자의 GitHub OAuth 토큰 탈취
- 토큰 범위가 사용자의 모든 비공개 리포로 확장
- 워크스페이스 확장이 skipPublisherTrust: true로 자동 설치
- VS Code 데스크톱은 비영향(Microsoft 발표)
취약 버전 github.dev / vscode.dev 웹 환경(2026-06-03 서비스 측 수정 이전)
벤더 대응 현황 2026-06-03 github.dev 임시 확인 대화 상자 적용, microsoft/vscode PR #319705(스톱갭) 및 PR #319813(완전 수정) 머지, 공식 CVE 미부여

■ 기술 분석

취약점의 핵심은 VS Code 웹뷰 격리 모델과 키 이벤트 전달 경계에 있습니다. VS Code의 노트북은 vscode-webview:// 오리진으로 격리된 iframe 안에서 렌더링되며, 동일 출처 정책이 메인 워크벤치 윈도우의 DOM 조작을 차단합니다. 단축키가 웹뷰 안에서도 정상 동작해야 하므로, 프리로드 스크립트는 keydown/keyup을 가로채 did-keydown 메시지로 메인 윈도우에 전달하는 방식입니다. 패치 이전에는 이 메시지가 사용자가 실제로 누른 키인지, 스크립트가 dispatchEvent로 합성한 키인지 구분하지 않았고, 그 빈틈 때문에 신뢰되지 않은 콘텐츠가 워크벤치의 명령 디스패처에 접근할 수 있는 통로가 열렸습니다.

연구자 PoC는 두 단계 키 합성을 사용해 확장 설치 권한 경계를 단계적으로 무너뜨립니다. 첫 단계에서는 추천 확장 알림 수락 단축키를 합성해 리포지토리에 포함된 워크스페이스 확장을 설치합니다. 이렇게 설치된 확장이 등록한 단축키가 두 번째 단계에서 다시 합성되면, 해당 단축키는 workbench.extensions.installExtensionskipPublisherTrust: true 컨텍스트로 호출하도록 정의돼 있어 외부 마켓 확장이 검증 없이 강제 설치됩니다. 최종 확장은 github.dev 세션이 보유한 OAuth 토큰을 읽어 외부로 송신합니다.

이러한 공격 경로를 끊기 위해 Microsoft의 완전 수정 패치(microsoft/vscode#319813)는 프리로드에서 키 이벤트의 isTrusted 플래그를 페이로드에 동봉하고, 메인 측 webviewElement에서 신뢰되지 않은 이벤트의 전달을 기본 차단하도록 변경했습니다. 클릭 핸들러에도 동일한 event.isTrusted 검증이 함께 추가됐습니다. 합성 KeyboardEvent는 W3C DOM 표준에 따라 isTrusted=false로 표시되며 스크립트가 이를 임의로 true로 변경할 수 없으므로, 한 줄의 검증만으로도 신뢰 경계가 회복됩니다.

/* [패치 후] pre/index.html - keydown payload에 신뢰 플래그 동봉 */
+ const data = {
+     isTrusted: e.isTrusted
+ };
+ hostMessaging.postMessage('did-keydown', data);

/* [패치 후] webviewElement.ts - 합성 이벤트 기본 차단 */
+ private shouldForwardKeyEvent(event: KeyEvent): boolean {
+     return event.isTrusted
+         || !!this._content.options.forwardUntrustedKeypressEvents;
+ }

/* [패치 전/후] 클릭 핸들러에도 동일 검증 추가 */
- if (!event?.view?.document) {
+ if (!event.isTrusted || !event?.view?.document) {

📘 INFO

Event.isTrusted 속성은 W3C DOM 표준이 보장하는 읽기 전용 플래그입니다.

스크립트가 dispatchEvent로 합성한 이벤트에서는 항상 false로 고정되므로, 합성 이벤트와 실제 사용자 입력을 구분하는 신뢰 가능한 기준점이 됩니다.

탐지 관점에서는 PoC의 확장 설치 흐름이 중요한 단서가 됩니다. PoC 리포지토리에 포함된 워크스페이스 확장의 package.json은 단축키 한 번으로 skipPublisherTrust: true 컨텍스트의 강제 확장 설치를 트리거하는 구조를 그대로 드러냅니다. 사내에서 외부 리포를 github.dev로 여는 워크플로가 존재한다면, 동일 패턴을 가진 .vscode/extensions/ 하위 파일을 헌팅 신호로 활용할 수 있습니다.

// .vscode/extensions/my-extension/package.json (PoC 발췌)
{
  "publisher": "Ammar",
  "engines": { "vscode": "^0.0.0" },
  "contributes": {
    "keybindings": [{
      "key": "ctrl+f1",
      "command": "runCommands",
      "args": {
        "commands": [{
          "command": "workbench.extensions.installExtension",
          "args": [
            "AmmarTest.hello-ammar-github",
            { "donotSync": true,
              "context": { "skipPublisherTrust": true } }
          ]
        }]
      }
    }]
  }
}
// ... 토큰 송신 확장 정의 생략 ...

■ 탐지 및 점검

✅ CHECK

서비스 측 패치 이후에도 노출 여부는 별도 확인이 필요합니다.

2026-06-03 서비스 측 패치 적용 이전 시점에 github.dev에 접속해 외부 출처 노트북을 연 적이 있는 모든 계정은 "토큰이 노출됐다"는 전제로 점검을 시작해야 합니다.

• GitHub Enterprise 감사 로그(audit_log)에서 git.clone, repo.listing, repository_visibility 관련 이벤트가 동일 OAuth 앱·짧은 시간 윈도우에 비정상적으로 폭증한 계정을 식별합니다.

• 조직 보안 로그(Settings > Personal access tokens / OAuth Apps)에서 사용자가 발급하지 않은 토큰의 활성화 이력과 권한 범위를 살핍니다.

• 웹 프록시·DLP(Data Loss Prevention) 로그에서 2026-06-02 ~ 2026-06-03 사이 github.dev 접속 중 .ipynb를 직접 여는 URL 패턴을 추출해 접근자 명단을 확보합니다.

• 외부 리포지토리 클론·열람 이력이 있는 사용자의 브라우저에서 github.dev 사이트 데이터(쿠키·로컬 스토리지)에 OAuth 토큰이 잔존하는지 대조하고 즉시 제거합니다.

• 사내 GitHub 미러·CI 시크릿 스캐너로 비공개 리포지토리의 시크릿(클라우드 키, DB 자격증명, 빌드 토큰)이 외부로 유출됐을 가능성을 함께 확인합니다.

■ 대응 방안

💡 TIP

점검에서 노출 가능성이 확인되면 토큰 자체를 새로 발급해야 합니다.

패치는 Microsoft가 서비스 측에서 적용했지만, "이미 탈취된 토큰"은 패치로 무효화되지 않습니다.

노출 의심 계정의 토큰 회전과 권한 재검토를 패치 적용과 별도로 반드시 진행해야 합니다.

• 노출 의심 사용자의 GitHub OAuth 토큰과 PAT(Personal Access Token)를 즉시 회수·재발급하고, SSH 키와 GPG 키 재발급도 함께 진행합니다.

• 조직 OAuth 앱 승인 목록을 점검해 사용자가 직접 인지하지 못한 앱과 과도한 repo 범위 권한을 회수합니다.

• 외부 출처 .ipynb 검토는 github.dev에서 직접 열지 말고, 신뢰된 환경의 데스크톱 VS Code에서 Restricted Mode로 열거나 raw 파일로 다운로드해 정적으로 분석합니다.

• 영향 시점에 노출된 비공개 리포지토리에서 발견되는 클라우드 키·데이터베이스 자격증명·서드파티 API 키를 재발급하고 사용 로그를 역추적합니다.

[참고 자료]

연구자 블로그, GitHub.dev OAuth Token Theft (Ammar Askar)

PoC 저장소, ammaraskar/github-dev-token-steal-poc

패치 PR, microsoft/vscode #319813 (webview keypress 신뢰 검증)

BleepingComputer, VS Code zero-day lets hackers steal GitHub tokens in one click

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.