Прочитав статью "Китай хочет запретить гражданам использовать 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-устройств с отслеживанием в конкретных локациях и т.д. Варианты зависят от поставленных целей.

Комментарии (15)


  1. vilgeforce
    12.07.2023 09:30

    Подозрительно знакомая карта ;-)


    1. micronull
      12.07.2023 09:30

      Это дефолтный стиль mapnik для OpenStreetMap


      1. vilgeforce
        12.07.2023 09:30

        Да я про местность изображенную скорее


        1. iamkisly
          12.07.2023 09:30

          Увидел улицу Лазаря, предположу, что Белград


  1. 3ycb
    12.07.2023 09:30

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

    Ошибаетесь. Самсунг смарт таг. Брелок для ключей. Транслирует рандомальный MAC-адрес каждые несколько минут. Хотел сделать отслеживание в Home Assistant интеграции BLE, а не тут то было.


    1. george_gDev Автор
      12.07.2023 09:30

      Еще один повод купить его - давно засматриваюсь на Samsung smart tag и на apple tag. Похоже, все же куплю, потестирую. Спасибо.


    1. makapohmgn
      12.07.2023 09:30

      А как тогда устройство связывается с меткой если её адрес каждый раз разный?)


      1. 3ycb
        12.07.2023 09:30

        А как тогда устройство связывается с меткой если её адрес каждый раз разный?

        Точно сказать не могу, но у Самсунг смарт тага есть аттрибут "Smart Tag", а далее видимо (вангую) аппликация Самсунга вычисляет может какой нибудь хэш или контрольную сумму из остальных аттрибутов и если совпало с Самсунговой какой-то внутренней информацией, то определяет, что это его таг и выдает результат. А в Home Assistent, в интеграции "Passive BLE Monitor integration" не позволяет фильтровать окружающий эфир по аттрибуту "Smart Tag", только по MAC адресу или UUID(который тоже все время меняется) Поэтому у меня с Home Assistent, не выходит каменный цветок.


        1. PlatinumKiller
          12.07.2023 09:30

          Как бы MAC вообще не важен, там если память не изменяет(давно делал приложение для одной компании) там коннект создается за счет поиска UUID и вот когда устройство ждет подтверждения пары с этим неким ключом, создается пара, а дальше оно не шлет о себе инфу вообще, а по сути мусорит эфир


          1. 3ycb
            12.07.2023 09:30

            там коннект создается за счет поиска UUID

            Только UUID тоже меняется каждые несколько минут, как и MAC. Может быть там ограниченный конечный набор их и потом они повторяются(не проверял)? Может они не случайные, а вшитые, уникальные для каждого вендора? Иначе не понимаю, как система определяет свой-чужой.


      1. Shaman_RSHU
        12.07.2023 09:30

        Здесь речь про рандомный MAC-адрес.


  1. NutsUnderline
    12.07.2023 09:30
    +1

    сразу вспоминается проект PAX counter который как раз выполняет подобный мониторинг, в виде небольшой коробочки


  1. mnnoee
    12.07.2023 09:30
    +2

    Wigle спокойно стоит в сторонке

    Там кстати есть экспорт по csv и не только блютуз устройства


  1. cathome_official
    12.07.2023 09:30

    я вижу вы владелец флиппера, и догадываюсь, что вдохновились тем, что любой флиппер можно отследить по его нику


  1. sL0n1q
    12.07.2023 09:30

    Да ребята-демократы, вам бы матчасть изучать.

    Почитайте спецификацию, хотя бы что такое RPA.

    Не смешите гусей. ))