RuStore и нашумевшая статья: что я нашёл, когда сам вскрыл свежий билд
Кирилл РозовПару дней назад (11 июня) по всем каналам разлетелась статья с Хабра, мол, RuStore тайно ставит сторонние приложения без спроса и мониторит GPS каждые 5 минут. 200+ плюсов, 150 комментов. Я не люблю реагировать на хайп с чужих слов и за честный разбор и анализ, поэтому скачал свежий билд прямо с rustore.ru (версия 1.103.0.3), вскрыл его сам через jadx и прошёлся по каждому пункту. Рассказываю, что там правда, а что натянуто.
Спойлер: автор статьи технически грамотный, но половину выводов он надул, а самое тревожное место почти никто не заметил. И сразу рамка, без которой вся страшилка осыпается: почти всё, чем пугает статья, работает только при одном условии, о котором автор не сказал ни слова. С него и начну.
Я - Кирилл Розов, занимаюсь Android разработкой с 2012 года, был Google Developer Expert до 2022, многократно выступал на ведущей конференции в СНГ по мобильной разработке Mobius, а также веду каналы про Android разработку - TG Android Broadcast и одноименный YouTube канал.
Что в коде действительно есть
Сначала честно: то, что есть в коде, в коде есть, и я это подтверждаю на самой свежей сборке, не на полугодовой.
Привилегированный установщик реальный: SessionParams с setRequireUserAction в режиме USER_ACTION_NOT_REQUIRED и setRequestUpdateOwnership(true). Это тихая установка без диалога.
Подсистема Radar реальная: таблица snapshot_records с тремя геофиксами, BSSID роутера, списком вышек, оператором SIM, флагом VPN и роуминга. Зачем это нужно, разбираю ниже отдельно.
Список установленных приложений реально уходит на сервер, и в DTO лежат только имена пакетов, без версий. Это инвентаризация для витрины и рекомендаций.
Условие, без которого вся страшилка осыпается
Теперь главное, ради чего я и полез в код, и чего в статье нет ни строчки. Вся её силовая часть, тихая установка приложений и фоновая раскатка любого софта, держится на одном невысказанном условии: у RuStore должно быть системное разрешение установки (INSTALL_PACKAGES). И тут развилка, которую очень легко спутать: быть предустановленным и быть привилегированным это совсем не одно и то же. RuStore действительно предустановлен на части устройств через вендоров, но предустановка сама по себе такой привилегии не даёт, её вендор должен прописать отдельно на уровне прошивки. То есть «предустановлен» не означает «может ставить в фон». По словам команды RuStore, на их предустановках фоновой установки нет. А если вы поставили RuStore сами из APK, привилегии не будет, Android её обычному приложению не выдаёт в принципе. И если на телефоне есть Google Play, второго привилегированного магазина рядом быть не может, по условиям лицензии Google Mobile Services (GMS) вендор не имеет права дать стороннему стору системные права. То есть на типичном телефоне весь силовой сценарий рассыпается ещё до старта. Теоретически он возможен лишь там, где конкретный вендор и предустановил, и отдельно выдал привилегию, но ни автор, ни кто-либо не показал такого устройства, а RuStore заявляют, что фоновую установку не использует.
Реальных случаев нет ни одного
Ни автор, ни кто-либо в полутора сотнях комментариев под статьёй не привёл ни одного живого устройства, где хоть какое-либо приложение реально установилось в фоне. Наоборот, люди пишут обратное: RuStore стоит, приложения сами не качаются, на каждую установку магазин запрашивает подтверждение. Возможность в коде есть, но зафиксированного случая на реальном девайсе нет ни одного. Строить заголовок на поведении, которое подтверждено лишь наличием кода, неправильно.
Ползучить разрешение != получить возможность
И вот где корень той самой манипуляции в заголовке. Вся соль в одной грани, которую статья размывает: «что приложение умеет в коде» и «что ему реально позволено сделать на вашем устройстве» это разные вещи. Это capability против permission. Я разбирал на своём Boosty, как модель разрешений в Android устроена изнутри: protection levels, runtime, AppOps, special permissions, priv-app, политики Google Play и почему наличие кода само по себе ничего не значит без выданного доступа. Если хотите понять, почему «в коде это есть» и «это работает у вас» далеко не одно и то же, тот разбор прямо в тему.
Что собирается, если вы поставили RuStore сами
Это не значит, что приложение совсем ничего не собирает: список установленных приложений уходит на сервер и при ручной установке (это обычное разрешение QUERY_ALL_PACKAGES, выдаётся само), а если вы сами дадите локацию или доступ к статистике использования, заработает и телеметрия. Но ключевое в том, что теперь все эти доступы контролируете вы: не выдали, отозвали, остановили, удалили. Вот честное «бояться нечего» для самостоятельной установки: не «оно ничего не делает», а «всё, что оно делает, под вашим контролем, а не под контролем вендора».
Главный мастер-выключатель фичи в коде называется techRadarAnalyticsEnabled, и его значение по умолчанию false. Подсистема выключена, включается только удалённо с сервера, и геофиксы наполняются лишь при выданном разрешении на локацию. Выдавать разрешение или нет решает пользователь, магазин полноценно работает без доступа к геолокации.
Блок про IMEI вообще занятный. Автор сам в тексте признаёт, что вызовы обёрнуты в catch SecurityException и на Android 10+ вернут null. То есть код есть, но он не исполняется на современных версиях. А в выводе при этом «пожизненный аппаратный слепок, отвязаться нельзя». Тело статьи противоречит её же заголовку. Сразу полезный совет всем, кто не видит смысла в обновлениях Android: многие изменения пользователю не видны, но систему делают безопаснее от сторонних приложений.
Это главное обвинение статьи. Автор нашёл, что интерактор, который ставит пакет из пуша (GetPreorderAutoInstallActionInteractor), не сверяет локально, заказывали ли вы этот пакет. Формально в коде так и есть. Но это не бэкдор, а обычная архитектура «доверяй собственному бэкенду»: пакет приходит аутентифицированным пушем от сервера RuStore, и клиент полагается на то, что сервер прислал корректное. Так устроены практически все приложения, работающие через сервер, все проверки и управление на центральном узле. Реальный риск тут ровно один и совсем другого класса: если скомпрометируют сам сервер RuStore или канал доставки пушей. Так что «магазин втихаря ставит вам что хочет» из заголовка проверки кодом не выдерживает, как и какой-либо реальной демонстрации.
Геоданные: зачем
Я задал прямой вопрос команде. В RuStore объясняют сбор так: это телеметрия качества сети. При блокировках интернета и троттлинге им важно понимать, что просадка скорости не на их стороне, плюс оптимизировать скачивание по регионам, где видно, что проседает. В российских реалиях мотивация понятная, и под эту задачу честно ложатся сила сигнала, тип сети, оператор и объём трафика, всё это в снапшоте есть.
Что у других магазинов приложений
Самое интересное в этой истории даже не RuStore, а то, что системный магазин любого вендора умеет примерно тот же набор: установку, инвентаризацию приложений, телеметрию. Google Play стоит системным с рождения, и про него почему-то так не пишут. Честнее всего сравнивать RuStore с AppGallery от Huawei: это магазин на устройствах без сервисов Google, то есть ровно тот случай, где стор реально привилегированный и ему ничто не мешает, как RuStore на priv-app. Это и есть настоящий аналог, а не Galaxy Store, который на гугловском самсунге зажат теми же ограничениями, что и RuStore.
В статье не объяснили ключевые технические детали про модель разрешений Android и предустановку, без которых выводы звучат куда страшнее, чем обстоят дела. Реальных подтверждённых кейсов ноль. Самое громкое обвинение, «бэкдор», проверки кодом не выдержало. Почти всё включается только там, где RuStore наделён системными правами, а на обычном Android с сервисами Google он стоит как любое ваше стороннее приложение.
Больше разборов и актуальной информации про Android в моём Telegram-канале @android_broadcast