应用安全工程增强钓鱼攻击防护 - 案例研究
2024年9月19日 - 作者:Szymon Drosdzol
引言
近期Doyensec受雇于一家提供"通信平台即服务"的客户。该平台允许其客户打造客户服务体验,并通过多种渠道(电子邮件、网络聊天、社交媒体等)与自己的客户进行通信。
虽然此类服务无疑具有价值,但也引入了独特的威胁模型。客户的用户每天需要处理大量来自外部(通常是匿名)用户的来信,这使他们特别容易受到网络钓鱼和其他社会工程攻击。
虽然无法完全消除此类威胁,但可以尽量减少被利用的可能性。认识到这一点后,客户聘请Doyensec进行安全审查,特别关注社会工程攻击,尤其是网络钓鱼。今年早些时候进行的这次合作证明对双方都极具价值。最重要的是,客户利用审计结果大大提高了其平台对社会工程攻击的抵御能力。此外,Doyensec工程师也有很好的机会在标准安全审计中释放他们的创造力,去发现那些经常被忽视或严重低估的漏洞(看看你,CVSS分数!),并从蓝队角度审视应用程序的防御。
本案例研究将讨论作为此次审计一部分而解决的一些漏洞。希望这篇文章能帮助开发人员了解他们的平台中可能潜伏着哪些类型的漏洞。它也有助于证明这种重点合作作为标准网络审计的补充是多么有价值。
附件处理
对于任何客户支持组织来说,文件附件管理都是一个关键功能。一方面,用户需要能够与对话者共享文件样本、截图等。另一方面,共享文件始终是利用各种安全漏洞的温床,尤其是在接受来自不可信方的文件时。因此,加固应用程序的这一部分始终需要仔细考虑如何确保机密性和完整性,同时不牺牲可用性。
通过尾随点绕过文件扩展名限制
测试平台采用了一个强大的系统,旨在验证允许的文件扩展名和内容类型,并具有全局禁止列表,用于禁止 inherently dangerous 文件类型,例如可执行文件(如.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输入处理
在交换消息时,添加格式并给用户更多表达方式可能非常有用。另一方面,当消息来自不可信来源时,此类功能可以使攻击者制作复杂的攻击,涉及UI伪装,例如,在其消息中模拟UI元素。
我们的客户找到了一种平衡可用性和安全性的好方法。虽然受信任的用户有丰富的输入格式选项,但来自平台外部的不可信用户只能共享基本的纯文本消息。还值得注意的是,即使受信任的用户也无法将任意HTML注入他们的消息,因为HTML标签被正确解析和编码。但是,有一些特定的标签是允许的,并且在某些情况下会转换为更复杂的元素(例如,链接标签被转换为按钮)。
Doyensec发现此解决方案在设计层面架构良好。然而,由于实现中的疏忽,公共消息API也接受了一个"隐藏"(未被前端使用)参数,该参数允许某些HTML元素。Doyensec能够利用链接到按钮的转换来演示使用此漏洞伪造UI元素的潜力。
通过完全禁用公共API中的此参数,只允许经过身份验证的用户格式化他们的消息,解决了该问题。
链接展示漏洞
数据展示漏洞是一种尤其被忽视的威胁。尽管它们有可能操纵或扭曲关键信息,但数据展示漏洞在安全评估中经常被低估,并在修复工作的优先级排序中被忽视。然而,它们的利用可能导致严重后果,包括网络钓鱼。
误导性Unicode域渲染
要理解这个问题,重要的是理解两个不同的术语。首先,Punycode是一种字符编码方案,用于表示域名中的Unicode字符。它使浏览器和其他Web客户端能够处理域名中的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不应被渲染为链接。类似地,应拒绝包含字符流操纵器的文件名。
不可信链接导航确认
即使链接总是正确显示,仍然存在攻击者可以创建成功网络钓鱼活动的机会。毕竟,用户总是可能被胁迫点击恶意链接。这种风险无法完全消除,但可以通过额外的加固来缓解。检查的平台实现了导航确认插页式广告。这意味着,任何时候用户点击平台外的链接,都会出现一个额外的确认屏幕。此类UI元素通知用户他们正在离开安全环境。这种UX设计大大降低了成功网络钓鱼攻击的可能性。
总结
这个项目是针对特定威胁进行主动合作的一个很好的例子。鉴于该平台的特定威胁模型,这样的合作作为定期安全评估及其漏洞赏金计划的补充被证明非常有用。特别是,专门关注网络钓鱼和社会工程的合作使我们能够制定一份建议和加固想法列表,这些在常规安全审查中可能只是一个旁注。