Google Chrome для Android: уязвимость UXSS и раскрытие учетных данных

    Итак, начнем. В июле 2011 года Roee Hay и Yair Amit из IBM Research Group обнаружили UXSS-уязвимость в используемом по умолчанию браузере Android. Эта ошибка позволяет вредоносному приложению внедрить JavaScript-код в контекст произвольного домена и захватить файлы Cookies или произвести другие вредоносные действия. Эта уязвимость была устранена в версии Android 2.3.5.

    21 июня 2012 года для Android был выпущен Google Chrome. Я смог найти в нем весьма интересные ошибки. Взгляните сами.

    Уязвимость UXSS


    Как и ожидалось, эта уязвимость не затрагивает активити “Main” Хрома. Однако давайте рассмотрим файл AndroidManifest.xml из Chrome .apk.



    Очевидно, что класс com.google.android.apps.chrome.SimpleChromeActivity можно вызвать из другого приложения, если в нем объявлена директива <intent-filter>.

    Декомпилируйте classes.dex из apk и взгляните на класс SimpleChromeActivity.



    В представленном выше методе onCreate можно заметить, что новый URL будет загружен в текущей, а не новой вкладке.

    Существует два способа запустить эту активность: посредством Android API или Activity Manager. Вызов из Android API немного сложен, поэтому я использовал команду «am» из оболочки adb.

    shell@android:/ $ am start -n com.android.chrome/com.google.android.apps.chrome.SimpleChromeActivity -d 'http://www.google.ru'
    




    Мне кажется, эта проблема с отображением содержимого не связана с безопасностью. Судя по заголовку, Chrome загрузил www.google.ru в SimpleChromeActivity вместо Main, а эта активность имеет доступ к базе Cookies в Chrome. Следующим шагом будет внедрение кода JavaScript.

    shell@android:/ $ am start -n com.android.chrome/com.google.android.apps.chrome.SimpleChromeActivity -d 'javascript:alert(document.cookie)' 
    




    Вот и все, JavaScript был исполнен в контексте домена www.google.ru.

    Раскрытие учетных данных


    Другая проблема — автоматическая загрузка файлов —стала настоящей головной болью при использовании браузеров, подобных Chrome. Если вы открыли бинарный файл в браузере Chrome, то он загрузится в каталог SDCard без вашего подтверждения. То же самое происходило и в стандартном браузере, в котором такая опция использовалась вредоносной программной NonCompatible. Вы можете спросить, как это связано с раскрытием учетных данных. Взгляните на каталог Chrome в системе.



    Только Chrome app может читать эти файлы (такие как Cookies, History и т.д.). Выглядит безопасно. Попробуйте запустить Chrome, используя file:// wrapper, и открыть файл Cookies.

    shell@android:/ $ am start -n com.android.chrome/com.android.chrome.Main -d 'file:///data/data/com.android.chrome/app_chrome/Default/Cookies'
    




    После запуска браузера Cookies будут загружаться/копироваться в /sdcard/Downloads/Cookies.bin, и любое приложение в системе сможет их прочитать.

    Я предоставил подробную информацию команде безопасности Chromium, и эти ошибки были устранены в версии 18.0.1025308.

    Ссылки:
    http://code.google.com/p/chromium/issues/detail?id=138035
    http://code.google.com/p/chromium/issues/detail?id=138210

    Автор: Артем Чайкин (artemchaykin).
    Positive Technologies
    Компания

    Комментарии 9

      +4
      Я правильно понял, уязвимость работает не через открытие страниц хромом, а в возможности приложения получить кукизы из хрома?
      Если да, то это, конечно, проблема безопасности, но не критичная (в ряде случаев, по крайней мере — в целом опять вопрос доверия приложениям)
        +6
        Поняли правильно. Уязвимость позволяет сторонним приложениям, установленным на телефоне, получить доступ к кукам хрома.
          +5
          Ну на PC кукисы локально из любого браузера потырыть можно и чё?
        +4
        Оба бага дают 403-Forbidden.
        Не рановато ли раскрыли подробности?
          +3
          С Гуглом предварительно согласовали раскрытие подробностей. Так что все ок)
          0
          А почему Артём Чайкин сам не написал статью в Песочницу? Наверняка был бы уже полноценным Хабра-жителем
            0
            Глядя на скриншот, я не понимаю — там же стоит return сразу же после registerForNotifications()
            Как же тогда создается таб?
              0
              Это проблемы декомпилятора, он очень часто выдает нерабочий код. Но, как правило, основная логика работы приложения понятна. В данном случае никакого return там, конечно, нет
                0
                Как раз не понятно — там создается new Tab(...), в котором загружается str
                Каким образом URL попадает в текущий таб?

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое