OWASP Cheat Sheet SeriesのLDAP Injection Prevention Cheat Sheetについてメモする。
LDAPとは
- ネットワーク機器やユーザーなどの情報を管理するディレクトリサービスへ接続するためのプロトコル
- ディレクトリサービス:ネットワークに存在するさまざまな情報を一元的に管理し、検索などの機能を提供するサービス
LDAPの仕組み
LDAPディレクトリに接続する場合、通常のLDAPワークフローは以下のようになる※プリンターと接続する場合
- LDAPディレクトリとのセキュアな接続を確立する。
- 特定のプリンタの「検索」クエリをLDAPディレクトリに送信する。
- LDAPディレクトリはユーザを認証する。
- ディレクトリ内で検索オペレーションが実行され、要求されたプリンタのアドレスが返却される。
- プリンタに接続する。
LDAPインジェクション
-
ユーザー入力に基づいてLDAPステートメントを作成するWebベースのアプリケーションを悪用するために使用される攻撃。
-
アプリがユーザー入力を適切にサニタイズできない場合、 SQLインジェクションと同様の手法でLDAPステートメントを変更できる。
-
許可されていないクエリへのアクセス許可の付与やLDAPツリー内のコンテンツの変更などの任意のコマンドが実行される可能性がある。
LDAPインジェクションの要因
- 安全にパラメータ化されたLDAPクエリI/Fの欠如
- ユーザー認証を行うためのLDAPの広範利用
LDAPインジェクション対策
対策1:適切なLDAPエンコーディング機能を使用した全変数のエスケープ
識別名のエスケープ
-
LDAPが名前を格納する主な方法は、DN(識別名)に基づいている。
- ユーザー名などのリソースにアクセスするために使用される。
-
DNには特殊文字と見なされる特定の文字があるため、エスケープを行う。
-
[リスト](https://ldapwiki.com/wiki/DN Escape Values)
検索フィルターのエスケープ
-
各DNは正確に1つのエントリを示す。※RDBMSのレコード・行のようなもの。
-
エントリごとに、RDBMS列に類似した1つ以上の属性があります。LDAPを介してユーザーの特定の属性を検索する場合は、検索フィルターを使用できる。
- 検索フィルターでは、標準のブール論理を使用して、任意の制約に一致するユーザーのリストを取得できる。
-
アプリケーションコードでLDAPクエリを生成するときは、LDAPクエリに追加された信頼できないデータをエスケープする必要がある。
-
LDAPエスケープには2つの形式がある。
- LDAP検索のエンコーディング
- LDAPDN(識別名)のエンコーディング。
- 適切なエスケープは、検索フィルターの入力をサニタイズするか、リソースにアクセスするためのユーザー名のようなクレデンシャルとしてDNを使用するかによって異なる。
-
検索フィルターで許可され、エスケープする必要がある「特殊」文字には次のものがある。
* ( ) \ NUL
※検索フィルターのエスケープの詳細はRFC4515を参照のこと
対策2:LDAPインジェクションに対して自動的に保護可能なフレームワークの利用
その他の対策
- 上記2つの主要な防御のいずれかを採用するだけでなく、多層防御を提供するために、次の追加防御策をすべて採用することも推奨される。
最小特権の付与
- LDAPインジェクション攻撃が成功した場合の潜在的な損傷を最小限に抑えるために、環境内のLDAPバインディングアカウントに割り当てられている特権を最小限に抑える必要がある。
バインド認証の有効化
- LDAPプロトコルがバインド認証で構成されている場合、攻撃者は、ユーザーによって渡された有効な資格情報に対して実行される検証および承認チェックによって、LDAPインジェクション攻撃を実行できない。
許可リスト入力の検証
-
入力検証を使用して、LDAPクエリに渡される前に不正な入力を検出する。
※詳細は入力検証に関するチートシートを参照