Отслеживание Bluetooth-устройств: эксперимент и выводы

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прочитав статью "Китай хочет запретить гражданам использовать Wi-Fi и Bluetooth", задумался о том, как можно различными способами использовать включенные Bluetooth-устройства, не подключаясь к ним (хотя и сама статья посвящена распространению нелегального контента). По сути, любое Bluetooth устройство — это небольшой маячок, который постоянно сообщает о себе миру. И если при поиске знакомых Wi-Fi-сетей устройства уже научились предоставлять случайный поддельный MAC-адрес, то, насколько мне известно, для Bluetooth этого пока нет (поправьте, если ошибаюсь).

Подобное поведение Bluetooth-устройств может быть использовано как в коммерческих целях (например, считать постоянных клиентов в магазине), так и в иных (например, для трекинга и слежения за человеком).

Исключительно в формате эксперимента был написан небольшой алгоритм в Automate, который каждые 15 секунд сканирует Bluetooth-устройства и сохраняет в лог имена, адреса и локацию:

Flow из Automate
Flow из Automate

Пустой файл необходимо заранее создать на устройстве (этот алгоритм не проверяет наличие файла и не создает новый — скорость эксперимента была важнее оптимизации).

Получаем файл примерно такого вида:

Полученный лог с устройствами, адресами и локацией
Полученный лог с устройствами, адресами и локацией

Подготовим файл для дальнейшего анализа, распарсив на столбцы:

import pandas as pd
import csv

# Исходный файл
input_file = "btlog.txt"

# Файл, куда будут записаны данные
output_file = "formatted_file.csv"

with open(input_file, 'r', encoding='utf-8') as inp, open(output_file, 'w', newline='', encoding='utf-8') as out:
    writer = csv.writer(out)
    writer.writerow(["device name", "device address", "advertiser", "location", "datetime"])
    for row in csv.reader(inp, delimiter=';'):
        device_names = row[0].split(", ")
        device_addresses = row[1].split(", ")
        advertisers = row[2].split(", ")
        location = f"{row[3]}, {row[4]}"
        datetime = row[5]
        
        min_len = min(len(device_names), len(device_addresses), len(advertisers))
        
        for i in range(min_len):
            writer.writerow([device_names[i], device_addresses[i], advertisers[i], location, datetime])

Получаем уже более стройную таблицу следующего вида

Нормализованные данные
Нормализованные данные

Теперь нужен инструмент, который позволит выбрать устройство из списка и покажет на карте, где устройство было найдено.

Открываем Google Colab, добавляем CSV-файл в каталог, пишем сам инструмент.

Импорт библиотек:

!pip install pandas folium ipywidgets

import pandas as pd
import folium
from ipywidgets import interact

Подготовка данных из таблицы и форматирование значений:

df = pd.read_csv('formatted_file.csv', sep=',')

df['location'] = df['location'].apply(lambda x: [float(i) for i in x.split(',')])
df['datetime'] = pd.to_datetime(df['datetime'])
df['device address'] = df['device address'].str.strip()  # удаление пробелов в начале и конце строки
df['device name'] = df['device name'].str.strip()  # удаление пробелов в начале и конце строки
df['frequency'] = df.groupby('device address')['device address'].transform('count')
df = df.sort_values(by='frequency', ascending=False)

# Создание нового столбца 'device_info', объединяющего 'device name' и 'device address' для свитка с выбором устрйоства
df['device_info'] = df['device name'].fillna('unknown') + ' - ' + df['device address']

Делаем выпадающий список с выбором устройства:

@interact
def search_device(device=list(df['device_info'].unique())):
    return df[df['device_info'] == device]

Визуализация данных на карте:

def visualize_on_map(device_info):
    device_data = df[df['device_info'] == device_info]
    m = folium.Map(location=device_data['location'].iloc[0], zoom_start=13)

    for _, row in device_data.iterrows():
        folium.Marker(
            location=row['location'], 
            popup=folium.Popup('Дата: ' + str(row['datetime']), max_width=300)
        ).add_to(m)

    return m

@interact
def interact_map(device=list(df['device_info'].unique())):
    return visualize_on_map(device)

В результате получаем выпадающий список. Выбрав из него соответствующее устройство, видим на карте, где его встречали, а при нажатии на точку видим дату и время:

Выбран Flipper для примера, так как это мое же устройство
Выбран Flipper для примера, так как это мое же устройство

По данным есть некоторые погрешности. Например, едва ли за мной километр ходил человек с 60-дюймовым включенным телевизором, а я этого не заметил. Скорее всего, не успела обновиться локация. Телефоны редко сообщают о себе, а вот часы, наушники и прочие устройства — постоянно.

Все не более чем proof of concept для проведения самого экспримента.

По результатам этого эксперимента становится очевидно, что мы часто беспечно раскрываем информацию о своем местоположении и движениях. Мы невольно регистрируем свое присутствие, оставляя включенным Bluetooth на смартфоне. Этот эксперимент показывает, что по собранным данным можно узнать, где и с какими людьми вы чаще всего пересекаетесь, даже не зная об этом (не замечая их в толпе, в транспорте или в торговом центре), а также — насколько легко определить ваше присутствие в конкретном месте (при наличии там сканнера Bluetooth-устройств и известном MAC-адресе одного из ваших гаджетов).

С точки зрения информационной безопасности это может быть риском. Чтобы уменьшить его, рекомендуется выключать Bluetooth, когда он не используется.

Систему можно развивать, усложнять, делать сеть из Bluetooth-устройств с отслеживанием в конкретных локациях и т.д. Варианты зависят от поставленных целей.

Источник: https://habr.com/ru/articles/747484/


Интересные статьи

Интересные статьи

Разработка собственной Kubernetes-платформы — большой и сложный проект со множеством взаимодействующих компонентов. В процессе неизбежно сталкиваешься с различными трудностями. Иногда их даже соз...
В этой статье я расскажу о результатах эксперимента контент-маркетинга здесь, и почему это один из самых рентабельный каналов привлечения клиентов для b2b по моему мнению
Такие приложения, как Snapchat, предлагают удивительное разнообразие фильтров для лиц и объективов, которые позволяют накладывать интересные эффекты на фотографии и видео...
Это четвертая и финальная часть из серии моих публикаций, посвященных вопросу ввоза обедненного гексафторида урана (ОГФУ) из Европы в Россию. Первая посвящена технологиям обогащения у...
А/Б-тестирование — мощный способ проверки интерфейсов перед публикацией на всю аудиторию. Я решил рассказать, из чего этот инструмент состоит, какие у него особенности логирования, как составляют...