解決 NGINX LDAP 參考實施中的安全問題

語言: CN / TW / HK

原文作者:Liam Crilly of F5 和 Timo Stark of F5

原文連結:解決 NGINX LDAP 參考實施中的安全問題

轉載來源:NGINX官方網站


2022 年 4 月 9 日,NGINX LDAP 參考實施中曝出了多個安全漏洞。經確認,只有參考實施受到了影響。NGINX 開源版和 NGINX Plus 本身未受影響,如果您不使用參考實施,則無需採取糾正措施。

NGINX LDAP 參考實施使用輕型目錄訪問協議 (LDAP) 來驗證由 NGINX 代理的應用的使用者。它作為 Python 守護程序(daemon)釋出,相關 NGINX 配置位於https://github.com/nginxinc/nginx-ldap-auth我們的博文對其目的和配置進行了詳細描述。

如果出現以下任何一種情況,LDAP 參考實施的部署都會受到漏洞的影響。下文詳細討論了這些情況及其規避方法:

  1. 命令列引數用於配置 Python 守護程序

  2. 有未使用的可選配置引數

  3. LDAP 身份驗證取決於特定的組的成員身份

:LDAP 參考實施作為參考實施釋出,並且描述了整合的工作機制以及驗證整合所需的所有元件。它不是生產級 LDAP 解決方案。舉例來說,示例登入頁面中使用的使用者名稱和密碼沒有加密,安全通知會提示這一點。

規避情況 1:命令列引數用於配置 Python 守護程序

配置 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; # If using Basic auth
    # ...
}

規避情況2:未使用的可選配置引數

如情況 1 中所述,攻擊者可以通過傳送精心設計的 HTTP 請求標頭來覆蓋某些配置引數(如果未在配置中設定)。舉例來說,如果未在配置中明確設定 LDAP 搜尋模板,則攻擊者可能會將其覆蓋。情況 2 的解決方法和情況 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 相關的技術乾貨、互動問答、系列課程、活動資源?

請前往 NGINX 開源社群: