
【免費(fèi)下載鏈接】publicationsPublications from Trail of Bits項(xiàng)目地址https://gitcode.com/GitHub_Trending/pu/publications點(diǎn)擊查看免費(fèi)下載本文以 The Treachery of Files 演講Evan SultanikBSides Philly 2017 與 Empire Hacking 2019 兩次公開報(bào)告幻燈片分別存于 File Polyglottery BSides Philly 2017.pdf 與 The Treachery of Files Empire Hacking 2019.pdf為核心系統(tǒng)講解文件多態(tài)polyglot攻擊的構(gòu)造原理——tar/tar.gz、PDF/NES、PDF/PostScript、PDF/Git 等真實(shí)案例——以及 Trail of Bits 為此開發(fā)的 PolyFile文件逆向?yàn)g覽器與 PolyTrackerLLVM 整輸入污點(diǎn)追蹤兩個(gè)工具的設(shè)計(jì)目標(biāo)、技術(shù)路線與輸出形式。讀完本篇你將理解同一個(gè)字節(jié)流對(duì)不同解析器呈現(xiàn)不同含義這一安全命題的完整技術(shù)鏈條并掌握一套分析可疑文件格式歧義的實(shí)戰(zhàn)方法論。核心命題文件沒有固有含義該演講以雙幕劇結(jié)構(gòu)展開README 中的摘要點(diǎn)明了主線Parsing is hard, even when a file format is well specified. When the specification is ambiguous, it leads to unintended parser behaviors that make file formats susceptible to security vulnerabilities. This talk explores whether we could automatically generate a safe subset of any file format along with an associated verified parser, provides examples of malicious files, and introduces PolyFile and PolyTracker -- two new tools for reverse engineering files and parsers.Act I 的目標(biāo)是證明這些花里胡哨的文件不只是會(huì)客廳里的奇技淫巧parlor tricks而是真實(shí)的安全問(wèn)題。演講引用了 Ange Albertini 在 PoC||GTFO 7:6 中的論斷作為第一幕的理論基石…a file has no intrinsic meaning. The meaning of a file—its type, its validity, its contents—can be different for each parser or interpreter.文件本身只是一段字節(jié)序列這是什么類型它是否合法它的內(nèi)容是什么這些問(wèn)題只有交給具體解析器回答。因此只要兩個(gè)解析器對(duì)同一字節(jié)流的接受集合grammar存在差異攻擊者就可能在差異處構(gòu)造出文件多態(tài)文件對(duì)解析器 A 是格式甲對(duì)解析器 B 是格式乙。Act I惡意文件的實(shí)戰(zhàn)案例tar 自動(dòng)探測(cè)與 .tar/.tar.gz 多態(tài)演講2017 版幻燈片中以 Before we get to more PoC||GTFO…Time to drop some 0-day! 引出給出的第一個(gè)案例利用了一個(gè)幾乎人人都會(huì)踩的解析行為$ tar xvf totally_not_malware.tar.gz注意命令中并沒有提供z選項(xiàng)?,F(xiàn)代版本的 tar 會(huì)基于magic bytes魔數(shù)自動(dòng)檢測(cè)歸檔是否經(jīng)過(guò) gzip 壓縮而實(shí)際的文件擴(kuò)展名被完全忽略。這直接引出一個(gè)構(gòu)造問(wèn)題What if we created a file that is both a valid .tar and a valid .tar.gz?即同時(shí)構(gòu)造一個(gè)既是合法 .tar、又是合法 .tar.gz的文件。由于 tar 的壓縮判斷依賴魔數(shù)而非擴(kuò)展名下游工具對(duì)該文件的身份判定將完全取決于它內(nèi)部探測(cè)到哪個(gè)魔數(shù)——這是解析即含義的最典型體現(xiàn)。為什么 PDF 特別易多態(tài)演講對(duì) PDF 格式的多態(tài)體質(zhì)給出了四點(diǎn)歸因Because Adobe, thats why!——PDF 生態(tài)歷史悠久解析器被刻意設(shè)計(jì)得對(duì)各種錯(cuò)誤和不兼容輸入高度寬容resilient文件存在時(shí)間長(zhǎng)各實(shí)現(xiàn)之間的行為分歧積累得更多幾乎可以在文件的任意位置插入任意長(zhǎng)度的二進(jìn)制塊——PDF 對(duì)象流object stream天然支持幾乎所有解析器都會(huì)忽略 PDF 頭%PDF-header之前的所有內(nèi)容。演講幻燈片直接給出了這種任意插入的結(jié)構(gòu)示意lol, put whatever you want here! ← 頭之前的垃圾解析器無(wú)視 %PDF-1.5 %D0D4C5D8 ? 9999 0 obj /Length # bytes in the blob ← 對(duì)象聲明了流長(zhǎng)度 stream lol, put whatever you want here! ← 任意二進(jìn)制塊合法藏身處 endstream endobj這意味著 PDF 是一個(gè)天然的外殼可以在其對(duì)象流中塞入 NES ROM、Git 包、Ruby 腳本等任意有效載荷而 PDF 閱讀器照常渲染、其他解析器照常識(shí)別自己的格式。打印攻擊PDF/PostScript 多態(tài)演講給出的社工場(chǎng)景是經(jīng)典的打印機(jī)風(fēng)險(xiǎn)攻擊者發(fā)送一封郵件——我總也發(fā)不進(jìn)去我的簡(jiǎn)歷給 HR 的某某能麻煩你打印一下附件嗎謝謝——Alice Hackerman。附件看起來(lái)很合法反病毒軟件通常不會(huì)掃描 MIPS 固件之類的載荷但一旦在連接著辦公網(wǎng)打印機(jī)的機(jī)器上打開并打印PostScript/PJL 載荷就會(huì)被打印機(jī)解釋執(zhí)行——這正是 Cui Stolfo 在 2011 年研究過(guò)的 PostScript/PJL 打印攻擊向量。構(gòu)造難點(diǎn)在于PDF 格式是 PostScript 語(yǔ)言的子集必須讓 PDF 解釋器忽略 PostScript 代碼、讓 PostScript 解釋器忽略 PDF 代碼。且?guī)缀跽也坏揭粋€(gè)支持 PDF 卻不支持 PostScript 的解釋器。兩個(gè)實(shí)現(xiàn)細(xì)節(jié)值得注意理論上只需以左括號(hào)(開頭即可讓 PostScript 解釋器進(jìn)入注釋模式但 Adobe 黑名單化了所有以括號(hào)開頭的 PDF所以此路不通讓 PostScript 解釋器停止解釋的手段是%%EOF之后緊跟stop操作符演講展示了文檔尾部的%%EndDocument … %%EOF / stop序列。演講還引用了 Ghostview 的dscparse.c中dsc_scan_type()函數(shù)注釋列出需識(shí)別的類型DSC、EPSF、PJL、^D、DOS EPS、PDF、non-DSCPlus 164 more lines of complex logic!來(lái)說(shuō)明僅僅判斷文檔類型這一小步就包含大量分支邏輯——這正是各實(shí)現(xiàn)產(chǎn)生分歧即多態(tài)可利用面的溫床。PoC||GTFO 0x13 期就收錄了這樣一個(gè) PDF/PostScript 多態(tài)文件。既是 HTML 又是 PDF/ZIP/Ruby 的 HTTP QuinePoC||GTFO 0x11 期展示了一個(gè)疊加了五重身份的文件In which an HTML page is also a PDF, which is also a ZIP, which is also a Ruby script, which is an HTTP Quine.其最小可行實(shí)現(xiàn)只需給任意 PDF 頭部拼接一段 Ruby 腳本__END__之后的內(nèi)容對(duì) Ruby 是數(shù)據(jù)段對(duì) PDF 解析器是無(wú)關(guān)內(nèi)容腳本會(huì)把自身作為響應(yīng)體回傳給客戶端require socket server TCPServer.new(, 8080) loop do socket server.accept request socket.gets response File.open(__FILE__).read socket.print HTTP/1.1 200 OK\r\n Content-Type: application/pdf\r\n Content-Length: #{response.bytesize}\r\n Connection: close\r\n socket.print \r\n socket.print response socket.close end __END__ # 下面是 PDF 內(nèi)容運(yùn)行ruby pocorgtfo11.pdf后該文件在 8080 端口監(jiān)聽而通過(guò)$ ln -s pocorgtfo11.pdf pocorgtfo11.html建立軟鏈后它又成為合法的 HTML 頁(yè)面——演講進(jìn)一步給出一個(gè)按請(qǐng)求路徑區(qū)分text/html與application/pdf響應(yīng)、且 HTML 部分從/html處截?cái)嗥椿氐脑鰪?qiáng)版本。這個(gè)例子把文件身份由解析方式?jīng)Q定推到了極致同一個(gè)文件作為 HTTP 服務(wù)器運(yùn)行時(shí)返回的內(nèi)容正是它自己。PDF/NES 多態(tài)與 MD5 Quine2017 版幻燈片詳細(xì)講解了一個(gè)更硬核的構(gòu)造一個(gè)文件同時(shí)是合法 PDF 與合法 iNES 格式 NES ROM。其布局利用了 iNES 頭部的 trainer 標(biāo)志位%PDF-1.5 %D0D4C5D8 9999 0 obj /Length number of bytes remaining in the ROM stream zeros for the remainder of the 512 Trainer bytes ← 補(bǔ)齊 512 字節(jié) trainer the remainder of the iNES ROM ← 其余為 iNES ROM endstream endobj the remainder of the PDF ← PDF 剩余部分NES 架構(gòu)方面PPU/CPU/APUCHR 與 PRG ROM、Mapper演講展示了如何用 PRG ROM 內(nèi)的代碼在運(yùn)行時(shí)自讀文件的 MD5 散列——通過(guò)查表把 128 個(gè)預(yù)計(jì)算差異值逐位還原成 MD5 的十六進(jìn)制字符串read_md5_byte、nibble_to_char等 C 偽碼構(gòu)成MD5 Quine在模擬器里運(yùn)行該 ROM能讀出文件自身的 MD5。演講中提到的ESultanikResume.pdf即為這類多態(tài)文件的實(shí)例PDF/ZIP/NES 三重身份md5sum恒為affab1eda8e9b6d8a80e940f20cb3b3b。PDF/Git 多態(tài)git bundle作為載體PDF/Git polyglot 的構(gòu)造利用了 git 的管道命令plumbing結(jié)構(gòu)git pull等價(jià)于git fetch git merge而git bundle委托給git pack-objects其調(diào)用形如argv_array_pushl(pack_objects.args, pack-objects, --all-progress-implied, --compression0, --stdout, --thin, --delta-base-offset, NULL); // bundle.c利用--stdout輸出pack 對(duì)象直接寫到 stdout且--compression0意味著不壓縮配合打過(guò)補(bǔ)丁的 git構(gòu)造流程為$ export PATH/path/to/patched/git:$PATH $ git init $ git add article.pdf $ git commit article.pdf -m added $ git bundle create PDFGitPolyglot.pdf --all最終產(chǎn)物是 pack 格式與 PDF 格式的疊加PACK^^^^B魔數(shù)之后的字節(jié)流同時(shí)構(gòu)成6 0 obj /Length 61337 /Filter /FlateDecode stream ...這樣的 PDF 對(duì)象。演講專門討論了 Our Hopes, Deflated 一節(jié)DEFLATE 塊最大 65,535 字節(jié)因此大文件必須分塊修改內(nèi)容會(huì)破壞內(nèi)層 PDF 的 xref 表Breaks xrefs in the inner PDF, but most viewers are resilient!以及 SHA1 哈希Remember to update the SHA1 hash!。最終效果$ git clone PDFGitPolyglot.pdf foo Cloning into foo... Receiving objects: 100% (174/174), 103.48 KiB | 0 bytes/s, done. Resolving deltas: 100% (100/100), done. $ cd foo $ ls PDFGitPolyglot.pdf PDFGitPolyglot.tex一份 PDF 文件可以直接作為 git 倉(cāng)庫(kù)克隆——文件格式的類型完全由誰(shuí)在解析它決定。Act IIPolyFile 與 PolyTracker研究目標(biāo)解析器語(yǔ)義映射與最小文法Act II 出自 SafeDocs TA1Automated Lexical Annotation and Navigation of Parsers課題與 The ALAN Parsers Project 相關(guān)聯(lián)。其高層目標(biāo)分兩步為解析器中的函數(shù)創(chuàng)建語(yǔ)義地圖——即哪個(gè)函數(shù)在處理文件的哪個(gè)語(yǔ)義區(qū)域parser_function1 ? byte 0, 10, 50 Object Stream parser_function2 ? byte 10, 74 Xref parser_function3 ? byte 20 JFIF終極目標(biāo)自動(dòng)抽取一個(gè)最小文法minimal grammar精確描述某個(gè)解析器接受的文件集合。演講提出了一個(gè)核心假設(shè)這是整個(gè)工具鏈的安全論據(jù)The majority of the potential for maliciousness and schizophrenia will exist in thesymmetric differenceof the grammars accepted by a formats parser implementations.格式各解析器實(shí)現(xiàn)所接受文法的對(duì)稱差集中集中了絕大部分惡意性與精神分裂同一文件多種解釋的潛力。相關(guān)工作與差距幻燈片對(duì)既有工具做了明確的能力盤點(diǎn)這也是 PolyFile/PolyTracker 存在的理由工具幻燈片指出的局限Ange 的 SBuD解析器支持有限Limited parser supportKaitai Struct不支持 PDF難以描述上下文敏感語(yǔ)言Valgrind / TaintGrind慢到不可用——解析一個(gè)最小 PDF 需要數(shù)小時(shí)AFL Analyze不能把輸入字節(jié)序列關(guān)聯(lián)到程序執(zhí)行軌跡LLVM Dataflow Sanitizerdfsan僅支持幾千個(gè)污點(diǎn)標(biāo)簽每次最多追蹤一個(gè)輸入字節(jié)技術(shù)路線語(yǔ)義標(biāo)注與 LLVM 插樁方法論概括為語(yǔ)義標(biāo)注Semantic Labeling三個(gè)環(huán)節(jié)分別是多態(tài)感知的文件識(shí)別Polyglot-Aware File Identification——對(duì)%???iNES ROM PDF ZIP這類混合輸入修改解析器做 best-effort 解析魯棒解析Resilient Parsing層次化標(biāo)注Hierarchical Labeling。流程為修改解析器使其 best-effort 工作 → 插樁以追蹤輸入字節(jié)偏移 → 對(duì)輸入?yún)^(qū)域打標(biāo)簽 → 產(chǎn)出 ground truth。PolyTracker 的插樁實(shí)現(xiàn)要點(diǎn)2019 版幻燈片 Parser Instrumentation 一節(jié)基于LLVM 插樁與污點(diǎn)追蹤操作對(duì)象是 LLVM/IR因此可以對(duì)接一切開源解析器遠(yuǎn)期計(jì)劃通過(guò)提升到 LLVM IR 支持閉源二進(jìn)制例如用McSEMA或Remill這類二進(jìn)制提升器影子內(nèi)存shadow memory設(shè)計(jì)借鑒 Data Flow Sanitizerdfsan開銷特性CPU 開銷可忽略negligible內(nèi)存為 O(n)其中 n 是解析器執(zhí)行的指令數(shù)新型污點(diǎn)標(biāo)簽存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)相對(duì) dfsan 的現(xiàn)狀——O(D_E)即高次查找、O(n2) 存儲(chǔ)——TAPP 達(dá)到O(log n) 查找、O(n) 存儲(chǔ)。當(dāng)前工具能力與示例輸出幻燈片列出了兩個(gè)工具當(dāng)時(shí)的具體能力對(duì)應(yīng) PolyFile 與 PolyTracker 兩個(gè)代碼庫(kù)新型文件匹配算法以TrID 中超過(guò) 10,000 條文件定義作為種子基于Kaitai Struct文件定義KSY的自動(dòng)標(biāo)注解析器如 JPEG、ZIP、WASM對(duì)Didier Stevens 的 PDF 解析器的插樁版本——對(duì)畸形輸入與精神分裂輸入具備魯棒性交互式文件瀏覽器語(yǔ)言支持C、C實(shí)驗(yàn)性以及任何可完整表示為 LLVM/IR 的代碼?;脽羝械难菔網(wǎng)ASM/HTML Polyglot Detection展示了 PolyTracker 的插樁輸出按函數(shù)聚合的輸入字節(jié)集合例如{ dfs$ensure_solid_xref: [2276587, 2276588], dfs$fmt_obj: [2465223, 2465224, 2465225, 2465226, 2465227, 2465228, 2465240, 2465241, 2465242, 2465243, 2465244, 2465245, 2465246, 2465258, 2465259, 2465260, 2465261, 2465262] }PolyFile 則把這些污點(diǎn)信息與格式知識(shí)合并成層次化的樹狀標(biāo)注iNES [0x0→0x12220] ? Magic [0x0→0x3] ? Header [0x4→0xF] ? ? PRG [0xC210→0x1020F] ? CHR [0x10210→0x12220] PDF [0x10→0x2EF72F] ? Magic [0x10→0x1E] ? Object 1.0 [0x1F→0x12221] ? Dictionary [0x2A→0x3E] ? Stream [0x3F→0x12219] ? JFIF Image [0x46→0x1220F] ? JPEG Segment […] ? Magic […] ? Marker […]一棵文件同時(shí)呈現(xiàn) iNES 與 PDF 兩條解析路徑且 PDF 內(nèi)部嵌套著 JFIF/JPEG 結(jié)構(gòu)——這正是 Act I 各多態(tài)案例在分析工具視角下的ground truth視圖。后續(xù)演進(jìn)從 2019 到 ISSTA 24本倉(cāng)庫(kù)內(nèi)還保留了這條研究線的后續(xù)節(jié)點(diǎn)可視為 Act II 的續(xù)集Toward Automated Grammar Extraction via Semantic Labeling of Parser ImplementationsLangSec 2020由 Carson Harmon、Brad Larsen、Evan Sultanik 提出把已知語(yǔ)法樹輸入 插樁解析器 通用污點(diǎn)追蹤與污點(diǎn)/控制流信息合并的算法產(chǎn)出文件格式類型 → 最專精處理該類型的函數(shù)集合的映射應(yīng)用于變異模糊測(cè)試、逆向、差分分析與自動(dòng)文法抽取。其幻燈片見 PolyMerge_LangSec2020.pdf。PolyTracker: Whole-Input Dynamic Information Flow TracingISSTA 2024PolyTracker 的正式論文版本——一個(gè)整程序、整輸入的動(dòng)態(tài)信息流追蹤DIFT框架對(duì) LLVM 兼容代碼庫(kù)或已提升到 LLVM IR 的二進(jìn)制做靜態(tài)插樁運(yùn)行時(shí)以適度的性能開銷輸出 TDAGTainted Directed Acyclic Graph格式的執(zhí)行軌跡可對(duì)輸入語(yǔ)料集運(yùn)行或由模糊器隨機(jī)生成輸入進(jìn)而實(shí)現(xiàn)追蹤每一個(gè)輸入字節(jié)穿過(guò)程序執(zhí)行的分析。From Polyglots to Prompt Injections: Parsing is Still Execution (And Your LLM Didnt Get the Memo)JawnCon 0x2, 2025/README.md)同一作者Evan Sultanik把本演講的命題延伸到 AI 系統(tǒng)——解析仍是執(zhí)行傳統(tǒng)文件多態(tài)與 LLM 提示注入之間是同一個(gè)解析安全問(wèn)題的兩代形態(tài)。安全啟示W(wǎng)hy Should You Care?幻燈片以 Why Should You Care? 收尾其含義可從兩個(gè)層面落地防御層面任何按文件類型分派處理的系統(tǒng)郵件網(wǎng)關(guān)、文檔轉(zhuǎn)換、打印管道、CI 工件校驗(yàn)都不應(yīng)假設(shè)文件擴(kuò)展名或單一解析器的判定結(jié)果。tar 自動(dòng)探測(cè)魔數(shù)、PDF 忽略頭部之前的垃圾、解析器對(duì) xref 損壞的寬容most viewers are resilient——每一條寬容性都是潛在的語(yǔ)義分歧點(diǎn)。2017 版幻燈片的結(jié)論頁(yè)概括為Files have no intrinsic meaning / Polyglots arent just a nifty parlor trick / You can make them, too! / PDF is broken。分析層面當(dāng)你懷疑一個(gè)文件身份不純時(shí)PolyFile 這類工具給出的是該文件的每個(gè)字節(jié)分別被哪些函數(shù)、以哪種格式語(yǔ)義解釋的層次化 ground truth而不是一個(gè)單值化的文件類型結(jié)論P(yáng)olyTracker 則提供了生成這種 ground truth 的通用插樁基礎(chǔ)設(shè)施其輸出可進(jìn)一步驅(qū)動(dòng)差分分析對(duì)比兩個(gè)解析器實(shí)現(xiàn)的文法對(duì)稱差集與自動(dòng)文法抽取。資源索引資源倉(cāng)庫(kù)路徑演講說(shuō)明frontmatter兩次會(huì)議、錄播與配套工具鏈接README.mdBSides Philly 2017 幻燈片tar、PDF 多態(tài)成因、打印攻擊、HTTP Quine、PDF/NES、PDF/Git 構(gòu)造細(xì)節(jié)File Polyglottery BSides Philly 2017.pdfEmpire Hacking 2019 幻燈片雙幕結(jié)構(gòu)、PolyFile/PolyTracker 目標(biāo)、相關(guān)工作對(duì)比、插樁細(xì)節(jié)、WASM/HTML 檢測(cè)演示The Treachery of Files Empire Hacking 2019.pdfLangSec 2020語(yǔ)義標(biāo)注與文法抽取PolyMerge 后續(xù)README.md、PolyMerge_LangSec2020.pdfISSTA 2024PolyTracker 正式論文issta24-polytracker.pdf2025 延伸從文件多態(tài)到提示注入README.md/README.md)需要說(shuō)明的適用前提本文所有技術(shù)細(xì)節(jié)均取自上述幻燈片與倉(cāng)庫(kù)文檔PolyFile/PolyTracker 的具體命令、構(gòu)建方式與當(dāng)前支持的語(yǔ)言列表請(qǐng)以兩者各自的代碼庫(kù)為準(zhǔn)2019 幻燈片給出的語(yǔ)言支持為 C 與實(shí)驗(yàn)性 C文中涉及的攻擊案例打印攻擊、社工郵件等均為研究性描述引用時(shí)應(yīng)注意其安全研究語(yǔ)境。贊分享【免費(fèi)下載鏈接】publicationsPublications from Trail of Bits項(xiàng)目地址https://gitcode.com/GitHub_Trending/pu/publications點(diǎn)擊查看免費(fèi)下載相關(guān)推薦state-of-the-art-shitcode項(xiàng)目啟動(dòng)指南從沒有README開始state of the art shitcode項(xiàng)目啟動(dòng)指南從沒有README開始 state of the art shitcode項(xiàng)目是一個(gè)幽默而實(shí)用的文檔教程代碼質(zhì)量The Joy of Pwning從 CTF、符號(hào)執(zhí)行到智能合約安全的三級(jí)技術(shù)成長(zhǎng)路徑——Trail of Bits Publications 演講復(fù)盤The Joy of Pwning從 CTF、符號(hào)執(zhí)行到智能合約安全的三級(jí)技術(shù)成長(zhǎng)路徑——Trail of Bits Publications 演講復(fù)盤 本文CANN/asc-devkit asc_gather函數(shù)文檔asc_gather 產(chǎn)品支持情況 | 產(chǎn)品 | 是否支持 | | : | : :| | Ascend 950PR/Ascend 950DT | √ | 功能說(shuō)人工智能深度學(xué)習(xí)算子庫(kù)CANNAscend創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考