小程序里直接调 STS AssumeRole 拿临时凭证,凭证被反编译拿到,一小时内被调用 4 万次,账单多出 1800 元,来源 IP 分布在三个省份。日志里能对上时间点,这种反而好排。

临时凭证换取的逻辑放在客户端,AccessKey 和 RoleArn 都在包里。STS 的有效期再短,被拿到后在这一小时内仍然可用。权限策略给的是对象存储全读写,没有按前缀限制。这一点先确认清楚,后面就不用反复试。

aws sts get-caller-identity
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=AssumeRole --max-items 20

「临时凭证泄露」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。

处理上按这个顺序:STS 换取移到服务端 客户端只拿临时上传签名;角色策略收窄到指定 bucket 和用户前缀;加调用频率和来源限制 异常时立即吊销会话;把泄露的那把 AccessKey 停用并查调用来源。

结果对不对很好判断,小程序包里搜不到 AccessKey 新凭证只能由登录用户的服务端换取。

作者 9823189