WebUSB. Прошейся из браузера

a_xiw0y1ywia6qlzpm3rkfdaajo.jpeg

Разработчики хромиума постоянно пилят огромное количество классных API для разных технологий и железяк. Тут и Web Share, и работа со звуком, Bluetooth, NFC, WebOTP и много чего ещё, более-менее полный список со статусами реализации можно посмотреть здесь. Но больше всего среди них впечатляет WebUSB API, о настоящих возможностях которого я узнал совсем недавно. Оказывается, с его помощью можно не только открывать странички с подключенных устройств, но и прошивать их. Это открывает новый крутейший сценарий работы со всякой мелкой электроникой.

Пара слов про WebUSB


Главной фишкой WebUSB считается возможность использовать USB-девайсы так, чтобы они при подключении открывали какой-то заданный сайт или запускали веб-приложение — в хроме вылезает уведомление, из которого можно его открыть. Главное преимущество в том, что можно писать кроссплатформенный код, который можно запустить сразу, без каких-либо инсталляторов и траты времени на выбор нужных файлов для ОС и архитектуры. Нажал на кнопку, получил результат.

WebUSB вышел в релиз в 2017 году, а в последний год его поддержка заметно выросла, так что ещё через годик он наверняка уже не будет восприниматься как какая-то диковинка. Кстати, это не полностью продукт гугла: в разработке стандарта активно участвовала Mozilla, но пока что, как и Apple, не торопится внедрять технологию в свой браузер из-за потенциальных уязвимостей. Конечно, API глубоко протестировано и запускается (очевидно) только под https, но из-за огромной мощности и количества потенциальных векторов атаки их точку зрения можно поддержать. С другой стороны, у 70% пользователей WebUSB уже давно живёт в браузере, и о критических уязвимостях пока не слышно.

Как и в большинстве новых API, WebUSB можно явно разрешить или запретить HTTP-заголовком Feature-Policy или атрибутом allow в iframe:

  Feature-Policy: fullscreen "*"; usb "none"; payment "self" https://payment.example.com
  

К тому же, получить доступ к списку устройств можно только через функциюnavigator.usb.requestDevice(), которая огромное модальное окно — и запускается только в ответ на действие пользователя (вроде нажатия на кнопку). То есть злоумышленники не получат у вас доступ к девайсам, пока вы явно не вызовете их список и не выберете какой-нибудь вручную.

di3_nirli3znccbh_s3c0kajm2i.png

DFU


Полностью описывать механизм работы и нюансы API можно долго, и для этого есть web.dev и стандарт. Самое интересное — в firmware. Так как железку, раздающую сайт, надо ещё научить это делать, разработчики, чтобы два раза не вставать, запилили возможность прошивать её прямо из браузера — точнее, не сломали эту возможность :)
zhovner многим открыл глаза этим видео — в том числе и мне

К USB-устройству обеспечен прямой доступ, со списком интерфейсов, VID/PID и другой информацией. Данные можно считывать и записывать управляющие команды, отслеживать состояния и так далее. Что из этого следует? Что тут же найдётся сумрачный гений, который запилит удобный инструмент, утилизирующий эти возможности! Так и появился PoC webdfu, позволяющий прошивать устройства в DFU-режиме.

eip-0kumrybmqcldhvcd4agkwqw.png

DFU (Device Firmware Upgrade) — это спецификация, созданная для упрощения обновления прошивки на USB-устройствах. Она поддерживается почти на всех ОС, работает в специальных программах вроде DfuSe и в оригинальной dfu-util. Как нетрудно догадаться из названия, webdfu служит драйвером USB-DFU для хрома. Он может:

  • Загружать текущую прошивку с устройства (upload)
  • Записывать новую прошивку на устройство (download)
  • Переключать устройство в режим DFU
  • Выполнять upload/download совместимо с STM’овской DfuSe

Не может:
  • Открыть устройство, если нет прав на доступ к нему или отсутствует базовый драйвер (Windows изрядно портит этим нервы)
  • Работать с файлами форматов DfuSe
  • Загружать прошивку в формате .dfu
  • Обрабатывать ошибки записи

А теперь возьмите полминуты паузы и подумайте: то, для чего раньше нужно было качать нужные драйвера, программы и библиотеки под разные ОС и архитектуры, теперь можно делать в пару кликов из браузера, на чём угодно! Будущее уже здесь.

Потестить это чудо техники можно с любым DFU-совместимым устройством, есть готовый проект dapboot для STM32F103, там вообще ни строчки писать не нужно, только собрать.

Ссылки




На правах рекламы


Виртуальные серверы с мгновенной активацией на Linux или Windows. Сервер готов к работе через минуту после оплаты!

Присоединяйтесь к нашему чату в Telegram.

8p3vz47nluspfyc0axlkx88gdua.png

© Habrahabr.ru