微软白板与Excalidraw中的剪贴板漏洞分析(CVE-2023-26140)

本文深入分析了Meta和微软白板应用中由剪贴板API引发的安全漏洞,详细披露了Excalidraw组件中的href属性注入和微软白板iframe沙箱逃逸的技术细节,揭示了现代Web应用中容易被忽视的攻击面。

回到剪贴板:微软白板与Meta中Excalidraw的漏洞(CVE-2023-26140)

在Meta和Google等拥有强大应用安全防护的项目中发现边缘案例总是很有趣,这些项目通常已经解决了整个漏洞类别(如跨站脚本),这突显了应用安全策略中潜在的盲点。我特别着迷于剪贴板API,它似乎能逃过典型的静态分析工具检测,就像我在Zoom白板中发现的一个存储型XSS漏洞。以下是我如何在Excalidraw(用于Messenger和其他Meta资产)和微软白板中发现类似漏洞的过程。

从合作开始

某天,teknogeek和nagli联系我合作研究一些Meta资产。具体来说,teknogeek正在研究CodeQL默认规则发现的Excalidraw中的跨站脚本漏洞,这是一个Meta使用的开源协作白板工具。该发现指出用户输入的来源是event.clipboardData:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
export const getSystemClipboard = async (
  event: ClipboardEvent | null,
): Promise<string> => {
  try {
    const text = event
      ? event.clipboardData?.getData("text/plain")
      : probablySupportsClipboardReadText &&
        (await navigator.clipboard.readText());
    return (text || "").trim();
  } catch {
    return "";
  }
};

最终,这些剪贴板事件数据流入image.src:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
export const loadHTMLImageElement = (dataURL: DataURL) => {
  return new Promise<HTMLImageElement>((resolve, reject) => {
    const image = new Image();
    image.onload = () => {
      resolve(image);
    };
    image.onerror = (error) => {
      reject(error);
    };
    image.src = dataURL;
  });
};

动态分析深入

深入研究剪贴板API会发现它很快变得非常复杂,因为开发人员在如何序列化HTML数据方面有很大的自由度。通过静态分析重建有效负载可能非常痛苦,因为需要进行大量的回溯。在这种情况下,动态获取典型的剪贴板序列化有效负载实际上要容易得多。

例如,访问白板时,可以在开发者控制台中输入以下代码来记录粘贴事件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
document.addEventListener('paste', function (event) {
    const clipboardData = event.clipboardData || window.clipboardData;
    console.log('Available types in clipboard:', clipboardData.types);
    if (clipboardData.types.includes('text/plain')) {
        const textContent = clipboardData.getData('text/plain');
        console.log('Text content from clipboard:', textContent);
    }
    if (clipboardData.types.includes('text/html')) {
        const htmlContent = clipboardData.getData('text/html');
        console.log('HTML content from clipboard:', htmlContent);
    }
});

微软白板的沙箱逃逸

审查微软白板的客户端代码揭示了一个隐藏的支持对象——微软白板实际上允许在白板中添加iframe!特别是超链接对象接受一个iframe属性,该属性应该是一个定义iframe的字符串化对象字面量。该对象本身可以包括src和sandbox属性。虽然微软白板正确地清理了src属性,但sandbox属性没有任何检查。

通过允许控制此属性,白板容易受到高度宽松的沙箱策略的影响。特别是allow-top-navigation沙箱值允许iframe中的脚本将父框架(即白板)重定向到任何其他URL。

1
2
3
4
5
6
const iframeData = {
  height: 600,
  width: 1200,
  src: "<ATTACKER WEBSITE HERE>",
  sandbox: ["allow-popups","allow-top-navigation","allow-scripts", "allow-top-navigation-to-custom-protocols", "allow-same-origin"]
}

非典型XSS的启示

随着简单的Web漏洞类别被安全编码的应用安全策略根除,发现像Excalidraw和微软白板问题这样的边缘案例很有趣。在这两种情况下,我怀疑可能是由于相对罕见的接收器可能未被静态分析工具捕获。此外,Excalidraw是一个可能超出Meta应用安全范围的第三方依赖项。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计