引言
最近Doyensec受雇于一家提供"通信平台即服务"的客户。该平台允许其客户打造客户服务体验,并通过多种渠道(电子邮件、网络聊天、社交媒体等)与自己的客户进行沟通。
虽然这种服务无疑具有价值,但它也引入了独特的威胁模型。客户的用户每天需要处理大量来自外部(通常是匿名)用户的通信,这使他们特别容易受到网络钓鱼和其他社会工程攻击。
虽然无法完全消除这些威胁,但可以尽量减少被利用的可能性。认识到这一点后,客户聘请Doyensec进行安全审查,特别关注社会工程攻击,尤其是网络钓鱼。今年早些时候进行的这次合作对双方都极具价值。最重要的是,客户利用审查结果大大提高了其平台对社会工程攻击的抵御能力。
附件处理
对于任何客户支持组织来说,文件附件管理都是关键功能。一方面,用户需要能够与对话者共享文件样本、截图等;另一方面,共享文件始终是各种安全漏洞利用的温床,特别是在接受来自不受信任方的文件时。
通过尾随点绕过文件扩展名限制
测试平台采用了强大的系统来验证允许的文件扩展名和内容类型,具有对固有危险文件类型(如可执行文件.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 redress的复杂攻击,例如在其消息中模拟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实际上解析到www.xn--80ak6aa92e.com,在展开Punycode字符串后。访问该链接显示它不受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设计大大降低了成功网络钓鱼攻击的机会。
总结
该项目是针对特定威胁进行主动合作的一个很好的例子。鉴于该平台的特定威胁模型,此类合作已被证明作为常规安全评估及其漏洞赏金计划的补充极其有用。特别是,专门关注网络钓鱼和社会工程的合作使我们能够制定一系列建议和强化想法,否则这些在常规安全审查中只是一个附带说明。