Введение
На этой неделе Тинькофф брокер устранил серию уязвимостей, которые в совокупности позволяли выводить на счёт карты суммы, в десятки раз превышающие размер депозита.
В этой статье поговорим о некоторых лайфхаках и исправленных уязвимостях, а также попытаемся понять, как устроена маржинальная торговля у Тинькофф брокера.
Вся информация предоставлена исключительно в ознакомительных целях и не является инвестиционной рекомендацией. Автор не несёт ответственности за любой возможный вред, причиненный этим материалом. Уязвимости, позволяющие нанести ущерб брокеру, на момент публикации статьи исправлены.
Основные определения
Торговля в лонг — это ставка на повышение цены. Когда трейдеры хотят заработать прибыль на росте цены актива, они торгуют в лонг.
Торговля в шорт — это ставка на понижение цены. Когда трейдеры хотят получить прибыль за счет снижения стоимости актива, они торгуют в шорт.
Маржинальная торговля
Маржинальная торговля — торговля с использованием заёмных денег, предоставляемых брокером спекулянту в кредит под залог определённой суммы — маржи.
Брокер сам определяет список ликвидных бумаг и ставки риска по ним.
Список ликвидных инструментов у Тинькофф брокера можно посмотреть здесь.
Ставка риска, например, в 20% показывает процент собственных средств в размере позиции.
То есть, если есть сумма 10000₽, то максимальная сумма с учётом заёмных средств, на которую можно купить текущую бумагу будет 10000₽ / 20% = 50000₽.
Также можно сказать, что кредитное плечо по текущей бумаге — 1 : 5.
У Тинькофф брокера ставки риска бумаг по лонговым операциям не меньше, чем по шортовым.
Не баг, а фича: увеличиваем размер шорта в два раза
Данный лайфхак существует уже достаточно долгое время, брокер не спешит его исправлять.
На моем депозите около 3200₽.
Рассмотрим лайфхак на примере акций компании ПИК.
Алгоритм
-
Покупаем максимальное количество акций в лонг
Как можно заметить, на собственные средства я могу купить только 3 бумаги. Ставки риска по бумаге 22.56% в лонг и 25.44% в шорт, что соответствует тому, что с учётом заёмных средств можно купить 14 и продать 12 акций.
Пока всё правильно: теперь можно продать 14 своих плюс те же 12 заемных акции. В сумме 26 штук.
-
Выставляем лимитную заявку на продажу на то количество бумаг, которое доступно продать без учёта плеча. В моём случае это 14 акций. Заявку нужно выставить по цене немного выше текущей. В моём случае цена акции 914₽, я выставил заявку по 915₽.
Как можно заметить, теперь система предлагает выставить заявку ещё на 26 акций.
-
Выставляем на продажу то количество акций, которое доступно с плечом
После того, как заявки будут исполнены, наши 14 акций продадутся и 26 бумаг пойдут в шорт.
На первом скриншоте видно, что изначально система разрешала нам продать в шорт только 12 акций, но после нехитрых манипуляций мы увеличили размер шорта более чем в два раза, и теперь ставка риска по этой бумаге составляет чуть больше 10%Если же теперь отменить заявку на продажу 14 акций, то система не разрешит выставить такую заявку снова, нужно проделывать манипуляции заново.
Исправленная уязвимость: как увеличить плечо в десятки раз и «зачислить» заёмные средства на брокерский счёт
Данный кейс я поймал случайно и потом ещё день пытался воспроизвести. Стало интересно, что будет, если выставить две встречные заявки на покупку и продажу по единой цене. Если следовать логике, я должен купить акцию сам у себя, что странно.
Как работает сейчас?
Выставляем заявку на покупку одной акции по 916,4₽ и сразу же пытаемся продать себе по той же цене с плечом 13 акций.
Результат вполне ожидаемый: заявка на продажу 13 акций сервер отклонил:
Как работало раньше?
Рассмотрим тот же кейс: выставляем заявку на покупку одной акции, а также заявку на продажу 13 акций.
В таком случае на моём счету формально было бы минус 13 акций, при этом в портфеле эти акции не отображались бы, а баланс оставался бы неизменным.
Ночью при пересчёте сделок система бы поняла, что на самом деле на биржу заявка не была выведена и отменила бы эти -13 акций.
Но до конца торгового дня система считала, что я нахожусь в шорте на 13 бумаг, поэтому она давала мне более большое плечо по этой акции на покупку в лонг, чтобы я мог покрыть эти 13 акций и купить ещё 14 акций на свои деньги (см. первый скрин).
Итого я в сумме мог бы купить не 14, а 27 акций.
Ночью система снимает «фейковые» -13 акций, но в портфеле остаются все те же настоящие 27 бумаг.
Чтобы было понятно наглядно, покажу некоторые скриншоты, которые остались у меня с тестирований, на момент которого в моем портфеле было 4790$.
Можем видеть, что таким образом получилось купить 2211 акций Vipshop на сумму 62151$. То есть плечо здесь уже более, чем 1 : 12
Размер плеча, в теории, можно было увеличить насколько угодно: если мы выставим заявку на покупку одной акции и по этой же цене продадим ещё 13 акций из примера выше, то система уже будет думать, что у нас -26 акций, соответственно, она даст плечо на покупку этих 26 бумаг плюс 14 акций на собственные средства. Итого уже 40 акций.
С большим плечом дела пошли в гору, мой баланс на спекуляциях удалось увеличить до 6384$.
На скриншоте видно, как с помощью тех же манипуляций получилось увеличить плечо по Амазону почти до 200 000$. Таким образом оно уже стало более чем 1 : 30. Напомню, максимальное плечо у Тинькофф колеблется от 1 : 4 до 1 : 5.
Но вспоминаем, что ночью Тинькофф после пересчёта уберёт такое плечо и вполне вероятно, что на утро нас будет ждать маржин колл.
Маржин колл — такое состояние портфеля, при котором баланс становится меньше начальной маржи. При этом, если не пополнить счёт, брокер автоматически начинает продавать бумаги.
Что интересно: Тинькофф прислал маржинколл, хотя позиция прибыльная.
«Зачисляем» заёмные средства на брокерский счёт
Для того, чтобы заёмные средства зачислились на брокерский счёт, достаточно было самому вызвать маржин колл: очевидно, что никакой маржи не хватит, если, имея 6500$ купить бумаг на 300 000$.
При срабатывании такого маржин колла сразу после покупки, система начинает автоматически закрывать позиции. Но ведь до ночи система думает, что все «фейковые» заявки являются настоящими.
Поэтому, сделав -30 фейковых акций Амазона способом выше, я купил 40 акций на сумму более 120 000$. Сразу после покупки сработал маржин колл, и система моментально продала купленные 40 акций. Вместе с этим система сразу же отменила заявку на продажу 30 акций (помним, что до ночи система не знает, что заявка фейковая) и зачислила их мне на счёт. Вместе с 30 акциями на счёт зачислилось и 6 947 118₽ и стоимость ликвидного портфеля увеличилась до 7 337 776₽
Таким образом, получилось увеличить депозит в 10 раз. Конечно, если вывести эту сумму, то на утро, когда отменятся все сделки, которые не были выведены на биржу, образуется отрицательный баланс на брокерском счёте. Однако, для злоумышленников это не было бы проблемой.
Все сделки, кроме «фейковых», были выведены на биржу, что подтверждается в брокерском отчёте.
Заключение
Таким образом, удалось столкнуться с необычной business logic уязвимостью, которая оказывает огромное влияние на брокера, а также показывает, насколько сегодня могут быть критичны недостатки в информационной безопасности.
Удобная система Тинькофф брокера с выводом средств с брокерского счёта в любое время суток показала, какой побочный эффект может быть достигнут.
Автор: HackerOne