前言
本文對PDF文件及其數(shù)字簽名機制進行了分析,并提出了三種針對PDF簽名的攻擊方式。
一年前,我們收到一份PDF合同,包含有數(shù)字簽名。我們查看文檔內(nèi)容的時候,忽略了其“證書不可信”的警告。不禁令人心生疑惑:
“PDF簽名機制如何工作?”
我們對于類似xml和json信息格式的安全性非常熟悉了,但是似乎很少有人了解,PDF的安全機制是如何工作的。因此我們決定圍繞此問題展開研究。
時至今日,我們很高興的公布我們的研究成果。本篇文章中,我們簡要概述了PDF簽名的工作機理,重要的是我們揭示了三個新的攻擊方式,用于實現(xiàn)對PDF文檔數(shù)字簽名的欺騙。我們對22款PDF閱讀器進行測試評估,結(jié)果發(fā)現(xiàn)有21個是存在安全性風險的。我們還對8個在線驗證服務(wù)進行測試,結(jié)果發(fā)現(xiàn)有6個是易受攻擊的。
通過與BSI-CERT合作,我們聯(lián)系了所有的開發(fā)商,向他們提供PoC,并幫助修復(fù)漏洞。對每一種攻擊方式均取得了CVE:CVE-2018-16042,?CVE-2018-18688,?CVE-2018-18689。
完整的結(jié)果可參考Karsten Meyer zu Selhausen的論文,我們的研究報告或者我們的網(wǎng)站
究竟何人在用PDF簽名?
也許你會心生疑問:既然PDF簽名如此重要,那么究竟誰在使用?
事實上,也許你自己早就使用過PDF簽名。
你是否曾經(jīng)打開過諸如Amazon、Sixt 或是 Decathlon 公司開具的發(fā)票?
這些PDF文件都是經(jīng)過數(shù)字簽名保護的,以防止被篡改。
實際上,PDF簽名在我們身邊具有廣泛的應(yīng)用。2000年,Bill Clinton總統(tǒng)頒布了一項聯(lián)邦法律,推廣在各州間和國際間數(shù)字簽名的使用,以確保合同的有效性和法律效力。他通過數(shù)字簽名簽署了此項法案。
自2014年起,在歐盟成員國內(nèi)提供公共數(shù)字服務(wù)的組織必須支持數(shù)字簽名文檔,這些文檔甚至可以作為法律訴訟的證據(jù)。
在奧地利,每個政府機構(gòu)都會對所有官方文檔進行數(shù)字簽名。此外,任何新頒布的法律只有在其文檔經(jīng)過數(shù)字簽名后,才算在法律上生效。
像巴西、加拿大、俄羅斯和日本等國也都廣泛使用數(shù)字簽名文檔。
據(jù)Adobe官方聲稱,公司僅在2017年就處理了80億個數(shù)字簽名。
PDF文件及其簽名速覽
為更好的理解數(shù)字簽名欺騙,我們首先不得不解釋一些基本概念。首先對PDF文件進行概述。
PDF文件其本質(zhì)是ASCII文件。利用普通的文本編輯器打開,即可觀察到源代碼。
在所給示例中,Body包含4個對象:Catalog, Pages, Page, stream。Catalog對象是PDF文件的根對象,定義了文檔結(jié)構(gòu),還可以聲明訪問權(quán)限。Catalog對象應(yīng)用了Pages對象,后者定義了頁數(shù)以及對每個Pages對象的引用信息。Pages對象包含有如何構(gòu)建一個單獨頁面的信息。在給定的示例中,它包含一個單獨的字符串對象“hello world!”
PDF簽名依賴于PDF一項特定功能,稱之為增量存儲(也稱增量更新),其允許修改PDF文件而不必改變之前的內(nèi)容。
從圖中觀察可知,原始的文檔和這里的文檔是一樣的。通過對文檔進行簽名,利用增量存儲來添加以下內(nèi)容:一個新的Catalog,一個簽名對象,一個新的Xref table引用了新對象,和一個新的Trailer。其中,新Catalog通過添加對Signature對象的引用,來擴展舊Catalog。Signature對象(5 0 obj)包含有哈希和簽名文檔的密碼算法信息。它還有一個Contents參數(shù),其包含一個16進制編碼的PKCS7 blob,該blob存有證書信息,以及利用證書中公鑰對應(yīng)私鑰創(chuàng)建簽名值。ByteRange 參數(shù)指定了PDF文件的哪些字節(jié)用作簽名計算的哈希輸入,并定義了2個整數(shù)元組:
根據(jù)相應(yīng)的規(guī)范,建議對文件進行簽名時,并不計算PKCS#7 blob部分(位于b和c之間)。
攻擊方式
根據(jù)研究,我們發(fā)現(xiàn)了針對PDF簽名的三種新型攻擊方式:
在本篇文章中,我們僅對各攻擊進行概述,并不闡述詳細的技術(shù)細節(jié)。如果讀者對此感興趣,可參考我們總結(jié)的資源。
通用簽名偽造的主體思想就是控制簽名中的原始數(shù)據(jù)信息,通過這種方式,使目標閱讀器程序在打開PDF文件尋找簽名時,無法找到其驗證所需的所有數(shù)據(jù)信息。
這種操作并不會導(dǎo)致將缺失的信息認定為錯誤,相反其會顯示簽名的驗證是有效的。例如,攻擊者控制Signature對象中的Contents或ByteRange的數(shù)值,對其控制操作的具體內(nèi)容:我們要么直接移除簽名值,要么刪除簽名內(nèi)容的起始位置信息。這種攻擊似乎微不足道,但即使是諸如Adobe Reader DC這樣優(yōu)秀的開發(fā)程序,能夠阻止其他多種功能類型的攻擊,卻也容易遭受USF攻擊。
增量存儲攻擊濫用了PDF規(guī)范中的合法功能,該功能允許PDF文件通過追加內(nèi)容來實現(xiàn)文件更新。這項功能很有用處,例如存儲PDF注釋或者在編輯文件時添加新的頁面。
ISA的主要思想是利用相同的技術(shù)來將簽名PDF文件中的元素更改為攻擊者所需內(nèi)容,例如文本、或是整個頁面。
換而言之,一個攻擊者可以通過Body Updates重新定義文檔的結(jié)構(gòu)和內(nèi)容。PDF文件內(nèi)的數(shù)字簽名可以精確保護ByteRange定義的文件內(nèi)容。由于增量存儲會將Body Updates追加保存到文件的結(jié)尾,其不屬于ByteRange定義的內(nèi)容,因此也就不受數(shù)據(jù)簽名的完整性保護。總而言之,簽名仍然有效,而Body Updates也更改了文件的內(nèi)容。
PDF規(guī)范并沒有禁止此操作,但簽名驗證應(yīng)指明已簽名的文檔已經(jīng)被篡改。
獨立于PDF,簽名包裝攻擊的主體思想是迫使驗證邏輯處理與應(yīng)用邏輯不同的數(shù)據(jù)。
在PDF文件中,SWA將原始的簽名內(nèi)容重定位到文檔內(nèi)的不同位置,并在已分配的位置處插入新的內(nèi)容,以此來定位簽名驗證邏輯。攻擊的起始點是控制ByteRange值,使其允許簽名內(nèi)容轉(zhuǎn)移到文件內(nèi)的不同位置。
在技術(shù)層面上,攻擊者使用有效的簽名文檔(如圖所示),并按以下方式執(zhí)行操作:
ByteRange [a b c* d]
,使其指向文件中處于不同位置的第二個簽名部分。
測試評估
在我們的測試評估階段,我們搜索了驗證PDF文件簽名的桌面應(yīng)用程序。我們針對這3種攻擊方式,驗證了其簽名驗證流程的安全性。有22個應(yīng)用程序滿足要求。我們在所有支持的平臺上(Windows, MacOS, and Linux),對這些應(yīng)用程序的最新版本進行了評估,結(jié)果如下所示: