]]>
]]>
Рейтинг@Mail.ru

Можно ли обмануть ваш интернет-банк при округлениях валют

Материал из Веб программирование.

Перейти к: навигация, поиск

Компании Acros security, которая занимается тестами на уязвимости в системах опубликовала статью:

Содержание

Шикарная скидка, которую банк вам не предоставлял

Мы делаем тесты на проникновение в различных критических средах более 12 лет и за это время повидали немало серверов интернет-банкинга с самыми разными уязвимостями, включая ошибки, позволяющие клиентам забирать себе деньги с чужих счетов, устанавливать на своих счетах бесконечный овердрафт, переводить на чужие счета отрицательные суммы (фактически высасывая оттуда деньги) и даже, как ни кошмарно это звучит, делать из воздуха деньги в бесконечных количествах. Критические ошибки такого рода вовсе не так редки в финансовых системах, как хотелось бы надеяться – на самом деле, по нашему опыту, хотя бы один подобный дефект присутствует и в вашем интернет-банке, если его не тестируют регулярно и тщательно разные аудиторы, имеющие значительный багаж знаний о банковских атаках и уязвимостях. Как правило, если в техническом задании банка на пен-тест есть слово "сканирование" или список конкретных IP-адресов, которые нужно протестировать, вместо описания программного кода и логики приложений – можно предсказать, что в его системе дистанционного обслуживания хватает логических ошибок безопасности.

Такие ошибки могут позволить сетевому вору забрать много денег со счетов клиентов банка, а то и у самого банка, но в большинстве стран это уголовно наказуемо.

Легальное эксплуатирование проблем безопасности

Однако существуют другие виды проблем безопасности в финансовых системах, которые можно эксплуатировать совершенно легально. Одна такая проблема кроется в способе округления сумм и позволяет пользователю фактически манипулировать курсами валют, чтобы продать, например, 100 долларов США за 100 евро, хотя вообще-то 100 евро стоят около 130 долларов.

Насколько нам известно, эта проблема была впервые описана в 2001 году в статье "Асимметричное округление валют" ("Assymetric Currency Rounding", компания Gemplus), а также в 2008, в статье "Как взломать банк, или Уязвимости обработки цифровых данных в финансовых приложениях" ("Breaking the bank – Vulnerabilities in numeric processing within financial applications", Corsaire). Мы её регулярно находим в системах дистанционного банковского обслуживания, которые тестируем. Работает это так.

Обмен валюты 101

Обычно у банков два курса для каждой валюты: курс покупателя, по которому банк покупает иностранную валюту, и курс продавца, по которой он продаёт её. Эти курсы можно выразить с помощью либо прямой котировки (сколько единиц местной валюты стоит одна единица иностранной валюты), либо косвенной котировки (сколько единиц иностранной валюты стоит одна единица местной валюты). Согласно Википедии, в большинстве стран принято использовать прямые котировки, однако в Евросоюзе и некоторых других странах используются косвенные.В этой статье мы будем пользоваться запятой для отделения дробной части и точкой для разделения разрядов. Например, одна тысяча пишется как 1.000,00 (приносим извинения читателям, привыкшим к другой системе записи).

Предположим, что европейский банк продаёт и покупает доллары США по следующему курсу в косвенной котировке:

  • Курс покупателя: 1,388 (вы платите 1,388 USD за 1,00 EUR)
  • Курс продавца: 1,364 (вы получаете 1,364 USD за 1,00 EUR)

Очевидно, что банк зарабатывает на разнице курсов, даже если не берёт дополнительной комиссии за обмен. Например, вы покупаете 1.364,00 USD за 1.000,00 EUR и продаёте их обратно банку, получаете 982,71 EUR и теряете на этом 17,29 EUR.

Округление

Банки обычно используют два знака после запятой, то есть различные вычисления (например, процентных ставок или обменных курсов) выполняются с большей точностью, но окончательный результат округляется до двух знаков после запятой. Если банк честен, то округление выполняется до ближайшего числа, так что 7,237 округляется до 7,24, а 2,221 – до 2,22. В меньшую сторону округляют или в большую (то есть получится ли 1,50 или 1,51 из 1,505), сейчас не имеет значения.

Сколько стоит один цент?

Как видно, вышеописанные обменные курсы в обычном случае обеспечивают банку выгодную бизнес-модель, однако аудиторов безопасности больше интересуют необычные случаи, а в особенности – критические случаи, когда одновременно многие параметры достигают своих граничных значений. Один из таких критических случаев – наименьшая возможная сумма (как правило, 0,01, то есть один цент во многих валютах).

Что произойдёт, если попытаться обменять на доллары США один евроцент? Европейский интернет-банк использует следующий обменный курс:

0,01 EUR * 1,364 USD/EUR = 0,01364 USD

Вам, конечно, это всё равно невыгодно (американский цент стоит дешевле европейского в нашем примере), причём потеряете вы целых 27%, хотя абсолютная потеря не выглядит значительной.

А что, если сделать наоборот и обменять один американский цент на евро? В этот раз курс будет таким:

0,01 USD / 1,388 USD/EUR = 0,0072046109510086455331412103746398 EUR

