- PVSM.RU - https://www.pvsm.ru -

Starbucks следует открыть публичный доступ к своим API

Мобильное приложение Starbucks — один из самых известных кейсов в ecommerce. Автор материала — программист опытным путем доказывающий, почему стоит открыть API этого приложения.

image

Мотивация

Стоит отдать должное приложению Starbucks — оно просто отличное. Я использую его (как минимум) раз в день. В нем есть все, что мне нужно от отличного мобильного сервиса — кофе, плейлисты хитов 80-х в Spotify [1] и возможность избежать живого общения с другими людьми. Я явно не одинок в своих предпочтениях, так как 20% операций Starbucks в США [2] сейчас производится через мобильные телефоны.

Помимо интеграции Slack [3] и кофейных кнопок [4] существует множество других интеграций, которые можно было бы реализовать, если бы компания открыла свой API для сторонних разработчиков. Она явно движется в этом направлении, поскольку у нее есть и аккаунт в Twitter, и (защищенный паролем) веб-сайт для разработчиков.

Однако я не мог ждать и поэтому решил взять дело в свои руки.

Было нелегко

Приложение Starbucks оказалось крепким орешком. Несмотря на URL-адрес «openapi.starbucks.com», пришлось пробираться через серьезные дебри, прежде чем начать анализировать вызовы, совершаемые приложением. Как и для любого другого приложения, обрабатывающего платежи, Starbucks предпринял многочисленные меры безопасности для защиты API, используемых своим приложением, от несанкционированного использования. Вот некоторые из них:

  • SSL certificate pinning [5]
  • Создание цифрового отпечатка [6] атрибутов [7] вашего мобильного телефона, чтобы понять, используете ли вы смартфон
  • Шифрование этого отпечатка с использованием AES, 256-битным ключом и псевдослучайным вектором инициализации
  • Подписание запросов с меткой текущего времени

Наблюдение за запросами сети

Для начала мне нужен был способ наблюдать за запросами и ответами, которыми обменивались приложение Starbucks и его сервера. Обычно я просто настраивал свой iPhone на Charles [8] (или mitmproxy [9]), и этого было достаточно.

Но не в этот раз! Поскольку приложение использует certificate pinning, я не смог перехватить его запросы, как обычно. Вместо этого мне пришлось откопать свой старый телефон на Android, получить root-права [10], установить фреймворк под названием Xposed [11] и, наконец, установить расширение [12], которое внедряется в запущенные приложения и отключает SSL pinning.

image

Муахаха

После его запуска я смог начать просмотр запросов с использованием прокси-сервера Charles. Однако это оказалось скорее ложной надеждой, так как не все запросы можно было легко воспроизвести. Тем не менее, я смог запросить основную информацию, например, о ближайших магазинах, меню и балансах карт.

image
Результат запроса о ближайшем магазине. Теперь вы знаете, где я работаю. Упс.

«Это легко», — думал я, — «Я просто размещу заказ, подключившись к прокси-серверу, и потом воспроизведу запросы!»

А вот и нет.

Как выяснилось, токены доступа Starbucks действительны всего один час, поэтому нельзя просто взять и пользоваться тем токеном, который использует ваш телефон. Это создает определенные трудности…

Вход в систему

Конечная точка OAuth, используемая приложением, перед выдачей токена проверяет три параметра:

  • Параметр строки запроса sig. Исследователь проблем безопасности Райан Пикрен выяснил [13], что это клиентский ключ, клиентский секретный ключ и текущая временная метка UNIX, конкатенированные [14] вместе и прогнанные через функцию MD5-хэширования [15].
  • Параметр формы «deviceFingerprint». Это список различных атрибутов устройства в кодировке base64 и зашифрованный AES-256. Он также регулярно изменяется, поскольку текущее время и аптайм устройства включены в отпечаток.
  • HTTP-заголовок «X-Cbt». Еще одна строка секретного ключа в кодировке base64.

Я начал пытаться сформировать некоторые из них самостоятельно. Я смог получить ключ шифрования, используемый для создания deviceFingerprint, используя джейлбрейкнутый iPhone для расшифровки фреймворков внутри приложения Starbucks. Изучив фреймворк в Hopper [16] в течение некоторого времени, я в конечном итоге смог отследить вызов к функции Apple CCCrypt [17].

image

www.youtube.com/watch?v=o8ZnCT14nRc [18]

Затем я прилинковал фреймворк SBXData (фреймворк, который я ранее расшифровал на джейлбрейкнутом телефоне) в наскоро созданное приложение и воспользовался Fishhook [19] для переназначения этой функции собственной реализации. Это позволило мне выгрузить ключ и связанные с ним параметры в консоль:

image

Аналогичным образом удалось выяснить, как генерировать заголовок «X-Cbt». Для краткости изложения, я оставлю эту задачу вам :)

Заключение

После того, как я смог подписать и снять отпечатки со своих запросов на вход, я объединил все в небольшой модуль Node.js, который позволяет использовать некоторые основные функции API Starbucks. Хорошие новости: он (в основном) размещен здесь [20] на GitHub!

Вуаля! Программируемый кофе.

Автор: Fondy

Источник [21]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/260824

Ссылки в тексте:

[1] плейлисты хитов 80-х в Spotify: https://open.spotify.com/user/starbucks/playlist/1KgSFElrtKsbvFBPDLUg7f

[2] 20% операций Starbucks в США: https://news.starbucks.com/uploads/documents/Fact_Sheet_-_Mobile_Order__Pay_National_Launch_2015.pdf

[3] интеграции Slack: https://api.slack.com/internal-integrations

[4] кофейных кнопок: http://ryanpickren.com/starbucks-button

[5] SSL certificate pinning: https://en.wikipedia.org/wiki/Transport_Layer_Security#Certificate_pinning

[6] Создание цифрового отпечатка: https://www.iovation.com/

[7] атрибутов: https://www.threatmetrix.com/

[8] Charles: https://www.charlesproxy.com/

[9] mitmproxy: https://mitmproxy.org/

[10] получить root-права: https://en.wikipedia.org/wiki/Rooting_%28Android_OS%29

[11] Xposed: http://repo.xposed.info/module/de.robv.android.xposed.installer

[12] расширение: https://github.com/Fuzion24/JustTrustMe

[13] выяснил: https://www.ryanpickren.com/starbucks-button

[14] конкатенированные: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%BA%D0%B0%D1%82%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D1%8F

[15] функцию MD5-хэширования: https://ru.wikipedia.org/wiki/MD5

[16] Hopper: https://www.hopperapp.com/

[17] Apple CCCrypt: https://opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonCryptor.h

[18] www.youtube.com/watch?v=o8ZnCT14nRc: https://www.youtube.com/watch?v=o8ZnCT14nRc

[19] Fishhook: https://github.com/facebook/fishhook

[20] здесь: https://github.com/tendigi/starbucks

[21] Источник: https://habrahabr.ru/post/322800/