跳转到: 导航, 搜索

OSSN/OSSN-0017

Horizon 在使用默认签名 Cookie 会话时存在会话固定漏洞

总结

Horizon 的默认设置是使用签名 Cookie 在客户端存储会话状态。这会导致如果攻击者能够捕获用户的 Cookie,他们可以冒充该用户执行所有操作,即使该用户已经注销。

受影响的服务 / 软件

Horizon, Folsom, Grizzly, Havana, Icehouse

讨论

当配置为使用客户端会话时,服务器不知道用户的登录状态。OpenStack 授权令牌存储在 Cookie 中的会话 ID 中。如果攻击者可以窃取 Cookie,他们可以冒充目标用户执行所有操作,即使该用户已经注销。

攻击者可以通过多种方式窃取 Cookie。例如,如果 Horizon 未配置为使用 SSL,则可以通过线路拦截 Cookie。如果攻击者可以访问该机器,他们还可以从文件系统访问 Cookie。还有其他窃取 Cookie 的方法,超出了本说明的范围。

通过启用服务器端会话跟踪解决方案,例如 memcache,可以在用户注销时终止会话。这可以防止攻击者使用已终止会话的 Cookie。

需要注意的是,Horizon 会请求 Keystone 在用户注销时使令牌失效,但尚未为 Identity API v3 实现此功能。如果 Keystone 服务不可用,令牌失效也可能失败。因此,为了确保用户注销后会话不可用,建议使用服务器端会话跟踪。

建议的操作

建议您配置 Horizon 使用不同的会话后端,而不是签名 Cookie。一种可能的替代方案是使用 memcache 会话。要检查您是否正在使用签名 Cookie,请在 Horizon 的 local_settings.py 中查找以下行:

 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

如果 SESSION_ENGINE 设置为除 'django.contrib.sessions.backends.signed_cookies' 以外的值,则此漏洞不存在。如果 SESSION_ENGINE 未在 local_settings.py 中设置,请在 settings.py 中检查它。

以下是配置 memcache 会话的步骤:

1. 确保 memcached 服务正在您的系统上运行

2. 确保已安装 python-memcached

3. 在 local_settings.py 中配置 memcached 缓存后端

      CACHES = {
          'default': {
              'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
              'LOCATION': '127.0.0.1:11211',
          }
      }

请确保使用 memcached 服务的实际 IP 地址和端口。

4. 在 local_settings.py 中添加一行以使用缓存后端

 SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

5. 重新启动 Horizon 的 Web 服务器服务(通常为 'apache2' 或 httpd)

此外,您应始终为 Horizon 启用 SSL,以帮助缓解此类攻击场景。

请注意,无论使用哪种会话后端,如果 Cookie 被盗,攻击者都可以在其会话有效期间假冒用户的全部权限。

联系方式 / 参考文献