Хранение пользовательских паролей в Google Chrome на Android

image

Привет Хабр! Я молодой разработчик, специализирующийся на Android-разработке и информационной безопасности. Не так давно я задался вопросом: каким образом Google Chrome хранит сохраненные пароли пользователей? Анализируя информацию из сети и файлы самого хрома (особенно информативной была эта статья), я обнаружил определенные сходства и отличия в реализации сохранения паролей на разных платформах, и для демонстрации написал приложения для извлечения паролей из Android версии браузера.

Как это работает?


Как мы можем знать из разных публикаций в сети на эту тему, Google Chrome на ПК хранит пароли своих пользователей в следующей директории:

«C:\Users\SomeUser\AppData\Local\Google\Chrome\User Data\Default\» в файле "Login Data".

Данный файл является базой данных SQLite, и его вполне можно открыть и посмотреть. В таблице logins мы можем видеть следующие, интересующие нас поля: origin_url (адрес сайта), username_value (логин), password_value(пароль). Пароль представлен байтовым массивом, и зашифрован через машинный ключ, индивидуальный для каждой системы. Подробнее можно узнать из этой статьи. Таким образом, какая-никакая защита в Windows клиенте присутствует.

Android


Но так как я больше увлекаюсь Android'ом, то мое внимание забрал на себя, соответственно, Android-клиент браузера.

«Расковыряв» пакет Google Chrome (com.android.chrome), я обнаружил, что его структура очень напоминает структуру ПК-клиента, и не составило труда найти точно такую же базу данных, отвечающую за хранение паролей пользователя. Полный путь к БД следующий: "/data/data/com.android.chrome/app_chrome/Default/Login Data". В целом, эта база данных очень похожа на свою «старшую сестру» из ПК-версии, имея лишь одно, но очень значительное отличие — пароли тут хранятся в открытом виде. Возникает вопрос: можно ли программно извлечь пароли из базы? Ответ оказался весьма очевидным — да, если у вашего приложения есть root-права.

Реализация


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

Если описать его работу в двух словах, то оно работает так:

  • Получает root.
  • Копирует базу данных Chrome в свою директорию.
  • С помощью chmod получает доступ к копии БД.
  • Открывает БД, и извлекает информацию о логинах и паролях.

Приложение было размещено в Google Play.

Проект на GitHub: ChromeOR.

Вывод


Как вывод из проделанной работы, можно сказать, что при наличии root-прав, вытащить базу паролей из браузера и отправить ее на свой сервер — задача вполне решаемая, и этот факт должен заставлять задуматься над тем, стоит ли доверять какому-либо приложению права суперпользователя.

