Back
Featured image of post Hack the browser extension 🚀 (웹 브라우저 확장 기능 취약점 점검하기)

Hack the browser extension 🚀 (웹 브라우저 확장 기능 취약점 점검하기)

새해 첫글입니다. 사실 12월 마지막 글로 작성하려고 했는데, 마무리를 못해서 새해 첫글이 되어버렸네요. 최근에 브라우저 확장 관련해서 기존에 알던 것 보다 조금 더 리서치할 일이 있었는데, 겸사겸사 정리할겸 분석 방법에 대해 글로 정리해봅니다.

Background knowledge

Background page

background page는 브라우저 확장 기능에서 사용하는 DOM 내부의 스크립트 영역입니다. 우선 브라우저 확장 기능은 웹 페이지와 별개의 격리된 DOM에서 동작하고, 주요 로직은 DOM 내부의 background page에서 개발자가 작성한 javascript code를 기준으로 동작하게 됩니다.

해당 영역에서는 허가된 권한 선에서 Browser Extension API를 사용할 수 있습니다.

1413 https://www.slideshare.net/OleksandrZinevych/chrome-extensions-56125231

Policy

브라우저 확장 기능은 웹 페이지와 유사한 보안 정책을 가지고 갑니다. (SOP, Frame 등등) 다만 환경 자체의 특성 탓에 적용받지 못하는 것들도 있긴 합니다. 아무튼 CORS, Frame 허용 여부 등은 확장 기능의 정보를 저장하는 Manifest.json에서 관리합니다.

Format of extension

ZIP 파일입니다.

Manifest.json

위에서 이야기드렸듯이 Manifest.json은 브라우저의 전반적인 정보를 저장하고 있는 파일입니다. (마치 안드로이드의 manifest.xml과 유사하죠)

확장 기능은 ZIP 포맷으로 이루어져 있는데, 압축을 풀게되면 최상단 디렉토리에 manifest.json 파일이 존재합니다. 확장 기능을 개발하던, 분석하던 모든 행위는 이 파일에서 시작됩니다.

Testing

오늘 글의 목적이 테스팅 방법이기 떄문에, 어떤 순서로 분석하면 좋을지 하나하나씩 풀어보도록 하겠습니다.

Download browser extension file and Extract

우선 분석을 위해선 확장 기능 파일(ZIP)이 필요하기 때문에 분석할 확장 기능의 파일을 받거나 설치합니다. store에 있는 확장의 경우 바로 파일을 받을 수가 없기 때문에 브라우저에 설치한 후 직접 디렉토리를 참조하여 찾습니다.

// Chrome 기준
MacOS: ~/Library/Application\ Support/Google/Chrome/Default/Extensions
Linux: ~/.config/google-chrome/Default/Extensions/
Windows: C:\Users\<Your_User_Name>\AppData\Local\Google\Chrome\User Data\Default\Extensions

각 브라우저별 위치는 구글링해보면 잘 나옵니다. 여기서 확장 기능의 이름은 Extension 자체의 ID 값입니다.

$ ll ~/Library/Application\ Support/Google/Chrome/Default/Extensions
total 0
drwx------@ 2 hahwul  staff    64B 12 24 00:37 Temp
drwx------@ 3 hahwul  staff    96B  9 29  2019 aapocclcgogkmnckokdopfmhonfmgoek
drwx------@ 3 hahwul  staff    96B  9 29  2019 aohghmighlieiainnegkcijnfilokake
drwx------@ 3 hahwul  staff    96B 11 14 18:39 apdfllckaahabafndbhieahigkjlhalf
drwx------@ 3 hahwul  staff    96B  7 12 00:48 baacjfeencnlcclennchejfnbcplfmbb
drwx------@ 3 hahwul  staff    96B  9 29  2019 blpcfgokakmgnkcojhhkbfbldkacnbeo
drwx------@ 3 hahwul  staff    96B 11 29 16:57 eimadpbcbfnmbkopoojfekhnkhdbieeh
drwx------@ 3 hahwul  staff    96B  9 29  2019 felcaaldnbdncclmgdcncolpebgiejap
drwx------@ 3 hahwul  staff    96B 11 29 16:57 fngmhnnpilhplaeedifhccceomclgfbg
drwx------@ 3 hahwul  staff    96B 11 24 02:03 ghbmnnjooekpmoecnnnilnnbdlolhkhi
drwx------@ 3 hahwul  staff    96B 11  2  2019 nmmhkkegccagdldgiimedpiccmgmieda
drwx------@ 4 hahwul  staff   128B 12 24 00:37 ophjlpahpchlmihnnnihgmmeilfjmjjc
drwx------@ 3 hahwul  staff    96B  7  9 00:53 phbjaiacjbplfmapmlljdoacomhbpfoe
drwx------@ 3 hahwul  staff    96B 11 14 18:39 pjkljhegncpnkpknbcohdijeoejaedia
drwx------@ 3 hahwul  staff    96B 11 24 02:03 pkedcjkdefgpdelpbcmbmeomcjbeemfm

