MuPDF와 Foxit 등 일부 PDF 소프트웨어가 암호학적으로 안전하지 않은 난수로 AES-256 파일 키를 만들어, 비밀번호 없이도 보호된 PDF를 복호화할 수 있다는 분석이 나왔다. 문제는 AES-256 자체가 아니라 키 생성 방식이며, 제작자들은 관련 문제를 업체에 알렸고 MuPDF에서는 수정됐다.

PDF는 문서 내용을 무작위 32바이트 파일 키로 암호화하고, 비밀번호와 솔트를 해시해 별도의 키를 만든 뒤 이 파일 키를 암호화한다. 따라서 파일 키를 추측할 수 있다면 비밀번호를 몰라도 문서를 열 수 있다.

MuPDF 1.28.5 이전 버전은 drand48 계열 난수 생성기를 사용했다. 이 생성기는 초 단위 타임스탬프로 초기화되지만, 상태의 하위 16비트는 고정값이고 출력에 영향을 주는 부분은 타임스탬프의 9비트뿐이다. 그 결과 가능한 키 후보는 512개로 줄어들며, 타임스탬프가 512초 차이 나는 경우에도 같은 바이트열이 나온다. 문서에 평문으로 저장되는 /ID 값도 후보를 확인하는 데 활용할 수 있다.

분석에 따르면 Foxit PDF Reader 2026.1.3.36551은 현재 시각과 초기화되지 않은 32바이트, 상수 문자열을 해시해 파일 키를 만든다. 해당 바이트가 실제로는 0으로 채워져 추가 무작위성을 제공하지 않으므로, 타임스탬프 후보를 검색하면 키를 찾을 수 있다. 문서의 /Perms 블록에 알려진 평문이 있어 후보마다 해시와 AES 블록 복호화만으로 확인할 수 있다. 분석에 사용한 Rust 구현은 Ryzen 9 7950X의 32개 스레드에서 초당 3억7000만~3억7600만 개 타임스탬프를 검색했다. 유닉스 시점부터 현재까지의 검색은 4.85초였으며, 최근에 생성된 문서는 분석 측 설명대로라면 검색 시간이 밀리초 단위일 수 있다.

OpenPDF 3.0.5와 iText 9.7.1도 밀리초 단위 시각과 JVM의 여유 메모리로 시드한 ARC4 스트림을 난수 생성에 사용한다. 분석 측은 평문으로 저장되는 /U와 /O의 솔트를 이용해 시각과 메모리 값을 추정한 뒤 인접한 스트림 바이트에서 파일 키를 복구할 수 있다고 설명했다. 다만 이 방식은 MuPDF와 Foxit 사례보다 변수가 더 많다고 밝혔다.

Foxit에서 비롯된 것으로 보이는 키 생성 코드 패턴은 PDFium의 2014년 최초 공개 커밋에도 있었고, PDFium 파일 헤더에는 원래 코드의 출처로 Foxit이 적혀 있다. 다른 편집기들도 PDFium을 통해 같은 방식을 사용했을 가능성이 있다고 분석 측은 덧붙였다. 분석 측은 MuPDF와 Foxit용 복호화 도구를 공개했다. 이미 만들어진 PDF는 사후에 보호를 강화할 수 없으므로, 취약한 방식으로 생성된 기존 문서도 영향을 받을 수 있다.