
【免费下载链接】publicationsPublications from Trail of Bits项目地址https://gitcode.com/GitHub_Trending/pu/publications点击查看免费下载本文以 The Treachery of Files 演讲Evan SultanikBSides Philly 2017 与 Empire Hacking 2019 两次公开报告幻灯片分别存于 File Polyglottery BSides Philly 2017.pdf 与 The Treachery of Files Empire Hacking 2019.pdf为核心系统讲解文件多态polyglot攻击的构造原理——tar/tar.gz、PDF/NES、PDF/PostScript、PDF/Git 等真实案例——以及 Trail of Bits 为此开发的 PolyFile文件逆向浏览器与 PolyTrackerLLVM 整输入污点追踪两个工具的设计目标、技术路线与输出形式。读完本篇你将理解同一个字节流对不同解析器呈现不同含义这一安全命题的完整技术链条并掌握一套分析可疑文件格式歧义的实战方法论。核心命题文件没有固有含义该演讲以双幕剧结构展开README 中的摘要点明了主线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 的目标是证明这些花里胡哨的文件不只是会客厅里的奇技淫巧parlor tricks而是真实的安全问题。演讲引用了 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.文件本身只是一段字节序列这是什么类型它是否合法它的内容是什么这些问题只有交给具体解析器回答。因此只要两个解析器对同一字节流的接受集合grammar存在差异攻击者就可能在差异处构造出文件多态文件对解析器 A 是格式甲对解析器 B 是格式乙。Act I恶意文件的实战案例tar 自动探测与 .tar/.tar.gz 多态演讲2017 版幻灯片中以 Before we get to more PoC||GTFO…Time to drop some 0-day! 引出给出的第一个案例利用了一个几乎人人都会踩的解析行为$ tar xvf totally_not_malware.tar.gz注意命令中并没有提供z选项。现代版本的 tar 会基于magic bytes魔数自动检测归档是否经过 gzip 压缩而实际的文件扩展名被完全忽略。这直接引出一个构造问题What if we created a file that is both a valid .tar and a valid .tar.gz?即同时构造一个既是合法 .tar、又是合法 .tar.gz的文件。由于 tar 的压缩判断依赖魔数而非扩展名下游工具对该文件的身份判定将完全取决于它内部探测到哪个魔数——这是解析即含义的最典型体现。为什么 PDF 特别易多态演讲对 PDF 格式的多态体质给出了四点归因Because Adobe, thats why!——PDF 生态历史悠久解析器被刻意设计得对各种错误和不兼容输入高度宽容resilient文件存在时间长各实现之间的行为分歧积累得更多几乎可以在文件的任意位置插入任意长度的二进制块——PDF 对象流object stream天然支持几乎所有解析器都会忽略 PDF 头%PDF-header之前的所有内容。演讲幻灯片直接给出了这种任意插入的结构示意lol, put whatever you want here! ← 头之前的垃圾解析器无视 %PDF-1.5 %D0D4C5D8 ⋮ 9999 0 obj /Length # bytes in the blob ← 对象声明了流长度 stream lol, put whatever you want here! ← 任意二进制块合法藏身处 endstream endobj这意味着 PDF 是一个天然的外壳可以在其对象流中塞入 NES ROM、Git 包、Ruby 脚本等任意有效载荷而 PDF 阅读器照常渲染、其他解析器照常识别自己的格式。打印攻击PDF/PostScript 多态演讲给出的社工场景是经典的打印机风险攻击者发送一封邮件——我总也发不进去我的简历给 HR 的某某能麻烦你打印一下附件吗谢谢——Alice Hackerman。附件看起来很合法反病毒软件通常不会扫描 MIPS 固件之类的载荷但一旦在连接着办公网打印机的机器上打开并打印PostScript/PJL 载荷就会被打印机解释执行——这正是 Cui Stolfo 在 2011 年研究过的 PostScript/PJL 打印攻击向量。构造难点在于PDF 格式是 PostScript 语言的子集必须让 PDF 解释器忽略 PostScript 代码、让 PostScript 解释器忽略 PDF 代码。且几乎找不到一个支持 PDF 却不支持 PostScript 的解释器。两个实现细节值得注意理论上只需以左括号(开头即可让 PostScript 解释器进入注释模式但 Adobe 黑名单化了所有以括号开头的 PDF所以此路不通让 PostScript 解释器停止解释的手段是%%EOF之后紧跟stop操作符演讲展示了文档尾部的%%EndDocument … %%EOF / stop序列。演讲还引用了 Ghostview 的dscparse.c中dsc_scan_type()函数注释列出需识别的类型DSC、EPSF、PJL、^D、DOS EPS、PDF、non-DSCPlus 164 more lines of complex logic!来说明仅仅判断文档类型这一小步就包含大量分支逻辑——这正是各实现产生分歧即多态可利用面的温床。PoC||GTFO 0x13 期就收录了这样一个 PDF/PostScript 多态文件。既是 HTML 又是 PDF/ZIP/Ruby 的 HTTP QuinePoC||GTFO 0x11 期展示了一个叠加了五重身份的文件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.其最小可行实现只需给任意 PDF 头部拼接一段 Ruby 脚本__END__之后的内容对 Ruby 是数据段对 PDF 解析器是无关内容脚本会把自身作为响应体回传给客户端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 内容运行ruby pocorgtfo11.pdf后该文件在 8080 端口监听而通过$ ln -s pocorgtfo11.pdf pocorgtfo11.html建立软链后它又成为合法的 HTML 页面——演讲进一步给出一个按请求路径区分text/html与application/pdf响应、且 HTML 部分从/html处截断拼回的增强版本。这个例子把文件身份由解析方式决定推到了极致同一个文件作为 HTTP 服务器运行时返回的内容正是它自己。PDF/NES 多态与 MD5 Quine2017 版幻灯片详细讲解了一个更硬核的构造一个文件同时是合法 PDF 与合法 iNES 格式 NES ROM。其布局利用了 iNES 头部的 trainer 标志位%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 ← 补齐 512 字节 trainer the remainder of the iNES ROM ← 其余为 iNES ROM endstream endobj the remainder of the PDF ← PDF 剩余部分NES 架构方面PPU/CPU/APUCHR 与 PRG ROM、Mapper演讲展示了如何用 PRG ROM 内的代码在运行时自读文件的 MD5 散列——通过查表把 128 个预计算差异值逐位还原成 MD5 的十六进制字符串read_md5_byte、nibble_to_char等 C 伪码构成MD5 Quine在模拟器里运行该 ROM能读出文件自身的 MD5。演讲中提到的ESultanikResume.pdf即为这类多态文件的实例PDF/ZIP/NES 三重身份md5sum恒为affab1eda8e9b6d8a80e940f20cb3b3b。PDF/Git 多态git bundle作为载体PDF/Git polyglot 的构造利用了 git 的管道命令plumbing结构git pull等价于git fetch git merge而git bundle委托给git pack-objects其调用形如argv_array_pushl(pack_objects.args, pack-objects, --all-progress-implied, --compression0, --stdout, --thin, --delta-base-offset, NULL); // bundle.c利用--stdout输出pack 对象直接写到 stdout且--compression0意味着不压缩配合打过补丁的 git构造流程为$ 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最终产物是 pack 格式与 PDF 格式的叠加PACK^^^^B魔数之后的字节流同时构成6 0 obj /Length 61337 /Filter /FlateDecode stream ...这样的 PDF 对象。演讲专门讨论了 Our Hopes, Deflated 一节DEFLATE 块最大 65,535 字节因此大文件必须分块修改内容会破坏内层 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 仓库克隆——文件格式的类型完全由谁在解析它决定。Act IIPolyFile 与 PolyTracker研究目标解析器语义映射与最小文法Act II 出自 SafeDocs TA1Automated Lexical Annotation and Navigation of Parsers课题与 The ALAN Parsers Project 相关联。其高层目标分两步为解析器中的函数创建语义地图——即哪个函数在处理文件的哪个语义区域parser_function1 ↳ byte 0, 10, 50 Object Stream parser_function2 ↳ byte 10, 74 Xref parser_function3 ↳ byte 20 JFIF终极目标自动抽取一个最小文法minimal grammar精确描述某个解析器接受的文件集合。演讲提出了一个核心假设这是整个工具链的安全论据The majority of the potential for maliciousness and schizophrenia will exist in thesymmetric differenceof the grammars accepted by a formats parser implementations.格式各解析器实现所接受文法的对称差集中集中了绝大部分恶意性与精神分裂同一文件多种解释的潜力。相关工作与差距幻灯片对既有工具做了明确的能力盘点这也是 PolyFile/PolyTracker 存在的理由工具幻灯片指出的局限Ange 的 SBuD解析器支持有限Limited parser supportKaitai Struct不支持 PDF难以描述上下文敏感语言Valgrind / TaintGrind慢到不可用——解析一个最小 PDF 需要数小时AFL Analyze不能把输入字节序列关联到程序执行轨迹LLVM Dataflow Sanitizerdfsan仅支持几千个污点标签每次最多追踪一个输入字节技术路线语义标注与 LLVM 插桩方法论概括为语义标注Semantic Labeling三个环节分别是多态感知的文件识别Polyglot-Aware File Identification——对%???iNES ROM PDF ZIP这类混合输入修改解析器做 best-effort 解析鲁棒解析Resilient Parsing层次化标注Hierarchical Labeling。流程为修改解析器使其 best-effort 工作 → 插桩以追踪输入字节偏移 → 对输入区域打标签 → 产出 ground truth。PolyTracker 的插桩实现要点2019 版幻灯片 Parser Instrumentation 一节基于LLVM 插桩与污点追踪操作对象是 LLVM/IR因此可以对接一切开源解析器远期计划通过提升到 LLVM IR 支持闭源二进制例如用McSEMA或Remill这类二进制提升器影子内存shadow memory设计借鉴 Data Flow Sanitizerdfsan开销特性CPU 开销可忽略negligible内存为 O(n)其中 n 是解析器执行的指令数新型污点标签存储数据结构相对 dfsan 的现状——O(D_E)即高次查找、O(n²) 存储——TAPP 达到O(log n) 查找、O(n) 存储。当前工具能力与示例输出幻灯片列出了两个工具当时的具体能力对应 PolyFile 与 PolyTracker 两个代码库新型文件匹配算法以TrID 中超过 10,000 条文件定义作为种子基于Kaitai Struct文件定义KSY的自动标注解析器如 JPEG、ZIP、WASM对Didier Stevens 的 PDF 解析器的插桩版本——对畸形输入与精神分裂输入具备鲁棒性交互式文件浏览器语言支持C、C实验性以及任何可完整表示为 LLVM/IR 的代码。幻灯片中的演示WASM/HTML Polyglot Detection展示了 PolyTracker 的插桩输出按函数聚合的输入字节集合例如{ 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 则把这些污点信息与格式知识合并成层次化的树状标注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 […]一棵文件同时呈现 iNES 与 PDF 两条解析路径且 PDF 内部嵌套着 JFIF/JPEG 结构——这正是 Act I 各多态案例在分析工具视角下的ground truth视图。后续演进从 2019 到 ISSTA 24本仓库内还保留了这条研究线的后续节点可视为 Act II 的续集Toward Automated Grammar Extraction via Semantic Labeling of Parser ImplementationsLangSec 2020由 Carson Harmon、Brad Larsen、Evan Sultanik 提出把已知语法树输入 插桩解析器 通用污点追踪与污点/控制流信息合并的算法产出文件格式类型 → 最专精处理该类型的函数集合的映射应用于变异模糊测试、逆向、差分分析与自动文法抽取。其幻灯片见 PolyMerge_LangSec2020.pdf。PolyTracker: Whole-Input Dynamic Information Flow TracingISSTA 2024PolyTracker 的正式论文版本——一个整程序、整输入的动态信息流追踪DIFT框架对 LLVM 兼容代码库或已提升到 LLVM IR 的二进制做静态插桩运行时以适度的性能开销输出 TDAGTainted Directed Acyclic Graph格式的执行轨迹可对输入语料集运行或由模糊器随机生成输入进而实现追踪每一个输入字节穿过程序执行的分析。From Polyglots to Prompt Injections: Parsing is Still Execution (And Your LLM Didnt Get the Memo)JawnCon 0x2, 2025/README.md)同一作者Evan Sultanik把本演讲的命题延伸到 AI 系统——解析仍是执行传统文件多态与 LLM 提示注入之间是同一个解析安全问题的两代形态。安全启示Why Should You Care?幻灯片以 Why Should You Care? 收尾其含义可从两个层面落地防御层面任何按文件类型分派处理的系统邮件网关、文档转换、打印管道、CI 工件校验都不应假设文件扩展名或单一解析器的判定结果。tar 自动探测魔数、PDF 忽略头部之前的垃圾、解析器对 xref 损坏的宽容most viewers are resilient——每一条宽容性都是潜在的语义分歧点。2017 版幻灯片的结论页概括为Files have no intrinsic meaning / Polyglots arent just a nifty parlor trick / You can make them, too! / PDF is broken。分析层面当你怀疑一个文件身份不纯时PolyFile 这类工具给出的是该文件的每个字节分别被哪些函数、以哪种格式语义解释的层次化 ground truth而不是一个单值化的文件类型结论PolyTracker 则提供了生成这种 ground truth 的通用插桩基础设施其输出可进一步驱动差分分析对比两个解析器实现的文法对称差集与自动文法抽取。资源索引资源仓库路径演讲说明frontmatter两次会议、录播与配套工具链接README.mdBSides Philly 2017 幻灯片tar、PDF 多态成因、打印攻击、HTTP Quine、PDF/NES、PDF/Git 构造细节File Polyglottery BSides Philly 2017.pdfEmpire Hacking 2019 幻灯片双幕结构、PolyFile/PolyTracker 目标、相关工作对比、插桩细节、WASM/HTML 检测演示The Treachery of Files Empire Hacking 2019.pdfLangSec 2020语义标注与文法抽取PolyMerge 后续README.md、PolyMerge_LangSec2020.pdfISSTA 2024PolyTracker 正式论文issta24-polytracker.pdf2025 延伸从文件多态到提示注入README.md/README.md)需要说明的适用前提本文所有技术细节均取自上述幻灯片与仓库文档PolyFile/PolyTracker 的具体命令、构建方式与当前支持的语言列表请以两者各自的代码库为准2019 幻灯片给出的语言支持为 C 与实验性 C文中涉及的攻击案例打印攻击、社工邮件等均为研究性描述引用时应注意其安全研究语境。赞分享【免费下载链接】publicationsPublications from Trail of Bits项目地址https://gitcode.com/GitHub_Trending/pu/publications点击查看免费下载相关推荐state-of-the-art-shitcode项目启动指南从没有README开始state of the art shitcode项目启动指南从没有README开始 state of the art shitcode项目是一个幽默而实用的文档教程代码质量The Joy of Pwning从 CTF、符号执行到智能合约安全的三级技术成长路径——Trail of Bits Publications 演讲复盘The Joy of Pwning从 CTF、符号执行到智能合约安全的三级技术成长路径——Trail of Bits Publications 演讲复盘 本文CANN/asc-devkit asc_gather函数文档asc_gather 产品支持情况 | 产品 | 是否支持 | | : | : :| | Ascend 950PR/Ascend 950DT | √ | 功能说人工智能深度学习算子库CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考