在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应用安全范围的第三方依赖项。