iHeartRadio 作为知名音乐流媒体平台,其前端和后端 JavaScript 源代码最近通过 GitHub 仓库泄露,尽管仓库现已下线,此类事件暴露了媒体应用常见的客户端安全隐患。本文聚焦泄露 JS 代码的安全审计要点,强调认证绕过路径、暴露 API 端点、客户端秘密泄露及 CORS 配置不当等高频漏洞模式。通过通用审计方法和可落地防护参数,帮助工程团队快速自查并加固类似系统,避免用户数据外泄或未授权访问。
审计要点一:不当 Token 存储与持久化风险
泄露的 JS 代码中,常見 localStorage 或 sessionStorage 直接持久化 JWT token,这是首要审计目标。例如,代码可能包含localStorage.setItem('authToken', token),导致 XSS 攻击轻易窃取 token。审计时,grep 搜索localStorage、sessionStorage、setItem('token'),检查是否明文存储长效 token。
证据显示,此类模式在媒体 App 中普遍:token 未加密、未设置过期时间,或 fallback 到 cookie 但无 HttpOnly 标志。攻击者通过注入 script 即可 dump token,实现会话劫持。
防护参数清单:
- Token TTL:访问 token 15 分钟刷新,refresh token 24 小时轮换;使用
expclaim 严格校验。 - 存储策略:优先 HttpOnly、Secure、SameSite=Strict 的 cookie 存储 token;禁用 localStorage fallback,仅 sessionStorage 用于临时 state。
- 客户端校验:集成
crypto.subtle加密 token(AES-GCM),密钥从服务器派生;示例代码:const encKey = await crypto.subtle.importKey('raw', serverKey, 'AES-GCM', true, ['encrypt']); const iv = crypto.getRandomValues(new Uint8Array(12)); const encryptedToken = await crypto.subtle.encrypt({name: 'AES-GCM', iv}, encKey, token); sessionStorage.setItem('encToken', JSON.stringify(Array.from(new Uint8Array(encryptedToken)))); - 回滚阈值:token 无效率 > 5% 时,强制全局刷新。
审计要点二:硬编码 Secrets 与暴露 API 端点
JS bundle 中搜索apiKey、secret、aws_access_key,常发现硬编码 Stripe key 或 S3 签名,常見于第三方集成如播放器 SDK。进一步,fetch/axios 调用如fetch('/api/user/profile', {headers: {Authorization: localStorage.token}})可能缺少校验,允许 bypass。
暴露端点模式:/api/stations无 auth,直接泄露用户偏好;或 GraphQL playground 嵌入生产环境。
防护参数:
- Secrets 扫描:构建时 truffleHog 扫描 bundle,阈值零容忍;使用 env 注入
process.env.API_KEY。 - API 网关:所有端点强制 JWT 验证,rate limit 100req/min/IP;示例 Nginx:
location /api/ { auth_request /auth; limit_req zone=api burst=20 nodelay; } - 端点最小化:公开 API 仅
/public/stations,敏感用/v1/user/+auth;监控未 auth 调用 > 1% 报警。
审计要点三:CORS 误配置与 CSRF 漏洞
JS 中配置credentials: 'include'搭配宽松 CORS 如Access-Control-Allow-Origin: *,允许恶意站劫持请求。审计 proxy/server.js,检查cors({origin: true})。
防护清单:
- CORS 策略:
Access-Control-Allow-Origin: https://app.iheartradio.com,Allow-Credentials: true仅 exact origin;Vary: Origin 头。 - CSRF Token:每个 fetch 附加
X-CSRF-Token: header from meta,服务器校验。 - 阈值监控:CORS 预检失败 > 10/min,日志 Origin 不匹配立即封 IP(Fail2ban 规则:
iptables -A INPUT -s $IP -j DROP)。
审计要点四:客户端逻辑漏洞与供应链风险
播放器 JS 可能暴露/stream/{id}?token=xxx,易猜 id 枚举;或依赖 npm 包如 lodash 未 pin 版本,引入 prototype 污染。
防护:
- ID 混淆:用 ULID 或 hashid 生成 stream ID,非顺序 int。
- 供应链:
npm audit --audit-level high,lockfile commit;Snyk 监控。 - CSP 头:
Content-Security-Policy: script-src 'self' 'nonce-{random}',禁 inline JS。
工程化监控与回滚策略
部署 Prometheus+Grafana 监控:
- Metric:
auth_failures_total{reason="expired"}>2% → PagerDuty。 cors_origin_mismatch>5/min → 自动回滚最近 deploy。- 日志:ELK 栈 grep
token、CORS,保留 7 天。
回滚清单:1. 零信任,重发所有 token;2. 增 DDoS WAF(Cloudflare 阈值:10req/s);3. 渗透测试覆盖 OWASP Top10。
通过以上参数,企业可将 MTTR 降至 1 小时。iHeartRadio 事件提醒:源代码泄露 = 生产镜像,审计不仅是修复,更是架构重构。
资料来源:
- GitHub 仓库 https://github.com/gh0stytongue/iheartradio(现 404)。
- Hacker News 相关讨论 https://news.ycombinator.com/。
(正文约 1250 字)