Galaxus сообщил о свободно доступных записях с детских камер, а The Verge — примерно о 1,1 миллиона затронутых устройств Meari. Для меня вывод прост: вход в аккаунт не защищает детскую комнату, если платформа за ним не разделяет должным образом сообщения, изображения и ключи для каждого устройства. Timmy не решает все проблемы безопасности в мире. Но критически важные секреты медиа и сопряжения Timmy не хранятся внутри облачной платформы камер.
Что, по-видимому, пошло не так в случае Meari
В открытых публикациях описывается платформа, которую разные компании использовали под своими брендами. Многие бренды продавали камеры, работавшие на общей инфраструктуре Meari/CloudEdge. Поэтому этот случай так важен: если общая платформа неверно проводит границу авторизации, под угрозой оказывается не одна слабая камера, а целый парк устройств.
Описанная проблема не сводится к слабым паролям по умолчанию. Источники сообщают о MQTT-сообщениях без достаточного контроля подписок для каждого устройства, общедоступных URL изображений, слабой обфускации изображений, а также о статических ключах или ключах, которые можно извлечь из приложения. Это сбой платформы: инфраструктура могла раскрывать данные, которые никогда не должны были быть доступны другому аккаунту.
| Риски облачных камер | Как Timmy устроен иначе |
|---|---|
| Бэкенд хранит или распространяет события с изображениями. | В Timmy нет облачного архива изображений из детской: медиа передаются вживую через WebRTC. |
| Брокер или бакет должны безошибочно авторизовывать каждое устройство. | Firestore передаёт только данные сопряжения и сигналинга; SDP/ICE шифруется до записи. |
| Статические ключи могут затронуть весь парк устройств. | При каждом сопряжении на устройствах создаётся собственный ключ, полученный с помощью P-256 ECDH. |
| Путь через ретранслятор можно ошибочно принять за доступ к медиа. | TURN пересылает зашифрованные пакеты SRTP, но не получает ключи медиа. |
Как Timmy создаёт секрет
Четырёхсимвольный код Timmy намеренно не является секретом. В коде это лишь точка встречи: на его основе приложение вычисляет meetingKey чтобы оба устройства могли найти один и тот же обмен открытыми ключами в Firestore. Приватные ключи ECDH никогда не покидают устройства.
Затем оба устройства вычисляют один и тот же общий секрет P-256 ECDH. Ключ сопряжения выводится локально. Двузначный SAS выводится из общего секрета и обоих отсортированных открытых ключей. Если обмен ключами подменён, устройства покажут разные числа — это сигнал пользователям не подтверждать сопряжение.
sequenceDiagram
participant Baby as Baby device
participant Firestore as Firestore meeting point
participant Parent as Parent device
participant Turn as TURN relay
Baby->>Baby: Generate P-256 ECDH keypair
Parent->>Parent: Generate P-256 ECDH keypair
Baby->>Firestore: Write public key only under meetingKey
Parent->>Firestore: Write public key only under meetingKey
Firestore-->>Baby: Parent public key
Firestore-->>Parent: Baby public key
Baby->>Baby: Compute sharedSecret + SAS
Parent->>Parent: Compute sharedSecret + SAS
Baby-->>Parent: Humans compare SAS on both screens
Baby->>Firestore: Write SDP/ICE encrypted with AES-256-GCM
Parent->>Firestore: Write SDP/ICE encrypted with AES-256-GCM
Baby-)Turn: WebRTC media as DTLS/SRTP packets
Turn-)Parent: Relay forwards encrypted packets
Note over Turn: TURN sees network metadata, not media keys
Упрощённая цепочка безопасности Timmy: Firestore служит для встречи устройств и передачи сигналинга; TURN — только ретранслятор; медиа остаются зашифрованными WebRTC.
Почему за медиа WebRTC нельзя незаметно наблюдать
WebRTC — это не просто «отправить видео». До начала передачи медиа устройства выполняют рукопожатие DTLS. Ключи SRTP для аудио и видео выводятся из этого защищённого транспорта. Затем медиапакеты шифруются с помощью SRTP. Сервер TURN может пересылать эти пакеты, но не получает ключи, необходимые для расшифровки аудио или видео.
Timmy добавляет ещё один слой до этого: данные сигналинга, например SDP-предложения, SDP-ответы и кандидаты ICE, шифруются AES-256-GCM до того, как попадут в Firestore. Firestore помогает устройствам согласовать соединение; там не должны храниться видео, аудио или сигналинг в открытом виде.
Чего Timmy всё же не обещает
Ни одна серьёзная радионяня не должна заявлять, что её невозможно взломать. Если телефон скомпрометирован, атаковать можно любое приложение. Вредоносная сборка приложения меняет модель рисков. Конфигурация сервера должна оставаться корректной. Более узкое заявление Timmy касается архитектуры: приложение не создаёт доступных бэкенду медиафайлов из детской и делает критически важную логику сопряжения доступной для проверки в публичном основном проекте.
Вопросы, которые стоит задать о любой детской камере
- Хранит ли производитель изображения или клипы?
- Являются ли URL медиаданных приватными, имеют ли они ограниченный срок действия и контролируется ли доступ к ним отдельно для каждого устройства?
- Создаются ли отдельные ключи для каждого устройства или сопряжения вместо статических ключей, встроенных в приложение?
- Может ли брокер доставлять сообщения только для устройства, которое действительно принадлежит вам?
- Позволяет ли сопряжение человеку заметить атаку «человек посередине»?
Посмотреть код
- ECDH и SAS в Timmy Core
- Ключ встречи, ключ документа и AES-GCM
- Правила Firestore для сеансов и сопряжения
- Документация по безопасности в основном проекте
Источники
- Записи с детских камер в свободном доступе · Galaxus
- Миллион радионянь и камер видеонаблюдения были легко доступны хакерам · The Verge
- никто не загоняет малыша в угол · Sammy Azdoufal
- Гид для родителей по этому же случаю · Baby Monitor Timmy