Итак, не так давно мне в голову пришла идея купить 3 карты Старбакса по $5 каждая.
На сайте 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/step2?confirm -H «Cookie: session=session2» &
После 5 попыток ничего интересного не произошло и я хотел уже было сдаться. Особенность состояния гонки в том, что ее можно лишь попытаться найти стороннему атакующему, ведь неизвестно, какие защиты стоят (число запросов по IP? запросов на аккаунт? запросов на действие?) и единственный способ проверить уязвимы ли вы — это тщательно проаудировать исходный код на наличие должных пессимистических локов в базе данных.
На 6-ой запрос произошло чудо — перевод был произведен два раза и у меня стало две карты с 15 и 5 долларами, 20 в сумме. Чтобы считать это за proof of concept, осталось убедиться, что магазин примет эти карты.
Я пошел в ближайший работающий Cтарбакс на market st.
— Дайте мне чего-нибудь на $16.
— O_o.
— Ну что у вас самое дорогое?
— Вон те сэндвичи.
Вышло $16.70.
Итак, в нашу маленькую операцию Ы было инвестировано 15 долларов, а закупок сделано на 16.70. Зная отношение самого гуманного суда США к хакерам, я вернувшись домой, сразу зачислил еще $10 с кредитки на карту Старбакса, чтобы не быть должным корпорации целых $1.70, мало ли.
Дальше самое сложное — процесс репорта. Саппорт честно ответил, что не может связать меня с технической командой, ну вообще никак, и им очень жаль, что я feel this way. Написал на InformationSecurityServices@starbucks.com 23 марта, тишина (ответили, кстати, аж 29 апреля). Пришлось через знакомых знакомых находить людей, которым не все равно и лишь через 10 дней уязвимость была исправлена.
Спасибо никто не сказал, зато был сделан не двусмысленный намек, что я совершил «fraud» и «malicious actions» и что они еще подумают, что со мной сделать.
А что мог сделать я? Я мог запустить ферму из фейковых гифт-карт, купленных в разных магазинах мира, нагенерить на них кучу денег и продавать на специальных промо сайтах с 50 процентной скидкой (чтобы не вызывать подозрения) за биткоины. Так, проработав год-другой, можно было бы высосать пару миллионов долларов из этой дружелюбной фирмы со сладким кофе.
Комментарии (129)
SLY_G
24.05.2015 02:10+7О, про вас BBC «раструбили»:
www.bbc.com/news/technology-32844123fse
26.05.2015 13:23Меня удивила поощрительная риторика в статье на BBC. Даже не смотря на тренд в их прессе по демонизации русских хакеров и русских вцелом.
Замечательная статья, замечательная уязвимость, замечательный итог.
Очень надеюсь, что старбакс не прибегнет к давлению на автора.vedenin1980
26.05.2015 17:36Ну вообще-то, справедливости ради, ни слова в статье что хакер русский не прозвучало, да мы-то знаем что имя Егор русское, но 99.9% мира — нет. ИМХО.
fse
26.05.2015 17:59+1А что мешало им написать: хакер, предположительно, работающий на российское правительство, взломал старбакс, после чего обнародовал способ взлома с целью обрушить акции компании?
vedenin1980
26.05.2015 18:19Ну и зачем кому-то нужна такая явная ложь, если у любого СМИ есть сто один способ обмануть, сказав чистую правду и ничего кроме правды?
fse
26.05.2015 18:41+1Попробуйте доказать, что вешеобозначенная версия публикации является ложной. Да и кто на этот счёт будет там беспокоиться?
Не знаю как Вы, но не питаю иллюзий о неполживости западных (ди и остальных) масс-медиа.
Чем больше ложь, тем скорее в нее поверят — Адольф Гитлер
ru.wikipedia.org/wiki/Большая_ложь
Впрочем, это не относится к теме публикации, поэтому не думаю, что следует продолжать.
valiorik
27.05.2015 04:10-2Тренд, скорее, против россиян и особенно правительства РФ.
К русским отношение не изменилось в последние годы.
hopungo
27.05.2015 10:37Хм, ну получается, всё что вы получили за свою работу — кофе по сниженной цене. А по большому счёту его следовало вернуть прямо на кассе без объяснения причины.
Кстати, не так давно я случайно обнаружил уязвимость в одной платёжной системе. После вашей статьи тоже жду от них привета.
SLY_G
К слову
geektimes.ru/post/250390