引言
近期,Doyensec受雇于一家提供“通信平台即服务”的客户。该平台允许其客户构建客服体验,并通过电子邮件、网络聊天、社交媒体等多种渠道与自己的客户进行沟通。
虽然此类服务价值毋庸置疑,但它也引入了独特的威胁模型。我们客户的用户每天需要处理大量来自外部(通常是匿名的)用户的往来信件,这使他们特别容易受到网络钓鱼和其他社会工程攻击。
虽然此类威胁无法完全消除,但可以最大限度地减少被利用的可能性。认识到这一点后,客户聘请Doyensec进行了一次安全审查,特别关注社会工程攻击,尤其是网络钓鱼。这项于今年早些时候进行的合作项目,对双方都证明极具价值。最重要的是,我们的客户利用审查结果极大地增强了其平台抵御社会工程攻击的能力。此外,Doyensec的工程师也有了一个绝佳的机会,在标准安全审计中常被忽视或被严重低估的漏洞上发挥创造力,并从蓝队的角度审视如何防御应用。
以下案例研究将讨论本次审计中解决的部分漏洞。希望本文能帮助开发人员理解他们的平台中可能潜伏着哪些类型的漏洞,并展示此类有针对性的合作作为标准Web审计的补充,其价值所在。
附件处理
对于任何客户服务组织而言,文件附件管理都是一个至关重要的功能。一方面,用户必须能够与其对话者共享文件样本、截图等。另一方面,共享文件始终是滋生各类安全漏洞的温床,尤其是在接受来自不受信任方的文件时。因此,要加固应用的这一部分,始终需要仔细权衡如何在不牺牲可用性的前提下确保机密性和完整性。
文件扩展名限制绕过——利用末尾句点
受测平台采用了一个健壮的系统,旨在验证允许上传的文件扩展名和内容类型,并包含一个针对固有危险文件类型(如可执行文件 .exe)的全局禁止列表。这些措施旨在防止上传和分发潜在恶意文件。然而,通过利用某些浏览器的特性,我们发现了一个漏洞:攻击者只需在文件扩展名后附加一个末尾句点(“悬空点”),即可绕过这些限制。
具体而言,可以通过构造一个包含被禁止扩展名(如 .exe.)的上传请求来绕过文件扩展名限制。这导致系统接受了该文件,因为表面上它符合允许上传的条件——其中包括空扩展名。然而,Firefox和基于Chromium的浏览器会移除这个悬空点(有趣的是,Safari会保留它)。结果,文件在受害者的文件系统上以原始的 .exe 扩展名保存。
这里的建议很简单。应从文件名中移除末尾的句点。这在现实场景中很少有用,因此可用性方面的权衡微乎其微。
通过构造子域名规避内容来源限制
平台聊天设置了一项限制,只允许来自我们客户子域的链接附件。此安全控制旨在将图片和附件的上传和引用限制在预定义的一组来源内,防止使用可能用于网络钓鱼攻击的外部来源。预期的验证过程依赖于一个域名的白名单。
然而,当使用正则表达式验证(子)域名时,很容易忘记这种语法的复杂性,从而导致难以察觉的绕过。
Doyensec观察到,子域名的匹配使用的是类似于 /acme-attachments-1.com/ 的正则表达式白名单。这样的正则表达式没有强制匹配字符串的开头和结尾,因此会接受任何包含所需子域的域名。攻击者可以创建一个类似于 acme-attachments-1.com.doyensec.com 的子域名,尽管有安全机制,它仍会被接受。
另一个常见(虽然在本例中不可利用)的错误是忘记点(.)字符在正则表达式中被视为通配符。当忘记转义域名正则中的点时,攻击者可以注册一个绕过此限制的域名。例如,类似于 downloads.acmecdn.com 的正则表达式会接受攻击者控制的 downloadsAacmecdn.com 这样的域名。
值得注意的是,尽管此漏洞看起来无害,但它实际上具有制造成功网络钓鱼攻击的巨大潜力。当受害者在受信任的平台上收到附件时,他们更有可能点击链接。同时,登录页面也不会让受害者感到意外,进一步增加了他们泄露凭据的可能性。
防病毒扫描绕过
该平台恰当地对所有传入文件实施了防病毒扫描。然而,攻击者可以通过创建加密压缩包来混淆有效载荷的真实内容:$ zip -e test_encrypted.zip eicar.com。
没有简单的解决方案可以解决此问题。完全禁止加密压缩包是一种可用性权衡,在某些情况下可能是不可接受的。Doyensec建议至少应明确警告用户不要打开加密文件。通过创建适当的配置开关,允许客户选择接受哪种权衡也可能是有用的。
HTML输入处理
在交换消息方面,添加格式化和给用户更多表达方式非常有用。另一方面,当消息来自不受信任的来源时,此类功能可能使攻击者能够精心策划涉及界面伪装(例如,在其消息中模拟界面元素)的复杂攻击。
我们的客户找到了平衡可用性和安全性的绝佳方法。虽然受信任的用户有丰富的输入格式选项,但来自平台外部的不受信任用户只能分享基本的纯文本消息。还值得注意的是,即使是受信任的用户也不能向消息中注入任意HTML,因为HTML标签会被正确解析和编码。但是,某些特定标签是允许的,并且在某些情况下会转换为更复杂的元素(例如,链接标签会转换为按钮)。
Doyensec认为此解决方案在设计层面架构良好。然而,由于实现上的疏忽,公共消息API也接受一个“隐藏的”(前端未使用的)参数,该参数允许某些HTML元素。Doyensec能够利用链接到按钮的转换来演示利用此漏洞进行界面元素欺骗的潜力。
该问题已通过完全禁用公共API中的此参数解决,仅允许经过身份验证的用户格式化其消息。
链接呈现漏洞
数据呈现漏洞是一种尤其被忽视的威胁。尽管它们有可能操纵或扭曲关键信息,但在安全评估中经常被低估,在修复工作的优先级排序中也常被忽视。然而,利用这些漏洞可能导致包括网络钓鱼在内的严重后果。
误导性的Unicode域名渲染
要理解此问题,重要的是要理解两个不同的术语。首先是Punycode,这是一种用于在域名中表示Unicode字符的编码方案。它使浏览器和其他网络客户端能够处理域名中的Unicode。其次,我们有同形异义词,即看起来非常相似但具有不同代码的字符。虽然视觉上难以区分,但请考虑字符 'a'(代码:0x61)和 'а'(代码:0x430)实际上是两个不同的字符,当在URL中使用时会导致两个不同的域名。
此威胁最突出的例子之一是由研究人员Xudong Zheng创建的。该研究人员创建了一个链接,看起来与广受信任的 www.apple.com 域名极其相似。然而,链接 https://www.аррӏе.com 在展开Punycode字符串后实际上解析到 www.xn--80ak6aa92e.com。访问该链接会发现它并非由Apple控制,尽管其外观具有说服力。
为了保护用户免受此类问题的影响,我们建议以Punycode格式渲染Unicode域名。这样用户就不会对给定链接指向何处产生误解。
通过RTLO注入进行URI和文件名欺骗
使用从右到左覆盖(RTLO)字符是另一种操纵链接显示方式的技术。RTLO字符会改变后续字符的渲染顺序。当涉及文件名和URL时,它们的结构是固定的,字符顺序很重要。因此,翻转字符顺序是掩盖链接真实目标或文件扩展名的有效方法。
听起来很复杂?一个例子就能说明清楚。考虑指向攻击者控制域的链接:https://gepj.net/selif#/moc.rugmi。它看起来可疑,但当在前面加上RTLO Unicode字符([U+202E]https://gepj.net/selif#/moc.rugmi)时,它将以下列方式渲染。
文件扩展名的显示也可以用类似的方式操纵。考虑一个名为 test.[U+202E]fdp.zip 的文件。
这里提出的解决方案很简单——更严格的过滤。当字符顺序被改变时,URL不应被渲染为链接。同样,包含字符流操纵器的文件名应被拒绝。
不受信任链接的导航确认
即使链接始终正确显示,攻击者仍有可能成功发起网络钓鱼活动。毕竟,用户总是有可能被迫点击恶意链接。此类风险无法完全消除,但可以通过额外的加固来缓解。受测平台实现了导航确认中间页。这意味着,每当用户点击平台外部的链接时,都会出现一个额外的确认界面。此类界面元素会告知用户他们正在离开安全环境。这种用户体验设计大大降低了网络钓鱼攻击成功的几率。
总结
本项目是针对特定威胁进行主动安全合作的绝佳范例。考虑到该平台的特殊威胁模型,此类合作作为常规安全评估及其漏洞赏金计划的补充,被证明极具价值。特别是,一次专门针对网络钓鱼和社会工程的合作使我们能够制定出一系列建议和加固方案,而这些在常规安全审查中可能仅仅是一个附带说明。