OSSN/OSSN-0056
已撤销的 Keystone Token 可能被接受
总结
Keystone auth_token 中间件使用 Token 和撤销列表缓存来减少 Keystone 服务的负载。默认 Token 缓存时间设置为 300 秒,默认 Token 撤销列表缓存时间设置为 10 秒。这会产生一种误导性的期望,即撤销后的 Token 不会在撤销后超过 10 秒的时间内被接受,然而,缓存 Token 的最大有效性必须假定为缓存持续时间。系统所有者应根据风险做出决策,以平衡 Token 生命周期与性能需求,如果使用已撤销的 Token 是不可接受的风险,则应禁用缓存。
受影响的服务 / 软件
使用 Keystone 中间件的 OpenStack 服务:Juno, Kilo, Liberty
讨论
Keystone auth_token 中间件中存在多种配置 Token 缓存的选项。这些选项包括 token_cache_time、revocation_cache_time 和 check_revocations_for_cached,每个选项都会影响 Token 缓存和撤销的不同阶段。根据这些选项的配置,攻击者可以使用被攻陷的 Token 长达 token_cache_time 秒,然后 Token 才会失效。为了缓解此漏洞,Juno 中发布了一个更改,将默认 Token 撤销列表 (TRL) 缓存时间减少到 10 秒,并添加了 check_revocations_for_cached 选项。将 Token 添加到 TRL 并不能保证缓存的 Token 会被拒绝,考虑到 Token 缓存的运行性质。例如,如果禁用 check_revocations_for_cached,则 Token 在缓存 token_cache_time 或赋予 Token 的指定过期时间后仍然有效。否则(如果启用 check_revocations_for_cached),则 Token 在 revocation_cache_time 后会被拒绝。
系统所有者应权衡攻击者使用已撤销 Token 的风险与减少 Token 缓存时间带来的性能影响。
建议的操作
审查默认 300 秒 Token 缓存时间的影响以及使用已撤销 Token 长达该缓存时间相关的任何风险。如果这不可接受,请减少缓存时间以缩短攻击窗口,或完全禁用 Token 缓存。
联系方式 / 参考文献
- 作者:Shellee Arnold, HPE
- 此 OSSN:https://wiki.openstack.org/wiki/OSSN/OSSN-0056
- 原始 LaunchPad Bug:https://bugs.launchpad.net/python-keystoneclient/+bug/1287301
- OpenStack Security ML:openstack-security@lists.openstack.org
- OpenStack Security Group:https://launchpad.net/~openstack-ossg