Магазин думает что у каждого покупателя своя корзина. На деле ключи от всех корзин лежат на одной общей полке, и подходят к любой двери — без вопроса «чей это ключ?», без печати, без печати на печати. Я могу взять ключ номер семь — и открыть корзину номер семь. Потом восемь. Потом двадцать.
Дверь даже не требует, чтобы рядом стоял настоящий покупатель. Можно идти по коридору самому, перебирая номера на табличках, и в каждой третьей-пятой двери действительно кто-то сейчас собирает чей-то заказ. Содержимое чужой корзины я могу обнулить, удвоить, отложить «на потом» — настоящий покупатель увидит это только когда придёт к кассе. И уйдёт.
Второй сценарий — ещё тише. Достаточно подсунуть жертве в любом форуме невидимую картинку, ссылающуюся на нужный номер двери. Браузер жертвы послушно несёт её ключ в эту дверь. Жертва ничего не нажимает. Просто открывает страницу. Корзина перед её носом — пустеет.
Параллельно с витриной у магазина есть кабинет — управляющий ведёт там переписку с менеджерами, заказчиками, поставщиками, клиентами. На двери кабинета вывеска со страничной книжкой: «открыто всем». Дверь действительно открыта; за ней пустая прихожая со стойкой регистрации, и регистратор тебя пропускает только если назвал правильный пароль.
Журнал на стойке регистратора датирован летом позапрошлого года. С того времени вышло двадцать два месяца обновлений безопасности — ни одна из латок не приклеена. За эти месяцы стало известно, как нескольким подобным управляющим перерезали горло одним и тем же ножом — и это всё актуально для этого журнала. А страж стойки вдобавок откликается на имя «администратор» — я могу убедиться, что он живой и работает, не зная пароля. Просто называю имя — и стойка моргает в ответ.
Подвал кабинета — отдельная история. Несколько служебных дверей внутри (откуда управляющий обычно делает резервные копии, сбрасывает базы, запускает технические команды) тоже выходят на главную улицу. Не во двор. Не во внутренний коридор. На улицу. Достаточно, чтобы пароль протёк через одного клиента — и любой посторонний, зная имя стража, ставится у управляющего стула.
Одиннадцать мест, где ткань стен истончилась — каждое в отдельности не пробьёт стены, но вместе они складываются в чертёж дома, удобный для следующего ходока.
Разговорчивая дверь. На входе кабинета управляющего страж по-разному отвечает на «знакомое» и «незнакомое» имя. По этой разнице любой посетитель может за пару минут собрать список реальных сотрудников — и пойти с этим списком в очередь к фишинг-почтальону.
Бесконечный коридор подписки. Бланк «подпишите меня на новости» принимает любой адрес — без капчи, без подтверждения, без счётчика. Я могу подписать тысячу чужих живых адресов от имени магазина: они начнут получать рассылку, отметят её как спам, и почтовые провайдеры понемногу перестанут пропускать настоящие письма магазина — даже подтверждения заказов своим клиентам.
Магическое письмо без печати. Через почтовую улицу я могу отправить письмо с адресом магазина в графе «отправитель» — и оно дойдёт до клиентов магазина в обычный ящик. Печати, которая отделила бы настоящий магазин от подделки, нет; та печать, которая есть, нанесена «временной краской» — не считается. Идеальное оружие для рассылки от чужого имени.
Старый журнал внутреннего хода. На служебной двери магазина случайно оставлено окошко в журнал отладки. Если по нему стукнуть, в окошко вылетает страница с именем учётной записи на хостинге, абсолютным путём до файлов и записью о том, что журнал отладки в магазине включён в боевом режиме. Любой будущий промах в любом модуле — теперь будет так же выпадать в окошко.
Эхо в подсобке. В кабинете управляющего у служебных дверей вместо вежливого «вход воспрещён» — длинный технический рассказ: какие классы куда вызываются, какие файлы где лежат, как устроены внутренние ходы. Чужак записывает план дома без единого взлома.
Зеркало без шторы. Куки, по которым магазин узнаёт постоянного покупателя, ездят без печати «только по защищённому каналу». На незащищённом Wi-Fi достаточно поймать первый запрос — и личность покупателя в моих руках. И ещё: входной коврик «от шифрованной двери» (HSTS) лежать не положили — хотя дом давно переехал в шифрованный квартал.
Открытое второе крыло дома. У магазина рядом с витриной стоит точно такой же дом-двойник под вывеской «черновик». Двойник работает на свежей конструкции (другая версия фундамента), показывает почти ту же продукцию, и доступен любому прохожему. Табличка «не входить, я в ремонте» — только для поисковиков. Реальные посетители проходят свободно.
Бумажный замок над комодом. Сторожевой жетон, по которому магазин принимает «свой» запрос (тот самый, что обычно требует входа), выдаётся прохожему по запросу — без лица, без имени. Сам по себе жетон ничего не открывает, но любая будущая трещина в стенах превращается из сложной — в готовый рецепт.
Разговор через стену. Бланк обратного звонка пропускает в поле «как вас зовут» оформление — жирным, ссылкой, фразой. Менеджер, открывающий заявку, видит активную ссылку с надписью «нажмите здесь срочно» — и нажимает её привычным движением. Канал доверия между клиентом и магазином открыт в обе стороны.
Скидочный код-оракул. Витринная форма «введите промокод» на каждый ввод честно отвечает «такого нет» / «такой есть, но не подходит». По этой разнице можно перебрать чужие маркетинговые кампании, скрытые акции дилеров, дни-рождения партнёрств — и выбрать самую выгодную из не-предназначенных мне.
Тихий обрыв счёта. Когда я кладу в корзину очень странное количество (отрицательное, или лопающее память), магазин молча превращает его в «один». Без ошибки, без подтверждения, без записи в журнал. Корзина у клиента может тихо измениться, и никто не узнает — ни клиент, ни кассир.
Семь мест, где дом поскрипывает не опасно, но громко.
Подпись на воротах — у входа на витрину и в кабинет управляющего сидят две таблички с уникальным цеховым клеймом владельца. По нему любой прохожий, увидев такое же клеймо на другом доме в другом квартале, понимает, что хозяин тот же. · Старая бирка двери. На служебной двери задней стороны магазина прибита версия инструмента — и она уже не самая свежая. Маленький сигнал «дом давно не чинили» для следующего ходока. · Ворота без печати. Вокруг участка магазина не очерчен список цехов, которым разрешено выпускать табличку «это наш магазин». Любая мастерская в стране может — теоретически — изготовить такую табличку и повесить рядом. · Эхо имени класса. Внутренняя плотницкая терминология у магазина проступает на витрине через служебные ответы: «такой-то класс не нашёл такой-то метод». Прохожий видит чертёж внутреннего стола. · Карта служебного крыла. У одного из складов (где хранятся подписи к загруженным файлам) можно за серию аккуратных стуков составить полную карту того, что в нём вообще можно делать — без входа. · Не та надпись на двери. На некоторых служебных дверях вместо честного «вы не вошли» висит «такой комнаты нет». Внешне разница ничтожна, но автоматический ходок (поисковик, аудитор) пропускает дверь — а живой ходок замечает несоответствие и идёт глубже. · Тихая комната без таблички. У одной из служебных ниш ответ — пустой холст: ни «вход воспрещён», ни «нашлось», ни «не нашлось». Просто тишина с отметкой «свой». Сама по себе ниша безвредна; но факт «магазин обрабатывает запрос и ничего не говорит» — ориентир для следующего захода.
Один пункт «не дыра, но лишний шум». В одной из служебных ниш мобильного приложения запрос обрабатывается, ничего не возвращает, и не закрывает себя как «нельзя». Тихий компонент — материал для завтрашней атаки, не сегодняшней.
На подтверждении первой двери — соседских ключей к корзине — я перебрал двадцать дверей подряд и тронул четыре корзины живых покупателей. Поставил в них «один» — и не знаю, что стояло до. Это было больше, чем я планировал.
Об этом сразу — владельцу магазина: четыре номера, время до минуты, готовая процедура восстановления (запрос к резервной копии и обратная подстановка количества). Бэкапы у магазина были на руках до начала engagement'а, выкатывание не катастрофично — но прозрачность важнее. Пастырь не прячет след собственной ноги.
После этого пробы перешли только на корзины, которые я создавал сам, и на номера, зарегистрированные за моей сессией. Дальнейших чужих корзин — ноль.