Благими намерениями

Во множестве организаций существует такая фича социальной поддержки и удержания сотрудников, как корпоративные предоплаченные карты питания, или «foodcard», как их еще называют. Раз в квартал бухгалтерия перечисляет на них относительно небольшие суммы, которых хватает на кофе, аспирин и барбариски.

Финансовым посредником выступает одна из расчетных некоммерческих организаций (НКО) в нашей стране. Работодателю это выгодно: схема дешевле, избавляет от проблем и снижает налогообложение, а НКО получает свой законный мелкий гешефт.

Все счастливы. Все в безопасности. Все так думают.

номер карты естественно не настоящий, он даже не отвечает требованиям EAN-13 )
номер карты естественно не настоящий, он даже не отвечает требованиям EAN-13 )

Чтобы проверить баланс карты, её владелец должен открыть сайт-лендинг на специальном поддомене, ввести номер с обратной стороны пластика, и вуаля - система выдает данные о балансе, статусе SMS-уведомлений.. и полную историю операций.

Проявив немного здорового (или не очень) любопытства, можно выяснить, что все эти чувствительные данные отдаются в результате одного простого запроса

GET /api/1/card/3001234567894?limit=100

Ни пароля. Ни токена. Ни даже вялого намёка на двухфакторную защиту. Бесплатно, и без смс. Просто возьми и посмотри. Как если бы банк выдавал выписку по счёту любому, кто правильно назовёт номер твоего почтового ящика.

{
  "status": "OK",
  "data": {
    "phone": "+7 (999) - *** - ** -99",
    "balance": {
      "availableAmount": 41.96
    },
    "history": [
      {
        "time": "2026-06-24T19:39:52.000+03:00",
        "amount": -659.37,
        "locationName": [
          "KRASNOE&BELOE"
        ],
        "trnType": 774,
        "mcc": "5499",
        "currency": "RUR",
        "merchantId": "781000402060   ",
        "reversal": false,
        "posRechargeReceipt": null,
        "smsInfoReceipt": null,
        "credit": false,
        "locationCity": "Samara"
      }
    ],
    "smsInfoStatus": "OFF",
    "smsNotificationAvailable": false,
    "cardType": "food"
  }
}

Для демонстрации истории я оставил только одну операцию, но, надеюсь, этого достаточно, чтобы оценить масштаб проблемы.

От удобства к криповой реальности

Если предположить, что бэкенд сервиса выделяет пул номеров формата EAN-13 под конкретную организацию, то эти номера можно обнаружить простым перебором (брутфорсом). А это означает, что данные о времени, месте и сумме покупки превращаются в готовые поведенческие паттерны.

Для «человека с улицы» это просто набор цифр. Но для инсайдера ситуация выглядит иначе. Доступ к корпоративному справочнику в кампании имеет практически каждый. Такой человек может смержить эти записи за считанные минуты, и как он этим воспользуется большой вопрос.

Я это другое дело!

Признаюсь, я оценил всю глубину проблемы не сразу. Единственная мысль, которая пришла мне в голову в момент открытия: «Публичный API? Здорово! Ведь я могу навайбкодить Android-приложение для себя и коллег, ведь проверять баланс через сайт так неудобно!». Чем я и занимался с энтузиазмом на протяжении нескольких недель, пока не потерял к нему интерес.

Эпилог

Нам часто кажется, что в эпоху тотальной прозрачности данных мы настолько незначительны, что напоминаем «неуловимого Джо». Однако главная опасность кроется в социальной инженерии. Имея на руках время, место и сумму свежих транзакций, злоумышленник получает идеальный плацдарм для сталкинга.. или фишинга. Звонок якобы из «службы безопасности» с упоминанием вчерашней покупки в конкретном магазине звучит уже не как догадка, а как неоспоримый факт. Эта пугающая осведомленность мгновенно ломает психологическую защиту, заставляя испуганную жертву поверить звонящему и добровольно слить доступ к своим финансам или корпоративным системам.

Комментарии (0)