PDF 암호화와 User-password 그리고 Owner-password

제가 최근에 pdfcrack을 통해 pdf 파일에 걸린 패스워드를 크랙하는 내용으로 을 썼었는데요. 이는 pdf 파일 크랙떄문에 메모 차 작성한 글이였고, 오늘은 pdf 파일의 암호화 자체에 대해 이야기할까 합니다. 그럼 pdf의 암호화와 user-password, owner-password 에 대해 알아보도록 하죠. (간단한 내용이에요)

User-password

user password는 보통 잘 알고 계신 pdf의 패스워드를 의미해요. 중요한 문서 데이터는 각 회사나 기관 등에서 제공 시 암호화를 걸어서 제공하게 되는데, 이 때 아무나 이 파일의 내용을 쉽게 확인할 수 없도록 AES 등의 암호화 알고리즘을 통해 데이터를 암호화하고, 암호화에 사용된 키 값을 사용자에게 제공(보통.. 생년월일..?)하여 풀어볼 수 있게 제공해주고 있습니다. 이러한 복호화 키를 user-password라고 부릅니다. 당연히 local에서 암호화 키 기반의 검증이기 때문에 cracking에는 취약할 수 밖에 없어요. 관련해서 내용을 찾아보면 조금 더 안전하게 사용하기 위해선 높은 암호화 알고리즘을 사용하라곤 하지만, 결국 키 값 자체가 단순하다면 어차피 복호화에 걸리는 시간은 그렇개 많지 않아집니다.

Adobe에선 ‘Document open password’ 라고 부릅니다.

Owner-password

오너 패스워드는 pdf 파일의 권한을 설정하는 패스워드입니다. 보통 기업 등에서 지정된 패스워드를 사용할 것이고, 이를 통해서 pdf 파일 내 복사 가능 여부, 프린트 가능 여부등을 명시할 수 있습니다. owner-password 또한 user-password 처럼 암호화에 사용되는 키 값이며, 파일에 명시된 알고리즘에 따라 사용됩니다.

Adobe에선 ‘Permissions password’ 라고 부릅니다.

Encryption

자 그럼 이제 암호화 이야기를 해야겠네요. pdf 파일은 단순히 패스워드를 저장하고 정확한 패스워드를 입력했는지 체크하는 형태가 아니라 진짜 파일내 컨텐츠를 사용자가 입력한 키로 암호화하고 패스워드 입력 단계에서 복호화하여 내용을 보여주는 플로우를 가지고 있습니다.

이는 대칭키 알고리즘은 AES를 사용하며 보통 파일 생성 과정에서 AES128, AES256 등 알고리즘을 지정하게 됩니다. 나머지 부분도 PDF 버전에 따른 스펙에 맞춰서 여러가지 기능들을 사용할 수 있다고 합니다. (단 pdf1.4 / pdf1.7 등 각 버전에서 사용 가능한 것들이 다르고, 이를 지원할 수 있는 pdf 리더들도 다르기 때문에 잘 체크해보셔야 합니다)

pdfcrack 등의 도구로 확인해보면 Length 값을 통해 확인할 수 있습니다. 이외에도 R(Revision), V(Algorithm version) 정보도 확인이 가능하구요.

AES128

PDF version 1.4
Security Handler: Standard
V: 2
R: 3
P: -1852
Length: 128
Encrypted Metadata: False

AES256

PDF version 1.7
Security Handler: Standard
V: 5
R: 5
P: -1852
Length: 256
Encrypted Metadata: False

암호화된 PDF는 아래와 같이 Plain PDF와 body, trailer 구간에서 차이가 납니다. (당연히 파일 전체가 암호화되는건 아니죠 😁) by eu-19-Muller-How-To-Break-PDF-Encryption

Metadata encryption

파일에는 많은 메타데이터 들이 있습니다. 파일 소유자, 생성일, 수정일, 또는 위치 정보 등이 해당하죠. 이러한 정보는 때때로 공격자에게 큰 도움이 될 수 있습니다. 출저URL 등에 중요정보가 남는 경우가 해당되겠죠. 이러한 정보 또한 암호화 단계에서 포함하여 암호화가 가능합니다. Adobe 공식 documents에는 이렇게 쓰여있습니다.

Specify the PDF document resources to encrypt by assigning a PasswordEncryptionOptionenumeration value to the PasswordEncryptionOptionSpec object’s encryptOption data member. To encrypt the entire PDF, including its metadata and its attachments, assign PasswordEncryptionOption.ALL to this data member.

메타데이터나, 첨부파일에 대해 추가 암호화를 하려면 PasswordEncryptionOption.ALL 옵션으로 암호화하라고… 아무튼 만약 메타데이터 내 중요 정보를 포함해야 한다면 이 또한 암호화하는게 좋습니다 :D

Other technic?

암호화 이외에도 봐야할 부분들은 더 있습니다. 2019년도에 BlackHat EU에서 PDF Encryption에 대한 발표가 있었는데요, 단순히 키 크랙 관점이 아닌 이미 암호화된 파일을 복호화하지 않고 공격자가 의도한 content를 임의로 Inject하는, 그리고 Gadget attack을 통해 조금 더 정교한 Injection을 구사하는 방법에 대한 내용입니다. 읽고 나면 PDF 자체에 대해 관점이 조금 더 생기니 꼭 읽어보시길 바래요!

https://i.blackhat.com/eu-19/Thursday/eu-19-Muller-How-To-Break-PDF-Encryption-2.pdf

References