亚洲日本免费-啊轻点灬太粗太长了三男一女-麻豆av电影在线观看-日韩一级片毛片|www.grbbt.com

淺談如何實(shí)現(xiàn)PDF簽名的欺騙攻擊

前言

本文對(duì)PDF文件及其數(shù)字簽名機(jī)制進(jìn)行了分析,并提出了三種針對(duì)PDF簽名的攻擊方式。

一年前,我們收到一份PDF合同,包含有數(shù)字簽名。我們查看文檔內(nèi)容的時(shí)候,忽略了其“證書(shū)不可信”的警告。不禁令人心生疑惑:

“PDF簽名機(jī)制如何工作?”

我們對(duì)于類似xml和json信息格式的安全性非常熟悉了,但是似乎很少有人了解,PDF的安全機(jī)制是如何工作的。因此我們決定圍繞此問(wèn)題展開(kāi)研究。

時(shí)至今日,我們很高興的公布我們的研究成果。本篇文章中,我們簡(jiǎn)要概述了PDF簽名的工作機(jī)理,重要的是我們揭示了三個(gè)新的攻擊方式,用于實(shí)現(xiàn)對(duì)PDF文檔數(shù)字簽名的欺騙。我們對(duì)22款PDF閱讀器進(jìn)行測(cè)試評(píng)估,結(jié)果發(fā)現(xiàn)有21個(gè)是存在安全性風(fēng)險(xiǎn)的。我們還對(duì)8個(gè)在線驗(yàn)證服務(wù)進(jìn)行測(cè)試,結(jié)果發(fā)現(xiàn)有6個(gè)是易受攻擊的。

通過(guò)與BSI-CERT合作,我們聯(lián)系了所有的開(kāi)發(fā)商,向他們提供PoC,并幫助修復(fù)漏洞。對(duì)每一種攻擊方式均取得了CVE:CVE-2018-16042,?CVE-2018-18688,?CVE-2018-18689

完整的結(jié)果可參考Karsten Meyer zu Selhausen論文,我們的研究報(bào)告或者我們的網(wǎng)站

究竟何人在用PDF簽名?

也許你會(huì)心生疑問(wèn):既然PDF簽名如此重要,那么究竟誰(shuí)在使用?

事實(shí)上,也許你自己早就使用過(guò)PDF簽名。

你是否曾經(jīng)打開(kāi)過(guò)諸如Amazon、Sixt 或是 Decathlon 公司開(kāi)具的發(fā)票?

這些PDF文件都是經(jīng)過(guò)數(shù)字簽名保護(hù)的,以防止被篡改。

實(shí)際上,PDF簽名在我們身邊具有廣泛的應(yīng)用。2000年,Bill Clinton總統(tǒng)頒布了一項(xiàng)聯(lián)邦法律,推廣在各州間和國(guó)際間數(shù)字簽名的使用,以確保合同的有效性和法律效力。他通過(guò)數(shù)字簽名簽署了此項(xiàng)法案

自2014年起,在歐盟成員國(guó)內(nèi)提供公共數(shù)字服務(wù)的組織必須支持?jǐn)?shù)字簽名文檔,這些文檔甚至可以作為法律訴訟的證據(jù)。

在奧地利,每個(gè)政府機(jī)構(gòu)都會(huì)對(duì)所有官方文檔進(jìn)行數(shù)字簽名。此外,任何新頒布的法律只有在其文檔經(jīng)過(guò)數(shù)字簽名后,才算在法律上生效。

像巴西、加拿大、俄羅斯和日本等國(guó)也都廣泛使用數(shù)字簽名文檔。

據(jù)Adobe官方聲稱,公司僅在2017年就處理了80億個(gè)數(shù)字簽名

PDF文件及其簽名速覽

PDF文件格式

為更好的理解數(shù)字簽名欺騙,我們首先不得不解釋一些基本概念。首先對(duì)PDF文件進(jìn)行概述。

PDF文件其本質(zhì)是ASCII文件。利用普通的文本編輯器打開(kāi),即可觀察到源代碼。

pdf-doc-1.png

  • PDF headerheader是PDF文件的第一行,定義了所需解釋器的版本。示例中的版本是PDF1.7.
  • PDF bodybody定義了PDF文件的內(nèi)容,包括文件自身的文本塊、字體、圖片和其他數(shù)據(jù)。body的主體部分是對(duì)象。每個(gè)對(duì)象以一個(gè)對(duì)象編號(hào)開(kāi)頭,后面跟一個(gè)代號(hào)(generation number)。如果對(duì)相應(yīng)的對(duì)象進(jìn)行了更改,則應(yīng)該增加代號(hào)。