확장 프로그램 페이지에서 확인할 수 있습니다.

1414

그럼 분석할 디렉토리로 가져옵시다.

$ cp -r ~/Library/Application\ Support/Google/Chrome/Default/Extensions/phbjaiacjbplfmapmlljdoacomhbpfoe .

Struct of browser extension

확장 기능의 크기에 따라 다르겠지만, 공통적인 구조를 가지고 있습니다. 설정 파일인 manifest.json, view 관련 부분이 있다면 popup.htmlpopup.js, 그리고 실제 background 작업을 처리하는 js 파일들입니다.

$ ll
total 168
...
-rw-------@  1 hahwul  staff   1.7K  1  2 01:32 manifest.json
-rw-------@  1 hahwul  staff   262B  1  2 01:32 popup.html
-rw-------@  1 hahwul  staff   2.1K  1  2 01:32 popup.js
-rw-------@  1 hahwul  staff   954B  1  2 01:32 setting.html
-rw-------@  1 hahwul  staff   9.8K  1  2 01:32 setting.js
-rw-------@  1 hahwul  staff   9.7K  1  2 01:32 util.js

1415

Analysis manifest.json

가장 먼저 살펴봐야할껀 manifest.json입니다. 여기엔 확장 기능의 전반적인 설정 정보와 더불어 정책적인 부분도 확인할 수 있어서 먼저 체크하고 가야합니다. background page에서 구동에 사용되는 Js는 background 에 명시되어 있고, permissions에 확장 기능의 정책이 명시되어 있습니다.

{
   "author": "MM3Tools",
   "background": {
      "scripts": [ "util.js", "ProxySwitch.js" ]
   },
   "browser_action": {
      "browser_style": true,
      "default_icon": {
         "16": "img/MM3_16off.png",
         "32": "img/MM3_32off.png"
      },
      "default_popup": "popup.html"
   },
   "commands": {
      "ProxySwitch-1": {
         "description": "1",
         "suggested_key": {
            "default": "Ctrl+Shift+1"
         }
      },
      "ProxySwitch-2": {
         "description": "2",
         "suggested_key": {
            "default": "Ctrl+Shift+2"
         }
      },
      "ProxySwitch-3": {
         "description": "3",
         "suggested_key": {
            "default": "Ctrl+Shift+3"
         }
      },
      "ProxySwitch-4": {
         "description": "4",
         "suggested_key": {
            "default": "Ctrl+Shift+4"
         }
      }
   },
   "default_locale": "en",
   "description": "__MSG_appDescription__",
   "icons": {
      "48": "img/MM3_48.png",
      "96": "img/MM3_96.png"
   },
   "key": "...snip...",
   "manifest_version": 2,
   "name": "MM3-ProxySwitch",
   "options_ui": {
      "open_in_tab": true,
      "page": "setting.html"
   },
   "permissions": [ "storage", "proxy", "browsingData", "http://*/*", "https://*/*" ],
   "short_name": "ProxySwitch",
   "update_url": "https://clients2.google.com/service/update2/crx",
   "version": "2018.332"
}

위 확장 도구를 예시로 보면 LocalStorage, Proxy 제어, Web Browsing 데이터 접근에 대한 Browser Extension API 권한이 있고, Host permission은 모든 도메인에 대해 가지고 있어 어떤 페이지에서든 이 확장 기능의 background page의 코드가 동작하게 됩니다.

퍼미션에 대한 부분은 아래 링크를 참고해주세요.

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions

Testing with devtools

브라우저 확장 기능은 별도의 DOM 영역에서 동작합니다. 보통 일반적인 웹이라면 DevTools에서 직접 DOM과 JS를 디버깅하고, 테스트할 수 있지만 확장 기능은 약간 다릅니다.

아래와 같이 옵션 > 확장 기능 > 대상 확장 기능 > 뷰 검사 에서 직접 분석할 페이지를 지정하여 DevTools를 열 수 있습니다.

1416

DevTools로는 background page에 올라온 js들과 view html들에 대해서 분석할 수 있습니다. 예를들어 보면 위 확장에 있던 util.js의 특정 함수를 보고 테스트하고 싶을 때 DevTools에 올라온 DOM에는 이미 로드되었기 때문에 바로 테스트할 수 있어집니다.

