【実務・中級編】LDAPインジェクションの攻撃ベクトルとフィルタリングの安全な実装 – アプリケーションセキュリティ & 安全な開発防御ガイド

LDAPインジェクション:なぜ今も「盲点」になり続けるのか

現場で長年インシデントを見てきたが、SQLインジェクションは撲滅の兆しが見えても、LDAPインジェクションは未だに「あ、そこ盲点だった」という顔で修正依頼が飛んでくる。

LDAP(Lightweight Directory Access Protocol)は、Active DirectoryやOpenLDAPなど、認証基盤の心臓部で動いていることが多い。もしここを突破されたら、単なるデータ漏洩では済まない。社内のディレクトリ構造が丸裸になり、権限昇格や横展開(Lateral Movement)の踏み台にされる。今回は、この「見落とされがちな脆弱性」の急所と、確実に防ぐための武装術を叩き込む。

—

1. 攻撃者が狙う「クエリの文法破壊」

LDAPインジェクションの本質は、ユーザー入力を適切にサニタイズせず、クエリの論理構造を意図的に書き換えることにある。

例えば、ユーザーのIDを検索する以下のようなクエリを想定してほしい。
(&(uid=USER_INPUT)(objectClass=person))

攻撃者は USER_INPUT に )(uid= を流し込む。するとクエリはこう変化する。
(&(uid=)(uid=)(objectClass=person))

これだけで、すべてのユーザーがマッチしてしまう。さらに悪質なのは )(|(uid= を送り込み、認証バイパスを狙うケースだ。LDAPのフィルタ構文には「ワイルドカード」や「論理演算子」が含まれるため、SQL以上に構造が崩れやすい。

—

2. 現場で使えるセキュア実装術

一番やってはいけないのは、「特定の文字を置換する」というブラックリスト方式のフィルタリングだ。攻撃者は常にその網を潜るエンコーディング手法を探している。

鉄則:ライブラリが提供するエスケープ関数を「利用する」こと。
自作関数はバグの元だ。各言語で信頼されているライブラリの作法を守れ。

【Python】python-ldap を使った安全な実装

Pythonの場合、ldap.filter.filter_format を使うのが正解だ。フォーマット文字列を使うことで、ライブラリ側が自動的にエスケープ処理を完結させてくれる。

import ldap.filter

def secure_ldap_query(user_id):
# ユーザー入力を安全にフォーマットする
# %s の部分に値が安全にエスケープされて挿入される
search_filter = ldap.filter.filter_format(‘(&(uid=%s)(objectClass=person))’, [user_id])

# ここでLDAPコネクションに対し検索を実行する
# result = ldap_conn.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter)
return search_filter

テスト:悪意ある入力でも構造は破壊されない
print(secure_ldap_query(“)(uid=”))
出力結果: (&(uid=\2a\29\28uid=\2a)(objectClass=person))

【PHP】LdapRecord / 標準関数での実装

PHPの場合、ldap_escape 関数を必ず使うこと。フラグには LDAP_ESCAPE_FILTER を指定するのが肝だ。

—

3. インフラ層での防御(多層防御の極意)

コードレベルで防ぐのが基本だが、万が一の漏れに備えてインフラ側でも絞り込む。

  • WAFの活用: AWS WAFやCloud Armor等には、LDAPインジェクションパターンを検知するマネージドルールがある。これを有効化し、, (, ), &, | などの記号が異常な頻度で含まれるリクエストをブロックせよ。
  • 最小権限の原則(IAM/ACL): アプリが使用するLDAPバインド用アカウントは、「検索しかできない」かつ「特定のOU(Organizational Unit)しか見られない」ようにディレクトリ側の権限を絞れ。管理者権限のサービスアカウントでアプリを動かすなど、論外だ。

—

最後に:セキュリティは「作法」である

LDAPインジェクションが怖くないのは、防御の手順が決まっているからだ。
1. 信頼できない入力をそのままクエリに結合しない
2. 必ずライブラリ標準の「エスケープ関数」を通す
3. バインド用アカウントには必要最小限の権限しか与えない

この3つを守るだけで、君の書くコードの堅牢性は劇的に変わる。セキュリティを「後付けの苦痛」にせず、開発プロセスの一部(当たり前の作法)として組み込んでくれ。

もし実装中に「これ本当に安全か?」と迷ったら、いつでも相談してほしい。現場の泥臭い経験が、君のコードを守る盾になるはずだ。

コメント

タイトルとURLをコピーしました