【蓝牙】CVE-2018-9361 process_l2cap_cmd_L2CAP_CMD_DISC_REQ未判断缓冲区边界造成信息泄露

补丁

  • https://android.googlesource.com/platform/system/bt/+/b66fc16410ff96e9119f8eb282e67960e79075c8

当我们找不到CCB的时候,就会调用l2cu_send_peer_disc_rsp()

/*******************************************************************************
 *
 * Function         process_l2cap_cmd
 *
 * Description      This function is called when a packet is received on the
 *                  L2CAP signalling CID
 *
 * Returns          void
 *
 ******************************************************************************/
static void process_l2cap_cmd(tL2C_LCB* p_lcb, uint8_t* p, uint16_t pkt_len) {
    ...
    /* An L2CAP packet may contain multiple commands */
    while (true) {
        /* Smallest command is 4 bytes */
        p = p_next_cmd; // p此时作为指针在缓冲区游动
        if (p > (p_pkt_end - 4)) break; // 保证剩余缓冲区至少还有4字节的数据剩余
    
        ...
        switch (cmd_code) {
            ...
            case L2CAP_CMD_DISC_REQ:
                // 取了4字节,取值前未判断:p + 2 > p_pkt_end
                STREAM_TO_UINT16(lcid, p);
                STREAM_TO_UINT16(rcid, p);

                p_ccb = l2cu_find_ccb_by_cid(p_lcb, lcid);
                if (p_ccb != NULL) {
                    if (p_ccb->remote_cid == rcid) {
                        p_ccb->remote_id = id;
                        l2c_csm_execute(p_ccb, L2CEVT_L2CAP_DISCONNECT_REQ, &con_info);
                    }
                } else
                    l2cu_send_peer_disc_rsp(p_lcb, id, lcid, rcid);
                break;
        
                ...
        }
    }
}

这个函数用来发送停止连接的包

PoC

Last updated