在所給示例中,Body包含4個(gè)對(duì)象:Catalog, Pages, Page, stream。Catalog對(duì)象是PDF文件的根對(duì)象,定義了文檔結(jié)構(gòu),還可以聲明訪問(wèn)權(quán)限。Catalog對(duì)象應(yīng)用了Pages對(duì)象,后者定義了頁(yè)數(shù)以及對(duì)每個(gè)Pages對(duì)象的引用信息。Pages對(duì)象包含有如何構(gòu)建一個(gè)單獨(dú)頁(yè)面的信息。在給定的示例中,它包含一個(gè)單獨(dú)的字符串對(duì)象“hello world!”

  • Xref table:包含文件內(nèi)所有PDF對(duì)象的位置信息(字節(jié)偏移量)
  • Trailer:當(dāng)一個(gè)PDF文件讀入內(nèi)存,將從尾到頭進(jìn)行處理。這就意味著,Trailer是PDF文檔中首先處理的內(nèi)容,它包含對(duì)Catalog和Xref table的引用。

PDF簽名如何工作

PDF簽名依賴于PDF一項(xiàng)特定功能,稱之為增量存儲(chǔ)(也稱增量更新),其允許修改PDF文件而不必改變之前的內(nèi)容。

pdf-doc-signed-1.png

從圖中觀察可知,原始的文檔和這里的文檔是一樣的。通過(guò)對(duì)文檔進(jìn)行簽名,利用增量存儲(chǔ)來(lái)添加以下內(nèi)容:一個(gè)新的Catalog,一個(gè)簽名對(duì)象,一個(gè)新的Xref table引用了新對(duì)象,和一個(gè)新的Trailer。其中,新Catalog通過(guò)添加對(duì)Signature對(duì)象的引用,來(lái)擴(kuò)展舊Catalog。Signature對(duì)象(5 0 obj)包含有哈希和簽名文檔的密碼算法信息。它還有一個(gè)Contents參數(shù),其包含一個(gè)16進(jìn)制編碼的PKCS7 blob,該blob存有證書(shū)信息,以及利用證書(shū)中公鑰對(duì)應(yīng)私鑰創(chuàng)建簽名值。ByteRange 參數(shù)指定了PDF文件的哪些字節(jié)用作簽名計(jì)算的哈希輸入,并定義了2個(gè)整數(shù)元組:

  • a,b: 從字節(jié)偏移量a開(kāi)始,后續(xù)的b個(gè)字節(jié)作為哈希運(yùn)算的第一個(gè)輸入。通常,a取值為0表示起始位置為文件頭部,偏移量b則取值為PKCS#7 blob的起始位置。
  • c,d:通常,偏移量c為PKCS#7 blob的結(jié)束位置,而c d則指向PDF文件的最后一個(gè)字節(jié)的范圍,用作哈希運(yùn)算的第二個(gè)輸入。

根據(jù)相應(yīng)的規(guī)范,建議對(duì)文件進(jìn)行簽名時(shí),并不計(jì)算PKCS#7 blob部分(位于b和c之間)。

攻擊方式

根據(jù)研究,我們發(fā)現(xiàn)了針對(duì)PDF簽名的三種新型攻擊方式:

  1. 通用簽名偽造(Universal Signature Forgery ,USF)
  2. 增量存儲(chǔ)攻擊(Incremental Saving Attack ,ISA)
  3. 簽名包裝攻擊(Signature Wrapping Attack ,SWA)

在本篇文章中,我們僅對(duì)各攻擊進(jìn)行概述,并不闡述詳細(xì)的技術(shù)細(xì)節(jié)。如果讀者對(duì)此感興趣,可參考我們總結(jié)的資源。

通用簽名偽造 USF

1.png

通用簽名偽造的主體思想就是控制簽名中的原始數(shù)據(jù)信息,通過(guò)這種方式,使目標(biāo)閱讀器程序在打開(kāi)PDF文件尋找簽名時(shí),無(wú)法找到其驗(yàn)證所需的所有數(shù)據(jù)信息。

這種操作并不會(huì)導(dǎo)致將缺失的信息認(rèn)定為錯(cuò)誤,相反其會(huì)顯示簽名的驗(yàn)證是有效的。例如,攻擊者控制Signature對(duì)象中的ContentsByteRange的數(shù)值,對(duì)其控制操作的具體內(nèi)容:我們要么直接移除簽名值,要么刪除簽名內(nèi)容的起始位置信息。這種攻擊似乎微不足道,但即使是諸如Adobe Reader DC這樣優(yōu)秀的開(kāi)發(fā)程序,能夠阻止其他多種功能類型的攻擊,卻也容易遭受USF攻擊。

增量存儲(chǔ)攻擊 ISA

