开发者以为开了安全开关就高枕无忧?一个XML转换库的漏洞告诉我们: sanitization(净化处理)可能只防了一半。

这个漏洞藏在xml2jsontoXml()函数里。该函数有个sanitize选项,开发者开启后以为能防止XML注入攻击。但问题在于——净化只针对属性值文本内容标签名属性名完全不在保护范围内。

打开网易新闻 查看精彩图片

攻击者不需要碰值,只要控制JSON的键名就能动手脚。比如把键名写成foo="x">bar,输出的XML结构就被篡改了。sanitize开关开着也没用,因为它根本不检查键名。

三类应用最危险:一是接收用户控制JSON键的动态XML构建工具;二是调用toXml(userJson, { sanitize: true })并信任其输出安全的系统;三是把生成的XML直接渲染到浏览器或传给下游解析器的场景。下游一旦解析了被污染的XML,XSS或更严重的攻击就可能发生。

这个漏洞的讽刺之处在于:安全选项的存在反而制造了虚假的安全感。开发者看到sanitize: true就以为万事大吉,却没意识到攻击面在键名这个盲区。

修复方向很明确——要么把键名也纳入净化范围,要么在文档里用大红字警告:此sanitize不防键名注入。但在此之前,依赖这个选项的系统都值得重新审计一遍。