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

    Подробнее
    Реклама
    Комментарии 136
    • НЛО прилетело и опубликовало эту надпись здесь
      • +72
        >Кстати вы еще проверьте, может их «фикс» — лишь забанили вашу айпиху, или еще что-нибудь такое.

        Я практически знаю что фикс кривой. Но это уже не важно. Я решил не общаться с этими редисками вообще.
        • +15
          и передали технологию в руки других редисок
          • +12
            Ну и поделом. Если не хотят нормально исправить проблему, которую им на блюдечке принесли, то это уже их личные сложности. Нормальные люди бы спасибо сказали и халявную карточку на сколько-нибудь денег подарили.
            • +6
              Как показывает практика, приносишь на блюдечке уязвимость, а тебя потом еще и во всех смертных грехах обвиняют, чего уж говорить о «халявной карточке». На моем счету обменники денег, несколько онлайн игр, новомодное питерское такси (с этими вообще весело было)
              • +5
                >На моем счету обменники денег, несколько онлайн игр, новомодное питерское такси (с этими вообще весело было)
                Не хотите поделиться историями с общественностью?:)
                • +19
                  Да ничего сверхъестественного.
                  Лет… много назад нашёл дыру в обменнике, фактически косяк хостера — своровать ничего нельзя было из-за ключей WM. Связываюсь с владельцем, объясняю ситуацию. Владелец всё понимает и идёт к хостеру. У хостера сидит админ Вася (имя реальное) и не долго думая поднимает хай с гневными письмами к моему провайдеру и в органы. Несколько дней угроз, общения с владельцами провайдера и органами. Вопрос замяли. Владелец высказал устную благодарность и переехал к другому хостеру, ибо предыдущий положил болт и ничего не стал менять.

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

                  История недавняя — У нас есть десяток городских телефонных номеров. Ночью случайно оказалась открыта консоль астериска. Краем глаза замечаю кучу звонков с мобильников к нам на номер, и как выясняется не первый день. Причем номер мне неизвестен, в астер не заведён. Завожу на себя, беру трубку — «Алё, ну где моё такси?» — Думаю ошиблись. Беру второй вызов — аналогично народ интересуется когда приедет их машина. Начинаю выяснять у звонящего — звонит он на YYY-XXXX, в зелёное питерское такси. Звоню на красивый YYY-XXXX — звонок приходит ко мне о_О. Номер, который я завёл, вообще не числится у нашего оператора. Пришлось долго и методом тыка искать людей, связанных с зелёным такси по их группе. Нашлась девушка, если не ошибаюсь, из начальства рекламного отдела. Сначала долго пришлось объяснять и доказывать что я не баран, после, видимо до них дошло.
                  Утром, выяснили что номер был у нас, но мы от него отказались. Оператор продал номер как б/у другому оператору, но что-то напутали с маршрутами, и в первую очередь звонок приходил к нам, а так как от нас был ответ 404, спокойно шёл дальше, к новому абоненту.
                  Никакой скидки или поощрения. В конкурсах, в группе вк, я тоже не выигрываю, зато частенько вижу ту барышню в списке _рандомно выбранных_

                  Видимо, нужно было пытаться найти выходы на «решающих начальников», либо всё же просто пустить их звонки на конкурентов и пусть сами дальше разбираются что за хрень творится.
                  • +16
                    Вот поэтому мне и нравится, что в 90-х все не компаниям/корпорациям репортили, а выкладывали в сеть и на всяких конвентах. Это было куда правильнее, чем сейчас пытаться достучаться до этих баранов.
                    • +1
                      Не все, я как-то наткнулся на несколько «устройств» из датацентров, торчащих в интернет со стандартными паролями.

                      Честно отписал на security, postmaster и admin на домены из WHOIS — ответили и закрыли дырку почти все, кроме большого корейского провайдера. А один финн даже написал по-русски спасибо.
                • +1
                  Онлайн игры — это, да. Как сейчас помню эту детскую радость…
                  Была такая игра Старый Бойцовский клуб, зашел я в нее, а там банк с обменником внутренней валюту, ввел отрицательное число на обмен и стал моментально миллиардером.
                  Но речь не об этом. Благодарность фактически не проявилась.
                  • 0
                    Раааанд, лови хакера! (:
                    • 0
                      Я сдал баг, там уже был не Рааанд, а trinity: )
                      • 0
                        О. Я таких знаю. Я им баг сдал, позволяющий клонировать предметы, а они меня заблокировали и гневное письмо в ящик накатали, что если баг пойдёт в народ — со мной будет разбираться суд, или кто похуже. Учитывая, что мы находились в разных странах, посмеялся. (;
                        • 0
                          Забавно. Браузерные игры — дело прибыльное (было во всяком случае), поэтому такая реакция. «Это ж подрыв экономики».
                          Но упоминание суда рядом с этим проектом и еще сотней его клонов в принципе неуместно, и админы об этом хорошо знают :)
                          Так что, да, они не правы…
                          • 0
                            Ну «подрыв экономики» — это громко. У повального большинства экономики или нет или она жутко непродумана.
                            • +1
                              Я бы не сказал, что совсем нет… Экономика в проектах без доната и абонентки фактически определяется так: «максимальное
                              удвовлетворение своих инстинктов получает тот, кто платит больше других в данный момент»… К слову сказать, это ломает обычно сам игровой процесс, и нормальные игроки быстро покидают такие ресурсы…
                • +1
                  Проблемы никто не любит, даже если их приносят на блюдечке, поэтому такое отношение. Менеджеру, которому в итоге пришлось это разруливать, это было лишним головняком, и поощрять такое безобразие он не хочет. Владельцам/Акционерам — да, это, наверно, важно, но они это не всегда осознают. А конкретному менеджеру — глубоко по барабану.
                • +3
                  передали технологию в руки других редисок
                  Это рэйс-то технология? А про поведение упомянутых Chikey «редисок» даже говорить не хочется… (реально столько неуравновешенных придурков на местах, тоже накушался).

                  Тогда тоже передам технологию… Не совсем рэйс, но похоже…

                  Хотел тут написать коммент, получился пост "Как я однажды взломал онлайн-казино".
                • 0
                  Надо обращаться выше с жалобой на конкретного сотрудника — что он неадекватно разрулил кейс и угрожает вам. Если у вас хватит упорства вывести это дело выше — рано или поздно перед вами извинятся и компенсируют беспокойство и моральный ущерб, им bad publicity не нужна и обойдётся дороже.
                  • +1
                    После статьи на bbc куда уж получить более bad publicity?
              • +5
                Спасибо
                • +43
                  Не расстраивайтесь. Все-равно кофе они никогда не умели варить…
                  • +5
                    +1. Самый вкусный напиток в старбаксе это пряный чай латте. (в азии не покупайте чай латте — это гадость зеленого цвета, совсем другая вещь).
                    • –14
                      вы во всей Азии проверили? или только за уралом?
                      • +1
                        Азия — это Тайланд, Китай, Гонконг, Индия, Камбоджа, Вьетнам и т.п. страны, но не РФ. Не придирайтесь к словам. У них Чай Латте это просто другой напиток сам по себе, а не то, к чему привыкли в Европе.
                        • 0
                          Кстати, то ли во Вьетнаме, то ли в Тайланде есть что-то подобное на латте — зеленого цвета. Не в курсе что это и как звать?
                        • –3
                          >>> Азия — это Тайланд, Китай, Гонконг, Индия, Камбоджа, Вьетнам и т.п. страны

                          а Япония к Азии относится?
                          • +2
                            Конечно. Восточная Азия ведь
                            • 0
                              Так вот сообщаю вам что кофе они делают отличный а чай лате здесь не готовят
                              • +1
                                У каждого человека вкус разный.
                                Если я вас правильно понял, то судя по их японскому сайту очень даже готовят www.starbucks.co.jp/en/beverage/tea.html — Full Leaf Chai Tea Latte(Hot)
                      • 0
                        Я из Японии такой растворимый заказывал, Nescafe выпускает. Ничего так, на любителя )
                        • +1
                          Я тоже. Хотел обычный, случайно заказал растворимый. Офигенная штука в любом случае.
                          На любителя, да. В офисе кроме меня ещё один человек от него не плевался.
                        • +1
                          А я вот пил в Индонезии эту зелёную, как вы сказали, «гадость», и с тех пор ужасно раздражает, что здесь, в России, не могу её найти. Так что о вкусах не спорят.
                      • +7
                        Крутяк.
                        Но не сказал бы, что
                        малоизвестный класс уязвимостей «race condition».

                        является малоизвестным :)
                        • +5
                          Его даже в этом самом owasp 10 нет, а в сети полторы статьи про гонки в вебе.
                          • +1
                            Просто не входит в десятку))
                            • +9
                              Это одна из причин почему он малоизвестный. Среди программистов, не рисечеров
                        • +15
                          Да уж. Интересно, какое, по их мнению, должно быть поведение IT специалистов при обнаружении уязвимости, чтоб они не писали «fraud» и «malicious actions»? Получается их служба безопасности пытается наказать честных людей, а нечестные спокойно эксплуатируют или продают уязвимости.
                          • +22
                            Мой опыт подсказывает, что это просто большая компания, где непонятно кто и что творит. И чем перетряхивать все процессы от начала до конца, проще шугануть гика.
                            • +9
                              И зачастую накрывшаяся премия безопасников сейчас намного для них важнее чем украденные пару миллионов долларов у компании через пару лет, когда они уже будут работать в другом месте.
                              • +16
                                Обычно немного не так. У ответственного стоят KPI за конкретные вещи. По ним рассчитывается его эффективность. Делать что-то за пределами того, что идёт в отчёт, как бы можно, но смысла нет. Взвешивая правильную работу по исправлению (написать айтишникам, объяснить, что это, доказать руководству, согласовать с безопасниками, предупредить маркетинг, что-то сделать с действующей акцией, согласовать бюджет на изменения, переназначить приоритеты, в т.ч. своих задач у IT) — это сложно. Шугануть гика с помощью юриста — просто и понятно, можно работать дальше.

                                Или даже так:
                                — Что делать-то будем?
                                — Исправим через полгода.
                                — А сейчас?
                                — Ну там напишите ему что-нибудь, чтобы он на реддите про это не рассказал. Юристу сообщите.
                                А дальше юрист по накатанной, не особо разбираясь, что это было.
                                • 0
                                  Ну так это и есть бич больших компаний Вроде и люди отобраны на работу самые лучшие, но число ступенек которые надо пройти чтобы принять любое решение слишком велико и это демотивирует начисто.
                                  • +2
                                    На примере Сони столкнулся пару месяцев назад. Их же оборудование с друг другом не работало, по отдельности с другими устройствами сторонних производителей работали. Сначала общение с поддержкой в РФ — аутсорсер. Когда на они поняли, что это нестандартное и рецепты типа отключите от сети, обновите прошивку и т.п. не помогают, написали запрос в Бельгию, обещали ответ за 10 дней, а вышло около месяца. Там мило отписались общими фразами используйте оригинальные аксессуары Сони, наши инженеры изучают вопрос, ожидайте обновления ПО. В переводе на нормальный язык — «никогда», только если такие обращения приобретут массовость, то это будет передано дальше.
                                    • +1
                                      В больших компаниях кроме увлеченных профессионалов, попадаются джедаи KPI и просто мудаки на которых можно натолкнуться.
                                      А экстренные решения принимаются быстро, если это не совсем клака. Хороший пример — реакция банков на Heartbleed.
                            • +1
                              Со Сбербанком так не получится?)
                              • +9
                                Попробуйте, как раз со Сбербанком может и получиться
                                • +13
                                  На всякий случай лучше быть гражданином другой страны.
                                  • +1
                                    Тут главная проблема с обналом. Зачем вам миллионы на сбербанке, все равно же найдут. Дропы и проч это все муторно. А старбакс карты -> биткоины -> отмыв работают как часы
                                    • 0
                                      Что мешает осуществить конвертацию сбер -> qiwi / ЯД -> bit coin?
                                      • +1
                                        Там повсюду жоский антифрод. Невозможно нагенерить кучу ЯД аккаунтов, и обменять все надежно для масштабных сумм
                                        • 0
                                          Самый жёсткий антифрод — там нужно много счетов привязанных к разным людям, чтобы сколько-нибудь интересную сумму поиметь, а вот получить доступ к таким счетам — уже реально сложно. В отделение не придёшь с кучей паспортов открывать счета. :)
                                          А в остальном — с их дырами и их политиками безопасности — по несколько тысяч со счёта утащить можно без палева. Чем и пользуются кардеры. Впрочем это уже касается почти всех банков (мало какие банки имеют параноидальный режим защиты клиентов).
                                  • 0
                                    Неее: может помните случаи с жуткими скандалами о непроходящих транзакциях владельцах карт сбера? (хотели люди в др. гос-ве расплатиться, а банк им фигу, а власти той страны «давайте нал или посидите в отделении»).
                                    Тогда они выложили запрос на международную доску, мол «помогите решить проблему». Ну и народ торкался там, предпологал как.
                                    А знакомый прогер, работавший с ораклом и знавший эту багу (с большой вероятностью именно эту багу) предложил им решить, но ессно не за просто так. Ни ответа, ни привета, а приколы ещё с месяц продолжались.
                                    Так что ждать спасибо от сбера можно только уже купив венок, думаю)
                                • +3
                                  Они варят плохой кофе и посредственный чай, а вы такой честный!
                                  Интересно поведение безопасников. Вместо награды и отлаживания процессов поиска уязвимостей добровольцами, они в суд обещают сходить.
                                  Мне кажется вам стоило остановиться на идее, изложенной в последнем абзаце.
                                  • +8
                                    А если безопасники сами этой дырой пользуются? Тогда да, их поведение абсолютно логично.
                                    • 0
                                      Я предполагаю, что поведение «добровольца» может отличаться в зависимости от куша, который он может сорвать.
                                      Если на кону полтора бакса, которые можно только конвертировать в кофе — то поведение одно.
                                      Если на кону миллиард долларов — то добровольца его же собственная жаба может задушить.
                                      Вариант торговли «клонированными» карточками давайте не будем всерьёз рассматривать — гемороя и риска много, а толку мало.

                                      Больше 10 лет назад я сам нашел возможность переводить вебмани с чужого адреса на свой не имея чужого файла приватных ключей кипера, а зная только пароль человека на форуме «околовебманевского» сайта. Поэкспериментировал с одним знакомым (с его согласия). Потом неделю думал, как мне добыть чужие пароли и стать миллионером. Ничего не придумав, «сдал» эту багу в саппорт вебманей и успокоился.
                                      • 0
                                        >Вариант торговли «клонированными» карточками давайте не будем всерьёз рассматривать — гемороя и риска много, а толку мало.

                                        В чем гемор? Торговля заключается в том что юзер видит объявление, идет покупает себе карту, платит нам биткоины и получает в два раза больше денег на свою карту. Мы — полностью анонимны. Отмываем биткоины, концы в воду.
                                        • +1
                                          Ну, для этого же карты нужно нагенерировать, используя дыру?
                                          Писать скрипт, потом еще запускать его через какой-нибудь tor, а потом увидеть то, что старбакс обнаружил в балансах разночтение, а в логах подозрительную активность.
                                          Могло бы получиться так, что на «инфраструктуру» вы бы потратили больше, чем получили бы «выхлоп».
                                          Ну да что я вам это объясняю? Уверен, что вы лучше меня посчитали ситуацию и решили, что честь — дороже.
                                          • 0
                                            Ну все зависит от вероятности того что они заметят. Конечно если у них есть статистика то нашли бы после первых тысяч баксов. А если нет, то врядли бы нашли вообще
                                            • +1
                                              А не должно ли быть в таких системах инструментов для анализа всей денежной массы в системе? То есть если общее количество денег на картах увеличивается быстрее, чем разница совокупного прихода и расхода, значит они возникают из ниоткуда.
                                              • +6
                                                Конечно, должно, но только в таких системах и безусловное использование транзакций для любых денежных переводов тоже быть должно.
                                                • 0
                                                  int x = 5;
                                                  if ( x != 5 ) // если не присвоилось
                                                  {

                                                  }

                                                  Конечно, должен быть анализ. Вопрос в том — как и кем он был писан, как его тестировали и насколько часто его смотрят. Если какой-то скрипт будет вам в течение года выдавать фразу «В Багдаде всё спокойно», то вы просто перестанете его запускать.
                                                • 0
                                                  Впрочем, это капитанство, только так это и должно работать.
                                            • +1
                                              Тем временем официант одной ресторанной сети 8 лет назад торговал скопированными дисконтными картами почти год. Уволился не бедным человеком.
                                              И последнее мое предложение носило скорее юмористический характер.
                                          • +4
                                            > далеко не каждый программист при проектировке программ учитывает такие факторы, как параллельность выполнения кода и его последствия

                                            Только не в том случае, если речь идет о деньгах или других важных данных. Перевод денег должен осуществляться в рамках одной транзакции.
                                            • +7
                                              Тут дело не только в транзакциях. Не раз сталкивался с программистами считающими что они знают что делают, при этом локающие лишь один аккаунт из двух, или локающие без создания транзакции. Там куча тонкостей. Поэтому не стоит быть таким уверенным что «я то эту ошибку не допущу».
                                              • +1
                                                Согласен, существует много нюансов. Поэтому и надо следовать железному правилу — все операции с деньгами только внутри транзакций.
                                                • +2
                                                  Предполагаю, что изначальный вариант карт был без возможности переводов между ними.
                                                  И на этом строилась вся архитектура.
                                                  Когда понадобились переводы — пришлось вставлять костыли в систему, которая не была на это расчитана.
                                                  Хорошо, если дорабатывали те же, что писали первоначальный вариант. А если эту доработку поручили другим? Представляю себе сколько мата там было.
                                                  • 0
                                                    Все хитрее. В базе не должно быть такой записи как «текущий баланс клиента». Баланс должен каждый раз рассчитываться на основе документов-движения средств.

                                                    Т.е. если у аккаунта есть две записи «внесение $10», потом «оплата за кофе $5.5», значит баланс сейчас $4.5. И никакие рейс-кондишены не страшны.

                                                    Конечно, каждый раз считать баланс с начала времен тяжело, поэтому можно и нужно заводить какие-то опорные точки, например на границе месяца, недели, суток, и считать относительно них.
                                                    • +3
                                                      И никакие рейс-кондишены не страшны.

                                                      Ошибаетесь, покупаем две анонимные карты по 5$, организуем 100 параллельных транзакций по переводу 5$ с одной карты на другую, в результате у нас две карты на одной +505$ на другой -500$ (вторая карта просто не успеет «понять» что баланс ушел в минус), выкидываем вторую и выводим деньги с первой в биткоины. К тому моменту когда начнутся разборки у злоумышленников уже будет пару миллионов в биткоинах. Профит.
                                                      • 0
                                                        Хм, ну тоже верно. Технический овердрафт получается.

                                                        Как вариант, можно периодически запускать задачу, которая будет откатывать транзакции, приводящие к овердафту. Хотя, тоже не лучшее решение.
                                                        • 0
                                                          Если все действия записывать в виде последовательных событий, то проблему можно легко решить.
                                                          Прежде чем перевести деньги, поток должен создать событие «хочу перенести 5 баксов» и записать в хранилище. у каждого события будет свой уникальный ИД.
                                                          Далее пробегаемся по всем событиям с самого начала до этого события, и смотрим, хватает ли сумма. Если да, то создаем событие что перевод одобрен.
                                                          Допустим параллельно запустили 2 поток, он то же создал событие заявку. И когда пробегается по всем событиям, он видит что другой поток оставил заявку на снятие раньше. Поэтому из баланса условно вычитаем эту сумму. И когда доходим до нашего события-заявки, то видим, что баланс пустой и создаем событие, что нашу заявку выполнять не нужно.
                                                          3 поток видит что 2 поток создал заявку(-5 баксов) и потом отменил(+5 баксов), в итоге 2 поток никак на баланс не повлиял.
                                                          • 0
                                                            Я рассмотрел вариант с SELECT… FOR UPDATE, которая собственно и придумана для конкуретной выборки.

                                                            пользователь А, хочет перевести деньги пользователю Б.
                                                            он делает select… for update для своей строки и потом select… for update для строки пользователя Б.
                                                            делает апдейты, и комитит изменения, освобождая тем самым строки.

                                                            Но тут возможна взаимоблокировка:
                                                            когда пользователь А хочет перевести деньги пользователю Б, а пользователь Б — наоборот, хочет перевести деньги пользователю А.
                                                            1) пользователь А блокирует запись А
                                                            2) пользователь Б блокирует запись Б
                                                            3) пользователь А пытается заблокировать запись Б, которая уже заблокирована пользвателем Б, следовательно пользователь А подвисает в состоянии ожидания.
                                                            4) пользователь Б пытается заблокировать запись А, которая уже заблокирована пользователем А,
                                                            ждет, когда она разблокируется… а она не разблокируется, потому что пользователь А ждет, когда разблокируется строка Б (смотри шаг 3).

                                                            Как этого избежать?

                                                            Я предлагаю всегда первым лочить строку с наименьшим айдишником.
                                                            Если у строки А айдишник меньше чем у Б, то её всегда лочить первой, независимо от того, какой пользователь, куда хочет перевести деньги.
                                                            • –1
                                                              Я предлагаю всегда первым лочить строку с наименьшим айдишником.

                                                              Вообще, надо лочить обе строки сразу. Но такая вещь в параллельном программировании называется deadlock, по методам борьбы с ней написана тонна книжек и придумана куча теорий. Если кратко полностью избавиться от deadlock'ов практически невозможно, но можно уменьшить шанс их появления до очень маленького.
                                                              • 0
                                                                А вы мой комент читали?
                                                                • 0
                                                                  Читал. В чем проблема сделать во время транзакции SELECЕ… WHERE id in (запись_А, запись_B) FOR UPDATE? Вообще, методы правильных организаций критичных транзакций и блокировок — тема избитая годами исследований, не стоит там изобретать велосипедов.
                                                                  • 0
                                                                    А я и не изобретаю, я использую старый «select for update» для этого.
                                                                    Ну если можно лочить сразу две строки с помощью SELECT FOR UPDATE..., то хорошо.
                                                                    • 0
                                                                      Есть же в mysql и транзакции и Atomic операции, которые надо только правильно настроить и использовать, они сами все блокируют и изолируют, ручная реализация транзакций и блокировок для критичных финансовых операций и приводят к подобным уязвимостям.
                                                                      • 0
                                                                        >>ручная реализация транзакций и блокировок
                                                                        вы так говорите, как будто я сам этот select for update придумал.

                                                                        вообще-то у них в документации MySQL dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
                                                                        как раз и разбирается некий гипотетический пример c select for update

                                                                        По вашей ссылке я не нашёл противоречия способу с select for update.
                                                                        Только перед select for update надо отключить autocommit
                                                                        • 0
                                                                          И кстати, по вашей ссылке упоминается LOCK TABLES, а select for update лочит только строки, что лучше.
                                                              • +1
                                                                Вы описали обычные транзакции с блокировкой ресурсов.
                                                                • 0
                                                                  Ну не совсем. Во первых «блокировка» будет только в случае, если денег на счету не хватает. А если там много денег, то эти операции будут выполнены без всяких блокировок параллельно. Причем всю логику можно легко настроить под себя.

                                                                  Во вторых, я бы не стал использовать реляционную модель с операциями UPDATE/DELETE при работе с денежными средствами. Если посмотреть как работают бухгалтеры, то заметите что они ведут отдельные записи прихода и расхода. И уже потом считают сколько денег было на определенный момент. Операции UPDATE сотрут такого рода информацию.
                                                                  • 0
                                                                    Эээ, просто надо настроить правильные уровни изоляции транзакций СУБД и вообще правильно использовать транзакции, все вопросы по безопасному переводу денег давно уже изучены и внедрены во все популярные СУБД, просто нужно внимательно изучать документацию к ним.

                                                                    P.S. Кстати, транзакции есть не только в СУБД, но и языках программирования.
                                                        • +3
                                                          Так может напишите пост, как не допускать race condition?
                                                    • +9
                                                      Надо отдавать отчет, что отвечал вам, скорее всего, не ответственный представитель компании, а низкий чин, который за наличие такой уязвимости в системе компании мог поплатиться премией, а то и должностью. Желание «припугнуть» вас могло быть продиктовано страхом перед тем, что информация просочится наверх.

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

                                                      Ну и, собственно, как насчет того, чтобы приложить усилия, чтобы об этом посте, а лучше, наверное, о его англоязычной версии на каком-нибудь популярном сайте, узнали в компании где-нибудь повыше? Кейс-то ого-го. Те, кто считает, что инициатива наказуема, должны быть наказаны :-D
                                                      • +2
                                                        >Тогда-то бы, может, засуетились.

                                                        Не рассматриваете, что они засуетятся не в том направлении?
                                                        И начнут жестко пресовать через ментов и попытаются закрыть.
                                                        Вместо устранения уязвимости.
                                                        • 0
                                                          На Западе-то — вряд ли. Представьте, допустим, что какой-то всемирно известный спец по безопасности, выступающий на конференциях, любимчик публики, на досуге это обнаруживает. И переводит себе 5$ — цену одной чашки кофе. Компания бы выставила себя на посмешище. Это при условии должной публичности, конечно.
                                                        • 0
                                                          Я примерно о том же писал выше. Только лучше всё-таки обратиться по инстанции к руководителю этого кренделя, и дальше, пока не отнесутся серьёзно. Кстати, в результате «гонки» деньги можно ведь и потерять — а вот тогда уже их самих можно будет засудить.
                                                        • +16
                                                          Символичная уязвимость.
                                                          Brian Goetz в книге «Java Concurrency in Practice» в главе 2.2.1. Race Conditions как раз объясняет проблему «race conditions» на примере двух заведений Starbucks
                                                          books.google.com.ua/books?id=EK43StEVfJIC&pg=PT43&lpg=PT43&source=bl&ots=uoWzy2rTjz&sig=ip9dsA3gjzd7KoyBebrVfSkEMyc&hl=ru&sa=X&ei=4tFdVbuqGMSssgHx1YG4Dg&ved=0CB0Q6AEwAA#v=onepage&q&f=false
                                                          • +1
                                                            > высосать пару миллионов долларов из этой дружелюбной фирмы со сладким кофе

                                                            Купить джип, написать по заднему стеклу «Высосал из дружелюбной фирмы со сладким кофе», и ездить себе с улыбкой!

                                                            Ах да, неплохо бы то же сделать и с картой какой-нибудь дружелюбной топливной компании, чтобы джип заправлять ;)

                                                            P.S. Откровенно, ожидал финала «дырку заткнули, а моя карта была помечена как делающая 100% скидку лично мне».
                                                            • 0
                                                              Автор так и сделал. Не будет же он кричать об этом на весь интернет.
                                                              • +5
                                                                Нет, ни в коем случае. Карты я уничтожил, так что они мне еще должны $8.30
                                                                • 0
                                                                  *Усиленно подмигивая обоими глазами* Да-да, конечно, о таком в публичнм месте громко не говорят… Но хоть бы намекнули, что с кофе у Вас проблем более нет, как-то так… Интригу, интригу надо держать! «Люди любят тайны, творите о себе легенды, правду пусть узнают те, кому надо!»
                                                                  • 0
                                                                    Не пью кофе. Единственная вещь интересующая меня в старбаксе это бутылка воды и бананы
                                                                    • 0
                                                                      Как-то дороговато за водой в Старбакс ходить…
                                                                      • +4
                                                                        За бананами еще дороже.
                                                            • 0
                                                              Неужели, если постоянно переводить средства с карт, описанным в статье способом, и накрутив ну пусть не $1000 000, а хотя бы $1000, то это останется незаметным?

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

                                                                А что они увидят? Куплено карт на 1 млн. $, снято на 900 тыс. $. Дело в том что можно купить карту год назад и только сейчас снять деньги, можно купить карту и вообще её потерять, то есть ничего с неё не снять, 100% совпадения в одном месяце куплено/снято никогда не будет. А если и увидят, то будут долго и муторно искать причину ошибок в первую очередь в построении отчетов. А если там ещё проводятся всякие акции «купи пять карт по цене шести», то концов вообще не найдешь. К тому моменту когда найдут дыру в безопасности злоумышленики давно будут отдыхать на собственном острове.
                                                                • –8
                                                                  Надеюсь, вам такими системами никогда заниматься не придется.
                                                                  • +3
                                                                    Занимался :), поверьте вытащить из статистики приходов и расходов действительный текущий баланс по всей крупной корпорации с филиалами по всему мире ОЧЕНЬ сложно, сама по себе операция синхронизации десятков СУБД довольно сложная.
                                                                    • 0
                                                                      У старбакса карты действуют в пределах одной страны
                                                                      • +2
                                                                        Это не так важно, главное что транзакций где-нибудь в США до… фига. Распределенные базы, ошибки при оплатах и переводах в полночь, откаты банковских транзакций, все возможные баги в отчетах и системах. Увы, точное совпадение всех цифр прихода/расхода по всем отчетам за день в больших международных компаниях это скорее фантастика чем обычная практика.
                                                                        • 0
                                                                          Какие распределенные базы и десятки субд? У старбакса в США 12000 кофеен, большинство посетителей, ну, на глаз, платит всё равно наличкой или банковской картой, очень сомневаюсь, что из одной кофейни оплата старбакс-картой может происходить чаще, чем раз в пару минут. Это в пике 100 rps (думаю, это сильно завышенная оценка), нафига там что-то городить?
                                                                          • 0
                                                                            FYI где то читал 40 или 60 процентов ВСЕХ денег в системе вращаются через гифт карты.
                                                                            • 0
                                                                              40% недалеко от правды:
                                                                              Every week we process over 8 million mobile payment transactions. And for all transactions in our stores we are now up to over 18% are via mobile payment. It was amazing that’s over half of our card payments are now through the app.
                                                                              seekingalpha.com/article/3015706-starbucks-sbux-ceo-howard-schultz-hosts-2015-annual-meeting-of-shareholders-conference-transcript

                                                                              То есть всего платежей по картам в неделю около 15 миллионов, то есть около 2 миллионов в день, то есть и 100 rps в пике там вряд ли конечно есть
                                                                  • 0
                                                                    Входящие/исходящие остатки, поступления/снятия, а также всякие акции/скидки в отчетах должны быть, где-нибудь, да разницу или несоответствие цифр можно будет увидеть, да и потом историю отчетов никто не отменял и всякие графические выписки тоже.
                                                                    • +3
                                                                      Если фирма маленькая да можно, если идут миллионы транзакций сложно. Все конечно можно сделать, но слабо вериться что фирма забившая на банальные транзакции, будет заниматься разработкой подобного глобального аудита.
                                                                      • 0
                                                                        Вы серьезно решили мониторить глазами все миллионы транзакций?
                                                                        Скрипту аудита глубоко фиолетово сто там транзакций или миллион.
                                                                        Он выявляет аномалии в движениях.
                                                                        Тут как бы такой момент. Это не фирма забила на транзакции.
                                                                        Это ошибка маленького винтика в системе.
                                                                        А винтиков в таких больших системах много.
                                                                        • +4
                                                                          Нет, не глазами, просто в больших системах все становится сложнее. Со стороны это кажется простым написать один sql запрос/скрипт и все, на самом деле там нужно решать кучу проблем, как-то:
                                                                          1) согласования таймзон разных серверов,
                                                                          2) отмененные банковские транзакции,
                                                                          3) отмененные внутренние транзакции,
                                                                          4) учет курсов валют в случие разных стран,
                                                                          6) обмен данными между разными репликами СУБД,
                                                                          7) учет ошибок, востановлений данных при сбоях СУБД и т.д.
                                                                          8) учет ошибочных переводов, ошибочных списаний денег в кафе и т.п.
                                                                          9) и т.п. и т.д.

                                                                          Казалось бы банки в банковское ПО вкладывают миллионы и тем не менее оно далеко не всегда способно все решать в автоматическом режиме, зачастую оно не может ответить на вопрос на сколько денег у банка на данный момент.

                                                                          Плюс, ну положем обнаружится появление 1 тыс.$ из ниоткуда и тут возникает вопрос стоимость команды в США из аналитиков, программистов, тестеров по поиску и исправлению таких ошибок в огромных системах может измерятся десятками и сотнями тысяч.$, не считая нагрузки на оборудования и т.п. И тут перед бизнесом возникает вопрос «а оно того стоит?»
                                                                • –3
                                                                  А самый прикол ведь в том, что Старбакс действительно получает больше денег на свой счет и тупо генерит сам себе сколько захочет виртуальных долларов.
                                                                  • +1
                                                                    Я вас понимаю и поддерживаю. Получить адекватный ответ не всегда просто. Например с ноября 2014 пытаюсь достучаться до одной компании, которая не защитила паспортные данные своих клиентов. Фирма не маленькая, судя по данным, но ответа по теме так и не получил. Выкладывать на хабр такую вещь до исправления довольно опасно, т.к. могут пострадать невинные люди, а оповестить надо.
                                                                    • 0
                                                                      Чем крупнее матодонт, тем сложней его вращать) Вопрос всегда один: в мотивации. Если найти в паспортных данных работников данной орг-ции глядишь и расшевелятся, если правильные слова подобрать.
                                                                      • 0
                                                                        Напишите руководителю приблизительно так: ваша организация не защитила паспортные данные своих клиентов, таким образом нарушила 152-ФЗ.
                                                                        Если и такое обращение не сработает, пиши в прокуратуру о факте нарушения.
                                                                        • 0
                                                                          Сработало, но через службу поддержки.
                                                                        • 0
                                                                          Мда. Все как обычно, нашару делается.
                                                                        • +3
                                                                          Esli oni tak neblagodarno sebya vedut — stoit napisat' business-ethics complaint: businessconduct.eawebline.com
                                                                          • +1
                                                                            Ого, ты уже в Калифорнию перебрался. Можно где-то почитать про опыт переезда?
                                                                            • 0
                                                                              жесть конечно читать «состояние гонки»
                                                                              • 0
                                                                                В студенческие времена пополнял интернет местного провайдера использую похожую уязвимость. Купил карточку на 25, пополнил на 200. Но провайдер был не очень, через пару месяцев перешел на другой так и не использовав «вирутальные» деньги.
                                                                                • 0
                                                                                  • +7
                                                                                    О, про вас BBC «раструбили»:
                                                                                    www.bbc.com/news/technology-32844123
                                                                                    • 0
                                                                                      Меня удивила поощрительная риторика в статье на BBC. Даже не смотря на тренд в их прессе по демонизации русских хакеров и русских вцелом.
                                                                                      Замечательная статья, замечательная уязвимость, замечательный итог.
                                                                                      Очень надеюсь, что старбакс не прибегнет к давлению на автора.
                                                                                      • 0
                                                                                        Ну вообще-то, справедливости ради, ни слова в статье что хакер русский не прозвучало, да мы-то знаем что имя Егор русское, но 99.9% мира — нет. ИМХО.
                                                                                        • +1
                                                                                          А что мешало им написать: хакер, предположительно, работающий на российское правительство, взломал старбакс, после чего обнародовал способ взлома с целью обрушить акции компании?
                                                                                          • 0
                                                                                            Ну и зачем кому-то нужна такая явная ложь, если у любого СМИ есть сто один способ обмануть, сказав чистую правду и ничего кроме правды?
                                                                                            • +1
                                                                                              Попробуйте доказать, что вешеобозначенная версия публикации является ложной. Да и кто на этот счёт будет там беспокоиться?
                                                                                              Не знаю как Вы, но не питаю иллюзий о неполживости западных (ди и остальных) масс-медиа.
                                                                                              Чем больше ложь, тем скорее в нее поверят — Адольф Гитлер

                                                                                              ru.wikipedia.org/wiki/Большая_ложь
                                                                                              Впрочем, это не относится к теме публикации, поэтому не думаю, что следует продолжать.
                                                                                        • –2
                                                                                          Тренд, скорее, против россиян и особенно правительства РФ.
                                                                                          К русским отношение не изменилось в последние годы.
                                                                                      • 0
                                                                                        Хм, ну получается, всё что вы получили за свою работу — кофе по сниженной цене. А по большому счёту его следовало вернуть прямо на кассе без объяснения причины.

                                                                                        Кстати, не так давно я случайно обнаружил уязвимость в одной платёжной системе. После вашей статьи тоже жду от них привета.
                                                                                        • 0
                                                                                          z-payment, ruru, rbkmoney,…? ))
                                                                                        • –2
                                                                                          ОМГ, откуда столько плюсов за достаточно обычную для этого сайта статью?)
                                                                                          • +2
                                                                                            Вообще-то, обычной она была если бы это был перевод статьи какого нибудь «Джонса как он взломал старбакс». В этой статье автор утверждает (и нет оснований ему не верить), что именно он лично взломал известную всему миру компанию и описывает процесс. Подобных статьей на хабре хорошо если несколько за год будет.
                                                                                          • 0
                                                                                            Интересно, а что заставило произвести и 6 попытку после 5 неудачных?
                                                                                            Я к тому, что уязвимость же могла проявиться не на 6, а на 106 раз.
                                                                                            Aka, нельзя быть на все 100 уверенным в наличие race-condition`а.

                                                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.