2022年4月9日、NGINXのLDAP拡張機能におけるセキュリティの脆弱性が公開されました。拡張機能のみが影響を受けると判断しております。NGINX オープンソースやNGINX Plus自身は影響を受けません。LDAP拡張機能の利用がない場合には、是正措置の実施は必要ありません。
NGINX LDAP拡張機能は、NGINXがプロキシーするアプリケーションがユーザーを認証するためにLDAPを利用します。この機能はPythonのデーモンとして動作させ、https://github.com/nginxinc/nginx-ldap-auth のNGINX設定に関連します。この目的や設定方法については、ブログで詳しく紹介しています。
LDAP 拡張機能を実装している場合、以下の条件のいずれかに該当すると、脆弱性の影響を受けます。以下では、これらの条件とその対策について詳しく説明します。
注意: LDAP拡張機能は、参考の実装方法を紹介しており、関連するコンポーネントが動作に仕組みと、検証する方法について記載しております。これは本番環境に適したLDAPの機能ではありません。例えば、サンプルログインページに利用するユーザー名やパスワードは暗号化されず、セキュリティの通知がなされます。
緩和策1:コマンドラインパラメータを、Pythonデーモンの設定に使用している
LDAP拡張機能を利用する主な実装方法が、サンプルの設定とドキュメントで説明されているように、いくつかのproxy_set_header
ディレクティブを使用することです。しかし、設定パラメータはPythonデーモンの初期設定を行うコマンドライン (nginx-ldap-auth-daemon.py) の利用も可能です。
コマンドラインで設定パラメータを指定した場合、攻撃者はいくつかまたは全てのパラメータにたいし、情報を加工したHTTPリクエストヘッダーを使うことで上書きすることが可能です。これらの動作を防ぐため、NGINX設定(GitHubレポジトリ内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サーチのテンプレートで使われている設定によるものでした。これを防ぐため、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デーモンは入力値の無害化は行いません。その結果、攻撃者はLDAPのグループ情報(memberOf
)の確認をバイパスするために、特別に加工したHTTPヘッダーを使い、認証されたユーザーが特定のグループに所属していない場合においても認証を成功させることが可能となります。
これを緩和するため、ログインフォームを表示するバックエンドデーモンが、ユーザー名フィールドから特殊文字を除去することを確認します。特に、小括弧の初めと終わりの文字 – ( )
– と、等号 (=
) などLDAPサーバで特別な意味を持つ文字列の除去が必要です。LDAP拡張機能のバックエンドデーモンは順次この様にアップデートを行う予定となっています。
謝辞
これらのセキュリティ上の脆弱性を指摘してくださったvalodzkaさんと@_Blue_hornetさんに感謝します。