Сегодня в выпуске: безопасность домашних голосовых ассистентов и других умных гаджетов, безопасность приложений, использующих датчик отпечатка пальца, история создания Magisk, рассказанная автором проекта. А также: внутренности Instant Apps, введение в Android Architecture Components, по-настоящему впечатляющие трюки в Kotlin и свежая подборка библиотек.
The Insecurity of Home Digital Voice Assistants — исследование, посвященное безопасности домашнего голосового ассистента Amazon Echo, а также других подобных ассистентов (Google Home, Apple HomePod).
В нашей стране не многие слышали об этих устройствах, но они очень популярны в США. Amazon продала более пяти миллионов колонок Amazon Echo, а количество ее скиллов (возможностей, которые доступны посредством голоса) уже перевалило за десять тысяч. С помощью Amazon Echo можно совершать интернет-покупки, заказывать еду, открывать двери, включать свет и делать огромное количество других вещей. Получив контроль над этим устройством, злоумышленник может открыть дверь в квартиру (если она оборудована смарт-замком, подключенным к устройству) или выполнить от его имени заказ в интернет-магазине.
При всех своих возможностях Amazon Echo очень слабо защищены. Единственный метод аутентификации, который они используют, — это своего рода парольная фраза (по умолчанию Alexa), после произнесения которой устройство просыпается и переходит в режим прослушивания команды. Неважно, кто и каким голосом произнес эту фразу, главное, чтобы громкость была не ниже 60 dB, а система распознавания голоса ее поняла.
Более того, Amazon Echo не различает присутствие человека в помещении и реагирует на любой голос, вне зависимости от того, кому он принадлежит: человеку, телевизору, смартфону, Bluetooth-колонке или говорящей собаке. Авторы исследования провели тест и выяснили, что Amazon Echo прекрасно распознает команды, произнесенные синтезированным голосом (на разных скоростях) Bluetooth-колонкой, расположенной на расстоянии до восьми метров.
В качестве метода борьбы с уязвимостями авторы предлагают использовать технологию VSButton. Несмотря на название, она не имеет ничего общего с физическими кнопками, но позволяет регистрировать искажения электромагнитных волн человеческим телом. С помощью этого метода можно выявить движение в помещении и таким образом определить присутствие человека. При этом VSButton не отдельное устройство, а может быть интегрирована в Amazon Echo с помощью обновления программного обеспечения.
IDIoT: Securing the Internet of Things like it’s 1994 — ресерч, посвященный безопасности IoT-устройств. По оценкам авторов, к 2020 году к интернету будет подключено более двадцати миллиардов разнообразных устройств, начиная от веб-камер и заканчивая холодильниками и стиральными машинами. И если учесть тотальную небезопасность текущих устройств, это может стать настолько серьезной проблемой, что бот Mirai, не так давно заваливший пол-интернета с помощью веб-камер, покажется детской игрушкой.
IT-специалисты предлагают разные решения этой проблемы, но пока ни одно из них не может быть воплощено в жизнь даже на небольшом числе устройств. IoT развивается очень быстро, поэтому компании-производители ставят на первое место скорость выпуска устройства на рынок, жертвуя безопасностью. Попытки стандартизации протоколов доступа к устройствам проваливаются одна за другой по причине инертности и стремления компаний протолкнуть свой стандарт. SDN-решения вроде специальных мидлбоксов, которые должны соединять IoT-устройства с внешним миром, никому не нужны. Попытки регулировать рынок IoT заканчиваются на бюрократическом выяснении отношений и бесконечном разбирательстве, кто и как должен его регулировать.
Документ интересен именно описанием текущей ситуации. Решение авторов, под названием IDIoT, — это довольно топорный сетевой фильтр, который пропускает наружу и внутрь локальной сети только тот трафик, который реально нужен девайсу, и отсекает все остальное. К примеру, веб-камера будет способна загружать видео на удаленный сервер, но не сможет «отключить» интернет UDP-запросами к корневым DNS-серверам. Решение может быть как софтверное, устанавливаемое на роутер или телефон, так и железное, например Raspberry Pi со специальной прошивкой.
Android nostalgia: 13 once-trumpeted features that quietly faded away — интересная статья о технологиях, которые когда-то были в Android, но теперь удалены. Из наиболее печальных потерь:
The Magisk Story — история создания Magisk, написанная автором проекта. Magisk — едва ли не самый популярный сегодня менеджер прав root, а также система модификации Android без внесения изменений в системный раздел (если по-простому: он модифицирует boot-раздел и во время загрузки вносит изменения поверх system-раздела без его модификации, это называется systemless). Наиболее интересные выдержки:
Broken Fingers: On the Usage of the Fingerprint API in Android — исследование, посвященное безопасности приложений, использующих датчик отпечатка пальца. Авторы написали утилиту для анализа кода таких приложений и применили ее к 501 APK из маркета. Выводы обычны: разработчикам приложений не стоит рассчитывать, что малварь не сможет запустить свой экран поверх их, но среди подобных стандартных рассуждений особо выделяется один результат исследования.
54% приложений (включая Google Play) не генерируют и не используют открывшиеся в результате касания датчика отпечатка пальца криптографические ключи (другими словами, датчик служит только для подтверждения действия, но не для того, чтобы, например, получить доступ к ключу и затем применить его для подписи транзакции или другого действия). Это значит, что злоумышленник с правами root сможет совершить покупку, просто симулировав касание сенсора (при помощи вызова метода onAuthenticationSucceeded самого приложения).
Inside Instant Apps — вводная статья об Instant Apps, сравнительно новой функции Android (а точнее, Google Mobile Services), позволяющей создавать «одноразовые приложения», которые можно запустить мгновенно без необходимости в установке.
Instant Apps базируются на концепции feature, когда одно комплексное приложение делится на несколько своего рода мини-приложений. Каждое такое мини-приложение может включать в себя код, ресурсы и данные, необходимые для работы только одной активности приложения. Feature может быть, к примеру, просто страницей покупки какого-либо товара. Оно имеет собственный URL, перейдя по которому пользователь мгновенно (ну или почти мгновенно) увидит определенную активность приложения.
Мини-приложения могут разделять код между собой, но размер каждого из них не должен превышать четыре мегабайта. Кроме того, они могут иметь ограниченный набор системных привилегий. Один и тот же проект можно использовать для сборки как полноценного приложения, так и набора мини-приложений или того и другого.
Yet Another Awesome Kotlin Feature: Parcelize — небольшая заметка о новой возможности Kotlin 1.1.4 под названием Parcelize. Суть ее в следующем: для передачи объектов между активностями в Android следует описывать эти объекты с помощью громоздкого и неудобного интерфейса Parcelable, представляющего возможности сериализации.
Описание одного простого объекта с помощью Parcelable может занимать десятки строк кода, большая часть которого будет иметь весьма опосредованное отношение к логике работы приложения. Parcelize позволяет описать такой объект буквально с помощью двух строк:
@Parcelize data class Student(val id: String, val name: String, val grade: String) : Parcelable
Возможность в данный момент экспериментальная, поэтому для ее использования следует добавить в build.gradle проекта такие строки:
apply plugin: 'kotlin-android-extensions' androidExtensions { experimental = true }
RecyclerView plusAssign Kotlin power — статья с описанием весьма интересной техники создания RecyclerView (списка). Краткая предыстория: чтобы создать список с помощью RecyclerView, необходимо создать класс на основе RecyclerView.adapter, а также класс на основе RecyclerView.ViewHolder. Второй будет содержать описание интерфейса каждого элемента, а первый — создавать элементы списка, наполняя ViewHolder нужными данными.
Очевидно, такой способ описания списков довольно громоздкий и выматывающий, если списков будет много. Автор предлагает заменить его такой конструкцией:
recyclerView.setUp(users, R.layout.item_layout, { nameText.text = it.name surNameText.text = it.surname })
Само собой, RecyclerView не имеет метода setUp, это функция-расширение, добавленная с помощью Kotlin. И именно ее описанию посвящена статья. Все сводится к созданию универсального адаптера и универсального ViewHolder, после чего автор описывает функцию-расширение setUp, которая и подключает адаптер к RecyclerView:
fun <ITEM> RecyclerView.setUp(items: List<ITEM>, layoutResId: Int, bindHolder: View.(ITEM) → Unit, manager: RecyclerView.LayoutManager = LinearLayoutManager(this.context)): Kadapter<ITEM> { return Kadapter(items, layoutResId, { bindHolder(it) }).apply { layoutManager = manager adapter = this } }
Плюс некоторые шаманства, связанные с написанием колбэков для обработки нажатий на элементы списка.
Kotlin Collections Inside. Part 1 — исследование того, как в Kotlin работают коллекции: Collection, Set, MutableSet, List, MutableList. Интересные наблюдения:
Realtime applications using Android Architecture Components with Kotlin — хорошее и не затянутое введение в Android Architecture Components, представляющие собой реализацию паттерна Model — View — ViewModel (MVVM). AAC базируются на четырех ключевых компонентах:
Используя эти компоненты, можно создать приложение, в режиме реального времени обновляющее свое состояние в обе стороны: нажатие кнопки приводит к записи в базу данных, а изменение в базе данных сразу отражается на графическом интерфейсе. Ну и конечно же, его компоненты будут четко разделены.
Читайте также
Последние новости