防止跨子域 cookie 攻击

信息安全 应用安全 饼干 会话固定
2021-08-16 05:49:10

我一直在这里阅读有关跨子域 cookie 攻击的信息

快速概述它的工作原理(来自维基百科):

  1. 网站 www.example.com 将子域分发给不受信任的第三方
  2. 其中之一是现在控制 evil.example.com 的 Mallory,将 Alice 引诱到她的网站
  3. 访问 evil.example.com 会在 Alice 的浏览器上设置一个带有域 .example.com 的会话 cookie
  4. 当 Alice 访问 www.example.com 时,此 cookie 将与请求一起发送,正如 cookie 的规范所述,并且 Alice 将拥有由 Mallory 的 cookie 指定的会话。
  5. 如果 Alice 现在登录,Mallory 可以使用她的帐户。

我们正在构建一个 Web 应用程序,客户将在其中拥有自己的子域:subdomain.ourapp.com.

每个客户都可以上传包含 javascript(用于客户端交互)的模板文件。

既然 javascript 可以用来读/写 cookie,我们如何防止上面的会话固定攻击呢?请注意,我们仅将会话 ID 存储在 cookie 中。

像 squarespace.com 这样的网站还允许用户将他们自己的 javascript 注入到他们自己子域上的页面中。由于几乎不可能尝试过滤掉在上传的模板文件中设置/读取 cookie 的 javascript 语句,我们如何减轻这种攻击向量?

4个回答

可以很容易地防止特定情况:在登录时创建一个新的 sessionid。

请注意,如果 sessionid 是 url 参数,则跨域存在问题。

然而,生成一个新的 sesionid 并不足以防止其他类型的攻击:一旦 Alice 登录并访问 Mallory 的子域,cookie 会被传输吗?

对所有受信任的活动使用完全不同的域是常见的做法。例如,Google 将 google.com 用于受信任的活动,将 *.googleusercontent.com 用于不受信任的站点。

最安全的答案是使用完全不同的域。

如果您使用同一域的子域,请首先了解可能的攻击的详细信息。在这个网站上已经写了很多关于这个的文章。见,例如,

如果您使用同一域的子域,您可以采取以下步骤来保护自己:将所有状态存储在服务器端(不要使用 cookie 将状态存储在客户端;相反,您使用的唯一 cookie 应该是会话ID); 在登录和注销时创建一个新的会话 ID;确保 cookie 的范围是子域(例如,它的范围应该是 foo.ourapp.com,而不是 .ourapp.com);在服务器端检查以确保您没有收到多个带有该名称的 cookie;确保保护自己免受会话固定;如果您使用 CORS,请非常小心您的跨域策略,以确保您不允许跨子域请求。

Public Suffix有一个所有供应商(Chrome/Firefox/IE/Safari/Opera)使用的域列表,以避免从其他子域(以及其他功能)窃取 cookie 的问题。该列表每天更新并在 Github 上维护

我从Heroku 的博客中获得了这些信息。

我已验证 Google 的googleusercontent.com域与herokuapp.com,herokussl.com域一起包含在列表中。

我只是有个主意。我们可以从加密令牌模式中借用一个想法:加密 cookie 值!

如果 cookie 仅由服务器访问,则可以使用廉价的对称加密。否则,使用更昂贵的公钥加密。

这将允许您检测恶意子域何时删除您的 cookie 和/或检测他们写入虚假 cookie 的尝试。