<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>AccessKey泄露 on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/accesskey%E6%B3%84%E9%9C%B2/</link>
        <description>Recent content in AccessKey泄露 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 05 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/accesskey%E6%B3%84%E9%9C%B2/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>记一次云账号 AccessKey 泄露导致云上资源被恶意开机挖矿的溯源与处置</title>
            <link>https://blog.5772447.xyz/posts/e10fe42a/</link>
            <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
            <guid>https://blog.5772447.xyz/posts/e10fe42a/</guid>
            <description>&lt;h2 id=&#34;问题背景&#34;&gt;&lt;a href=&#34;#%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;我们有一套跑在公有云上的业务系统，日常云费用相对稳定，月度波动不超过 10%。财务侧配了一条粗粒度的费用预算告警，阈值设在月预算的 80%。2026 年 8 月 4 日凌晨 02:40，费用预算告警和云厂商的「账号存在高风险操作」安全通知几乎同时到达，值班同事被叫醒时，当天的消费金额已经是平日整月的三分之一。&lt;/p&gt;&#xA;&lt;p&gt;登录控制台第一眼看到的不是业务异常，而是一堆自己完全没见过的计算实例——分布在从来没开通过业务的境外地域。这不是性能故障，是账号已经被人拿去用了。下面是这次从「账单异常」倒查到「一行硬编码密钥」的完整过程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故障现象&#34;&gt;&lt;a href=&#34;#%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;故障现象&#xD;&#xA;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;费用曲线断崖式上翘&lt;/strong&gt;：按小时的消费明细显示，01:12 起每小时消费从个位数直接跳到三位数，且仍在持续增长。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;陌生地域出现陌生实例&lt;/strong&gt;：在新加坡、法兰克福、硅谷三个从未使用过的地域，各出现 6～10 台计算优化型高配实例（部分是 GPU 规格），实例名是随机字符串，创建时间集中在 01:05～01:30 的二十几分钟内。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;实例行为特征明显&lt;/strong&gt;：抽查其中一台，CPU 使用率长期 100%，安全组只放行了一个高位端口，实例启动时通过 UserData 拉起了一段脚本，向境外矿池地址发起持续外联。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;账号内多了不认识的子账号&lt;/strong&gt;：RAM 用户列表里多了一个 &lt;code&gt;svc-backup-agent&lt;/code&gt;，创建时间 01:08，挂着高权限策略，并且已经生成了一对新的 AccessKey。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;业务本身完全正常&lt;/strong&gt;：生产环境的服务、数据库、对象存储访问一切如常，没有任何业务侧报警——这也是它能安静跑将近两小时的原因。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;排查过程&#34;&gt;&lt;a href=&#34;#%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;排查过程&#xD;&#xA;&lt;/h2&gt;&lt;h3 id=&#34;第一步先确认是凭证被盗用还是主机被入侵&#34;&gt;&lt;a href=&#34;#%e7%ac%ac%e4%b8%80%e6%ad%a5%e5%85%88%e7%a1%ae%e8%ae%a4%e6%98%af%e5%87%ad%e8%af%81%e8%a2%ab%e7%9b%97%e7%94%a8%e8%bf%98%e6%98%af%e4%b8%bb%e6%9c%ba%e8%a2%ab%e5%85%a5%e4%be%b5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;第一步：先确认是「凭证被盗用」还是「主机被入侵」&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;这两者的处置路径完全不同。如果是某台业务服务器被拿下、攻击者在机器上翻到了凭据，那要立刻做主机侧应急；如果是凭证本身在外部泄露，主机可能干干净净。&lt;/p&gt;&#xA;&lt;p&gt;先看恶意实例是怎么被创建出来的。调操作审计（ActionTrail / CloudTrail 同类能力），按事件名 &lt;code&gt;RunInstances&lt;/code&gt; 过滤 01:00 之后的记录：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aliyun actiontrail LookupEvents &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --StartTime 2026-08-04T00:00:00Z --EndTime 2026-08-04T03:00:00Z &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --LookupAttribute.1.Key EventName --LookupAttribute.1.Value RunInstances&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;返回的每条事件里都有 &lt;code&gt;userIdentity&lt;/code&gt; 字段，结果非常干脆：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;调用者类型是 &lt;code&gt;RAMUser&lt;/code&gt;，身份是子账号 &lt;code&gt;ci-deploy&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;使用的凭证是 AccessKeyId &lt;code&gt;LTAI5t****3n7q&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;来源 IP 是几个境外 IDC 段的地址，而我们所有运维出口 IP 都在国内固定段。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;再查这个 &lt;code&gt;ci-deploy&lt;/code&gt; 账号的其他调用记录，攻击者的动作序列一目了然：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:03  GetCallerIdentity        # 先确认这把钥匙是谁、还能不能用&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:04  ListPolicies / GetUser   # 摸权限边界&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:08  CreateUser + AttachPolicy + CreateAccessKey   # 建后门账号做持久化&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:05  DescribeRegions          # 列出所有可用地域&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:05  DescribeInstanceTypes    # 挑最贵最能算的规格&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:12  RunInstances × N         # 多地域批量开机&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:20  ListBuckets              # 顺手看看有没有对象存储&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01:21  GetBucketAcl × 3         # 试探桶权限&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;到这里第一个问题有了答案：&lt;strong&gt;这是纯粹的凭证盗用，攻击者从头到尾没碰过我们任何一台服务器&lt;/strong&gt;——所有动作都是通过云 API 完成的。&lt;/p&gt;&#xA;&lt;h3 id=&#34;第二步确认有没有数据被拖走&#34;&gt;&lt;a href=&#34;#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e7%a1%ae%e8%ae%a4%e6%9c%89%e6%b2%a1%e6%9c%89%e6%95%b0%e6%8d%ae%e8%a2%ab%e6%8b%96%e8%b5%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;第二步：确认有没有数据被拖走&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;这一步比清理挖矿实例更重要。挖矿只是烧钱，数据泄露是事故性质的改变。&lt;/p&gt;&#xA;&lt;p&gt;顺着审计日志把所有对象存储相关事件拉出来看：攻击者执行了 &lt;code&gt;ListBuckets&lt;/code&gt; 和 3 次 &lt;code&gt;GetBucketAcl&lt;/code&gt;，但&lt;strong&gt;没有任何一条 &lt;code&gt;GetObject&lt;/code&gt; 成功记录&lt;/strong&gt;。原因是这几个桶都配了 Bucket Policy，只允许指定 VPC 内网访问，公网直接调用被拒。同时数据库实例的白名单也只放行了内网网段，审计里没有出现任何 &lt;code&gt;ModifySecurityIps&lt;/code&gt; 类的改白名单尝试成功记录。&lt;/p&gt;&#xA;&lt;p&gt;结论：&lt;strong&gt;未发生数据泄露，攻击者的目标就是算力&lt;/strong&gt;。这一条后来写进了事故报告，也决定了我们不需要走对外披露流程。&lt;/p&gt;&#xA;&lt;h3 id=&#34;第三步这把钥匙是怎么跑出去的&#34;&gt;&lt;a href=&#34;#%e7%ac%ac%e4%b8%89%e6%ad%a5%e8%bf%99%e6%8a%8a%e9%92%a5%e5%8c%99%e6%98%af%e6%80%8e%e4%b9%88%e8%b7%91%e5%87%ba%e5%8e%bb%e7%9a%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;第三步：这把钥匙是怎么跑出去的&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;ci-deploy&lt;/code&gt; 是一个历史遗留的 CI 部署子账号。先在内部排查：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;生产服务器上 grep 一遍常见位置，确认这对 AK 没有落在任何一台机器上（我们内部机器都是走实例角色，不放静态密钥）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -rn &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LTAI5t&amp;#34;&lt;/span&gt; /etc /opt /home /var/www 2&amp;gt;/dev/null&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;无结果。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;查 CI 系统的凭据管理，这对 AK 确实作为环境变量存在，但 CI 的构建日志做了掩码，且访问 IP 全在国内。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;转向代码仓库。先用 gitleaks 扫内部 GitLab 全组织：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gitleaks detect --source ./repos --report-format json --report-path leaks.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;内部仓库扫出几条历史告警，但都不是这一对。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;最后一步是去公网搜。用泄露的 AccessKeyId 前缀在公开代码托管平台做代码搜索——命中了。一名实习生个人账号下的一个 &lt;strong&gt;public&lt;/strong&gt; 仓库里，有个 &lt;code&gt;tools/upload_oss.py&lt;/code&gt;，第 9 行赫然写着：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ACCESS_KEY_ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LTAI5t****3n7q&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ACCESS_KEY_SECRET &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;wq7****&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;他为了在自己电脑上测试对象存储上传，把公司 CI 的密钥复制进了脚本，随手推到了自己的公开仓库。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;时间线一对，脊背发凉：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;时间&lt;/th&gt;&#xA;          &lt;th&gt;事件&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;00:52&lt;/td&gt;&#xA;          &lt;td&gt;该 commit 推送到公开仓库&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;01:03&lt;/td&gt;&#xA;          &lt;td&gt;攻击者首次 &lt;code&gt;GetCallerIdentity&lt;/code&gt; 调用&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;01:12&lt;/td&gt;&#xA;          &lt;td&gt;首批恶意实例创建&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;从密钥进入公网到被用来开机，只隔了 20 分钟，其中「被发现」这一步只用了 11 分钟。&lt;/strong&gt; 这不是有人盯着我们，而是全网都有扫描机器人在实时抓取公开提交里的密钥特征，秒级触发。&lt;/p&gt;&#xA;&lt;h3 id=&#34;第四步为什么一把-ci-密钥能开机器&#34;&gt;&lt;a href=&#34;#%e7%ac%ac%e5%9b%9b%e6%ad%a5%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%80%e6%8a%8a-ci-%e5%af%86%e9%92%a5%e8%83%bd%e5%bc%80%e6%9c%ba%e5%99%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;第四步：为什么一把 CI 密钥能开机器&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;看这个子账号挂的权限策略，是 &lt;code&gt;AdministratorAccess&lt;/code&gt;。当初配 CI 的同事图省事，没有细化到只给部署所需的几个动作。&lt;strong&gt;一把只该用来上传构建产物的钥匙，实际上是整个账号的万能钥匙。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;&lt;a href=&#34;#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;解决方案&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;处置分两条线并行，止血优先于取证之外的一切。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第一线：切断访问（5 分钟内完成）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;先&lt;strong&gt;禁用&lt;/strong&gt;而不是删除泄露的 AK，保留取证痕迹：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aliyun ram UpdateAccessKey --UserName ci-deploy &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --UserAccessKeyId LTAI5t****3n7q --Status Inactive&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;删除攻击者创建的 &lt;code&gt;svc-backup-agent&lt;/code&gt; 子账号及其 AK。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;检查是否还有其他被新建的凭证、角色信任关系被篡改。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二线：清理资源与费用&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;逐地域列出并销毁恶意实例，同时清理攻击者创建的安全组、自定义镜像、快照（有的攻击者会留镜像做二次拉起）。&lt;/li&gt;&#xA;&lt;li&gt;关闭本次事件中未使用的境外地域。&lt;/li&gt;&#xA;&lt;li&gt;整理审计日志与实例账单明细，向云厂商提交异常消费申诉，最终追回了大部分费用。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;第三线：源头清理&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;联系实习生删除仓库。但必须强调一点：&lt;strong&gt;仓库设私有、把那行代码删掉、甚至 &lt;code&gt;git rm&lt;/code&gt; 一次新提交，都不等于密钥安全了&lt;/strong&gt;——历史提交仍可通过缓存和分叉获取。正确做法是：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git filter-repo --path tools/upload_oss.py --invert-paths&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;重写历史后强推，同时删除该公开仓库。但&lt;strong&gt;这只是善后，不是修复&lt;/strong&gt;。真正的修复只有一条：密钥一旦离开受控环境，就必须视为永久泄露、立即轮换作废。我们直接废弃了这对 AK，CI 改用支持短期凭证的方式重新对接。&lt;/p&gt;&#xA;&lt;h2 id=&#34;根因分析&#34;&gt;&lt;a href=&#34;#%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;表面看是「实习生把密钥写进了代码」，但一个人的失误能直接放大成账号级事故，说明防线上有五个洞，任意补上一个都能拦住这次事件：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;长期有效的静态 AccessKey&lt;/strong&gt;——创建于两年前，从未轮换，没有过期时间。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;权限严重超配&lt;/strong&gt;——部署用途的子账号挂了管理员策略，越权半径等于整个账号。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;密钥可以被随手复制&lt;/strong&gt;——没有任何机制阻止开发者把生产凭据拿到个人环境。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;提交侧无扫描卡点&lt;/strong&gt;——本地无 pre-commit，公开推送无检测。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;调用侧无异常告警&lt;/strong&gt;——境外 IP 调用、陌生地域开机、&lt;code&gt;CreateUser&lt;/code&gt; 这类高危动作，都没有实时告警，最后是靠费用告警兜底发现的，已经晚了近两小时。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;预防措施&#34;&gt;&lt;a href=&#34;#%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;预防措施&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;消灭长期静态密钥&lt;/strong&gt;：服务器侧统一用实例角色，CI/CD 用短期 STS 临时凭证或 OIDC 联合身份换取，把「不存在的密钥」作为最优解。确实无法避免的 AK，强制 90 天轮换，并开启「长期未使用自动禁用」。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;最小权限 + 访问条件&lt;/strong&gt;：按用途拆分子账号，只授予必需的 API 动作与资源范围；给关键子账号加上来源 IP 条件限制，境外 IP 直接拒绝——单这一条本次就能挡住。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;提交侧双层拦截&lt;/strong&gt;：本地 pre-commit 挂 gitleaks，服务端加 pre-receive 钩子拦含密钥特征的推送，CI 流水线再扫一次。三层里任何一层都能在 00:52 那一刻拦下。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;高危 API 实时告警&lt;/strong&gt;：对 &lt;code&gt;CreateUser&lt;/code&gt;、&lt;code&gt;CreateAccessKey&lt;/code&gt;、&lt;code&gt;AttachPolicy&lt;/code&gt;、非常用地域 &lt;code&gt;RunInstances&lt;/code&gt;、非常用 IP 调用等配置分钟级告警，直接推到值班群，不要只依赖费用告警。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;费用告警细化&lt;/strong&gt;：从「月预算 80%」改为「按小时环比突增」+「按地域白名单」双维度，把发现时间从两小时压缩到十分钟内。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;人的环节&lt;/strong&gt;：新人入职培训里明确「生产凭据不得离开受控环境」，并提供可用的沙箱账号——如果当初有个只能操作测试桶的沙箱 AK，他根本不需要去复制生产密钥。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这次事故里最扎眼的数字是 11 分钟：从密钥出现在公网，到它被自动化机器人捡起来用。这个速度决定了「事后发现再补救」这条路基本走不通，防线必须前移到提交那一刻。&lt;/p&gt;&#xA;&lt;p&gt;复盘时我们把它拆成一句话：&lt;strong&gt;泄露是必然会发生的，问题在于泄露的那把钥匙能开多大的门、多久会被发现。&lt;/strong&gt; 静态密钥换成临时凭证，管理员权限降到最小集，无告警补上高危动作监控——三件事做完，同样的失误再来一次，损失只会是一条被拦下的提交记录。至于那位实习生，我们没有处分他，而是让他在部门周会上把这条时间线讲了一遍。效果比任何制度宣贯都好。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
