Introduction
Browser Extension์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๊ณ ๋ ํ์ฅํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณต๋๋ ๊ธฐ๋ฅ์ ๋๋ค. Chrome, Safari, Firefox, Edge ๋ฑ ๋ฉ์ด์ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ์ง์ํ๊ณ ์์ผ๋ฉฐ Chrome์ ๊ธฐ๋ฐ์ผ๋กํ ๋ธ๋ผ์ฐ์ (Brave, Whale ๋ฑ) ๋ํ ๋์ผํ๊ฒ Extension์ ์ง์ํฉ๋๋ค.
์ด ๋ฌธ์๋ ์ด๋ฌํ Browser Extension์ ๋ํด ํ ์คํ ํ๊ณ ๋ณด์์ ์ธ ๋ฌธ์ ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํฉ๋๋ค.
Structure
Chrome/Firefox Extension
Chrome๊ณผ Firefox๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ Extension ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. ๊ทธ๋์ ์ํธ ํธํ ๊ฐ๋ฅํ Extension๋ค์ด ์กด์ฌํฉ๋๋ค. ๋ค๋ง ์ ์ ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ์ ๋ฐ๋ผ ํ์ฌ๋ ์ฝ๊ฐ ์์ดํ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ ํธํ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
Safari App Extension
Safari app extension์ Chrome, Firefox์์ ์ฌ์ฉํ๋ Web Extension๊ณผ ๋ค๋ฅด๊ฒ Swift ์ฝ๋๋ก ๋น๋๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ์ค์ ๋ด๋ถ ๊ตฌ์ฑ์ ๋ง์ด ๋ค๋ฅด์ง๋ง ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ผํ๊ฒ DOM ๋ด๋ถ์์ ์ผ๋ถ Javascript์ HTML๋ก ์ปจํธ๋กคํ๊ธฐ ๋๋ฌธ์ ์๋ ํ ์คํ ๋ฐฉ๋ฒ์ชฝ์์ ๋์ผํ๊ฒ ํ์ธํด๋ณด์ค ์ ์์ต๋๋ค.
Safari Web Extension
Safari Web Extension์ Chrome/Firefox์์ ์ฌ์ฉํ๋ Web Extension ๊ณผ ๋์ผํ ํํ์ Extension์ ๋๋ค. App Extension๊ณผ Web Extension์ ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ์ ์ค์น ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
- App Extension: AppStore๋ฅผ ํตํด์๋ง ์ค์น
- Web Extension: Chrome๊ณผ ๋์ผํ๊ฒ ํ์ผ ๊ธฐ๋ฐ ์ค์น
API Documents
- Chrome: https://developer.chrome.com/docs/extensions/reference/
- Firefox: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions
- Safari
Hack Mechanism
๊ฐ ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ด๋ถ์ ์ธ ๋์ ๋ฐฉ์์ ๋ค๋ฅด์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ์ํํ๋ ๋ฒ์๋ ๋น์ทํ๊ธฐ ๋๋ฌธ์ ์ ์ฌํ ํํ๋ก ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ต์คํ ์ ์ ํ ์คํธํ๊ณ ๋ณด์์ ์ธ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
Code audit
๋ธ๋ผ์ฐ์ ์ต์คํ ์ ์ ZIP ํ์ผ์ด ๋๋ฌธ์ ๋ค์ด๋ก๋ ํ ์์ถ์ ํ์ด ์์ค์ฝ๋์ ๋ฆฌ์์ค ๋ฑ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ค๋ง ๊ฐ Store์์๋ ์ง์ ํ์ผ์ ์ ๊ณตํด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ํธ๋ฆญ์ผ๋ก ํ์ผ์ ์ฐพ์์ผํฉ๋๋ค.
Find source code
ํฌ๋กฌ ์ต์คํ ์ ์ ์ค์น ์ ์๋ ๊ฒฝ๋ก์ ์ ์ฅ๋ฉ๋๋ค.
- 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์ ํค ๊ฐ์ผ๋ก ํด๋๊ฐ ์กด์ฌํฉ๋๋ค.
ll ~/Library/Application\ Support/Google/Chrome/Default/Extensions
# 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 7 9 00:53 phbjaiacjbplfmapmlljdoacomhbpfoe
extension์ ํค ๊ฐ์ ํฌ๋กฌ์ ํ์ฅ ํ๋ก๊ทธ๋จ ํ์ด์ง์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
ํ์ผ์ ์ฐพ์๋ค๋ฉด ๋ถ์ํ ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌํด์์ ์์ ์ ์งํํ๋ฉด ๋ฉ๋๋ค.
cp -r ~/Library/Application\ Support/Google/Chrome/Default/Extensions/phbjaiacjbplfmapmlljdoacomhbpfoe .
Manifest
Browser extension์ ๋๋ถ๋ถ์ policy์ permission์ manifest.json ํ์ผ์ ๋ช ์ํฉ๋๋ค. ํด๋น ํ์ผ์ ์ฒดํฌํ์ฌ ํ์ฉํ๊ณ ์๋ ์ ์ฑ ์ ํ์ ํ๊ณ , ์๋ชป ์ฌ์ฉํ๋ ์ค์ ๋ค์ด ์๋์ง ์ฒดํฌํฉ๋๋ค.
{
"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"
}
*๊ฐ ํผ๋ฏธ์ ์ https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
Source code
์ต์คํ ์ ๋๋ ํ ๋ฆฌ ๋ด๋ถ์ ์๋ ์์ค์ฝ๋๋ ์ค์ ๊ตฌ๋์ ์ฌ์ฉ๋๋ ์ฝ๋๋ค์ ๋๋ค. popup.html ๊ฐ์ด ํ์ด์ง๋ฅผ ํํํ๊ธฐ ์ํ markup ๋ถํฐ ์ค์ ๋์์ ๋ด์ js ํ์ผ๋ค์ด ์กด์ฌํฉ๋๋ค. ํด๋น ์ฝ๋๋ค์ ์ดํผ๋ฉด์ ์ค์ํ ๊ฐ(secret, key ๋ฑ)์ด ๋ ธ์ถ๋์๋์ง, ์ธ๋ถ๋ก ๋ถํฐ ๋ฐ์ ์ ์๋ Input ๋ค์ด ์๋์ง ์ฒดํฌํฉ๋๋ค.
์ฃผ๋ก ๋ด์ผํ ๋ถ๋ถ์ ์๋์ ๊ฐ์ต๋๋ค.
- postMessage
- SSE
- webSocket
- wasm
- API Call (ajax, xmlhttprequest, etc..)
- localStorage / sessionStorage
Live audit
Test with devtools
์ต์คํ ์ ์ ์น ํ์ด์ง์ ๋ค๋ฅธ ๋ณ๋์ DOM์์ ๋์ํฉ๋๋ค. ์ผ๋ฐ ์น ํ์ด์ง๋ผ๋ฉด DevTools๋ฅผ ์ด์ด ์ฒดํฌํ ์ ์์ง๋ง ์ต์คํ ์ ์ ์ฝ๋์ ๋ฐ๋ผ ๋ทฐ๋ฅผ ์ ๊ณตํด์ฃผ์ง ์๊ฑฐ๋ ๋ทฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ด๋ ค์ธ ์๋ ์์ต๋๋ค. ์ด๋ด ๋ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก DOM ์์ญ์ ์ด ์ ์์ต๋๋ค.
์ต์ > ํ์ฅ ๊ธฐ๋ฅ > ๋์ ํ์ฅ ๊ธฐ๋ฅ > ๋ทฐ ๊ฒ์ฌ
๋ทฐ ๊ฒ์ฌ๋ฅผ ํตํด ํ์ด์ง๋ฅผ ๋ก๋ํ๋ค๋ฉด background ์ ๊ฐ js ๋ฑ์ด ์ด๋ฏธ ์ฌ๋ผ์จ ์ํ์ด๊ธฐ ๋๋ฌธ์ devtools์ console ์ด๋ debugger๋ฅผ ํตํด์ ํ ์คํธํด๋ณผ ์ ์์ต๋๋ค. ํจ์ ์ ๋ณด๋ ์ ๋ถ์์ค์ธ ์์ค์ฝ๋์์ cat๊ณผ grep ๋ฑ์ผ๋ก ๊ฑธ๋ฌ๋ด๋ฉด ์ฐพ์๋ผ ์ ์์ต๋๋ค.
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))
chrome-extension
๋ง์ฝ ์ต์คํ ์ ์ด popup.html ๋ฑ view๋ฅผ ์ ๊ณตํ๋ค๋ฉด ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด chrome-extension:// ๋ฅผ ํตํด์ ์ง์ ์ ๊ทผํ์ฌ ํ ์คํธํ ์๋ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ์ค์ ๋์์ ๋์ผ๋ก ๋ณด๋ฉด์ ํ ์คํธํ ์ ์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ํธ๋ฆฌํฉ๋๋ค. ์ฐธ๊ณ ๋ก chrome-extension:// ํ๋กํ ์ฝ ๋ํ popup ๋ฑ ํ์ด์ง์์ query parse๋ฅผ ํตํด ๊ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ํ ์คํ ํฌ์ธํธ๊ฐ ๋๊ธฐ๋ ํฉ๋๋ค.
chrome-extension://vulnapp/landing?c=};alert(45);function a(){//
User input
๋ธ๋ผ์ฐ์ ์ต์คํ ์ ์ ๊ตฌ๋ ์ DOM์ ๊ฐ์ง๋ ์น ํ์ด์ง๋ก์จ ์ผ๋ฐ ๋ธ๋ผ์ฐ์ง ์์ญ๊ณผ ๊ฒฉ๋ฆฌ๋์ด ์๊ธด ํ์ง๋ง, postMessage, SSE ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ๋ค์ ํตํด ์น ํ์ด์ง, API ๋ฑ๊ณผ ํต์ ํ๊ณ DOM ๋ด๋ถ์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์ต์คํ ์ ๋ํ ์ผ๋ฐ ์น ํ์ด์ง์ ๋์ผํ๊ฒ ์น ์ทจ์ฝ์ ์ ์ํฅ์ ๋ฐ๋๋ค๋ ์ด์ผ๊ธฐ์ ๋๋ค.
์์ค์ฝ๋ ๋ถ์์ผ๋ก ์ฐพ์๋ธ Endpoint ๋ค์ ๋ํด์ ํ ์คํธ๋ฅผ ์งํํด์ผํฉ๋๋ค.
- https://www.hahwul.com/2020/05/14/vulnerability-of-postmessage/
- https://www.hahwul.com/2016/08/29/web-hacking-html5-postmessage-api/
A major weakness
Sensitive Data Leak
์ต์คํ ์ ์ ๊ธฐ๋ฅ์ ๋ฐ๋ผ์ ๋ด๋ถ์ ์ค์ํ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ด๋ฌํ ์ ๋ณด๊ฐ postMessage ๋ฑ์ ํตํด ์ธ๋ถ์์ ํ์ทจํ ์ ์๋ค๋ฉด ์ฌ์ฉ์์ ์ค์์ ๋ณด๊ฐ ํ์ทจ๋ ์ ์๋ ์ด์๊ฐ ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ์ฅ ์์น์ ๋ํ ํ ๋ก ์ด ๋ง์๋ฐ, manifest v3 ๊ธฐ์ค์ผ๋ก ์ค์์ ๋ณด๋ session storage ์ ์ฅํ๋ ๊ฒ์ ๊ถ๊ณ ํ๊ณ ์์ต๋๋ค.
XSS
๋๋ค์ ์น ์ทจ์ฝ์ ์ด ํฌ์ธํธ๊ฐ ๋๊ฒ ์ง๋ง, ๊ทธ์ค์์๋ XSS๋ ๊ฐ์ฅ ์ค์ ์ ์ผ๋ก ๋ด์ผํ ๋ถ๋ถ์ผ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฌด๋๋ ํด๋ผ์ด์ธ๋ ๋จ์์ ๋๋ฉ์ธ ๊ธฐ๋ฐ์ ๋ฆฌ์คํฌ๊ฐ ์๋, ๊ด๋ฒ์ํ UXSS๋ Browser API๋ฅผ ํตํ ์ถ๊ฐ์ ์ธ ๊ณต๊ฒฉ๊น์ง ์ด์ด์ง ์ ์์ด์ ํ์ฅ ๊ธฐ๋ฅ์์ ์กฐ๊ธ ๋ ์ค์ํ ๋ถ๋ถ์ผ๋ก ๋ณด์ ๋๋ค.
Bypass CSP
๋ธ๋ผ์ฐ์ ํ์ฅ ๊ธฐ๋ฅ์์ CSP๋ Manifest์ ๋ช ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง CSP ์ฐํ ๋ฐฉ๋ฒ์ ํตํด์ CSP ์ ์ฑ ์ ์ฐํํ ์ ์๊ณ , XSS ์ทจ์ฝ์ ์ด ์กฐ๊ธ ๋ ๋ฆฌ์คํฌ๋ฅผ ๊ฐ์ง๋๋ฐ ์์ด์ ํฐ ๋์์ ์ค ์ ์์ต๋๋ค.
Javascript CVE
๋น์ฐํ ์น ๊ธฐ๋ฐ์ ํ์ด์ง๋ผ์ Javascript ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณต๊ฐ ์ทจ์ฝ์ ์ ์ํฅ์ ๋ฐ์ต๋๋ค. ์ ๋ฐ์ดํธ๋ฅผ ์ํด์ ํ์ฅ ๊ธฐ๋ฅ์ ํจํค์ง ์ ๋ฐ์ดํธ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์น ํ์ด์ง๋ณด๋จ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฆฐํธ์ ๋๋ค. retire.js ๋ฑ์ผ๋ก ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
API Security
ํ์ฅ ๊ธฐ๋ฅ์ ์ฐ๋๋๋ API ์๋ฒ๋ ์ฃผ์ ๋ถ์ ๋์์ด ๋ฉ๋๋ค. ๋น์ฐํ ์ฌ๊ธฐ์ ๋ณดํธ์ ์ธ ์ทจ์ฝ์ ์ ์ฐพ์ ์ ์๊ณ , ์ด์ด์ ํ์ฅ ๊ธฐ๋ฅ๊ณผ์ ์ฐ๋์ฑ๋ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํ์ฉํ๋ฉด ํ์ฅ ๊ธฐ๋ฅ ์์ฒด์๋ ์ํฅ์ ์ค ์ ์๋ ์ทจ์ฝ์ ์ ๋ง๋ค์ด๋ผ ์ ์์ต๋๋ค.
API Server ๋ด ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ์ํค๋ ์ทจ์ฝ์ ์ด ์๊ณ , ์ด ๋ฐ์ดํฐ๊ฐ ํ์ฅ ๊ธฐ๋ฅ์์ XSS๋ก ๋์ํ๋ค๋ฉด, UXSS ๋๋ Browser Extension API๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ณต๊ฒฉ๊น์ง ์ด์ด์ง ์ ์์ด ๋ฆฌ์คํฌ๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
๐ Environment
Include WASM
๋ง์ฝ WASM(Web Assembly)๊ฐ ์ ์ฉ๋ Extension์ด๋ผ๋ฉด wasm์ ๋ํ ๋ถ์์ด ์ถ๊ฐ๋ก ํ์ํ๊ฒ ๋ฉ๋๋ค. wasm ๋ถ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
์น ์ด์ ๋ธ๋ฆฌ(Web Assembly)๋ ์ด๋ป๊ฒ ๋ณด์ ์ทจ์ฝ์ ๋ถ์์ ํ ๊น์?
Inclulde SSE
SSE๊ฐ ์ ์ฉ๋ ์ต์คํ ์ ์ด๋ผ๋ฉด SSE๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ZAP, Burpsuite์์ ๋ชจ๋ ๊ฐ๋ฅํ๋ฉฐ ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
Include WebSocket
WebSocket์ด ์ ์ฉ๋ ์ต์คํ ์ ์ด๋ผ๋ฉด WebSocket๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. SSE์ ๋์ผํ๊ฒ ZAP, Burpsuite์์ ๋ชจ๋ ๊ฐ๋ฅํ๋ฉฐ ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
Articles
References
- https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Anatomy_of_a_WebExtension
- https://www.slideshare.net/OleksandrZinevych/chrome-extensions-56125231
- https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json
- https://developer.apple.com/documentation/safariservices/safari_web_extensions