Як хлопець Starbucks зламав (3 фото)

11

Один хлопець знайшов спосіб, як обійти захист відомої американської компанії Starbucks, що володіє мережею кав’ярень по всьому світу, і вирішив поділитися цією інформацією з усіма бажаючими. Правда, зробив він це вже після того, як повідомив про це недогляд представникам компанії, які, до речі, навіть не подякував за надану допомогу.

Далі авторський тест.

Це історія про те, як я знайшов спосіб нагенерить необмежену кількість грошей на подарункові карти старбакса, тим самим забезпечити собі довічний безкоштовний кави, ну або вкрасти у них пару мільйонів іншими способами.

Отже, не так давно мені в голову прийшла ідея купити 3 карти Старбакса по $5 кожна.

На сайті компанії є особистий кабінет, де можна додати ці карти, дивитися баланс і навіть переказувати гроші між картами.

Є такий маловідомий клас уразливостей «race condition». Можу з упевненістю заявити, що більшість додатків, які можуть бути уразливі до цієї атаки швидше за все вразливі, адже далеко не кожен програміст при проектуванні програм враховує такі фактори, як паралельність виконання коду та його наслідки.

У веб-застосунках він теж зустрічається, зазвичай у функціях пов’язаних з переказом грошей/окулярів/фантиків/ваучерів. Про всі тонкощі експлуатації я розповім наступного разу, а поки повернемося до перекладу між картами в Старбаксе.

Переклад будувався з декількох stateful запитів. Схематично — перший запит POST /step1?amount=1&from=wallet1&to=wallet2 закладав всі ці значення у сесію на сервері, і лише другий POST/step2?confirm перекладав дані вже закладені в сесії і очищав її.

Це істотно ускладнює експлуатацію щодо класичної гонки, де потрібно лише повторити один і той же запит кілька разів одночасно. Адже як тільки перший запит очищає сесію, другий вже натикається на порожню сесію! І щоб якось змусити це працювати, довелося б робити складну композицію запитів, записує у сесію відразу після її очищення першим запитом і перед виконанням другого запиту. Таке могло б спрацювати раз мільйони спроб, або взагалі не спрацювати.

Але завжди є обхід для таких «напів захистів» — можна залогуватися в один і той же аккаунт з двох різних браузерів / сесій. Тоді експлуатація виглядає приблизно так:

#закладаємо параметри перекладу в обидві сесії
curl starbucks/step1 -H Cookie: session=session1» —data «amount=1&from=wallet1&to=wallet2»
curl starbucks/step1 -H Cookie: session=session2» —data «amount=1&from=wallet1&to=wallet2»
#одночасне схвалення перекладу $1 з карти 1 на карту 2.
curl starbucks/step2?confirm -H Cookie: session=session1» & curl starbucks/step2?confirm -H Cookie: session=session2» &

Після 5 спроб нічого цікавого не сталося і я хотів вже було здатися. Особливість стану гонки в тому, що її можна лише спробувати знайти сторонньому атакуючому, адже невідомо, які захисту стоять (кількість запитів по IP? запитів на аккаунт? запитів на дію?) і єдиний спосіб перевірити чи вразливі ви — це ретельно проаудировать вихідний код на наявність належних песимістичних локов в базі даних.

На 6-ий запит сталося диво — переклад був зроблений два рази і в мене стало дві карти з 15 і 5 доларами, 20 в сумі. Щоб вважати це за proof of concept, залишилося переконатися, що магазин прийме ці карти.

Я пішов в найближчий працює Старбакс на market st.

— Дайте мені чого-небудь на $16.
— O_o.
— Ну що у вас найдорожче?
— Он ті сендвічі.

Вийшло $16.70.

Отже, в нашу маленьку операцію И було інвестовано 15 доларів, а закупівель зроблено на 16.70. Знаючи ставлення самого гуманного суду США до хакерам, я, повернувшись додому, відразу зарахував ще $10 з кредитки на карту Старбакса, щоб не бути належним корпорації цілих $1.70, мало.

Далі найскладніше — процес репорта. Саппорт чесно відповів, що не може зв’язати мене з технічною командою, ну взагалі ніяк, і їм дуже шкода, що я feel this way. Написав на [email protected] 23 березня, тиша (відповіли, до речі, аж 29 квітня). Довелося через знайомих знайомих знаходити людей, яким не все одно і лише через 10 днів уразливість була виправлена.

Спасибі ніхто не сказав, зате був зроблений не двозначний натяк, що я зробив «fraud» і «malicious actions» і що вони ще подумають, що зі мною зробити.

А що міг зробити я? Я міг запустити ферму з фейкових гіфт-карт, куплених в різних магазинах світу, нагенерить на них купу грошей і продавати на спеціальних промо сайтах з 50 відсотковою знижкою (щоб не викликати підозри) за биткоины. Так, пропрацювавши рік-інший, можна було б висмоктати пару мільйонів доларів з цією дружелюбною фірми з солодким кави.

Звідси