歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

BlueBorne 藍牙破綻漏洞bug深度研究和PoC

來源:本站整理 作者:佚名 時間:2017-09-29 TAG: 我要投稿

前些天,armis爆出了一系列藍牙的破綻,無打仗無感知接收體系的才能有點可駭,并且基本上影響一切的藍牙裝備,迫害不可估量,能夠看這里(https://www.armis.com/blueborne/  )來懂得一下它的逆天才能:只需手機開啟了藍牙,就能夠被長途節制。如今手機這么多,應用這個破綻寫出蠕蟲化的對象,那末能夠又是一個手機版的低配wannacry了。咱們360Vulpecker Team在懂得到這些相干信息后,疾速停止了跟進闡發。 armis給出了他們的whitepaper,對藍牙架構和這幾個破綻的闡發能夠說異常過細了,先膜一發。不外他們沒有給出這些破綻的PoC或者是exp,只給了一個針對Android的“BlueBorne檢測app",然則逆向這個發明僅僅是檢測了體系的補釘日期。因而我來拾一波牙慧,把這幾個破綻再闡發一下,而后把poc編寫出來:
* CVE-2017-1000250 Linux bluetoothd過程信息泄漏
* CVE-2017-1000251 Linux 內核棧溢出
* CVE-2017-0785 Android com.android.bluetooth過程信息泄漏
* CVE-2017-0781 Android com.android.bluetooth過程堆溢出
* CVE-2017-0782 Android com.android.bluetooth過程堆溢出
以上PoC代碼均在
https://github.com/marsyy/littl_tools/tree/master/bluetooth
因為也是因為這幾個破綻才從零開端搞藍牙,以是應當有些闡發不到位的處所,還請各路大牛示正。
0x01 藍牙架構及代碼散布
這里起首應當祭出armis的paper里的圖:

圖上把藍牙的各個條理干系描寫得很過細,不外咱們這里臨時只需要關懷這么幾層:HCI,L2CAP,BNEP,SDP。BNEP和SDP是比擬下層的辦事,HCI在最底層,間接和藍牙裝備打交道。而承載在藍牙辦事和底層裝備之間的橋梁,也便是L2CAP層了。每一層都有它協定規定的數據組織布局,一切層的數據包組合在一起,便是一個完備的藍牙包(一個SDP包為例):

固然協定規定的架構是圖上說的那樣,然則具體實現是有分歧的,Linux用的BlueZ,而如今的Android用的BlueDroid,也就針對這兩種架構說一說代碼的具體散布。
BlueZ
在Linux里,用的是BlueZ架構,由bluetoothd來供給BNEP,SDP這些比擬下層的辦事,而L2CAP層則是放在內核外面。對付BlueZ咱們對SDP和L2CAP挨個闡發。
1, 實現SDP辦事的代碼在代碼目次的/src/sdp,此中sdp-client.c是它的客戶端,sdp-server.c是它的辦事端。咱們要闡發的破綻都是長途的破綻,以是成績是出在辦事端外面,咱們重點存眷辦事端。而辦事端最焦點的代碼,應當是它對接遭到的數據包的處置的過程,這個過程由sdp-request.c來實現。當L2CAP層有SDP數據后,會觸發sdp-server.c的io_session_event函數,來獲得這個數據包,交由sdp-request.c的handle_request函數處置(怎樣處置的,后續破綻闡發的時刻再講):
static gboolean io_session_event(GIOChannel *chan, GIOCondition cond, gpointer data)
{
    ...
    len = recv(sk, &hdr, sizeof(sdp_pdu_hdr_t), MSG_PEEK); //獲得SDP的頭部數據,得到SDP數據巨細
    if (len int) len sizeof(sdp_pdu_hdr_t)) {
        sdp_svcdb_collect_all(sk);
        return FALSE;
    }
 
    size = sizeof(sdp_pdu_hdr_t) + ntohs(hdr.plen);
    buf = malloc(size);
    if (!buf)
        return TRUE;
 
    len = recv(sk, buf, size, 0);  //得到完備數據包
    ...
    handle_request(sk, buf, len);
 
    return TRUE;
}
2, L2CAP層的代碼在內核里,這里我以Linux 4.2.8這份代碼為例。l2cap層重要由 /net/bluetooth/l2capcore.c和/net/bluetooth/l2cap_sock.c來實現。l2cap_core.c實現了L2CAP協定的重要內容,l2cap_sock.c經由過程注冊sock協定的方法供給了這一層針對userspace的接口。異樣的咱們關懷一個L2CAP對接遭到數據包后的處置過程,L2CAP的數據是由HCI層傳曩昔的,在hci_core.c的hci_rx_work函數里
static void hci_rx_work(struct work_struct *work)
{
    
    while ((skb = skb_dequeue(&hdev->rx_q))) {
        /* Send copy to monitor */
        hci_send_to_monitor(hdev, skb);
 
        ...
        switch (bt_cb(skb)->pkt_type) {
        case HCI_EVENT_PKT:
            BT_DBG("%s Event packet", hdev->name);
            hci_event_packet(hdev, skb);
            break;
 
        case HCI_ACLDATA_PKT:
            BT_DBG("%s ACL data packet", hdev->name);
            hci_acldata_packet(hdev, skb);

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  下一頁

【聲明】:黑吧安全網(http://www.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视