$ cat util.js
"use strict";function err(ex){if(ex!=null)console.error(ex,ex.message,chrome.runtime.lastError);else console.error(chrome.runtime.lastError);}function myParseInt(value){try{value=value.trim();if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value))return Number(value);}catch(ex){err(ex);}return NaN;}function hostM(host,isProxy){try{let hp={};let i=host.lastIndexOf(':');if(i!=-1){hp.port=host.substring(i+1);let em=null;if(hp.port.length==0)em=chrome.i18n.getMessage('notSpecified');else{let n=myParseInt(hp.port);if(isNaN(n))

1417

이러면 분석이 한층 더 쉬워집니다 😎

만약 popup.html 이외 view 페이지가 별도로 있다면 직접 접근해서 분석하셔도 됩니다. (가능하면 이게 제일 편하겠죠)

1418

Testing user intput / output (for all the things)

확장 기능은 브라우저에서 동작하는 웹 페이지이기 때문에 일반적인 웹 페이지와 동일한 점검 포인트를 가집니다. 다만 인자값이나 데이터를 파라미터 등을 통해 전달하는게 아닌, PostMessage나 Storage, DOM Read/Write를 통해서 공유/사용하게 되는데, 이 부분들이 주요 점검 포인트가 됩니다.

PostMessage의 경우 예전에 쓴 글이 있으니 참고해주세요.

아무튼 확장기능에서 데이터를 가공하고 사용하는 부분이 중점 포인트고, 일반 웹 점검에 비해서 조금 더 특별한 부분이 있다면 background page에 관한 부분 때문인데요, 확장 기능은 아까 위에서 봤듯이 manifest에 permission을 명시하고, 사용자로부터 동의받아 해당 권한을 사용합니다. 이 때 확장 기능에 내부에 XSS 등으로 js 코드를 삽입할 수 있어지는 경우엔, 일반적인 XSS와 다르게 Browser Extension API를 직접 사용할 수 있어, 권한에 따라 추가적인 리스크를 가지게 됩니다.

Testing with iframe (for xs-leak, clickjacking)

manifest.json에서 web_accessible_resources 란 부분이 있습니다. 이는 외부에서 확장 기능의 직접 접근을 어디까지 허용할 것인가에 대한 정책인데 보통은 허가할 리소스만 명시하지만 때에 따라서 아래와 같이 * 등으로 제어하는 경우가 있습니다. (물론 허용 리소스에 중요 페이지가 있으면 그것 또한 문제가 되겠죠)

{
  "web_accessible_resources" : "*"
}

이러한 경우 외부에서 아래와 같이 ID값을 통해 iframe으로 페이지 내부에 frame으로 삽입할 수 있어집니다.

<iframe src="chrome-extension://phbjaiacjbplfmapmlljdoacomhbpfoe/setting.html"></iframe>

이러한 경우, ClickJacking이나 XS-Leak 등에 노출될 수 있습니다.

A major weakness

사실 뭐 다 중요하겠지만, 몇가지 추려봤습니다.

XSS

대다수 웹 취약점이 포인트가 되겠지만, 그중에서도 XSS는 가장 중점적으로 봐야할 부분일 것 같습니다. 아무래도 클라이언드 단에서 도메인 기반의 리스크가 아닌, 광범위한 UXSS나 Browser API를 통한 추가적인 공격까지 이어질 수 있어서 확장 기능에선 조금 더 중요한 부분으로 보입니다. (마치 Public Cloud 환경에서 SSRF가 중요도를 많이 가져갔던 것과 같습니다 😁)

Bypass CSP

브라우저 확장 기능에서 CSP는 Manifest에 명시합니다. 일반적으로 알려진 CSP 우회 방법을 통해서 CSP 정책을 우회할 수 있고, XSS 취약점이 조금 더 리스크를 가지는데 있어서 큰 도움을 줄 수 있습니다.

Click Jacking

web_accessible_resources 설정에 따라서 나올 확률이 높은 부분입니다. 페이지에 중요한 기능이 있다면 공격으로 성공시키기 유리합니다. samy의 quick jack 같은 도구를 사용하면 조금 더 쉽게 PoC 구성이 가능합니다.

Javascript CVE

당연히 웹 기반의 페이지라서 Javascript 라이브러리 공개 취약점에 영향을 받습니다. 업데이트를 위해선 확장 기능의 패키지 업데이트가 필요하기 때문에 일반적으로 웹 페이지보단 업데이트가 느린편입니다. retire.js 등으로 쉽게 확인할 수 있습니다.

API server security

확장 기능에 연동되는 API 서버는 주요 분석 대상이 됩니다. 당연히 여기서 보편적인 취약점을 찾을 수 있고, 이어서 확장 기능과의 연동성도 있기 때문에 이를 활용하면 확장 기능 자체에도 영향을 줄 수 있는 취약점을 만들어낼 수 있습니다.

예를들면.. API Server 내 임의의 데이터를 저장시키는 취약점이 있고, 이 데이터가 확장 기능에서 XSS로 동작한다면, UXSS 또는 Browser Extension API를 사용할 수 있는 공격까지 이어질 수 있어 리스크를 높일 수 있습니다.

References