Sonntag, 24. Februar 2019

How To Spoof PDF Signatures

One year ago, we received a contract as a PDF file. It was digitally signed. We looked at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document - ignoring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "certificate is not trusted" warning shown by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 viewer - and asked ourselfs:

"How do PDF signatures exactly work?"

We are quite familiar with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of message formats like XML and JSON. But nobody had an idea, how PDFs really work. So we started our research journey.

Today, we are happy to announce our results. In this blog post, we give an overview how PDF signatures work and on top, we reveal three novel attack classes for spoofing a digitally signed PDF document. We present our evaluation of 22 different PDF viewers and show 21 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to be vulnerable. We additionally evaluated 8 online validation services and found 6 to be vulnerable.

In cooperation with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSI-CERT, we contacted all vendors, provided proof-of-concept exploits, and helped cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues and three generic CVEs for each attack class were issued: CVE-2018-16042CVE-2018-18688CVE-2018-18689.


Full results are available in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 master cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis of Karsten Meyer zu Selhausen, in our security report, and on our website.

Digitally Signed PDFs? Who cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Hell uses this?

Maybe you asked yourself, if signed PDFs are important and who uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.
In fact, you may have already used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.
Have you ever opened an Invoice by companies such as Amazon, Sixt, or Decathlon?
These PDFs are digitally signed and protected against modifications.
In fact, PDF signatures are widely deployed in our world. In 2000, President Bill Clinton enacted a federal law facilitating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of electronic and digital signatures in interstate and foreign commerce by ensuring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validity and legal effect of contracts. He approved cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 eSign Act by digitally signing it.
Since 2014, organizations delivering public digital services in an EU member state are required to support digitally signed documents, which are even admissible as evidence in legal proceedings.
In Austria, every governmental authority digitally signs any official document [§19]. In addition, any new law is legally valid after its announcement within a digitally signed PDF.
Several countries like Brazil, Canada, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Russian Federation, and Japan also use and accept digitally signed documents.
According to Adobe Sign, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 company processed 8 billion electronic and digital signatures in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2017 alone.

Crash Course: PDF and PDF Signatures

To understand how to spoof PDF Signatures, we unfortunately need to explain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basics first. So here is a breef overview.

PDF files are ASCII files. You can use a common text editor to open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m and read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code.

PDF header. The header is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first line within a PDF and defines cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter version to be used. The provided example uses version PDF 1.7. 
PDF body. The body defines cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF and contains text blocks, fonts, images, and metadata regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file itself. The main building blocks within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 body are objects. Each object starts with an object number followed by a generation number. The generation number should be incremented if additional changes are made to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object.
In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Body contains four objects: Catalog, Pages, Page, and stream. The Catalog object is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root object of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file. It defines cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document structure and can additionally declare access permissions. The Catalog refers to a Pages object which defines cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pages and a reference to each Page object (e.g., text columns). The Page object contains information how to build a single page. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given example, it only contains a single string object “Hello World!”.
Xref table. The Xref table contains information about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 position (byte offset) of all PDF objects within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file.
Trailer. After a PDF file is read into memory, it is processed from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning. By this means, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Trailer is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first processed content of a PDF file. It contains references to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Catalog and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Xref table.

How do PDF Signatures work?

PDF Signatures rely on a feature of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF specification called incremental saving (also known as incremental update), allowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 modification of a PDF file without changing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous content.
 
As you can see in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 figure on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left side, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original document is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same document as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one described above. By signing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document, an incremental saving is applied and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following content is added: a new Catalog, a Signature object, a new Xref table referencing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new object(s), and a new Trailer. The new Catalog extends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old one by adding a reference to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Signature object. The Signature object (5 0 obj) contains information regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applied cryptographic algorithms for hashing and signing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document. It additionally includes a Contents parameter containing a hex-encoded PKCS7 blob, which holds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certificates as well as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature value created with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 private key corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certificate. The ByteRange parameter defines which bytes of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file are used as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hash input for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature calculation and defines 2 integer tuples: 
a, b : Beginning at byte offset a, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following b bytes are used as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first input for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hash calculation. Typically, a 0 is used to indicate that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file is used while a b is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 byte offset where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PKCS#7 blob begins.
c, d : Typically, byte offset c is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PKCS#7 blob, while c d points to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last byte range of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file and is used as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second input to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hash calculation.
According to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specification, it is recommended to sign cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole file except for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PKCS#7 blob (located in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 range between a b and c).

