あなたのプログラムが「招かざる客」を招き入れていないか?LDAPインジェクションの罠と対策
こんにちは。セキュリティの世界へようこそ。今日は、少し地味だけれど、もし穴があれば致命的な被害をもたらす「LDAPインジェクション」について、泥棒と家の鍵に例えてお話ししますね。
「LDAP?なんだか難しそう」と身構える必要はありません。仕組みを理解してしまえば、今日からあなたのコードは一段と強固になります。さあ、一歩ずつ紐解いていきましょう!
—
1. そもそもLDAPって何?「社員名簿の番人」の話
LDAP(エルダップ)は、簡単に言うと「組織の大きな名簿管理システム」です。社内の誰がどの部署にいて、どんな権限を持っているのか。これを確認するためのデータベースだと思ってください。
プログラムが「このユーザーはログインしてもいい人かな?」と確認するとき、この「番人(LDAP)」に問い合わせを行います。
2. 攻撃のメカニズム:鍵穴に「細工した針金」を突っ込まれる
あなたが家(LDAP)の鍵穴に「ユーザー名」という鍵を差し込む場面を想像してください。
本来なら、「田中さん」という鍵を入れたら「はい、どうぞ」と開くはずですよね。しかし、攻撃者はここに「特殊な針金」を仕込みます。
例えば、検索クエリが以下のような構造だとします。
(&(uid=入力値)(objectClass=person))
ここで、入力値に「admin)(password=」という文字列を送り込んだらどうなるでしょうか? クエリはこう変化します。
(&(uid=admin)(password=)(objectClass=person))
なんと、「パスワードは何でもいいから、admin(管理者)の情報を教えろ!」という命令に書き換わってしまうのです。これがLDAPインジェクションの正体です。プログラムの意図を無視して、命令文そのものを乗っ取ってしまう「言葉の魔術」ですね。
—
3. どう防げばいい?「フィルタエスケープ」という防犯対策
この攻撃を防ぐための鉄則は、「入力された文字を、命令文の一部として解釈させない」ことに尽きます。
具体的には、( や ) 、 & 、 “ といった特殊な文字が入力されたときに、「これは命令の一部じゃなくて、ただの『文字』ですよ!」とプログラムに教えてあげる作業が必要です。これを「エスケープ処理」と呼びます。
安全な実装例(Javaの例)
最近のフレームワークには、この防犯対策が標準で組み込まれています。例えば、Spring Securityなどを使う場合、手動で文字をいじるのではなく、専用のライブラリ関数を使いましょう。
// 安全なフィルタ構築の例
import org.springframework.ldap.query.LdapQueryBuilder;
import org.springframework.ldap.filter.HardcodedFilter;
// ユーザー入力をそのまま連結してはいけません!
String userInput = “admin)(password=”;
// ライブラリが提供するエスケープ機能を使うのが鉄則
// これにより、括弧などの特殊文字は「ただの文字」として扱われます
String safeFilter = LdapQueryBuilder.query()
.where(“uid”).is(userInput) // ライブラリが自動的にエスケープしてくれます
.and(“objectClass”).is(“person”)
.filter().encode();
// もし手動でエスケープするなら、RFC 4514に準拠した変換が必要です
// ( -> \28 , ) -> \29 , -> \2a など
—
4. セキュリティ担当からの「現場の視点」アドバイス
教科書には「全部エスケープしましょう」と書かれていますが、実務では以下の3点をセットで意識してください。
1. 「入力はすべて嘘つきだと思え」:ユーザーからの入力は、たとえ社内ツールであっても必ずバリデーション(形式チェック)を通しましょう。「アルファベットと数字以外は受け付けない」といったホワイトリスト方式が最強の防犯です。
2. 権限を最小限にする:万が一インジェクションが成功しても、被害を最小限にするために、WebアプリケーションがLDAPにアクセスする際のユーザー権限は「検索のみ」「必要な項目のみ」に絞り込んでおいてください。
3. エラーメッセージを親切にしすぎない:LDAPのエラーをそのまま画面に出すと、攻撃者に「どんなクエリが失敗したか」を教えてあげるヒントになります。ログには詳細を残し、画面には「ログインに失敗しました」とだけ表示しましょう。
最後に:セキュリティは「終わりなき旅」
「一度設定したから安心!」ではなく、開発の現場で「この入力値は、どこかで誰かに悪用されないかな?」と立ち止まって考える。その癖こそが、あなたを一流のエンジニアにする一番の近道です。
恐れることはありません。鍵の仕組みさえ知っていれば、泥棒にはそう簡単に侵入されません。今日から、あなたのコードに「最強の鍵」をかけていきましょうね!
コメント