【入門編】LDAPインジェクション:ディレクトリサービスへの不正クエリ注入 – アプリケーションセキュリティ & 安全な開発防御ガイド

LDAPインジェクション:あなたの家の「合鍵」が盗まれないために

こんにちは!セキュリティの世界へようこそ。今日は、少し地味だけれど、悪用されると非常に厄介な「LDAPインジェクション」についてお話しします。

「LDAP(エルダップ)」って聞いたことはありますか? 企業内の社員データや、システムの認証情報が詰まった「巨大な電話帳」のようなデータベースのことです。この扉をこじ開けようとするのがLDAPインジェクション。初心者の方でもイメージしやすいよう、身近な例えで解説していきますね。

—

1. LDAPインジェクションって何?:泥棒の「偽の合鍵」作戦

まず、LDAPがどうやって動いているか想像してみましょう。

あなたは玄関のドアを開けるとき、鍵穴に鍵を差し込みますよね。LDAPの世界では、プログラムがユーザーから受け取った「ID」や「パスワード」を元に、LDAPという巨大な電話帳へ「この条件に合う人を探して!」とクエリ(検索命令)を送ります。

ここで悪意ある泥棒(攻撃者)は、本来の鍵(ID)の代わりに、「鍵穴の仕組みを無視してドアを開ける魔法の言葉」を混ぜ込みます。これがLDAPインジェクションです。

攻撃の仕組みを覗いてみよう

例えば、システムがこんな検索命令を作っているとします。

(&(uid=ユーザー名)(password=パスワード))

これは、「IDもパスワードも一致する人を探せ!」という命令です。ここで、攻撃者がID欄に admin)(uid= という魔法の言葉を入れたらどうなるでしょう? 命令文はこう書き換わります。

(&(uid=admin)(uid=)(password=...))

“(アスタリスク)は「何でもいいよ」という意味。つまり、「管理者のIDを見つけろ。しかもパスワードは問わない!」という命令に化けてしまうんです。これが認証バイパス(パスワードなしでログインされる)の正体です。

—

2. なぜ防げないのか?:言葉の「区切り」を悪用される

なぜこんなことが起きるのか。それは、プログラムが「ユーザーが入力した文字」と「システムが命令として使う文字」を区別できていないからです。

LDAPには、( や ) や “ といった、命令を制御するための「特殊な記号」が決まっています。泥棒は、あなたが書いた手紙の隙間に勝手に追記して、手紙の内容を書き換えてしまうようなズルをするんですね。

—

3. 今すぐできる対策:信頼できる「エスケープ」を使おう

では、どうすれば泥棒を追い返せるのでしょうか? 答えは「エスケープ処理」です。

これは、「入力された記号を、命令の一部ではなく、ただの『文字』として扱わせる」という魔法の処理です。例えば、( が入力されたら、\28 という特別なコードに変換して、システムに「これはただの文字だよ!」と教えるんです。

実践:安全なコードの書き方(Javaの例)

自分で特殊文字を一つ一つ置換しようとしないでください。必ず、プロが作った信頼できるライブラリを使いましょう。

// Spring Securityなどで提供されているLDAPエスケープ機能を使う例です
import org.springframework.ldap.query.LdapQueryBuilder;

// ユーザー入力が危険な文字を含んでいても、安全に処理されます
String safeUserName = LdapEncoder.filterEncode(userInput);

// 安全なフィルタを構築する
String filter = “(&(uid=” + safeUserName + “)(password=” + password + “))”;

ポイント:

  • 「自作のフィルタ関数」は絶対に使わない: 泥棒は最新の抜け穴を探しています。コミュニティでメンテナンスされているライブラリ(Spring SecurityのLdapEncoderなど)を使うのが鉄則です。
  • 入力値の検証: そもそも、ID欄に ( や & が入る必要はありますか? もし不要なら、プログラムの入り口でそうした記号を弾いてしまうのも強力な防犯対策です。

—

4. セキュリティの第一歩は「疑うこと」から

エンジニアの皆さんが今日から意識すべきことは一つです。「ユーザーからの入力は、すべて悪意があるかもしれない」と疑うこと。

玄関の鍵穴に針金を突っ込む人がいるように、プログラムの入力欄には「命令を書き換えようとする人」が必ずいます。でも、今回学んだ「エスケープ」という防犯対策を知っていれば、その隙を埋めることができます。

セキュリティは、一度やって終わりではありません。ですが、こうして少しずつ知識を積み重ねることで、あなたの作るシステムは驚くほど強固になります。

「難しそう」と怖がらずに、まずは自分のコードの入力部分を眺めてみてください。そこが、あなたのシステムの「最初の防犯扉」になりますよ!

また次の記事で、より深い防衛術をお話ししましょう。一緒にエンジニアリングを楽しんでいきましょうね!

コメント

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