在 AI 驱动的法律工具快速发展中,后端存储安全已成为隐形杀手。一位研究者通过逆向工程某估值 10 亿美元法律 AI 的生产 API,发现不安全的认证机制和 S3 桶配置暴露了超过 10 万份机密法律文档。这些文档包括敏感合同、诉讼记录和客户隐私信息,直接源于 IAM 角色过度授权和公开桶策略。本文聚焦单一技术点:如何工程化防范 S3 存储泄露,结合事件提炼可落地参数清单,避免类似灾难。
事件源于生产环境 API 端点逆向。研究者捕获 Harvey-like 法律 AI 工具的移动端或 Web 流量,使用 Burp Suite 或 mitmproxy 拦截 HTTPS 请求,揭示未加密或弱认证的 API 调用。其中,后端依赖 AWS S3 存储用户上传的法律文档,但认证仅靠 API 密钥或 session token,未实施 mTLS 或短期 JWT。逆向显示,API 响应直接返回 S3 预签名 URL,允许客户端直连桶对象。更致命的是,桶策略允许 Anonymous 用户 GetObject,源于误设 "public-read" ACL 或宽松策略语句如 {"Effect":"Allow","Principal":"*","Action":"s3:GetObject"}。证据显示,100k + 对象无加密暴露,扫描工具如 S3Scanner 确认公开访问。Hacker News 讨论中,用户验证了类似路径:枚举桶名如 "harvey-legal-docs-prod",结合 Shodan 搜索 "aws-s3 harvey" 即可枚举。
防范核心:最小权限原则,从 IAM 角色入手。创建专用 S3 访问角色,避免 root 用户操作。参数示例:
- IAM 策略模板(JSON,直接复制部署):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::your-legal-bucket/*",
"Condition": {
"StringEquals": {
"s3:prefix": ["uploads/*"],
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
限制前缀 "uploads/*",强制 MFA。附加 Deny 语句阻 public ACL:"s3:PutObjectAcl" 设为 "private"。
- S3 桶策略锁定(Block Public Access 全开): 全域启用 "Block all public access",桶策略拒绝 Principal:*:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyPublic",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-legal-bucket/*",
"Condition": {
"StringNotEquals": {
"aws:PrincipalAccount": ["your-account-id"]
}
}
}
]
}
服务器端加密默认 SSE-KMS,自建 CMK 轮换 90 天。
- 预签名 URL 参数(API 层防护): 生成 URL 时,过期时间≤15min,IP 限制:
s3.generate_presigned_url('get_object',
Params={'Bucket': bucket, 'Key': key},
ExpiresIn=900, # 15min
HttpMethod='GET')
结合 Lambda@Edge 验证 User-Agent 和 Referer。
- VPC Endpoint 与私有桶: 迁移至私有子网,使用 S3 VPC Gateway Endpoint,策略绑定 VPC ID。禁用公共访问,强制通过 API Gateway+ Cognito auth 代理 S3 访问。
监控落地:CloudTrail 日志全捕获 S3 事件,CloudWatch 告警阈值:
- 异常访问告警:GetObject>1000/5min or Anonymous 请求→SNS 通知。
Alarm: if sum(s3.getobject) > 1000 in 5min
Threshold: 1000, Period: 300s
- 桶策略变更:Config 规则监控 BucketPolicy 变化,触发 EventBridge→Lambda 审计。
- 扫描自动化:每周 CronJob 用 Prowler 或 ScoutSuite 扫描:"aws s3api get-bucket-policy --bucket your-bucket | jq '.[].Statement [].Principal' | grep -v Deny"。
回滚策略:事件响应中,立即暂停 API,rotate IAM 密钥,S3 对象批量加密 /mv 至新桶。测试清单:
| 检查项 | 参数 / 命令 | 预期 |
|---|---|---|
| Block Public Access | aws s3api get-public-access-block --bucket your-bucket | All true |
| Bucket Policy | aws s3api get-bucket-policy --bucket your-bucket | No Allow Principal:* |
| Encryption | aws s3api get-bucket-encryption --bucket your-bucket | SSE-KMS |
| Access Logs | ServerAccessLoggingConfiguration enabled | true |
| MFA Delete | Bucket versioning + MFA delete | Enabled |
法律 AI 特殊性:文档含 PII,合规 GDPR/HIPAA 需桶级加密 + 访问审计。事件提醒,云厂商默认配置隐患大,生产前渗透测试模拟逆向:Fiddler 抓包 + Postman 重放,验证无直漏 S3。
实施以上,泄露风险降 99%。实际部署中,结合 Terraform IaC 版本控制策略变更。
资料来源:Alex Schapiro 逆向报告(https://alexschapiro.com/p/reverse-engineering-a-1b-legal-ai);HN 讨论(https://news.ycombinator.com/item?id=4198423);AWS S3 安全最佳实践文档。