Оказывается, я проспал, как в прессе уже несколько дней (а на форуме и все двадцать) обсуждается новая «страшная уязвимость». Как ни странно, некоторая проблема здесь действительно имеет место. Но и традиционные курьезы и фейспалмы никто не отменял.
Суть дела: дамп памяти содержит информацию о мастер-пароле.
Вообще-то мы давно знаем, что все, с чем мы работали после запуска KeePass'а, остается в его памяти даже после блокировки. И ничего с этим поделать невозможно из-за неизменяемости .NET строк.
Однако нам, пусть и с оговорками, все-таки обещано отсутствие «чувствительных данных» в памяти процесса. По крайней мере, считалось, что противник, завладевший дампом памяти, не сможет восстановить мастер-пароль, если мы вводили его обычным способом и без раскрытия звездочек. Выяснилось, что сможет. В этом и состоит уязвимость.
Насколько она серьезна? — Настолько же, насколько существенны все оговорки, сделанные и упомянутые выше. Пойдем с конца.
Во-первых, когда мастер-пароль виден, он неизбежно попадает в память. Многие ли пользователи задумываются об утечке дампа, когда раскрывают звездочки, набирая пароль?
Во-вторых, мастер-пароль защищается от попадания в память, когда он вводится с клавиатуры, но не когда он передается через командную строку (в т.ч. зашифрованно) или через StdIn, или когда базы открываются друг из друга триггерами.
В-третьих, данные неизбежно остаются в памяти, если мы ими пользуемся (а если нет, то для чего мы их храним?..) Т.е. как бы мы ни пеклись о безопасном вводе мастер-пароля, сама наша защищаемая ценность — наши записи — оказываются в уязвимом положении.
Из всего этого напрашивается вывод, что все плохо мы все умрем обнаруженная уязвимость не так уж сильно меняет расклад: утечка дампа всегда представлялась опасной. Так что лучше нам позаботиться о том, чтобы его вообще не с чего было снимать, а не о том, какие данные туда попадут. Например, автооткрытие флешкой палит мастер-пароль в памяти KeePass'а, но смысл этого приема как раз в повышении безопасности: легкость открытия позволяет закрывать приложение после каждого использования, а не держать его запущенным днями и месяцами.
Сама же уязвимость скоро будет устранена: разработчик быстро нашел, как это сделать, и выкатил тестовую сборку.
Но я ведь обещал фейспалм? Встречайте: представитель KeePassXC гордо отрапортавал, что их продукт не подвержен этой уязвимости. Об этом же заявлено (что меня удивило более всего) на гитхабе у автора PoC, и, разумеется, это повторили «глянцевые» издания. Таки не подвержен?
В каком-то смысле они даже правы: «Eсли у вас нету дома, пожары ему не страшны...» Ну вы поняли. KeePassXC вообще не предотвращает попадание мастер-пароля в свою память. И конечно, не удаляет его оттуда после блокировки. Чтобы в этом убедиться, не нужен хитрый трюк, который автор PoC проворачивал с собиранием обрывочных строк. Просто снимите дамп и найдите там свой мастер-пароль голым текстом.
Что, впрочем, само по себе не является намного большей проблемой, чем все, сказанное выше про KeePass.