增量存儲(chǔ)攻擊濫用了PDF規(guī)范中的合法功能,該功能允許PDF文件通過(guò)追加內(nèi)容來(lái)實(shí)現(xiàn)文件更新。這項(xiàng)功能很有用處,例如存儲(chǔ)PDF注釋或者在編輯文件時(shí)添加新的頁(yè)面。

2.png

ISA的主要思想是利用相同的技術(shù)來(lái)將簽名PDF文件中的元素更改為攻擊者所需內(nèi)容,例如文本、或是整個(gè)頁(yè)面。

換而言之,一個(gè)攻擊者可以通過(guò)Body Updates重新定義文檔的結(jié)構(gòu)和內(nèi)容。PDF文件內(nèi)的數(shù)字簽名可以精確保護(hù)ByteRange定義的文件內(nèi)容。由于增量存儲(chǔ)會(huì)將Body Updates追加保存到文件的結(jié)尾,其不屬于ByteRange定義的內(nèi)容,因此也就不受數(shù)據(jù)簽名的完整性保護(hù)。總而言之,簽名仍然有效,而Body Updates也更改了文件的內(nèi)容。

PDF規(guī)范并沒(méi)有禁止此操作,但簽名驗(yàn)證應(yīng)指明已簽名的文檔已經(jīng)被篡改。

簽名包裝攻擊 SWA

獨(dú)立于PDF,簽名包裝攻擊的主體思想是迫使驗(yàn)證邏輯處理與應(yīng)用邏輯不同的數(shù)據(jù)。

3.png

在PDF文件中,SWA將原始的簽名內(nèi)容重定位到文檔內(nèi)的不同位置,并在已分配的位置處插入新的內(nèi)容,以此來(lái)定位簽名驗(yàn)證邏輯。攻擊的起始點(diǎn)是控制ByteRange值,使其允許簽名內(nèi)容轉(zhuǎn)移到文件內(nèi)的不同位置。

在技術(shù)層面上,攻擊者使用有效的簽名文檔(如圖所示),并按以下方式執(zhí)行操作:

sig-bypass-swa.png-1.png

  • step 1 (可選):攻擊者刪除Contents參數(shù)內(nèi)的零字節(jié)填充,以增加注入操作對(duì)象的可用空間。
  • step 2:攻擊者通過(guò)操控c的值來(lái)定義新的ByteRange [a b c* d],使其指向文件中處于不同位置的第二個(gè)簽名部分。
  • step 3:攻擊者創(chuàng)建指向新對(duì)象的新的Xref table,必須保持新插入的Xref table的字節(jié)偏移與前一個(gè)Xref table的相同。該位置不可更改,因?yàn)樗怯梢押灻?strong>Trailer所引用的。正因如此,攻擊者可以在新的Xref table前增加一個(gè)填充塊(例如,可用空格),以此來(lái)填滿未用空間。
  • step 4:攻擊者注入不受簽名保護(hù)的惡意對(duì)象。對(duì)這些對(duì)象而言,有多種不同的注入點(diǎn)。它們可以放置于惡意Xref table之前或之后。如果step 1沒(méi)有執(zhí)行,則只能將其放置于惡意Xref table之后。
  • step 5(可選):一些PDF閱讀器需要在操控的Xref table之后加入Trailer,否則將無(wú)法打開(kāi)PDF文件或者檢測(cè)到修改并提示錯(cuò)誤信息。拷貝最后部分的Trailer,從而繞過(guò)其限制。
  • step 6:攻擊者刪除在字節(jié)偏移c*處、由c和d定義的已簽名內(nèi)容。當(dāng)然,也可以選擇刪除封裝在流對(duì)象中的內(nèi)容。值得注意的是,被操控的PDF文件并沒(méi)有以%%EOF結(jié)尾。一些驗(yàn)證程序之所以會(huì)提示已簽名文件被修改,是由于簽名后面的%%EOF。為了繞過(guò)此需求,PDF文件無(wú)法正常關(guān)閉。但是,它仍然可以由其他閱讀器處理。

 

測(cè)試評(píng)估

在我們的測(cè)試評(píng)估階段,我們搜索了驗(yàn)證PDF文件簽名的桌面應(yīng)用程序。我們針對(duì)這3種攻擊方式,驗(yàn)證了其簽名驗(yàn)證流程的安全性。有22個(gè)應(yīng)用程序滿足要求。我們?cè)谒兄С值钠脚_(tái)上(Windows, MacOS, and Linux),對(duì)這些應(yīng)用程序的最新版本進(jìn)行了評(píng)估,結(jié)果如下所示:

evalution.png

本文翻譯自 web-in-security.blogspot.com,原文地址:https://web-in-security.blogspot.com/2019/02/how-to-spoof-pdf-signatures.html

上一篇:澄清對(duì)零信任安全的5大誤區(qū)