一个跨站脚本漏洞就能毁掉你的初创公司
每个人都在谈论因糟糕的用户体验、缓慢的加载时间、令人困惑的新手引导流程或移动端无法使用的按钮导致的用户流失。关于“失去用户”的讨论几乎完全集中在产品层面。
却没有人谈论当你的更新端点向每个检查新版本的用户提供 javascript: 统一资源标识符时会发生什么。或者当你的接受标记语言格式的版本说明字段被用来向每个渲染它的客户端注入脚本标签时。又或者当你的静态发布令牌没有速率限制,导致攻击者可以无限次尝试暴力破解它。
这些并非理论上的场景,而是在工具版本管理系统的常规拉取请求审计中会出现的那类发现。与损坏的模态框或令人困惑的注册流程不同,你不会收到告诉你出问题的热罐录制回放。你只会收到一份数据泄露报告,或者石沉大海,直到六个月后才发现真相。
看起来不像漏洞的漏洞
以下是最近在一次安全审计中被标记出的真实拉取请求的样子:
class ArtifactCreate(BaseModel):
platform: str
arch: str
url: str # 接受任何统一资源标识符
sha256: Optional[str] = None
四个字段,没有验证。网址字段接受 https://,但也接受 javascript:alert(document.domain)、data:text/html、<script>... 以及 http://internal-svc:8080/admin。
当你的工具自动更新端点返回此网址且客户端渲染它时,这就是跨站脚本攻击。当你的工具跟随该网址下载二进制文件时,这就是服务器端请求伪造,取决于你的云设置,这可能意味着访问内部服务、元数据端点,甚至更糟的情况。
修复方法只需四行代码:
