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)


  1. Eivind
    12.10.2016 18:05
    +4

    При наличии режима «капитан очевидность» и root-прав не обязательно полагаться, что пользователь вот так вот просто оставил свои пароли лежать в открытом виде. Можно устроить MITM и выловить эти пароли прямо из трафика, а для случая TLS еще заменить системные сертификаты.


  1. nikitastaf1996
    12.10.2016 18:05
    -3

    Фигово
    IMHO У google вообще все плохо с хранением паролей.Я лично пользуюсь lastpass.Пытался попробовать passwords.google.com.Это что за менеджер паролей в котором пароли можно только удалять но не добавлять и не редактировать.При этом они добавляются криво-полу-автоматически.


    1. tentakle
      13.10.2016 03:57
      +2

      Осталось погуглить «lastpass утечка» и перестать пользоваться менеджерами паролей. Особенно забавно, когда все пароли передают стороннему сервису, ну или «защищают» сотню паролей одним мастер-паролем.


      1. sumanai
        16.10.2016 20:32

        Осталось погуглить «lastpass утечка» и перестать пользоваться менеджерами паролей.

        Скорее перестать пользоваться менеджерами паролей с закрытым исходным кодом и синхронизацией только с одним их сервером.
        Не вижу ничего плохого в хранении паролей в KeePass под надёжным паролем и ключевым файлом в виде безобидной картинки из своего фотоархива.


    1. MuradGazibekov
      13.10.2016 10:32

      У Apple [преданным фанатом которой я являюсь] тоже все очень плохо. Недавно был очень удивлен. Открыл страничку авторизации для публичной Wi-Fi сети, жмякнул на поле логин и он сразу же предложил взять логин/пароль из связки ключей, я выбрал «Просмотреть доступные» или что-то в этом духе и он без всяких запросов [пароля Apple ID, Touch ID или хотя бы локального пароля от устройства] показал мне все наборы std::tuple<сайт, логин, пароль>.


    1. varnav
      13.10.2016 15:30

      Чтобы получить доступ ко всем сохраненным паролям в Firefox нужно 6 кликов мышью


      1. NLO
        14.10.2016 12:02

        НЛО прилетело и опубликовало эту надпись здесь


      1. itssvet
        14.10.2016 12:03
        +1

        Справедливости ради не могу не отметить, мой FF настроен так, что он не покажет мои пароли кому попало без ввода мастер-пароля.


        1. Frankenstine
          15.10.2016 13:27

          Правда возникает вопрос надёжности защиты мастер-паролем. Где и в каком виде он хранится, насколько легко его извлечь?


  1. justmara
    12.10.2016 22:07
    +1

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


    1. Delta6
      13.10.2016 10:32

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


      1. justmara
        13.10.2016 12:19

        Агануда
        image


        1. Delta6
          13.10.2016 15:00
          +1

          Я подумал мы говорили о картах из Google Wallets, они тоже тянутся в хром.


        1. Delta6
          13.10.2016 15:11

          А те пароли, что вы показали, не синкаются. Можете проверить.


          1. justmara
            13.10.2016 18:34

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


            image


            1. Delta6
              13.10.2016 21:32

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

              Все карты
              image


  1. Crandel
    13.10.2016 04:53
    -2

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


    1. Semper-Viventem
      13.10.2016 10:30

      Все верно. Дело в том, что это поле является байтовым массивом типа blob, и программа, через которую вы смотрели, просто не смогла его «пережевать». Если открыть эту базу через какой-нибудь sqlite3 (через терминал в андроиде он тоже доступен), то все отображается вполне корректно.


  1. gmikhail94
    13.10.2016 08:35
    +1

    Помню, несколько лет назад делал простенькую программу, которая при запуске на ПК пользователя искала cookie файл Google Chrome и вытягивала оттуда данные авторизации с конкретного сайта (cookie файл был обычным текстовым документом). В итоге получалась фича, когда при первом запуске программы она сама авторизовывалась под аккаунтом пользователя, без ввода логина/пароля. Позже Google Chrome стал шифровать cookie файл и фича стала неактуальна.

    По поводу самой публикации, могу еще добавить что есть официальный сервис от Google, на котором можно посмотреть в открытом виде все сохраненные в Google Chrome пароли — https://passwords.google.com


    1. imm
      13.10.2016 13:53

      На самом деле там есть опция — защита с помощью кодовой фразы.
      По умолчанию не включена, надо включать руками


  1. glowingsword
    13.10.2016 10:31
    +1

    Странно, в ОС Linux у Google Chrome с безопасностью хранения паролей дела обстоят иначе, чем в Windows и Android. В Linux Chrome использует Gnome Keyring — довольно надёжный централизованный способ хранения паролей и другой приватной информации. Да и в OS X Chrome использует Keychain. Может в ОС Android и ОС Windows аналог Gnome Keyring/OS X Keychain пока отсутствует? Разработчикам данных ОС стоило бы задупаться о правильном хранении конфеденциальной информации различными прикладными приложениями.


    1. Thero
      14.10.2016 12:03

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


  1. AnarchyMob
    13.10.2016 10:32

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


    1. KennyGin
      13.10.2016 17:40

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


  1. AnarchyMob
    13.10.2016 21:46

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


    1. Semper-Viventem
      14.10.2016 13:54

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