Как я взломал Starbucks для безлимитного кофе

от автора

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

Не так давно мне в голову пришла идея купить 3 карты старбакса по $5 каждая.
image

На сайте starbucks.com есть личный кабинет где можно добавить эти карты, смотреть баланс и даже переводить деньги между картами.

Есть такой малоизвестный класс уязвимостей «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/step1?confirm -H «Cookie: session=session2» &

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

На 6-ой запрос произошло чудо — перевод был произведен два раза и у меня стало две карты с 15 и 5 долларами, 20 в сумме. Чтобы считать это за proof of concept осталось убедиться что магазин примет эти карты.

Я пошел в ближайший работающий старбакс на mission st.

> Дайте мне чего нибудь на $16
> O_o
> Ну что у вас самое дорогое?
> Вон те сэндвичи

image

Вышло $16.70

image

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

Дальше, самое сложное, процесс репорта. Саппорт честно ответил что не может связать меня с технической командой, ну вообще никак, и им очень жаль что я feel this way. Написал на InformationSecurityServices@starbucks.com 23 марта, тишина (ответили кстати аж 29 апреля). Пришлось через знакомых знакомых находить людей которым не все равно и лишь через 10 дней уязвимость была исправлена.

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

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

ссылка на оригинал статьи http://habrahabr.ru/post/258449/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *