Привет Хабр! Я молодой разработчик, специализирующийся на 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)
nikitastaf1996
12.10.2016 18:05-3Фигово
IMHO У google вообще все плохо с хранением паролей.Я лично пользуюсь lastpass.Пытался попробовать passwords.google.com.Это что за менеджер паролей в котором пароли можно только удалять но не добавлять и не редактировать.При этом они добавляются криво-полу-автоматически.tentakle
13.10.2016 03:57+2Осталось погуглить «lastpass утечка» и перестать пользоваться менеджерами паролей. Особенно забавно, когда все пароли передают стороннему сервису, ну или «защищают» сотню паролей одним мастер-паролем.
sumanai
16.10.2016 20:32Осталось погуглить «lastpass утечка» и перестать пользоваться менеджерами паролей.
Скорее перестать пользоваться менеджерами паролей с закрытым исходным кодом и синхронизацией только с одним их сервером.
Не вижу ничего плохого в хранении паролей в KeePass под надёжным паролем и ключевым файлом в виде безобидной картинки из своего фотоархива.
MuradGazibekov
13.10.2016 10:32У Apple [преданным фанатом которой я являюсь] тоже все очень плохо. Недавно был очень удивлен. Открыл страничку авторизации для публичной Wi-Fi сети, жмякнул на поле логин и он сразу же предложил взять логин/пароль из связки ключей, я выбрал «Просмотреть доступные» или что-то в этом духе и он без всяких запросов [пароля Apple ID, Touch ID или хотя бы локального пароля от устройства] показал мне все наборы std::tuple<сайт, логин, пароль>.
varnav
13.10.2016 15:30Чтобы получить доступ ко всем сохраненным паролям в Firefox нужно 6 кликов мышью
itssvet
14.10.2016 12:03+1Справедливости ради не могу не отметить, мой FF настроен так, что он не покажет мои пароли кому попало без ввода мастер-пароля.
Frankenstine
15.10.2016 13:27Правда возникает вопрос надёжности защиты мастер-паролем. Где и в каком виде он хранится, насколько легко его извлечь?
justmara
12.10.2016 22:07+1а если учесть тот факт, что хром синхронизирует настройки/пароли между десктопом и мобильной версией… а данные кредиток он там же хранит? (ну, автокомплит для полей форм, он там часто предлагает запомнить инфу по карточке).
Delta6
13.10.2016 10:32В браузере в хроме хранится 4 цифры последние. Если есть вариант подставить свою карту
Crandel
13.10.2016 04:53-2Не нашел у себя в хроме паролей в открытом виде. В поле password везде пишется "(data)". Открывал базу Sqlite Editor-ом
Semper-Viventem
13.10.2016 10:30Все верно. Дело в том, что это поле является байтовым массивом типа blob, и программа, через которую вы смотрели, просто не смогла его «пережевать». Если открыть эту базу через какой-нибудь sqlite3 (через терминал в андроиде он тоже доступен), то все отображается вполне корректно.
gmikhail94
13.10.2016 08:35+1Помню, несколько лет назад делал простенькую программу, которая при запуске на ПК пользователя искала cookie файл Google Chrome и вытягивала оттуда данные авторизации с конкретного сайта (cookie файл был обычным текстовым документом). В итоге получалась фича, когда при первом запуске программы она сама авторизовывалась под аккаунтом пользователя, без ввода логина/пароля. Позже Google Chrome стал шифровать cookie файл и фича стала неактуальна.
По поводу самой публикации, могу еще добавить что есть официальный сервис от Google, на котором можно посмотреть в открытом виде все сохраненные в Google Chrome пароли — https://passwords.google.comimm
13.10.2016 13:53На самом деле там есть опция — защита с помощью кодовой фразы.
По умолчанию не включена, надо включать руками
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 пока отсутствует? Разработчикам данных ОС стоило бы задупаться о правильном хранении конфеденциальной информации различными прикладными приложениями.
Thero
14.10.2016 12:03в винде спрашивает пароль пользователя прежде чем показать… на андроиде 7 это вроде как долдно быть решено глобально, но тут дело в том что по задумке гугл не должно быть рут доступа на телефонах.
другое дело что по хорошему автотестер приложений в плеймаркете должен был завернуть приложение…
AnarchyMob
13.10.2016 10:32Зачем вообще хранить пароли на локальной машине? Ведь браузер актуален только при наличии доступа к сети, а значит пароль при входе на какую либо страницу можно "забирать" прямо с сервера Google (passwords.google.com)...
KennyGin
13.10.2016 17:40Браузер актуален при наличии локальной сети. Например, в нашей студенческой локалке было несколько сотен сайтов, включая официальный сайт ВУЗа с личным кабинетом, сайт провайдера тоже с личным кабинетом…
AnarchyMob
13.10.2016 21:46Вопрос к автору. А где исходники программы? А то некрасиво получается (не то чтобы паранойя), но все же...
Semper-Viventem
14.10.2016 13:54Все верно. Исходники залью на гитхаб в ближайшее время, и прикреплю к статье. Спасибо.
Eivind
При наличии режима «капитан очевидность» и root-прав не обязательно полагаться, что пользователь вот так вот просто оставил свои пароли лежать в открытом виде. Можно устроить MITM и выловить эти пароли прямо из трафика, а для случая TLS еще заменить системные сертификаты.