Разбор безопасности

Уязвимость в безопасности детских камер Meari: чем Timmy отличается

Случай с Meari показывает: красивого экрана входа недостаточно. Безопасность радионяни зависит от архитектуры, авторизации и управления ключами.

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 медиаданных приватными, имеют ли они ограниченный срок действия и контролируется ли доступ к ним отдельно для каждого устройства?
  • Создаются ли отдельные ключи для каждого устройства или сопряжения вместо статических ключей, встроенных в приложение?
  • Может ли брокер доставлять сообщения только для устройства, которое действительно принадлежит вам?
  • Позволяет ли сопряжение человеку заметить атаку «человек посередине»?

Посмотреть код

Источники