
CVE-2023-32784용 원본 PoC
해당 취약점은 CVE-2023-32784로 지정되었으며 KeePass 2.54에서 수정되었습니다. 빠른 대응과 창의적인 수정에 대해 Dominik Reichl에게 다시 한번 감사드립니다!
명확히 하자면: 비밀번호는 클립보드에서 복사하는 것이 아니라 키보드로 입력해야 합니다 (작동 방식 섹션 참조).
먼저, KeePass 2.54 이상으로 업데이트하세요.
둘째, 오랫동안 KeePass를 사용해 왔다면 마스터 비밀번호(그리고 잠재적으로 다른 비밀번호들)가 페이지 파일/스왑 파일, 최대 절전 파일, 크래시 덤프에 남아 있을 수 있습니다. 걱정되는 수준에 따라 다음 단계를 통해 문제를 해결할 수 있습니다:
C:\Windows\memory.dmp이지만 다른 것이 있을 수도 있습니다)/w 옵션과 함께 Cipher 사용)아니면 그냥 HDD를 덮어쓰고 운영 체제를 새로 설치하세요.
영향을 받지 않는 제품의 불완전한 목록 (더 추가하려면 풀 리퀘스트(pull request)나 이슈(issue)를 생성해 주세요). 일반적으로 .NET으로 작성된 원래 KeePass 2.X 앱이 아니라면 영향을 받지 않을 가능성이 높습니다.
KeePass Master Password Dumper는 KeePass의 메모리에서 마스터 비밀번호를 덤프하는 간단한 개념 증명(PoC) 도구입니다. 첫 번째 비밀번호 문자를 제외하고는 대부분의 비밀번호를 평문으로 복구할 수 있습니다. 대상 시스템에서 코드 실행이 필요하지 않으며, 메모리 덤프만 있으면 됩니다. 메모리가 어디서 왔는지는 중요하지 않습니다. 프로세스 덤프, 스왑 파일(pagefile.sys), 최대 절전 파일(hiberfil.sys), 각종 크래시 덤프 또는 시스템 전체의 RAM 덤프가 될 수 있습니다. 작업 공간이 잠겨 있는지 여부도 중요하지 않습니다. KeePass가 더 이상 실행 중이 아니더라도 RAM에서 비밀번호를 덤프하는 것도 가능하지만, 이 방법이 성공할 확률은 그 이후 경과된 시간에 비례하여 낮아집니다.
Windows(영문)에서는 KeePass 2.53.1, Debian(keepass2 패키지)에서는 KeePass 2.47로 테스트했습니다. macOS 버전에서도 작동해야 합니다. 불행히도 Enter master key on secure desktop 옵션을 활성화해도 공격을 막는 데 도움이 되지 않습니다. PoC는 이전 버전의 KeePass로 만든 데이터베이스에서 문제가 발생할 수 있지만, 재현하지는 못했습니다 (이슈 #4 참조).
이 발견은 KeePass의 저자인 Dominik Reichl에 의해 여기에서 확인되었습니다. Dominik의 빠른 응대에 감사드립니다. 조만간 수정되기를 바랍니다!
git clone https://github.com/vdohney/keepass-password-dumper 또는 GitHub에서 다운로드하세요cd keepass-password-dumperdotnet run PATH_TO_DUMPWindows에서 가장 쉽게 테스트하는 방법은 작업 관리자에서 KeePass 프로세스를 마우스 오른쪽 버튼으로 클릭하고 "Create dump file"을 선택하여 프로세스 덤프를 생성하는 것입니다.

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST 매개변수를 추가하여 두 번째 문자부터 시작하는 가능한 모든 비밀번호 목록을 생성할 수 있습니다.위협 모델에 따라 다릅니다. 컴퓨터가 이미 사용자 권한으로 백그라운드에서 실행되는 맬웨어에 감염된 경우, 이 발견으로 상황이 훨씬 나빠지지는 않습니다. 그러나 KeeTheft나 KeeFarce와 달리 프로세스 인젝션이나 다른 유형의 코드 실행이 필요 없기 때문에 맬웨어가 은밀하게 행동하고 안티바이러스를 회피하기가 더 쉬울 수 있습니다.
누군가 컴퓨터에 접근하여 포렌식 분석을 수행할 수 있다고 합리적으로 의심할 만한 상황이라면, 이는 좋지 않을 수 있습니다. 최악의 경우 KeePass가 잠겨 있거나 전혀 실행되고 있지 않더라도 마스터 비밀번호가 복구될 수 있습니다.
강력한 비밀번호로 전체 디스크 암호화를 사용하고 시스템이 깨끗하다면 괜찮을 것입니다. 이 발견만으로는 인터넷을 통해 원격으로 비밀번호를 도난당하지 않습니다.
KeePass 2.X는 비밀번호 입력을 위해 자체 개발한 텍스트 상자 SecureTextBoxEx를 사용합니다. 이 텍스트 상자는 마스터 비밀번호 입력뿐만 아니라 비밀번호 편집 상자 등 KeePass의 다른 곳에서도 사용됩니다 (따라서 이 공격은 해당 내용을 복구하는 데에도 사용될 수 있습니다).
여기서 악용되는 결함은 입력된 모든 문자에 대해 메모리에 잔여 문자열이 생성된다는 것입니다. .NET의 동작 방식 때문에 일단 생성되면 이를 제거하는 것이 거의 불가능합니다. 예를 들어 "Password"를 입력하면 다음과 같은 잔여 문자열이 생성됩니다: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. POC 애플리케이션은 덤프에서 이러한 패턴을 검색하여 비밀번호의 각 위치에 대한 가능한 문자를 제시합니다.
이 공격의 신뢰성은 비밀번호가 입력된 방식과 세션당 얼마나 많은 비밀번호가 입력되었는지에 따라 달라질 수 있습니다. 그러나 세션에 여러 비밀번호가 있거나 오타가 있더라도 .NET CLR이 이러한 문자열을 할당하는 방식 때문에 메모리에서 깔끔하게 정렬될 가능성이 높다는 것을 발견했습니다. 따라서 세 개의 서로 다른 비밀번호가 입력된 경우 각 문자 위치에 대해 세 개의 후보가 순서대로 나올 가능성이 높으며, 이를 통해 세 개의 비밀번호를 모두 복구할 수 있습니다.
빠르게 만든 POC이므로 신뢰성과 견고성이 높지 않을 수 있습니다. 문제를 발견하면 풀 리퀘스트를 생성하여 수정해 주세요.
허용되는 비밀번호 문자는 현재 다음과 같이 하드코딩되어 있습니다: ^[\x20-\x7E]+$ (인쇄 가능한 모든 ASCII 문자 및 공백).
비밀번호 목록 자동 생성 기능을 추가해 준 adridlug와 코드를 리팩터링해 준 ynuwenhof에게 감사드립니다.
아직 그중 어느 것도 확인하지 못했습니다.