Attacks

During our research, we discovered three novel attack classes on PDF signatures:

  1. Universal Signature Forgery (USF)
  2. Incremental Saving Attack (ISA)
  3. Signature Wrapping Attack (SWA)

In this blog post, we give an overview on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacks without going into technical details. If you are more interested, just take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sources we summarized for you here.

Universal Signature Forgery (USF)

The main idea of Universal Signature Forgery (USF) is to manipulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 meta information in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature in such a way that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 targeted viewer application opens cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file, finds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature, but is unable to find all necessary data for its validation.

Instead of treating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 missing information as an error, it shows that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contained signature is valid. For example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can manipulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Contents or ByteRange values within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Signature object. The manipulation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se entries is reasoned by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that we eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature value or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information stating which content is signed.
The attack seems trivial, but even very good implementations like Adobe Reader DC preventing all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r attacks were susceptible against USF.

Incremental Saving Attack (ISA)



The Incremental Saving Attack (ISA) abuses a legitimate feature of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF specification, which allows to update a PDF file by appending cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 changes. The feature is used, for example, to store PDF annotations, or to add new pages while editing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file.

The main idea of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ISA is to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same technique for changing elements, such as texts, or whole pages included in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signed PDF file to what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker desires.
In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, an attacker can redefine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document’s structure and content using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Body Updates part. The digital signature within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file protects precisely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file defined in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ByteRange. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 incremental saving appends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Body Updates to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file, it is not part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 defined ByteRange and thus not part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature’s integrity protection. Summarized, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature remains valid, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Body Updates changed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 displayed content.
This is not forbidden by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF specification, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature validation should indicate that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document has been altered after signing.

Signature Wrapping Attack (SWA)

Independently of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDFs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main idea behind Signature Wrapping Attacks is to force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 verification logic to process different data than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application logic.

In PDF files, SWA targets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature validation logic by relocating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 originally signed content to a different position within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document and inserting new content at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated position. The starting point for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manipulation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ByteRange value allowing to shift cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signed content to different loctions within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file.

On a very technical level, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker uses a validly signed document (shown on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left side) and proceeds as follows:


  • Step 1 (optional): The attacker deletes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 padded zero Bytes within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Contents parameter to increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 available space for injecting manipulated objects.
  • Step 2: The attacker defines a new /ByteRange [a b c* d] by manipulating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 c value, which now points to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second signed part placed on a different position within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document.
  • Step 3: The attacker creates a new Xref table pointing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new objects. It is essential that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 byte offset of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newly inserted Xref table has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same byte offset as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous Xref table. The position is not changeable since it is refer- enced by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signed Trailer. For this purpose, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can add a padding block (e.g., using whitespaces) before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new Xref table to fill cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unused space.
  • Step 4: The attacker injects malicious objects which are not protected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature. There are different injection points for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se objects. They can be placed before or after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malicious Xref table. If Step 1 is not executed, it is only possible to place cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malicious Xref table.
  • Step 5 (optional): Some PDF viewers need a Trailer after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manipulated Xref table, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y cannot open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file or detect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manipulation and display a warning message. Copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last Trailer is sufficient to bypass this limitation.
  • Step 6: The attacker moves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signed content defined by c and d at byte offset c*. Optionally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 moved content can be encapsulated within a stream object. Noteworthy is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manipulated PDF file does not end with %%EOF after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 endstream. The reason why some validators throw a warning that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file was manipulated after signing is because of an %%EOF after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signed one. To bypass this requirement, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file is not correctly closed. However, it will be still processed by any viewer.

Evaluation

In our evaluation, we searched for desktop applications validating digitally signed PDF files. We analyzed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir signature validation process against our 3 attack classes. The 22 applications fulfill cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se requirements. We evaluated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applications on all supported platforms (Windows, MacOS, and Linux).


Authors of this Post

Vladislav Mladenov
Christian Mainka
Karsten Meyer zu Selhausen
Martin Grocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365
Jörg Schwenk

Acknowledgements

Many thanks to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CERT-Bund team for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 great support during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 responsible disclosure.
We also want to acknowledge cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teams which reacted to our report and fixed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable implementations.

Beliebte Posts