Привет, друзья!
Меня зовут Сергей Лурье, и это мой первый пост на Хабре, в котором я хотел бы рассказать о результатах эксперимента по детектированию активности пользователя с помощью умной розетки Sber SBDV-00123W .
Для начала немного предыстории. Идея измерять энергопотребление ИТ-системы, подключив датчик тока в разрыв цепи питания переменного напряжения номиналом 230В, каковое используется в нашей стране, возникла примерно восемь лет назад, когда мы с коллегами в бизнес-инкубаторе «Лаборатории Касперского» тестировали спрос на решения по защите USB-портов мобильных устройств.
![Вот это я слева на скриншоте промо-ролика устройства Pure.Charger на KickStarter с Женей Черешневым (справа) Вот это я слева на скриншоте промо-ролика устройства Pure.Charger на KickStarter с Женей Черешневым (справа)](https://habrastorage.org/getpro/habr/upload_files/313/500/f56/313500f56f685b36a3728da35800f92d.png)
Мы обнаружили ряд публикаций, в которых рассказывались страшные истории о том, как злоумышленники могут получить несанкционированный доступ к вашему мобильному устройству при его подключении к USB-порту компьютера, даже если у вас не включен режим разработки мобильных приложений. Надо сказать, для некоторых моделей мобильных телефонов нам даже удалось некоторые страшные истории воспроизвести. А в качестве универсальной защиты мы придумали устройство под названием Pure.Charger, которое позволяло бы блокировать (или разрешать) соединение по шине данных USB-порта в зависимости от «репутации» конкретного USB-порта, например, в каком-либо общественном месте. Устройство оказалось дороговатым, а уникальное торговое предложение — сложноватым даже для той узкой аудитории параноиков, в которых мы целились.
Ну и ладно, подумали мы, зато у нас возник вопрос:
А можно ли измерить флуктуации тока потребления при USB-подключении?
Как оказалось — очень даже можно. Можно даже посчитать, сколько энергии тратится на отправку одного бита данных по USB-шине и сравнить с пределом Ландауэра.
![График изменения тока (в миллиамперах) при подключении мобильного телефона Google Nexus 5X к шине USB График изменения тока (в миллиамперах) при подключении мобильного телефона Google Nexus 5X к шине USB](https://habrastorage.org/getpro/habr/upload_files/02b/c5e/46d/02bc5e46d3873770dc3da4c28806f5d0.png)
Как оказалось, на тот момент никто особенно и не интересовался вопросом энергопотребления при передаче данных по шине USB, и мы даже отправили полученные результаты (3,1х10-8..1,4х10-7 Дж/бит) в виде научной статьи в журнал IEEE Transactions on Mobile Computing (которая, правда, не вышла — рецензенты отклонили наш препринт с резолюцией «Сплошная эмпирика, не хватает математической модели», с чем нельзя было не согласиться). Но главный результат мы для себя получили — можно измерять энергопотребление, подключаясь в разрыв соединения адаптера питания устройства с сетью 230 Вольт. Разумеется, исключив токи зарядки.
Спустя два года мы воспроизвели этот эксперимент, заинтересовавшись вопросом:
А можно ли оценить изменение энергопотребления при заражении компьютера, например, криптомайнерами?
Криптомайнеры в качестве объекта исследования были выбраны неслучайно — именно в 2018 году наблюдался всплеск стоимости биткойна, который тогда еще можно было майнить на обычных, не специализированных устройствах. И злоумышленники начали заражать устройства ничего не подозревающих пользователей специальным видом зловредного ПО, которое начинало майнить криптовалюты (чаще всего Monero и им подобные, но их курс был привязан к биткойну).
![Нехитрая схема экспериментального стенда для измерения энергопотребления зараженной системы, в которой использовался мультиметр (если быть точным, то два: один для измерения тока, второй — для измерения напряжения) Нехитрая схема экспериментального стенда для измерения энергопотребления зараженной системы, в которой использовался мультиметр (если быть точным, то два: один для измерения тока, второй — для измерения напряжения)](https://habrastorage.org/getpro/habr/upload_files/f6a/348/84f/f6a34884f75ce212942d5d8ac30c3743.png)
![Типичная картина загрузки процессора системы в момент майнинга Типичная картина загрузки процессора системы в момент майнинга](https://habrastorage.org/getpro/habr/upload_files/579/8ad/76c/5798ad76c7d01df4d85a3698a808a662.png)
Сопоставив данные по срабатываниям антивируса Касперского, классифицировавших зловред как криптомайнеры и данные по распределению TDP (Thermal Design Power – номинальное значение энергопотребления при 100% нагрузке, которые нужно было скрейпить отдельно, но об этом, может быть, как-нибудь в другой раз), нам удалось посчитать, какую мощность майнинга мы предотвратили (порядка 19 Гигаватт) и прикинуть, сколько электроэнергии нам удалось сэкономить для нашей планеты. Спойлер: не так много, как потратили все биткойн-майнеры в тот же год, но все же ощутимо: порядка 1000 МВт-часов, на которые в ценах того же года пришлось бы потратить около 3 миллионов рублей.
После всех этих экспериментов мы с коллегами в «Лаборатории Касперского», конечно же, не могли не заинтересоваться тем, как поведут себя ИТ-системы в разных сценариях нагрузки и, в том числе, при заражении разными видами зловредного ПО. Например, шифровальщиками, которые, если дать им волю, непременно превратят содержимое вашего жесткого диска в нечитаемые последовательности нулей и единиц. Причем без гарантии, что если вы заплатите вымогателям требуемые ими деньги (чаще всего — в биткойнах), вы сможете получить свои данные обратно. Была проведена серьезная работа в партнерстве с университетами Манчестера и Нотингема, в том числе, разработана математическая модель ИТ-систем под определенным видом нагрузки — мы учли замечания рецензентов из EEE Transactions on Mobile Computing. Но, увы, начался 2022 год и иностранные академические институты начали резко отказываться от совместных публикаций. Поэтому в 2023 году я задался уже другим вопросом:
А можно ли достичь сопоставимых результатов точности измерений, используя датчики, встроенные в бытовые умные розетки?
Поскольку я уже год как работал в Сбере, я обратился к коллегам в SberDevices, от которых узнал, что в умных розетках Sber SBDV-00123W применяются встроенные измерители напряжения и тока, к которым присоединены 24-разрядные АЦП (аналогово-цифровые преобразователи). Что, вообще говоря, сопоставимо с чувствительностью АЦП в мультиметрах, которые использовались в предыдущих экспериментах. Данные измерений передаются розеткой по Wi-Fi в облако Умного Дома, откуда их можно увидеть в соответствующем приложении. Розетка измеряет напряжение в сети чтобы в случае повышенного напряжения отключить технику и спасти ее от повреждения. В приложении Салют можно настраивать порог отключения, по умолчанию стоит 253В в соответствии с ГОСТ. Аналогично с током - можно настроить порог от 0,1 до 16 А и розетка отключит нагрузку при превышении порога. Такой настраиваемый автоматический выключатель получается.
![Фрагмент экрана приложения «Салют!» с подключенной умной розеткой, показывающей уровень напряжения и силы тока Фрагмент экрана приложения «Салют!» с подключенной умной розеткой, показывающей уровень напряжения и силы тока](https://habrastorage.org/getpro/habr/upload_files/447/faf/376/447faf37607d96b07485dcff6d7ce130.png)
По ходу эксперимента возникла одна проблема – алгоритм передачи показаний от розетки на сервер работал таким образом, чтобы минимизировать трафик и небольшие колебания тока не передавались. А нам нужно было передавать результаты измерений максимально часто. Коллеги (особенно хотел бы выразить благодарность Дмитрию Маняхину - @ditivi и Алексею Цветкову - @Tsvetik) помогли сделать модифицированную прошивку для розетки, которая отдает данные об энергопотреблении по Bluetooth LE (BLE), и мы поставили следующий эксперимент, схема которого была аналогична предыдущим, только вместо мультиметра использовалась умная розетка, транслировавшая на компьютер через BLE данные измерения тока, напряжения, и мощности.
Для сбора информации о паттернах энергопотребления было принято решение записать серии показаний, получаемых от умной розетки с темпом 2 Гц (то есть, мы пишем среднеквадратичные значения переменного тока, усредняя значения каждые 25 периодов). Можно, конечно, было бы и чаще, но в предыдущих экспериментах использовались мультиметры, выдавшие RMS-величины (RMS - Root Mean Square, среднеквадратичное значение) также раз в 0,5 с, поэтому, для сопоставления с ранее полученными результатами, мы с коллегами остановились именно на этом темпе опроса датчика.
![Схема эксперимента и скриншот IDE, в котором запущен соответствующий скрипт. Схема эксперимента и скриншот IDE, в котором запущен соответствующий скрипт.](https://habrastorage.org/getpro/habr/upload_files/d9f/47a/d56/d9f47ad563410b180dd0135d04f00fb3.png)
Профили активности, которые были выбраны для эксперимента, включали в себя: работу в офисном пакете (LibreOffice) — этот сценарий эмулировал полезную (насколько этот термин применим в данном контексте) работу офисного планктона; выгрузку файлов в облако — этот сценарий эмулировал этап эксфильтрации данных в какой-либо сложной (или не очень) кибератаке, когда злоумышленник, проникший в сеть компании, начинает активно куда-то сливать информацию; просмотр видео в YouTube и, конечно же, сценарий «ничегонеделания» (мой самый любимый, контрольная группы). Изначально я даже предпринял попытку отделить сценарий просмотра видео в YouTube от YouTube трансляции (но впоследствии убедился, что с точки зрения паттернов энергопотребления они друг от друга неотделимы).
![Вот примерно так выглядят временные ряды (паттерны) энергопотребления для разных сценариев нагрузки. Красный цвет соответствует «ничегонеделанию», сиреневый — работе в LibreOffice, синий — загрузке файлов, и между ними желтый и зеленый — две вариации просмотра видео в YouTube. Вот примерно так выглядят временные ряды (паттерны) энергопотребления для разных сценариев нагрузки. Красный цвет соответствует «ничегонеделанию», сиреневый — работе в LibreOffice, синий — загрузке файлов, и между ними желтый и зеленый — две вариации просмотра видео в YouTube.](https://habrastorage.org/getpro/habr/upload_files/83e/7e1/133/83e7e11333faae658a3fb6fa56a9b0ab.png)
С точки зрения машинного обучения, это, с одной стороны, тривиальная задача классификации, но, с другой стороны, это задача классификации временных рядов, для которой нейросетевые методы не так сильно развиты, как, например, для задач NLP, коими я занимаюсь в основное рабочее время. На выручку пришел фреймворк LightAutoML (LAMA), развиваемый коллегами в Сбере. Осталось только решить задачу оптимизации размера временного ряда, то есть, найти такое значение количества отсчетов, при котором функция потерь минимальна (а интересующая нас функция качества — в данном случае, макроусредненная F-мера, наоборот, максимальна).
![График зависимости функции потерь (красным), точности (синим), полноты (зеленым) и F-меры (черным) в зависимости от времени (по оси абсцисс) График зависимости функции потерь (красным), точности (синим), полноты (зеленым) и F-меры (черным) в зависимости от времени (по оси абсцисс)](https://habrastorage.org/getpro/habr/upload_files/b96/e18/9e7/b96e189e7ad6e900ce7db2006fe0bc0a.png)
Первый подход к снаряду оказался не очень впечатляющим: LAMA в качестве оптимальной модели выдает комбинацию из LightGBM и CatBoost, при этом достаточно много ложноположительных срабатываний, особенно из-за смешения двух близких классов YouTube. Поэтому первое очевидное решение: объединить датасеты для двух близких классов в один.
![FFT-спектр паттернов энергопотребления для разных сценариев нагрузки (нулевая гармоника, соответствующая среднему значению, отфильтрована для лучше наглядности) FFT-спектр паттернов энергопотребления для разных сценариев нагрузки (нулевая гармоника, соответствующая среднему значению, отфильтрована для лучше наглядности)](https://habrastorage.org/getpro/habr/upload_files/0eb/e9f/f27/0ebe9ff273cc0110a11431535b855acd.png)
Второе решение не так очевидно, и оно проистекает из нашего знания о природе изучаемых сигналов — в частности того, что они являются квазипериодическими. А значит, их можно преобразовать в дискретный Фурье-спектр, используя FFT-преобразование (FFT – Fast Fourier Transform). В статье, которая, к сожалению, не вышла в 2022 году, коллеги из Нотингема и Манчестера разработали математическую модель ИТ-системы и даже показали хорошее совпадение между предсказанными FFT-спектрами и теми, что наблюдались экспериментально.
![График зависимости функции потерь (красным), точности (синим), полноты (зеленым) и F-меры (черным) для FFT-представления паттернов энергопотребления График зависимости функции потерь (красным), точности (синим), полноты (зеленым) и F-меры (черным) для FFT-представления паттернов энергопотребления](https://habrastorage.org/getpro/habr/upload_files/383/f77/8b1/383f778b19a42fae7f2989e5721fd36c.png)
Объединив два подхода в один, получились куда более внятные результаты: макроусредненная F-мера классификации пользователя по паттернам энергопотребления достигла 83%, при этом точность определения, например, сценария выгрузки файлов, превысила 90%.
Выводы
Поскольку меня интересовал вопрос качества данных, которые мы можем снимать с встроенных в умную розетку датчиков, я не стал глубоко копать алгоритмы обработки данных и разрабатывать сложные нейросетевые модели, заточенные на классификацию FFT-спектров, а остановился на тех быстрых результатах, которые выдавал LAMA. И они меня воодушевили: оказывается, даже с помощью сравнительно простых ML-алгоритмов, каковыми являются GBM/CatBoost, можно определять, чем загружен компьютер пользователя, каждые 60-100 секунд, с вполне себе интересной точностью. Какое тут может быть практическое применение, сказать пока трудно: это может быть и непрерывная аутентификация, и определение профиля пользователя или выявление аномалий в его поведении, что может быть востребовано специалистами по кибербезопасности и/или HR. Но одно можно сказать точно: умная розетка Sber — это не только возможность её включения и выключения через приложение, а еще и довольно точный измерительный прибор, который можно применять для пусть и любительской, но вполне себе науки.
Отдельно стоит еще раз отметить, что для эксперимента мы использовали модифицированную прошивку для умной розетки Sber, чтобы забирать с нее данные измерений локально, а не в облако. Алгоритм сбора данных также был модифицирован чтобы получать сырые данные максимально быстро и с максимальной точностью. Для бытовых нужд такой функционал не нужен, поэтому в стандартных прошивках он отсутствует. Штатные функций защиты от повышенного напряжения и тока реализованы прямо в прошивке розетки и работают локально на ней, поэтому и передавать данные на сервер часто не требуется. Ну и связи с облаком может вообще не быть, а защитные функции должны работать, поэтому такие вещи всегда обязаны работать локально. Благодаря этому розетка надежно спасает электроприборы от повышенного тока и напряжения, даже если она не подключена к сети передачи данных.
Если есть идеи по тому, что ещё можно было бы поисследовать вместе с коллегами из SberDevices, или же просто пообщаться на тему DIY-электроники и IoT – вступайте в наше сообщество DIY-энтузиастов!