После округления вы получите 0,01 EUR. Так-то лучше: вы только что мгновенно заработали на округлении 38,8%. Конечно, абсолютная прибыль ничтожна, и на неё нигде нельзя купить даже чашку кофе, но ведь схему можно автоматизировать и повторить множество раз. Если сделать так сто раз, то можно обменять 1 доллар США на 1 евро. Если сделать так сто тысяч раз, можно получить 1.000,00 EUR за 1.000,00 USD (и заработать 280,00 EUR). Даже если сначала купить эту тысячу долларов в том же банке и по его курсу, то есть за 733,14 EUR, чистая прибыль составит 266,86 EUR. И это прибыль от легального использования услуг банка на его условиях и под его контролем.

Но сколько центов можно продать?

Предположим, что интернет-банк может обработать сто запросов в секунду (предположение весьма осторожное: большим банкам приходится иметь дело с тысячами запросов в секунду в часы пик), тогда автоматический скрипт может продать 100*60*60*24 = 8.640.000 центов за день, зарабатывая около 23.000 EUR каждые 24 часа, если этот интернет-банк поддерживает обмен валюты круглосуточно.

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

Другой пример: японская йена

Валюты из примера выше стоят примерно одинаково. Но тот же метод работает для любых двух валют, например для евро и японской йены (JPY). Предположим, что курс покупателя составляет для йены 97,5949. Следовательно, продажа йен за евро будет выглядеть так:

0,50 JPY / 97,5949 JPY/EUR = 0,0051232185288370601332651603721096

После округления вы получите 0,01 EUR (и 95% прибыли).

Максимизация прибыли

Итак, мы выяснили, что прибыль приходит от ошибок округления. Если работать с двумя знаками после запятой, максимальная ошибка округления для каждой отдельной транзакции может составить 0,005. Чем ближе обменная стоимость к 0,005 (притом что она должна быть больше, чем 0,005), тем выше будет прибыль, когда сумма округлится до 0,01, а максимизировать её можно, используя валюты с наибольшей разницей в стоимости (см. пример с йенами), так как это означает возможность более "тонкой настройки", когда стоит задача приблизить стоимость к 0,005.

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

Это действительно легально?

Неотъемлемое свойство этого "эксплуатирования" состоит в том, что вы не делаете ничего особенного, чтобы обойти механизмы безопасности, используемые банком, а просто используете функционал системы так, как положено – невозможно же себе представить, чтобы обменять 1.00 USD было законно, обменять 0.02 USD было законно, а вписать 0.01 в то же поле было бы незаконно.

Обратите внимание, что степень законности существенно снижается, если системе активно "помогали" принять транзакцию на маленькую сумму. Даже если клиент всего лишь обошёл JavaScript, который не давал ему ввести слишком маленькое значение, по закону (по крайней мере, по законам Евросоюза) он обошёл его нелегально. Также подвох может заключаться в договоре между банком и клиентом. Там может быть закреплено аннулирование определённых транзакций, например, транзакций, выполненных физическим лицом не вручную с помощью обычного интерфейса, или ошибочных транзакций, произошедших вследствие логических ошибок в коде.

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

Контрмеры

Зная об этой уязвимости, банки могут применить различные контрмеры:

  1. Взимать плату за обмен валюты. Это самая простая контрмера, и даже если плата крохотная (например, 0.01 EUR), она уничтожает всю возможную прибыль от округления.
  2. Установить минимальную сумму обмена. Так же как большинство реальных обменников отказываются принимать мелкие деньги, виртуальный обменник может отказаться принимать меньшие суммы, чем одна "большая" единица валюты – например, 1 евро в примерах выше. Обратите внимание на то, что обмен 1 евро и больше всё равно может принести прибыль в 0,005 EUR за счёт ошибки округления, но эта прибыль покрывается разницей между курсами покупателя и продавца.
  3. Всегда округлять в пользу банка. Это может быть нечестно – и даже запрещено местным финансовым законодательством – но это эффективная контрмера.
  4. Разрешить ограниченное количество транзакций. Очевидно, что для получения ощутимой прибыли необходимы сотни тысяч операций. Интернет-банк может ограничить разрешённое количество обменных операций для каждого физического лица, скажем, тысячей в день, без каких-либо проблем для клиентов.
  5. Существуют ли другие возможности легально эксплуатировать проблемы безопасности? Их много. Мы решили рассказать именно об этой, потому что она общеизвестна уже десять лет, активно эксплуатируется, и мы всё ещё находим её при аудитах интернет-банков. Множество других проблем не общеизвестны, и рассказывать о них было бы медвежьей услугам нашим нынешним и будущим клиентам.

Выводы

Эта ошибка – отличный пример того, какая беда может случиться, если взять простой, хорошо изученный реальный процесс, такой как физический обмен валюты, и превратить его в виртуальную услугу. В этом конкретном случае произошли две критические перемены: во-первых, виртуальный сервис позволяет осуществлять сотни тысяч операций за короткий период, в то время как реальный обменник вряд ли производит больше двух операций в минуту. А во-вторых, виртуальная система принимает самую мелкую мелочь и не чувствует ни подозрений, ни раздражения, когда кто-то хочет обменять один цент, и ещё один, и ещё – она просто дисциплинированно выполняет алгоритм.

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

]]>
Google+
]]>
Личные инструменты
Хочешь еще цитату? Если отладка - процесс удаления ошибок, то программирование должно быть процессом их внесения.Эдсгер Вайб Дейкстра
веб-программирование
Просмотры
чтим

Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/webproger/data/www/webproger.ru/1c6a72389c0fd92079ac7ae7cd356173/sape.php on line 218 Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/webproger/data/www/webproger.ru/1c6a72389c0fd92079ac7ae7cd356173/sape.php on line 224

]]>
Rambler's Top100
]]>
]]>
]]>