Британский исследователь Пол Прайс (Paul Price) обнаружил ошибку в местном приложении Domino’s Pizza. Баг позволял исследователю заказывать пиццу бесплатно, но будучи сознательным white hat хакером, Прайс не стал умалчивать об уязвимости в личных целях.
API британской версии приложения Domino’s Pizza для Android оказалось дырявым: Прайс заметил, что информация о платежах обрабатывается не совсем корректно. Как правило, обработка платежей происходит на стороне сервера, однако приложение Domino обрабатывало платежи самостоятельно, прямо на стороне клиента. Когда исследователь решил изучить проблему детальнее, он выяснил, что приложение можно обмануть и заставить его поверить, что недействительный платеж на самом деле прошел.
Для теста Прайс ввел в приложение номер карты Visa 4111111111111111 и получил предсказуемый ответ с ошибкой.
Затем исследователь попытался подменить значение атрибута <reason> на ACCEPTED и <status> на 1 (это означает, что транзакция прошла успешно). К удивлению Прайса, его тестовый заказ был успешно принят, а платеж отмечен как осуществленный. Исследователь по-прежнему не верил, что всё так просто, он решил, что информацию о заказе проверят, и тогда точно раскроется подмена. Однако вскоре статус заказа в приложении изменился, а через 30 минут Прайсу как ни в чем не бывало доставили еду, общей стоимостью £26.
«Первой моей мыслью было – класс! Второй мыслью было — черт», — пишет Прайс в своем блоге.
В итоге исследователь сообщил курьеру, что произошла какая-то ошибка, он вообще не вводил в приложение данные банковской карты и с самого начал хотел расплатиться наличными. Оплатив счет наличными, Прайс очистил свою совесть и пошел сообщать о найденной уязвимости разработчикам Domino. В настоящее время ошибка уже устранена, а представители компании поблагодарили исследователя за бдительность.
Оказалось, что логика приложения примерно такова:
Значение placeOrder() отправляется Domino API как HTTP-запрос, где order_id это номер, который присваивается заказу в процессе создания, а <merchantreference> получается из XML-запроса выше. По идее Dominos стоит перепроверять эти данные на стороне сервера, однако этого не происходит, ведь клиент никогда не врет. В результате, приложению можно было скормить практически любую информацию о платежах.
Фото: Scott Bauer