2022 年 4 月 9 日, NGINX LDAP 参考实现中的安全漏洞被公开分享。 我们确定只有参考实现受到影响。 NGINX Open Source 和 NGINX Plus 本身不受影响,如果您不使用参考实现,则无需采取纠正措施。
NGINX LDAP 参考实现使用轻量级目录访问协议 (LDAP) 对 NGINX 代理的应用的用户进行身份验证。它作为 Python 守护程序和相关 NGINX 配置发布在https://github.com/nginxinc/nginx-ldap-auth上,其用途和配置在我们的博客上详细描述。
如果满足以下任何条件,LDAP 参考实现的部署就会受到漏洞的影响。 下面我们进一步讨论这些情况以及如何缓解它们:
笔记: LDAP 参考实现作为参考实现发布,并描述了集成的工作机制以及验证集成所需的所有组件。 它不是生产级 LDAP 解决方案。 例如,示例登录页面使用的用户名和密码没有加密,安全声明中也指出了这一点。
配置 LDAP 参考实现的主要方法是使用一些proxy_set_header
指令,如示例配置和文档中详细说明的那样。 但是,也可以在初始化 Python 守护进程( nginx-ldap-auth-daemon.py )的命令行上设置配置参数。
当在命令行上指定配置参数时,攻击者可以通过传递特制的 HTTP 请求标头来覆盖其中的部分或全部。 为了防止这种情况,请通过在 NGINX 配置(repo 中的nginx-ldap-auth.conf )中的location
=
/auth-proxy
块中添加以下配置,确保在身份验证期间忽略任何无关的请求标头。
location = /auth-proxy {
# ...
proxy_pass_request_headers off;
proxy_set_header Authorization $http_authorization; # 如果使用基本身份验证
# ...
}
与条件 1 一样,如果配置中未设置某些配置参数,攻击者可以传递特制的 HTTP 请求标头来覆盖这些配置参数。 例如,如果配置中未明确设置,则 LDAP 搜索模板可能会被覆盖。 这与条件 1 的防御方式相同,通过在 NGINX 配置中的location
=
/auth-proxy
块中添加以下配置。
location = /auth-proxy {
# ...
proxy_pass_request_headers off;
proxy_set_header Authorization $http_authorization; # 如果使用基本身份验证
# ...
}
Python 守护进程不会清理其输入。 因此,攻击者可以使用特制的请求标头来绕过组成员身份( memberOf
)检查,从而强制 LDAP 身份验证成功,即使被验证的用户不属于所需的组。
为了缓解这种情况,请确保显示登录表单的后端守护进程从用户名字段中删除所有特殊字符。 特别是,它必须删除开始和结束括号字符 – ( )
– 和等号 ( =
),这些对于 LDAP 服务器来说都有特殊含义。 LDAP 参考实现中的后端守护进程将在适当的时候以这种方式进行更新。
我们感谢 Lucas Verney、valodzka 和 @_Blue_hornet 强调这些安全漏洞。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”