OSSN/OSSN-0048
Glance 方法过滤在某些条件下不起作用
总结
Glance 在其缓存中间件中,针对某些镜像端点使用 Python 的 assert 语句来验证 HTTP 方法类型。Python 文档指出,当请求优化时(命令行选项 -O),assert 语句将不会被评估。这导致了一种情况,即这些方法验证将不会发生,并且可能允许使用不同的 HTTP 动词调用特定的方法。
受影响的服务 / 软件
Glance, Icehouse, Juno, Kilo
讨论
Glance 使用 Python 的 assert 语句来验证版本 1 和 2 REST 接口中某些镜像端点的 HTTP 方法。在 Glance 使用 Python 优化启用(通过使用 -O 命令行选项)的情况下,这些 assert 语句将不会被评估。在这种情况下,对于请求的端点,HTTP 动词将不会被检查。
受此影响的端点和方法如下
- 对 /v1/images/{image_id} 的 GET 请求
- 对 /v1/images/{image_id} 的 DELETE 请求
- 对 /v2/images/{image_id}/file 的 GET 请求
- 对 /v2/images/{image_id} 的 DELETE 请求
这可能导致在某些配置中出现访问违规。例如,如果在 Glance API 前端进行过滤以根据 HTTP 方法和 IP 地址限制查询,攻击者可以通过匹配端点正则表达式并提供不同的 HTTP 动词来绕过此过滤。在这种情况下,攻击者将能够从 Glance 下载或删除镜像。
假设用户被网络过滤限制为仅向 Glance API 端点发送 DELETE 请求。用户可以尝试通过向端点发送精心构造的请求来绕过过滤,该请求实际上会检索命名的镜像。如果已知镜像 ID 为“12345”,则发送到 Glance API 端点“/v2/images/12345/file”的 DELETE 请求最终将匹配 GET URI 模式。这将从 Glance 检索镜像,从而利用该过滤。
建议的操作
截至 Glance Kilo-rc1 版本的发布,此漏洞已得到修复。它也已回溯到 Juno 版本的稳定分支,并将作为 Glance 的 2014.2.4 标签进行官方更新。此问题将不会在 Icehouse 中得到修复。
应将 Kilo 部署更新到 rc1 标签。应将 Juno 部署更新到 2014.2.4 标签。维护 Glance Icehouse 部署的运维人员应考虑升级到 Juno 2014.2.4 版本。
联系方式 / 参考文献
- 作者:Michael McCune, Red Hat
- 此 OSSN:https://wiki.openstack.org/wiki/OSSN/OSSN-0048
- 原始 LaunchPad Bug:https://bugs.launchpad.net/glance/+bug/1414532
- OpenStack Security ML:openstack-security@lists.openstack.org
- OpenStack Security Group:https://launchpad.net/~openstack-ossg
- Python assert 文档:https://docs.pythonlang.cn/3/reference/simple_stmts.html#the-assert-statement
- Python 优化文档:https://docs.pythonlang.cn/2/using/cmdline.html#envvar-PYTHONOPTIMIZE
- Glance v1 API:https://developer.openstack.org/api-ref-image-v1.html
- Glance v2 API:https://developer.openstack.org/api-ref-image-v2.html