直接回答
XML 解析与选择文件、检查 MIME 是不同的信任边界。如果本地 AI 流程解析用户选择的 XML、模型元数据或导入文档,解析器可能解释导致文件访问、网络请求或过量实体展开的声明。实际风险取决于解析器实现与配置。本地文件和离线推理都不能证明解析器不会打开其他资源。先记录接受何种 XML、为何需要它,以及实际执行解析的 Android parser/provider 与运行时版本;如果产品不需要 XML,直接拒绝比自行发明通用策略更简单。 对 Android XmlPullParser,FEATURE_PROCESS_DOCDECL 是处理文档类型声明的专属控制。API 文档注明它从 API 1 提供,默认值为 false。但这不代表解析器会拒绝每个 DOCTYPE token:关闭处理时,next() 会忽略该声明,nextToken() 则可以报告 DOCDECL。如果产品策略禁止声明,应在 setInput 前配置具体 parser,再检查 token 并在使用文档值前拒绝 DOCDECL。不要先启用 DTD 处理,之后才检查事件。测试必须证明选定的 Android/provider 实现不会在拒绝点之前解析外部资源。 Android XML 外部实体安全指南给出 XmlPullParserFactory 的 disallow-doctype-decl 特性示例,并建议禁用 DTD。应把它视作要按实现验证的设置,而不是所有 XML API 都有的可移植能力。XmlPullParser 有自己的特性名;若请求的特性不受支持,可能抛出 XmlPullParserException。DOM/JAXP factory、SAX reader 和 pull parser 的配置接口不同,把 JAXP 属性名粘贴给 pull parser 并不会自动加固。发布前应创建生产实际使用的 parser,设置必需控制,并在 API 允许时读取验证状态;任何必需控制不受支持或无法应用时都要失败关闭。 禁用外部实体和拒绝文档类型声明相关但不等价。如果应用确实需要内部声明,应采用明确列出的 parser 设计并限制资源;外部 resolver 必须拒绝未批准标识符,不能回退到默认查找。普通导入元数据更适合拒绝 DOCTYPE、外部子集、外部通用或参数实体,以及 schema 不需要的处理指令。策略还应明确:禁用 DTD 处理可能令命名实体不可用或产生解析错误,应报告格式不支持,而不是悄悄改变含义。 解析器开关不能替代输入限制。读取所选 stream 时限制字节数,再按实际格式限制嵌套深度、元素和属性数量、文本长度及总解析工作量。根据 schema 拒绝格式错误或重复字段后,才映射到应用状态。不要让 XML 值直接选择文件路径、URI、网络端点、native 库或模型操作。解析出的文本以后若进入模型提示词,仍是不可信数据;格式良好不等于语义校验或授权。 测试实际发版实现,而不只测试 mock parser。无害 canary 仅用临时测试文件和受控 loopback 端点,不指向私人文件或远端地址。在 harness 阻断之前记录 resolver、文件和网络访问尝试,再断言没有尝试查找、也没有返回 canary 内容。被网络阻断的空 listener 本身不能证明 parser 从未尝试 I/O。覆盖声明、有界实体展开、深层嵌套、大文本、损坏编码、重复字段、取消及不支持开关,并在实际 Android provider 矩阵复测安全敏感行为。夹具工作量有界;常规日志不含私人路径/内容,自有资源只在解析安全结束后关闭。 记录 parser class/provider、Android API 与构建、启用的特性、fixture 哈希、拒绝原因,以及文件或网络 canary 是否被触达。通过测试只支持该配置和输入路径上的结论,不能证明应用里所有 parser 均已加固、native 模型代码能安全接受 XML,或 Cove 已提供 XML 导入。结论必须以真实实现和测量行为为前提。
用户选择的配置文件含有意外 DOCTYPE
Android 应用在提取模型设置前接受用户选择的 XML 元数据。文件在本地,但前言声明了外部实体。团队尚未确认各受支持 API 上究竟由哪个 parser provider 处理该文件。
决策
识别运行时 parser,在经过测试的 parser-specific 策略下拒绝声明,并确保拒绝用例无法读取受控文件或访问测试端点。
预期结果
导入报告 XML 不受支持;展开后的内容不会进入应用状态或模型提示词,也不声称 Cove 已实现这条路径。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- ANDROID-XML-SECURITY-2026-10:Android XML parser 的外部实体风险与控制项必须按具体实现核验。
- ANDROID-PRIVACY-01:应用仍负责数据访问、存储和用户控制。
- Android XML 安全指南、XmlPullParser API 与 OWASP 文档定义 DTD 行为和 parser-specific 加固边界。
隐私声明需要数据清单和流量证据;“本地模型”标签本身不是证明。
实施流程
- 明确 XML 契约和 parser. 列出文档用途与 schema、调用方、输入 stream、Android API 范围、parser class/provider 和依赖版本。不需要 XML 时就拒绝,不要接受任意 XML。
- 解析前应用安全控制. 对 XmlPullParser,在输入前设置 FEATURE_PROCESS_DOCDECL=false,并且仅应用具体实现文档支持的控制。JAXP/SAX 控制分开处理;必需设置不受支持时失败关闭。
- 拒绝禁止的声明和值. 在禁止 DOCTYPE 的策略下,按选定 parser 的 token 行为检测 DOCDECL,并在读取数据前拒绝文档。再按应用 schema 校验元素名、字段和值中的 URI。
- 限制解析工作量. 独立限制字节、深度、元素、属性、文本和解析时长,不把这些限制混同于实体设置。成功、拒绝、取消和异常时均关闭应用拥有的输入 stream。
- 用真实 provider 执行 canary. 在 Android API 矩阵测试外部文件/loopback 引用、实体展开、损坏和超限 fixture 及不支持的开关。断言 canary 未被触达,并从日志中脱敏测试路径。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 记录生产 parser/provider 与版本;安全特性须在输入前配置,必需控制不受支持时拒绝文档。
- 禁止 DOCTYPE 的策略区分“禁用 DTD 处理”和“显式拒绝 DOCDECL”,并分别测试 token 行为与外部资源 canary。
- 字节、结构和处理时长限制分别测试;XML 格式良好不等于语义校验或授权。
- 内容不声称 Cove 当前解析 XML,也不声称离线推理本身会阻止 parser I/O。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| XmlPullParser | 按选定 provider 的文档设置专属 feature 并验证 token 行为。 | FEATURE_PROCESS_DOCDECL 默认 false,但策略仍须决定是否拒绝 DOCDECL。 |
| JAXP DOM 或 SAX | 配置该实现支持的 factory/reader 控制。 | 名称与 XmlPullParser 不同;未验证前不能照搬 feature 字符串。 |
| 必须保留 DTD 的 XML | 只允许窄范围的本地/catalog 策略并设置资源上限。 | resolver 若回退到默认查找会重新开放外部访问;必需安全控制不支持就是失败。 |
| 非 XML 输入 | 功能不需要 XML 时直接拒绝。 | 避免给原本仅校验字节的导入流程增加 parser 与声明处理面。 |
需要避免的失败模式
- 不要把默认不处理 DTD 等同于拒绝所有 DOCTYPE 声明。
- 不要跨用 JAXP、SAX 和 XmlPullParser 的特性名,也不要吞掉必需安全开关不受支持的错误。
- 不要因为 XML 在本地或推理离线,就认定解析器不会读文件或尝试网络解析。
- 不要声称 Cove 当前接受或解析 XML 模型输入。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Android privacy and security
- Android Security:XML 外部实体注入风险
- Android API:XmlPullParser 特性与 token 行为
- OWASP:XML External Entity Prevention Cheat Sheet
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
FEATURE_PROCESS_DOCDECL=false 会拒绝所有 DOCTYPE 吗?
不会。Android 文档说明它关闭声明处理;nextToken() 仍可报告 DOCDECL,而 next() 会忽略。严格拒绝策略要测试具体实现的 token 行为,并在读取值之前失败。
能否把 JAXP 的 XXE 设置用于 XmlPullParser?
不能默认这样假设。不同 parser 家族有不同控制。只使用具体 provider 文档支持的 feature;必需开关不受支持就应配置失败。
XML 文档在本地,推理也离线,是否就安全?
不是。依配置而定,parser 仍可能访问本地文件或尝试解析外部资源。应在实际发版 parser 上测试受控文件和网络 canary。
parser 安全开关能取代输入上限吗?
不能。还要限制字节、嵌套、字段、文本和处理时长,再校验应用 schema,之后才把值交给模型或 native 代码。