家の鍵穴に「偽の合鍵」を差し込まれたら?LDAPインジェクションの脅威と対策
こんにちは!セキュリティの世界へようこそ。
システムを守る仕事をしていると、「最新の攻撃」ばかりに目が行きがちですが、実は多くの現場で「昔ながらの、でも非常に厄介な手法」が今もなお、システムの隙を突いています。
今回は、その代表格である「LDAPインジェクション」についてお話しします。
「LDAP?なんだか難しそう…」と思うかもしれませんが、大丈夫。身近な「家の防犯」に例えて、一緒に紐解いていきましょう!
—
1. LDAPってそもそも何?(家の「住民名簿」をイメージして)
LDAP(エルダップ)とは、会社や組織の中で「誰がどの部署にいて、どんな権限を持っているか」という情報を管理する巨大な住民名簿のようなものです。
システムにログインする際、入力したIDとパスワードが正しいか照合するために、システムはこの「住民名簿」にこう尋ねます。
「このIDとパスワードを持つ人は、この名簿に載っていますか?」
この質問を投げかけるための「質問状(クエリ)」を操作して、悪意ある命令を紛れ込ませるのがLDAPインジェクションです。
—
2. 攻撃のメカニズム:鍵穴に「偽の合鍵」を差し込む
家を想像してください。玄関のドアには「正しい鍵(IDとパスワード)」を持つ人だけが入れるようになっていますよね。
LDAPインジェクションを行う攻撃者は、鍵穴に物理的な鍵を差し込む代わりに、「入力フォーム」という名の鍵穴に、魔法の記号(特殊文字)を流し込みます。
例えば、システムが裏でこんな質問を作っているとします。
(&(uid=入力したID)(password=入力したパスワード))
ここで、攻撃者がID欄にこんな文字を入力したらどうなるでしょう?
admin)(&)
システムが受け取る質問状はこう書き換わります。
(&(uid=admin)(&))(password=...))
実はLDAPのルールでは、(&)は「常に真(True)」を意味します。つまり、「パスワードが何であれ、IDがadminならOKにする」という魔法の質問にすり替わってしまうのです。これが認証回避の仕組みです。
—
3. なぜ防げないのか?「生の言葉」を信じすぎているから
開発現場でよくあるミスは、ユーザーからの入力を「そのまま」質問状に組み込んでしまうことです。
「この人は名前を入力しただけだから、害はないはずだ」という性善説に基づいた実装は、セキュリティの世界では「鍵のかかっていない勝手口」と同じです。
では、どうすれば防げるのでしょうか?
—
4. 今日からできる!安全な防御のステップ
対策はシンプルです。「入力された文字を、プログラムが勝手に命令として解釈しないようにする」ことです。
ステップ1:エスケープ処理を徹底する
一番大切なのは、「LDAPの命令で使われる記号( など)を、ただの『文字』として扱わせる」ことです。これをエスケープと呼びます。, (, ), &, |
例えば、ユーザーが入力したIDを、プログラム側でこのように処理します。
// JavaScriptでの例:ライブラリを使って特殊文字を無害化する
const ldap = require(‘ldap-escape’);
// ユーザーが入力した値を受け取る
const userInput = req.body.username;
// filter文字列の中に組み込む前に、特殊文字を無害化する
// これにより、もし「admin)(&)」と入力されても、
// システムはそれを「admin)(&)」という単なる文字列として検索します。
const safeFilter = (&(uid=${ldap.filter(userInput)})(password=${password}));
ステップ2:ライブラリに任せる
自分で「( を見つけたら \28 に置き換える」といった処理を書くのは、非常にリスクが高いです。書き漏らしが必ず出ます。
「その言語で推奨されている、信頼されたLDAPライブラリ」を使用し、そのライブラリが提供する「パラメータ化されたクエリ」機能を使ってください。
ステップ3:入力チェック(バリデーション)の習慣化
「IDには英数字しか使わせない」といったルールを設けるのも非常に強力です。
「家の鍵穴には、特定の形の鍵しか入らないようにしておく」という物理的な防壁と同じですね。
—
最後に:セキュリティは「疑うこと」から始まる
セキュリティエンジニアとして一番大切な心構えは、「ユーザーの入力は、常に『鍵穴をこじ開けようとする道具』になり得る」と疑うことです。
最初は難しく感じるかもしれませんが、一歩ずつ「入力値をそのまま使っていないか?」「特殊文字を適切に扱っているか?」を確認する癖をつけるだけで、あなたの書くコードは驚くほど堅牢になります。
もし迷ったら、いつでもこの記事を見返してくださいね。皆さんの開発ライフが、安全で楽しいものになることを心から応援しています!
それでは、また次回のセキュリティ講座でお会いしましょう。
コメント