Надеюсь, эта статья была информативной. Спасибо за внимание!
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 26
    +4
    При наличии режима «капитан очевидность» и root-прав не обязательно полагаться, что пользователь вот так вот просто оставил свои пароли лежать в открытом виде. Можно устроить MITM и выловить эти пароли прямо из трафика, а для случая TLS еще заменить системные сертификаты.
    • НЛО прилетело и опубликовало эту надпись здесь
        +2
        Осталось погуглить «lastpass утечка» и перестать пользоваться менеджерами паролей. Особенно забавно, когда все пароли передают стороннему сервису, ну или «защищают» сотню паролей одним мастер-паролем.
          0
          Осталось погуглить «lastpass утечка» и перестать пользоваться менеджерами паролей.

          Скорее перестать пользоваться менеджерами паролей с закрытым исходным кодом и синхронизацией только с одним их сервером.
          Не вижу ничего плохого в хранении паролей в KeePass под надёжным паролем и ключевым файлом в виде безобидной картинки из своего фотоархива.
          0
          У Apple [преданным фанатом которой я являюсь] тоже все очень плохо. Недавно был очень удивлен. Открыл страничку авторизации для публичной Wi-Fi сети, жмякнул на поле логин и он сразу же предложил взять логин/пароль из связки ключей, я выбрал «Просмотреть доступные» или что-то в этом духе и он без всяких запросов [пароля Apple ID, Touch ID или хотя бы локального пароля от устройства] показал мне все наборы std::tuple<сайт, логин, пароль>.
            0
            Чтобы получить доступ ко всем сохраненным паролям в Firefox нужно 6 кликов мышью
            • НЛО прилетело и опубликовало эту надпись здесь
                +1
                Справедливости ради не могу не отметить, мой FF настроен так, что он не покажет мои пароли кому попало без ввода мастер-пароля.
                  0
                  Правда возникает вопрос надёжности защиты мастер-паролем. Где и в каком виде он хранится, насколько легко его извлечь?
              +1

              а если учесть тот факт, что хром синхронизирует настройки/пароли между десктопом и мобильной версией… а данные кредиток он там же хранит? (ну, автокомплит для полей форм, он там часто предлагает запомнить инфу по карточке).

                0
                В браузере в хроме хранится 4 цифры последние. Если есть вариант подставить свою карту
                  0

                  Агануда
                  image

                    +1
                    Я подумал мы говорили о картах из Google Wallets, они тоже тянутся в хром.
                      0
                      А те пароли, что вы показали, не синкаются. Можете проверить.
                        0

                        Не надоело пальцем в небо тыкать? Я-то, как раз, проверил


                        image

                          0
                          Вот мои карты с хрома. Одна из них — фейковая, нашел при помощи генератора карт, вставил в хроме. Одна из Google Wallet — я не могу её посмотреть.
                          Все карты
                          image

                          Фейковая карта
                          image

                          Скриншот с андроида
                          image


                          Спорить больше не буду, так как вы, скорее всего, ввели их в браузере хрома на андроиде. Если даже и нет(в чем я сомневаюсь), то с такой манерой общения мне дело не хочется иметь больше.
                  –2

                  Не нашел у себя в хроме паролей в открытом виде. В поле password везде пишется "(data)". Открывал базу Sqlite Editor-ом

                    0
                    Все верно. Дело в том, что это поле является байтовым массивом типа blob, и программа, через которую вы смотрели, просто не смогла его «пережевать». Если открыть эту базу через какой-нибудь sqlite3 (через терминал в андроиде он тоже доступен), то все отображается вполне корректно.
                    +1
                    Помню, несколько лет назад делал простенькую программу, которая при запуске на ПК пользователя искала cookie файл Google Chrome и вытягивала оттуда данные авторизации с конкретного сайта (cookie файл был обычным текстовым документом). В итоге получалась фича, когда при первом запуске программы она сама авторизовывалась под аккаунтом пользователя, без ввода логина/пароля. Позже Google Chrome стал шифровать cookie файл и фича стала неактуальна.

                    По поводу самой публикации, могу еще добавить что есть официальный сервис от Google, на котором можно посмотреть в открытом виде все сохраненные в Google Chrome пароли — https://passwords.google.com
                      0
                      На самом деле там есть опция — защита с помощью кодовой фразы.
                      По умолчанию не включена, надо включать руками
                      +1
                      Странно, в ОС Linux у Google Chrome с безопасностью хранения паролей дела обстоят иначе, чем в Windows и Android. В Linux Chrome использует Gnome Keyring — довольно надёжный централизованный способ хранения паролей и другой приватной информации. Да и в OS X Chrome использует Keychain. Может в ОС Android и ОС Windows аналог Gnome Keyring/OS X Keychain пока отсутствует? Разработчикам данных ОС стоило бы задупаться о правильном хранении конфеденциальной информации различными прикладными приложениями.
                        0
                        в винде спрашивает пароль пользователя прежде чем показать… на андроиде 7 это вроде как долдно быть решено глобально, но тут дело в том что по задумке гугл не должно быть рут доступа на телефонах.
                        другое дело что по хорошему автотестер приложений в плеймаркете должен был завернуть приложение…
                        0

                        Зачем вообще хранить пароли на локальной машине? Ведь браузер актуален только при наличии доступа к сети, а значит пароль при входе на какую либо страницу можно "забирать" прямо с сервера Google (passwords.google.com)...

                          0
                          Браузер актуален при наличии локальной сети. Например, в нашей студенческой локалке было несколько сотен сайтов, включая официальный сайт ВУЗа с личным кабинетом, сайт провайдера тоже с личным кабинетом…
                          0

                          Вопрос к автору. А где исходники программы? А то некрасиво получается (не то чтобы паранойя), но все же...

                            0
                            Все верно. Исходники залью на гитхаб в ближайшее время, и прикреплю к статье. Спасибо.

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

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