Извлечение мастер-пароля из заблокированного менеджера паролей SafeInCloud

    После прочтения этой статьи мне захотелось провести исследование другого менеджера паролей на наличие похожих уязвимостей.

    В комментариях к статье пользователем Dark_Angel был задан вопрос:
    А что скажите насчет SafeInCloud?


    Исследование проводилось над бесплатной Windows версией SafeInCloud v.19.0.2

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

    В отличии от 1Password, SafeInCloud хранит все ваши пароли в открытом виде даже в заблокированном состоянии(после первой разблокировки).

    Для получения пароля от базы данных достаточно просто прочитать память приложения. Обфускация данных полностью отсутствует! Мастер-пароль(и все остальные пароли и записи) не перезаписывается никогда после первой удачной разблокировки базы данных, даже если пользователь заблокирует её.

    Ваши пароли могут утечь в случаях:

    + Отправка отчёта об ошибке в каком-либо ПО. Очень часто разработчики делают дампы памяти всех приложений в целях отладки.
    + Если пользуетесь компьютером не только Вы.
    + При получении физического доступа к компьютеру злоумышленников.
    + При запуске вредоносного ПО.
    + Возможно попадание содержимого памяти в swap.
    + Что-нибудь ещё…

    Приложение под Windows написано на .net, что значительно упрощает анализ исходного кода.



    Приложение написано на .net

    После успешной расшифровки базы данных (XDatabase) расшифрованная база и мастер-пароль сохраняются как поля класса в Singleton instanc'е класса DatabaseModel.



    Установка полей с базой данных и мастер-паролем от неё

    Все записи и пароли хранятся в памяти в открытом виде даже после блокировки приложения пользователем. Мастер-пароль лежит в открытом виде рядом.



    Пароль хранится в свойстве Password, _database — поле класса XDatabase, содержащего расшифрованную базу данных.


    База данных в формате XML.

    При повторной разблокировке приложение выполняет элементарную проверку:



    Если пароль, введенный пользователем, совпал с сохраненным в памяти — разблокировка выполнена.

    Для автоматизации извлечения мастер-пароля была написана простая утилита SafeInCloudExtractor.
    Утилита выполняет извлечение мастер-пароля и локальный путь к файлу базы данных.

    А каким менеджером пароля пользуетесь Вы? Напишите в комментариях!

    UPDATE. После сообщения о наличии проблемы, автор SiC воспринял критику крайне негативно(вплоть до оскорблений). Под давлением пользователей была выпущена бета-версия с «защитой против хакеров». То есть с защитой от утилиты SafeInCloudExtractor. Казалось бы, проблема решена! Пароли «чистятся» из памяти. Однако это не так и вот почему:
    Обновленная версия SiC также хранит все пароли в памяти. Для усложнения анализа кода был применен обфускатор + добавлена проверка IsDebuggerPresent. Пароли как хранились в открытом виде в памяти, так и хранятся. Похоже, что автор не понимает, от чего нужно защищаться. Вместо того, чтобы исправить проблему, был сделал неработоспособным PoC. Скорее всего, у автора нет необходимой квалификации и знаний, чтобы разрабатывать security-related ПО. Будьте бдительны!
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

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

      +1
      Keepassxc на linux.
        0
        Много лет использую KeePassX, увидев в этом обсуждении KeePassXC, решил его попробовать. Выглядит неплохо и интеграция с браузером облегчает жизнь. Единственное, что немного раздражает — в окошке KeePassX можно табуляцией переключаться между списком групп и списком паролей и вообще между полями, что позволяло вообще не пользоваться мышкой (учитывая, что я и вызываю это окошко с клавиатуры, используя функционал scratchpad из i3 wm, это было очень удобно), а в KeePassXC приходится использовать мышь
          0
          -del-
          Прочитал внимательнее — вроде да, у KeePassXC в отличие от обычного Keepass есть защита данных в памяти.
          Статья авторов об этом: keepassxc.org/blog/2019-02-21-memory-security
        +4
        KeePass
          0
          pass. Шифрует сертификатом gpg, расшифровывает по одному, xdotool сразу для вставки куда необходимо. Синхронизация через git. Удобная гиковская штука.
            0
            Блин, неужели никто реально не использует pass (https://www.passwordstore.org/).

            Ранее юзал KeePassX, на линухе оказался глюченым. Так же в плане поиска нужного пароля неудобен
            LastPass — хранение критически важных паролей в чужом облаке — для меня не вариант. К тому же он условно бесплатен. Если нужно приложение на телефон — нужна подписка. Нативный клиент плохой, если юзать не для веб — вообще не удобен.

            Pass — это парольный менеджер изначально написанный на bash. Каждый файл пароля хранится в отдельно зашифрованном gpg сертификатом файле. Хранить можно не только пароль (первая строчка файла), но и любую дополнительную информацию в текстовом виде.
            Работает на Linux, MacOS, Win. Android и iOS тоже есть.

            Преимущества:

            1. Синхронизация через git репозиторий (свой скрытый или внутри компании). (pass git pull, pass git push)
            2. Возможность шифровать пароли для нескольких человек (общие папки). Каждый пароль шифруется для нескольких gpg сертификатов. Есть возможность перешифровать добавив или удалив его ИД.
            3. Пароли расшифровываются не группой, а по одному
            4. Есть gui клиенты для различных операционных систем
            5. Есть плагины для тех же TOTP, git credetials, update (обновление паролей), pwned для проверки утечки и многие другие
            6. Есть плагины для браузеров для автозаполнения логинов и паролей
            7. Есть приложения для мобильных (все бесплатно)

            Для линуксоидов, в комплекте есть скрипт для dmenu. То есть по комбинации клавиша в любом месте можно вызывать окно выбора пароля. Пароль может быть либо скопирован в буфер с последующей очисткой (кроме хитрых буферов), либо для вставки в по месту (я использую этот метод).

            Из минусов — нет автозаполнений форм (карточные данные и тп, но я думаю мерж реквесты в репозиторий экстеншена приветсвуются). Но я без этого живу нормально (pass ls my_cards/sbrf/visa)

            Еще автор pass так же является автором WireGuard но это уже другая история.
            +2
            LastPass бесплатный… чет даже страшно уже :)
              0
              Посмотреть в backend код LastPass-а не представляется возможным. Но у меня складывается ощущение, что там хватает говнокода:

              • Backend написан на PHP
              • Web сервисы возвращают XML, причём форматирование поломано — табуляции вперемешку с проблемами
              • Расширение иногда перестаёт работать в приватной вкладке Firefox
              • Постоянно отваливается синхронизация логина между Firefox и Opera
              • На Android отваливается синхронизация логина между Lastpass и Authenticator

              Вроде бы это всё мелочи, но к качеству кода есть вопросы.
              0

              Тоже LastPass. Можно ли посмотреть его?

                0
                Тоже самое. Пароли в памяти хранятся в открытом виде, даже после того как вы вышли (разлогинились из приложения). И они об этом знают, потому что репорт на багбаунти приняли как duplicated
                0
                KeePassXC, хоть и жутко неудобный после LastPass.
                  0
                  а в чем неудобство?
                    0
                    В KeePass можно хранить только пароли. В то время как в LastPass и файлы (сканы документов, закрытые ключи, пароли от Wifi, данные платёжных карт, простые заметки, прочее). Конечно в KeePass можно хранить вложения и свои кастомные поля, такие как номер карты, CVV, пр. Но LastPass делает это удобнее.

                    Но для меня главное преимущество LastPass, 1Password и Buttercup в том, что для всех платформ софт пишет один разработчик и функциональность одинаковая на iOS, Android, Browser, Windows, Linux. В случае с KeePass декстопное приложение написано на C++/Qt (или на JS как в случае с KeeWeb), расширение для браузеров писали другие люди, мобильные приложения — третьи. Поэтому выглядит всё по разному и функциональность отличается (где-то есть TOTP, где-то нет, какие-то расширения умеют с desktop-клиентом синхронизироваться, другие нет).

                    Очень надеюсь, что Buttercup по функциональности догонят Lastpass или 1Password. Но пока они далеки от идеала.
                      0
                      Забыл добавить про многофакторную аутентификацию через Lastpass Authenticator, TOTP, Toopher, Duo Security, Transakt, Grid, YubiKey, отпечаток пальца, Sesame или Salesforce Authenticator. А также возможность делиться отдельными записями или целыми папками с другими пользователями.
                  0
                  Одно только хранение пароля в String -это большой косяк. Правильно хранить в массиве [].
                    0

                    Лучше бы его вообще не хранить. Они базу всё равно уже расшифровали. Как вариант для более быстрой разблокировки — использовать обфускацию. Как в 1Password. Однако и при таком подходе извлечение пароля возможно. Если пользлватель нажал "Заблокировать", то почему бы действительно не почистить полностью память?

                      +1
                      Я не знаю, поэтому спрашиваю, разве можно в C# почистить память? В Java массив можно занулить, а String так и будет в памяти висеть.
                        0
                        Действительно, в c# строки не изменяемые. Как вариант, использовать SecureString, конструируя объект, вызывая метод appendChar, а после использования уничтожить, вызвав Dispose().
                    +1
                    Пользуюсь KeePass Password Safe уже много лет.
                    Не так давно они БигБаунти запустили по KeePass 2.x.
                    Серьезный недостаток — отсутствие официального клиента для мобильных устройств, и соответственно синхронизации между ними.
                    Приходится использовать на телефоне неофициальный, только название разработчика «Flush Software, LLC» смущает.
                      0
                      Bitwarden, серверная часть на собственной железке, благо бесплатная версия это допускает. Но он не имеет адекватного клиента под декстоп, только под Андроид (что для iOS — не видел за неимением) и браузерные расширения.
                        0
                        Начинал, наверное как и все, с KeePass, а как началось бурное развитие мобилок и пароли понадобились не только на десктопе перешел на 1password. Удобство оказалось важнее безопасности. К тому же не доверяю критически важных данных менеджерам, в большинстве случаев есть второй фактор и данные банковской карты храню только для одной, специально для интернет покупок. Если не ошибаюсь bobuk в каком-то из выпусков Радио-Т Bitwarden хвалил, поставил жене, вроде нормально, давно хотел её от LastPass отучить.
                          +1
                          Ещё бы Enpass проверить. Много кто недавно на него перешёл с KeePass
                            0

                            присоединяюсь, тоже хочется знать кому я доверил все свои данные

                              0
                              Что за чушь? С чего пользователям KeePass переходить на эту неудобную проприетарную поделку.
                              0

                              Зашел сюда, чтобы прочитать коммент amarao о том, что парольный менеджер должен быть открытым, и удивился, что его еще нет.


                              Ну и так для истории: https://defcon.ru/penetration-testing/3353/

                                0
                                Все уже забыли о Password Safe? Тем не менее он до сих пор живой, и старина Шнайер на этой волне проверок заметил что его балалайка пароли в плейн тексте не хранит www.schneier.com/blog/archives/2019/02/on_the_security_1.html
                                  0
                                  Недавно смотрел на разные менеджеры паролей.
                                  После сравнений и проб остановился на bitwarden. Пока доволен удобством и безопасностью.
                                    0
                                    А можете высказать свое мнение по поводу Enpass?
                                    Или сделать такую же статью по взлому Enpass
                                    Я сам пользуюсь SafeinCloud, но хочется теперь что нибудь более защищенное
                                      0
                                      Использую уже давно. На 3 ноутах, планшете и телефоне. Никто не обещал сильную криптографию в данной программе (да я и не надеялся оную получить-)), но из многих аналогов выбрал именно её — просто, удобно. Если есть что хранить, то pgp в помощь или аналоги. Не так удобны, зато надёжны. А от банального любопытного индивида, эта программа защищает не плохо.
                                        0
                                        Ребятки добрый вечер, читаю эту статью и понимаю, что моя святая святых, а именно SIC, не такая уж и крепость, как я себе ее представлял. Посмотрев все комментарии я полностью растерялся, прошу вашего совета, а именно куда можно перейти? Требования к менеджеру таковы:
                                        1. Не дорогой.
                                        2. Для Windows и Android
                                        3. Для хранения паролей и файлов (ключи, скан. и др.)
                                        4. Качественно защищен
                                        P.s. особо ценного у меня как у обычного гражданина нет, но хотелось бы быть уверенным в надежности программы.
                                        Заранее большое спасибо.
                                          0
                                          KeePass
                                            0
                                            К сожалению, данный продукт также оставляет пароли в памяти(после разблокировки), но не так явно как SiC. Также KeePass чистит мастер-пароль из памяти.
                                            Причина тут может быть также и в том, что KeePass также написан на .net, а там строки не изменяемые и у программиста над ними мало контроля.
                                              0
                                              Пароль появляется только после его копирования и только у конкретной записи, которую открыли. Это лучше чем то, что делает SiC. А так да, верно, чтобы у этой же записи пароль был стёрт из памяти нужно заблокировать базу
                                                0
                                                Вы неправильно поняли мой комментарий. Ваши пароли(кроме местер-пароля) будут в памяти процесса даже при ЗАБЛОКИРОВАННОЙ базе. Достаточно одной разблокировки.
                                                Проверьте сами. Достаточно заблокировать KeePass и просканировать память на наличие одного из Ваших паролей. Причем об этом прямо написано в исходниках KeePass, это поведение ожидаемое.
                                                  0

                                                  Читал документацию (https://keepass.info/%0D/help/base/security.html#secmemprot), но не исходники.


                                                  Operations that result in unencrypted data in the process memory include, but are not limited to: displaying data (not asterisks) in standard controls, searching data, replacing placeholders (during auto-type, drag&drop, copying to clipboard, ...)

                                                  Похоже, что в памяти будут пароли, которые копировались. Может быть, проверите?

                                                    0
                                                    Да, все верно. А также при открытии группы со списком логин/пароль все пароли расшифровываются и остаются в памяти.
                                                    В исходниках KeePassLib.Security.ProtectedString.
                                                    Метод ReadString возвращает пароль в виде обычной строки.
                                                    Как проверить самому:
                                                    1. Разблокируйте базу, откройте любую группу (с объектами можно не взаимодействовать(напр.копирование пароля)), заблокируйте базу.
                                                    2. С помощью любого memory scanner'а(я использовал Cheat Engine) просканируйте память на наличие Вашего пароля, искать строку в UTF-16.
                                                      0

                                                      Мда, все так. Грустно.

                                          +1
                                          Добавил небольшой UPDATE про реакцию автора на критику и его попытку сделать неработоспособным PoC.

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

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