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解决方案。例如,示例登录页面使用的用户名和密码未加密,安全通知中已明确指出这一点。
缓解条件 1:使用命令行参数配置 Python 守护进程
配置LDAP参考实现的主要方式是使用多个proxy_set_header指令,具体说明请参阅示例配置和文档。不过,也可以在用于初始化Python守护进程(nginx-ldap-auth-daemon.py)的命令行中设置这些配置参数。
如果在命令行中指定配置参数,攻击者可以通过传递特制的HTTP请求标头来覆盖部分或全部参数。为防止这种情况,请将以下配置添加到NGINX配置中的location = /auth-proxy块(代码仓库中的nginx-ldap-auth.conf),确保在身份验证期间忽略所有无关的请求标头。
location = /auth-proxy {
# ...
proxy_pass_request_headers off;
proxy_set_header Authorization $http_authorization; # If using Basic auth
# ...
}缓解条件 2:未使用的可选配置参数
与条件1相同,如果某些配置参数未在配置中设置,攻击者可以通过传递特制的HTTP请求标头来覆盖这些参数。例如,如果未在配置中显式设置LDAP搜索模板,该模板可能会被覆盖。防御方法也与条件1相同,即在NGINX配置的location = /auth-proxy块中添加以下配置。
location = /auth-proxy {
# ...
proxy_pass_request_headers off;
proxy_set_header Authorization $http_authorization; # If using Basic auth
# ...
}缓解条件3:必须具备LDAP组成员身份
Python守护进程不会清理其输入。因此,攻击者可以使用特制的请求标头绕过组成员身份(memberOf)检查,从而强制LDAP身份验证成功,即使接受身份验证的用户不属于所需的组。
为缓解此问题,请确保提供登录表单的后端守护进程会从用户名字段中删除所有特殊字符。尤其必须删除左括号和右括号字符(( ))以及等号(=),因为这些字符对LDAP服务器均有特殊含义。LDAP参考实现中的后端守护进程将在适当时候按此方式更新。
致谢
感谢Lucas Verney、valodzka和@_Blue_hornet指出这些安全漏洞。
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
