コンピュータセキュリティにおいて、LDAPインジェクション(英: LDAP injection)とは、ディレクトリ・サービスに接続するために使用される通信プロトコルであるLDAP (Lightweight Directory Access Protocol) で表現される、インジェクション攻撃である。これにより、機密性の高いユーザー情報が漏洩したり、情報を改ざんすることでWebアプリケーションを悪用される恐れがある。LDAPインジェクションは、内部の検索、追加、または変更関数に渡される入力パラメータを操作することによって、アプリケーションのセキュリティ脆弱性を悪用する。アプリケーションがユーザー入力を適切にサニタイズ(無害化)しない場合、攻撃者がLDAP文を改ざんすることが可能になる。
技術的実装 LDAPインジェクションは、ユーザー入力が適切にサニタイズされずに、動的に生成されるLDAPフィルタの一部として使用される場合に発生する。これにより、LDAPサーバー上で実行されるLDAP文が操作され、認証情報の閲覧、改ざん、または迂回が行われる可能性がある。
防御策
LDAPインジェクションは既知の攻撃であり、簡単な対策で防ぐことができる。クライアントから提供されるすべての入力は、悪意のある動作を引き起こす可能性のある文字がないかチェック/サニタイズされなければならない。入力検証では、LDAPクエリ言語の一部である特殊文字、既知のデータ型、正当な値などが存在するかどうかをチェックして、入力を検証する必要がある。ホワイトリスト方式の入力検証を使用して、LDAPクエリに渡される前に不正な入力を検出することもできる。Web Application Firewallの利用も推奨されている。
例 以下の例では、ログイン目的でユーザーの認証情報を検証するためのクエリが構築される。
String filter = "(&(USER = " + user_name + ") (PASSWORD = " + user_password + "))";
LDAPの典型的なユースケースでは、ユーザーは自身の認証情報を提供し、このフィルタがその検証に使用される。
攻撃者は変数 user_name に対して johnDoe)(&) のような細工された入力を行い、パスワードには任意の値を入力することができる。すると、完成したクエリは (&(USER = johnDoe)(&))(PASSWORD = pass)) となる。LDAPサーバーによって処理されるのはこのクエリの最初の部分 (&(USER = johnDoe)(&) のみであり、これは常にtrueと評価されるため、攻撃者は有効な認証情報を提供することなくシステムへのアクセス権を得ることができてしまう。
関連項目 SQLインジェクション - 類似の悪意ある攻撃手法
参考文献