Fuck the Logic. Три исследования логических багов, получившие Pentest Award

Содержание статьи

  • Четвертое место: «Уязвимость переполнения целочисленной переменной и возможность без ограничений выводить средства на криптокошелек»
  • Вывод
  • Третье место: «Захват любого аккаунта в мессенджере»
  • Принцип атаки
  • Атака
  • Выводы
  • Первое место: «Абьюз работы токенов на основе временных меток»
  • Как это можно пофиксить

Се­год­ня мы пуб­лику­ем три работы, получив­шие Pentest Award в номина­ции Fuck the Logic. В пер­вой речь пой­дет о баге, поз­воляв­шем бес­конеч­но выводить день­ги с крип­тобир­жи, во вто­рой — о зах­вате чужих акка­унтов в некой соц­сети, в треть­ей — о лов­ком ревер­се токенов при­ложе­ния. Pentest Award

В августе 2023 года прош­ла церемо­ния наг­ражде­ния Pentest Award — пре­мии для спе­циалис­тов по тес­тирова­нию на про­ник­новение, которую учре­дила ком­пания Awillix. Мы пуб­лику­ем луч­шие работы из каж­дой номина­ции.

 

Четвертое место: «Уязвимость переполнения целочисленной переменной и возможность без ограничений выводить средства на криптокошелек»

  • Ав­тор: arteb123

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

При этом ненуле­вое отри­цатель­ное зна­чение сче­та поз­воляло соз­дать вауче­ры с уже положи­тель­ной сум­мой валюты и неог­раничен­но вывес­ти внут­реннюю валюту на внеш­ний крип­токоше­лек. Для это­го недоб­росовес­тно­му поль­зовате­лю было дос­таточ­но обна­личить вауче­ры на вто­ром соз­данном акка­унте.

При­мер экс­плу­ата­ции выг­лядел сле­дующим обра­зом. Во вре­мя вывода средств из лич­ного кабине­та с помощью одной из крип­товалют соз­дает­ся тикет с ука­зани­ем сум­мы (с рас­четом комис­сии) и внеш­него крип­токошель­ка.

При этом ука­зан­ная сум­ма для вывода средств дол­жна была быть целочис­ленной и не быть мень­ше нуля или рав­ной нулю.

Тем не менее при обра­бот­ке зап­росов на сто­роне сер­вера была допуще­на ошиб­ка: зна­чение перемен­ной cashpoints, с помощью которой умень­шалось зна­чение сум­мы сче­та на акка­унте, поз­воляло передать зна­чение, пре­выша­ющее зна­чение int.

В резуль­тате этой ошиб­ки при отправ­ке зап­роса на вывод средств на сер­вер мож­но было передать очень боль­шое зна­чение перемен­ной cashpoints. Это про­изво­дило перепол­нение целочис­ленно­го зна­чения сче­та и делало его отри­цатель­ным (при этом в интерфей­се зна­чение сче­та отоб­ражалось как положи­тель­ное).

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

Соз­даем вауче­ры с ука­зани­ем сум­мы по ссыл­ке:

https://example.com/account/voucher/create

При этом сум­ма отри­цатель­ного сче­та акка­унта уве­личи­вает­ся на это зна­чение.

Соз­даем вто­рой акка­унт и при­меня­ем соз­данные вауче­ры:

https://example.com/account/voucher/redeem

В резуль­тате зна­чение сче­та акка­унта уве­личе­но на сум­му, соот­ветс­тву­ющую вауче­ру.

Соз­даем тран­закцию, что­бы вывес­ти день­ги на внеш­ний крип­токоше­лек:

https://example.com/withdraw/withdrawBalanceInstan>t

В резуль­тате получа­ем крип­товалю­ту.

Так мож­но было бес­конеч­но соз­давать вауче­ры, обна­личи­вать их на вто­ром акка­унте и выводить день­ги.

 

Вывод

Ис­поль­зуя най­ден­ную цепоч­ку уяз­вимос­тей, мы для демонс­тра­ции вывели средс­тва, экви­вален­тные 8,26 и 4,13 дол­лара США. При этом пер­воначаль­ный баланс обо­их акка­унтов был равен нулю и попол­нения кошель­ков не про­изво­дилось.

Для вла­дель­цев сай­та такая уяз­вимость — пря­мой риск финан­совых потерь. Кра­жа средств поч­ти мгно­вен­на и необ­ратима.

Для устра­нения уяз­вимос­ти мы пореко­мен­довали про­верять дли­ну вход­ных дан­ных и откло­нять тран­закцию при слиш­ком боль­шом зна­чении перемен­ной. Для уяз­вимос­ти с соз­дани­ем вауче­ров — про­верять зна­чение балан­са сче­та на отри­цатель­ное зна­чение.

 

Третье место: «Захват любого аккаунта в мессенджере»

  • Ав­тор: Денис Погонин, @Danr0

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

При­ложе­ние дос­тупно в виде вер­сий для iOS и Android, как вари­ант мож­но исполь­зовать веб‑интерфейс. На момент написа­ния этой статьи толь­ко на Android нас­читыва­ется более мил­лиона заг­рузок. Вер­сия для iOS вхо­дит в топ-200 самых популяр­ных при­ложе­ний для обще­ния в App Store.

Ана­лиз прог­раммы про­изво­дил­ся методом чер­ного ящи­ка — на осно­ве пуб­лично дос­тупных при­ложе­ний и веб‑кли­ента. При ана­лизе при­ложе­ний я обна­ружил хорошо нас­тро­енный SSL Pinning. На Android его уда­лось час­тично обой­ти с помощью кас­томиза­ции скрип­тов Frida. На iOS раз­работ­чики исполь­зовали пос­ледние вер­сии защит­ных фун­кций, обхо­да для которых пока что нет.

Глав­ной проб­лемой при иссле­дова­нии ста­ло то, что при­ложе­ние исполь­зовало gRPC (на осно­ве Protobuf) для обще­ния с сер­вером. Пос­коль­ку тес­тирова­ние про­исхо­дило методом чер­ного ящи­ка, proto-фай­ла с опи­сани­ем струк­тур у меня не было. Поэто­му все най­ден­ные уяз­вимос­ти были обна­руже­ны в про­цес­се руч­ного ана­лиза proto-зап­росов.

Что­бы работать gRPC, я исполь­зовал рас­ширение Blackbox Protobuf для Burp Suite. Одна­ко вер­сия из репози­тория некор­рек­тно пар­сила поля зап­росов. Что­бы зас­тавить ее нор­маль­но работать, приш­лось модифи­циро­вать рас­ширение, добавить сооб­щени­ям новый заголо­вок и изме­нить алго­ритм пар­синга поля Additional Data в gRPC.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *