Уязвимость в Xamarin для Android: подменяем dll и едим бесплатно

    Введение


    Эта история началась еще прошлым летом: мы с друзьями ночью зашли в заведение быстрого питания, которое только-только внедрило мобильное скидочное приложение. Приложение было установлено, бесплатная еда получена, трафик сохранен в .pcap-файл, и, естественно, было желание покопаться в нем, узнать, как оно работает. Программа оказалась написана на C# с использованием мультиплатформенного фреймворка для разработки мобильных приложений Xamarin; в то время apktool не мог правильно собрать измененный apk и завершался с ошибкой. Долгое время я пользовался этим приложением, накапливал баллы, тратил их, иногда натыкаясь на посты о накрутках на форумах, однако, аккаунты накрутчиков довольно быстро банили.

    Азарт и желание что-то исследовать, как это обычно у меня случается, не появляется из ниоткуда. На этот раз спонсором выступил вор, который упер у меня кошелек со всеми банковскими карточками, и у меня не было иного выхода, кроме как купить себе обед в этом заведении, предварительно накрутив баллы. Да и кофе я, в отличие от @Chikey, не люблю. Однако, статья совсем не об этом.

    image
    Измененное название чрезвычайно похоже на настоящее название заведения

    Приложение


    Как я уже говорил, приложение написано на C# и скомпилировано с использованием Xamarin. Сколько бы я не пробовал, у меня не получилось перепаковать приложение так, чтобы оно осталось работоспособным. Перепаковка средствами apktool сразу давала только черный экран, обновление измененных файлов в apk-файле через zip-упаковщики тоже не давало нужного результата. В какой-то момент, установив еще одну сломанную сборку, я заметил, что фреймворк пытается подгрузить измененные нерабочие dll не только из apk, но и с SD-карты по следующему пути:
    /storage/sdcard0/Android/data/app_id/files/.__override__/

    Как можно заметить, этот путь не в Secure Storage, и любое приложение может записывать файлы по этому пути без особых привилегий. Вредоносное приложение может положить зараженные файлы (например System.dll и Mono.Android.dll, которые есть в любой поставке приложения с Xamarin), и они будут использоваться вместо .dll внутри apk. Это поведение исправлено только в Xamarin 5.1 и новее, предыдущие версии фреймворка всегда ставят в приоритет библиотеки с карты библиотекам внутри пакета. Злоумышленник может поместить модифицированные библиотеки, которые изменяют логику работы программы, записывают действия пользователя или подменяют вводимые данные, в указанную директорию, а программа и не заметит подмены.

    Уязвимость успешно эксплуатируется на 4 популярных приложениях и 1 мобильном банк-клиенте. Все разработчики, которым было сообщено об уязвимости, обновили свое ПО.

    Что делать?


    Если вы используете Xamarin в своих Android-приложениях, пересоберите его с последней версией фреймворка, в release-режиме и без debug-символов.

    Сообщение в рассылке Full Disclosure.

    Так и едим.
    Share post

    Comments 18

      +4
      История без окончания?
      Что в dll изменили? У приложения нет серверной части и баллы хранятся лишь в нем? Тогда, наверное, можно было вообще нарисованный скриншот предъявлять вместо реального приложения?
        +3
        У приложения есть серверная часть, но оно может работать и оффлайн. Количество баллов хранится как на сервере, так и на клиенте. Приложение генерирует QR-код, который нужно приложить к считывателю. В текущей версии, считыватель хоть и синхронизируется с сервером, но, вероятно, не проверяет количество баллов (т.е. можно уйти в минус).
        Вообще говоря, вы правы, можно предъявить скриншот с действующим QR-кодом.
        Изменял метод получения количества баллов.
        +17
        Тоесть у вас украли кошелек, и вы решили, что это оправдывает, фактически, кражу обеда? Ок.
          –3
          установив еще одну сломанную сборку
          Не только обеда.
            +2
            Сломанную = не запускающуюся.
              0
              Тогда нет. Но одно другого не исключает.
            –2
            У меня не хватало несколько десятков баллов для покупки обеда, я же пользовался приложением до этого и у меня был положительный баланс.
              +14
              Так а у карманника тоже не хватало пары рублей, вот он и стянул Ваш кошелек. Он так-то не всегда ворует, только по нужде, а еще много хороших вещей делает и кармический баланс у него положительный.
            +33
            В одной камере сидеть будем.
              +2
              Ага, один будет одновременно переливать похлебку между двумя мисками, а второй морковку на морковку с ГМО
              –9
              Поставил статье минус т.к. это не уязвимость. Клиентский код всегда подконтролен клиенту, он может делать с приложением все что угодно. Одновременно надежной и удобной для пользователя защиты от этого не существует. И я очень надеюсь, что не будет существовать.
                +10
                Представьте, что у вас есть банк-клиент на Xamarin (а такой есть), и приложение-фонарик, которое не запрашивает никаких привилегий. Приложение-фонарик помещает библиотеку банк-клиенту в директорию на SD-карте (для этого не требуются привилегии, все приложения могут это делать по умолчанию), и ваш багк-клиент начинает пополнять не ваш телефон, а телефон разработчика приложения-фонарика.
                Вероятно, статья написана на слишком понятно, я писал ее еще месяц назад, если не больше. Посмотрите Full Disclosure.
                  –2
                  ну как минимум права записи на sd-карту у него должны быть. А тут уже можно и задуматься, зачем фонарику доступ к файлам?
                +2
                спасибо за статью, теперь все ночь буду гадать, что за заведение такое, название которого похоже на «Лопата для еды»
                  0
                  image
                    +2
                    Приезжайте на Масленицу в Ставрополь
                  +1
                  Злоумышленник может поместить модифицированные библиотеки, которые изменяют логику работы программы, записывают действия пользователя или подменяют вводимые данные, в указанную директорию, а программа и не заметит подмены.
                  Если у Вас root, то уже не важно какой приоритет использования библиотек — можно заменить любую.

                  А алгоритм генирации QR кодов на клиенте лежит? Если так, то и библиотеку менять не нужно.
                    0
                    В последнее время стало модно рассказывать о чем-то не совсем законно полученным.
                    Если уж совесть позволяет эксплуатировать плохо написанное ПО (не важно на доллар или десять), то лучше делать это молча.

                    Only users with full accounts can post comments. Log in, please.