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

Итак, не так давно мне в голову пришла идея купить 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/step2?confirm -H «Cookie: session=session2» &

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

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

Я пошел в ближайший работающий Cтарбакс на market 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 процентной скидкой (чтобы не вызывать подозрения) за биткоины. Так, проработав год-другой, можно было бы высосать пару миллионов долларов из этой дружелюбной фирмы со сладким кофе.

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


  1. SLY_G
    24.05.2015 02:04

  1. SLY_G
    24.05.2015 02:10
    +7

    О, про вас BBC «раструбили»:
    www.bbc.com/news/technology-32844123


    1. fse
      26.05.2015 13:23

      Меня удивила поощрительная риторика в статье на BBC. Даже не смотря на тренд в их прессе по демонизации русских хакеров и русских вцелом.
      Замечательная статья, замечательная уязвимость, замечательный итог.
      Очень надеюсь, что старбакс не прибегнет к давлению на автора.


      1. vedenin1980
        26.05.2015 17:36

        Ну вообще-то, справедливости ради, ни слова в статье что хакер русский не прозвучало, да мы-то знаем что имя Егор русское, но 99.9% мира — нет. ИМХО.


        1. fse
          26.05.2015 17:59
          +1

          А что мешало им написать: хакер, предположительно, работающий на российское правительство, взломал старбакс, после чего обнародовал способ взлома с целью обрушить акции компании?


          1. vedenin1980
            26.05.2015 18:19

            Ну и зачем кому-то нужна такая явная ложь, если у любого СМИ есть сто один способ обмануть, сказав чистую правду и ничего кроме правды?


            1. fse
              26.05.2015 18:41
              +1

              Попробуйте доказать, что вешеобозначенная версия публикации является ложной. Да и кто на этот счёт будет там беспокоиться?
              Не знаю как Вы, но не питаю иллюзий о неполживости западных (ди и остальных) масс-медиа.

              Чем больше ложь, тем скорее в нее поверят — Адольф Гитлер

              ru.wikipedia.org/wiki/Большая_ложь
              Впрочем, это не относится к теме публикации, поэтому не думаю, что следует продолжать.


      1. valiorik
        27.05.2015 04:10
        -2

        Тренд, скорее, против россиян и особенно правительства РФ.
        К русским отношение не изменилось в последние годы.


  1. hopungo
    27.05.2015 10:37

    Хм, ну получается, всё что вы получили за свою работу — кофе по сниженной цене. А по большому счёту его следовало вернуть прямо на кассе без объяснения причины.

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


    1. lobity
      01.06.2015 05:25

      z-payment, ruru, rbkmoney,…? ))