Прочитав статью "Китай хочет запретить гражданам использовать Wi-Fi и Bluetooth", задумался о том, как можно различными способами использовать включенные Bluetooth-устройства, не подключаясь к ним (хотя и сама статья посвящена распространению нелегального контента). По сути, любое Bluetooth устройство — это небольшой маячок, который постоянно сообщает о себе миру. И если при поиске знакомых Wi-Fi-сетей устройства уже научились предоставлять случайный поддельный MAC-адрес, то, насколько мне известно, для Bluetooth этого пока нет (поправьте, если ошибаюсь).
Подобное поведение Bluetooth-устройств может быть использовано как в коммерческих целях (например, считать постоянных клиентов в магазине), так и в иных (например, для трекинга и слежения за человеком).
Исключительно в формате эксперимента был написан небольшой алгоритм в Automate, который каждые 15 секунд сканирует Bluetooth-устройства и сохраняет в лог имена, адреса и локацию:
Пустой файл необходимо заранее создать на устройстве (этот алгоритм не проверяет наличие файла и не создает новый — скорость эксперимента была важнее оптимизации).
Получаем файл примерно такого вида:
Подготовим файл для дальнейшего анализа, распарсив на столбцы:
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)
В результате получаем выпадающий список. Выбрав из него соответствующее устройство, видим на карте, где его встречали, а при нажатии на точку видим дату и время:
По данным есть некоторые погрешности. Например, едва ли за мной километр ходил человек с 60-дюймовым включенным телевизором, а я этого не заметил. Скорее всего, не успела обновиться локация. Телефоны редко сообщают о себе, а вот часы, наушники и прочие устройства — постоянно.
Все не более чем proof of concept для проведения самого экспримента.
По результатам этого эксперимента становится очевидно, что мы часто беспечно раскрываем информацию о своем местоположении и движениях. Мы невольно регистрируем свое присутствие, оставляя включенным Bluetooth на смартфоне. Этот эксперимент показывает, что по собранным данным можно узнать, где и с какими людьми вы чаще всего пересекаетесь, даже не зная об этом (не замечая их в толпе, в транспорте или в торговом центре), а также — насколько легко определить ваше присутствие в конкретном месте (при наличии там сканнера Bluetooth-устройств и известном MAC-адресе одного из ваших гаджетов).
С точки зрения информационной безопасности это может быть риском. Чтобы уменьшить его, рекомендуется выключать Bluetooth, когда он не используется.
Систему можно развивать, усложнять, делать сеть из Bluetooth-устройств с отслеживанием в конкретных локациях и т.д. Варианты зависят от поставленных целей.
Комментарии (15)
3ycb
12.07.2023 09:30И если при поиске знакомых Wi-Fi-сетей устройства уже научились предоставлять случайный поддельный MAC-адрес, то, насколько мне известно, для Bluetooth этого пока нет (поправьте, если ошибаюсь).
Ошибаетесь. Самсунг смарт таг. Брелок для ключей. Транслирует рандомальный MAC-адрес каждые несколько минут. Хотел сделать отслеживание в Home Assistant интеграции BLE, а не тут то было.
george_gDev Автор
12.07.2023 09:30Еще один повод купить его - давно засматриваюсь на Samsung smart tag и на apple tag. Похоже, все же куплю, потестирую. Спасибо.
makapohmgn
12.07.2023 09:30А как тогда устройство связывается с меткой если её адрес каждый раз разный?)
3ycb
12.07.2023 09:30А как тогда устройство связывается с меткой если её адрес каждый раз разный?
Точно сказать не могу, но у Самсунг смарт тага есть аттрибут "Smart Tag", а далее видимо (вангую) аппликация Самсунга вычисляет может какой нибудь хэш или контрольную сумму из остальных аттрибутов и если совпало с Самсунговой какой-то внутренней информацией, то определяет, что это его таг и выдает результат. А в Home Assistent, в интеграции "Passive BLE Monitor integration" не позволяет фильтровать окружающий эфир по аттрибуту "Smart Tag", только по MAC адресу или UUID(который тоже все время меняется) Поэтому у меня с Home Assistent, не выходит каменный цветок.
PlatinumKiller
12.07.2023 09:30Как бы MAC вообще не важен, там если память не изменяет(давно делал приложение для одной компании) там коннект создается за счет поиска UUID и вот когда устройство ждет подтверждения пары с этим неким ключом, создается пара, а дальше оно не шлет о себе инфу вообще, а по сути мусорит эфир
3ycb
12.07.2023 09:30там коннект создается за счет поиска UUID
Только UUID тоже меняется каждые несколько минут, как и MAC. Может быть там ограниченный конечный набор их и потом они повторяются(не проверял)? Может они не случайные, а вшитые, уникальные для каждого вендора? Иначе не понимаю, как система определяет свой-чужой.
NutsUnderline
12.07.2023 09:30+1сразу вспоминается проект PAX counter который как раз выполняет подобный мониторинг, в виде небольшой коробочки
mnnoee
12.07.2023 09:30+2Wigle спокойно стоит в сторонке
Там кстати есть экспорт по csv и не только блютуз устройства
cathome_official
12.07.2023 09:30я вижу вы владелец флиппера, и догадываюсь, что вдохновились тем, что любой флиппер можно отследить по его нику
sL0n1q
12.07.2023 09:30Да ребята-демократы, вам бы матчасть изучать.
Почитайте спецификацию, хотя бы что такое RPA.
Не смешите гусей. ))
vilgeforce
Подозрительно знакомая карта ;-)
micronull
Это дефолтный стиль mapnik для OpenStreetMap
vilgeforce
Да я про местность изображенную скорее
iamkisly
Увидел улицу Лазаря, предположу, что Белград