Coders Conquer Security:シェア&ラーンシリーズ - LDAPインジェクション

2019年1月17日発行
ジャープ・カラン・シン著
ケーススタディ

Coders Conquer Security:シェア&ラーンシリーズ - LDAPインジェクション

2019年1月17日発行
ジャープ・カラン・シン著
リソースを見る
リソースを見る

ほとんどのコンピューターシステムでは、LDAP(Lightweight Directory Access Protocol)が使われている。LDAPは、インターネット・プロトコル(IP)ネットワーク上で分散型ディレクトリ情報サービスを維持するために使用されます。つまり、基本的にはユーザーを管理するための手段として機能しています。

LDAPは、アプリケーションがユーザーに様々なアクションを実行する権限があるかどうか、特に組織内で定義された役割に関連しているかどうかを確認するための認証ソースとしてよく使用される。例えば、経理担当者だけが会社の会計ソフトを使えるようになっているかもしれない。アプリケーションは、LDAPテーブルをチェックして、ユーザーが確立された権限の範囲内で行動していることを確認するようにプログラムされることが多い。

悪意のあるユーザーがLDAPクエリを操作すると問題が発生します。これにより、受信側のサーバーを騙して、通常は許可されない無効なクエリを実行させたり、パスワードを持たない無効なユーザーやセキュリティの低いユーザーにハイレベルまたは管理者のアクセスを許可したりすることができます。  

LDAPインジェクションは厄介なものですが、このエピソードでは、それを学びます。

  • 仕組み
  • なぜ彼らは危険なのか
  • それを阻止するためには、どのような防御策を講じるべきか。

攻撃者はどのようにLDAPインジェクションを利用するのか?

LDAPベースの攻撃が長年にわたって人気を維持している理由の1つは、ほとんどすべてのコンピュータシステムがLDAPを使用しているという事実です。LDAPはオープンソースで、非常によく機能するため、代替手段があまり作られていません。

LDAPは、IPベースのコンピューターシステムやネットワーク内の有効なユーザーを追跡するデータベースであることがその核心である。ユーザーは、システム、ネットワーク、サーバー、アプリケーション、さらには同じネットワーク上の他のユーザーに関する情報を共有することができます。

LDAPでは、データベースの行やレコードに相当する情報が保存されており、これを識別名と呼びます。各DNはユニークです。例として、大企業のシカゴ会計事務所に勤務するユーザーのDNは次のようになります。

cn=James Smith, ou=Corporate Accounts, dc=Chicago, do=Parkview  

各 DN が一意であることを保証するために、レコードに「+」、「/」、「=」などのさまざまなコードを追加することができます。また、レコードの前後にスペースを挿入することで、シカゴ・パークビューオフィスのコーポレートアカウントで働くジェームス・スミスが2人いたとしても、それぞれが個別のDNを持つことができます。

アプリケーションでは一般的にLDAPを使用して、ユーザーが特定のDNに関するクエリを送信できるようにしています。例えば、小切手にミスがあったことを相談するために、給与部の正しい連絡先を見つけようとする場合などです。LDAPインジェクションは、検索クエリでユーザーが提供したパラメータの検証が行われていない場合に起こる可能性があります。その場合、ハッカーは良性の検索を操作して、認証メカニズムを回避したり、追加の任意のクエリを実行したりすることができます。これにより、サーバーを騙して、ユーザーのパスワードなど許可されていないはずの結果を表示させたり、有効なパスワードの有無にかかわらず、ネットワーク内のセキュリティの高い領域へのアクセスをアプリケーションに許可させたりすることができます。

なぜLDAPインジェクションは危険なのか?

LDAPインジェクションの最大の危険性は、世界中の大半のIPコンピュータ・ネットワークにLDAPプロトコルが普及していることにある。情報を盗んだり、ネットワーク上で自分の権限を高めたりしたいと考えているハッカーにとって、LDAPは容易な足がかりとなる。訓練されたハッカーであれば、LDAPインジェクションが可能かどうかをチェックしないことはないので、セキュリティチームはその穴が常に閉じられていることを確認しなければならない。

具体的には、組織内のユーザーやグループに関する限定的な情報、あるいはDNに含まれるその他の情報を、有効なユーザーが見つけられるようにプログラムされたアプリケーションがかなりある。例えば、あるアプリケーションでは、LDAPを使ってシカゴで働く企業の会計士の連絡先情報を検索できるようになっており、上記の例では友人のJames Smithが返される。パーミッションにもよりますが、これはLDAPクエリーの完全に有効な使用法と言えます。

危険なのは、悪意のあるユーザがクエリにフィルタリングされていないパラメータを追加し、検索の性質を変え、通常は提供されるべきでない情報を提供するようにサーバを騙した場合です。例えば、user=*という文字列を追加すると、攻撃者は、組織全体のすべてのユーザーに関する情報を取得することができます。

認証にLDAPを使用しているアプリケーションでは、問題はさらに悪化する可能性があります。攻撃者は、例えば、LDAP クエリの最後にある (&) 文字列を使用して、引数が真であるとサーバーに思わせることができます。アプリケーションがパスワードの検証にLDAPを使用している場合、LDAPインジェクションによって引数を強制的にTrueにすると、パスワードがなくても、権限のないユーザーが管理者としてネットワークにログインできる可能性があります。

ネットワークでLDAPインジェクションをL-DON'Tにする

LDAPインジェクションを防止する最善の方法の1つは、LINQtoADなど、LDAPインジェクションに対抗するために特別に設計されたフレームワークを実装することです。ネットワーク上にLDAPクエリを利用するアプリケーションがすでに存在する場合は、これができないこともある。しかし、そのような場合でも、新しいアプリケーションには、インジェクション耐性のあるフレームワークを使用することをお勧めします。

LDAPを使用する既存のアプリケーションでも、ホワイトリストの検証や入力のサニタイズを行うことで、インジェクションに対する耐性を高めることができます。可能であれば、ユーザーの入力を限られた信頼できる値のセットに制限してください。そうでない場合は、LDAP クエリの一部であるユーザーの入力を最初にサニタイズする必要があります。また、GET および POST パラメータ、Cookie、HTTP ヘッダーも攻撃のベクターとして機能することがあるので、これらを含めることを忘れないでください。入力のサニタイズを行うために独自の関数を書かないでください。代わりに、信頼できるサードパーティのセキュリティに特化したライブラリやフレームワークの組み込みAPIを使用してください。

対象となる対策だけでなく、ネットワーク上で必要最小限の権限を持つLDAP照会アプリケーションを割り当てるなど、適切なコンピューティング・プラクティスを行うことも有効です。これにより、万が一、LDAPインジェクションが通過してしまった場合でも、その被害を軽減することができます。

LDAPインジェクションの詳細情報

さらに読みたい方は、OWASP の LDAP インジェクションに関する記事や、インジェクション防止のためのチートシートをご覧ください。また、サイバーセキュリティチームを究極のサイバー戦士に育成するSecure Code Warrior プラットフォームの無料デモで、新たに得た防御の知識を試すこともできます。この脆弱性やその他の脅威の対策についての詳細は、Secure Code Warrior ブログをご覧ください。

リソースを見る
リソースを見る

著者

Jaap Karan Singh

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

Coders Conquer Security:シェア&ラーンシリーズ - LDAPインジェクション

2019年1月17日発行
Jaap Karan Singh著

ほとんどのコンピューターシステムでは、LDAP(Lightweight Directory Access Protocol)が使われている。LDAPは、インターネット・プロトコル(IP)ネットワーク上で分散型ディレクトリ情報サービスを維持するために使用されます。つまり、基本的にはユーザーを管理するための手段として機能しています。

LDAPは、アプリケーションがユーザーに様々なアクションを実行する権限があるかどうか、特に組織内で定義された役割に関連しているかどうかを確認するための認証ソースとしてよく使用される。例えば、経理担当者だけが会社の会計ソフトを使えるようになっているかもしれない。アプリケーションは、LDAPテーブルをチェックして、ユーザーが確立された権限の範囲内で行動していることを確認するようにプログラムされることが多い。

悪意のあるユーザーがLDAPクエリを操作すると問題が発生します。これにより、受信側のサーバーを騙して、通常は許可されない無効なクエリを実行させたり、パスワードを持たない無効なユーザーやセキュリティの低いユーザーにハイレベルまたは管理者のアクセスを許可したりすることができます。  

LDAPインジェクションは厄介なものですが、このエピソードでは、それを学びます。

  • 仕組み
  • なぜ彼らは危険なのか
  • それを阻止するためには、どのような防御策を講じるべきか。

攻撃者はどのようにLDAPインジェクションを利用するのか?

LDAPベースの攻撃が長年にわたって人気を維持している理由の1つは、ほとんどすべてのコンピュータシステムがLDAPを使用しているという事実です。LDAPはオープンソースで、非常によく機能するため、代替手段があまり作られていません。

LDAPは、IPベースのコンピューターシステムやネットワーク内の有効なユーザーを追跡するデータベースであることがその核心である。ユーザーは、システム、ネットワーク、サーバー、アプリケーション、さらには同じネットワーク上の他のユーザーに関する情報を共有することができます。

LDAPでは、データベースの行やレコードに相当する情報が保存されており、これを識別名と呼びます。各DNはユニークです。例として、大企業のシカゴ会計事務所に勤務するユーザーのDNは次のようになります。

cn=James Smith, ou=Corporate Accounts, dc=Chicago, do=Parkview  

各 DN が一意であることを保証するために、レコードに「+」、「/」、「=」などのさまざまなコードを追加することができます。また、レコードの前後にスペースを挿入することで、シカゴ・パークビューオフィスのコーポレートアカウントで働くジェームス・スミスが2人いたとしても、それぞれが個別のDNを持つことができます。

アプリケーションでは一般的にLDAPを使用して、ユーザーが特定のDNに関するクエリを送信できるようにしています。例えば、小切手にミスがあったことを相談するために、給与部の正しい連絡先を見つけようとする場合などです。LDAPインジェクションは、検索クエリでユーザーが提供したパラメータの検証が行われていない場合に起こる可能性があります。その場合、ハッカーは良性の検索を操作して、認証メカニズムを回避したり、追加の任意のクエリを実行したりすることができます。これにより、サーバーを騙して、ユーザーのパスワードなど許可されていないはずの結果を表示させたり、有効なパスワードの有無にかかわらず、ネットワーク内のセキュリティの高い領域へのアクセスをアプリケーションに許可させたりすることができます。

なぜLDAPインジェクションは危険なのか?

LDAPインジェクションの最大の危険性は、世界中の大半のIPコンピュータ・ネットワークにLDAPプロトコルが普及していることにある。情報を盗んだり、ネットワーク上で自分の権限を高めたりしたいと考えているハッカーにとって、LDAPは容易な足がかりとなる。訓練されたハッカーであれば、LDAPインジェクションが可能かどうかをチェックしないことはないので、セキュリティチームはその穴が常に閉じられていることを確認しなければならない。

具体的には、組織内のユーザーやグループに関する限定的な情報、あるいはDNに含まれるその他の情報を、有効なユーザーが見つけられるようにプログラムされたアプリケーションがかなりある。例えば、あるアプリケーションでは、LDAPを使ってシカゴで働く企業の会計士の連絡先情報を検索できるようになっており、上記の例では友人のJames Smithが返される。パーミッションにもよりますが、これはLDAPクエリーの完全に有効な使用法と言えます。

危険なのは、悪意のあるユーザがクエリにフィルタリングされていないパラメータを追加し、検索の性質を変え、通常は提供されるべきでない情報を提供するようにサーバを騙した場合です。例えば、user=*という文字列を追加すると、攻撃者は、組織全体のすべてのユーザーに関する情報を取得することができます。

認証にLDAPを使用しているアプリケーションでは、問題はさらに悪化する可能性があります。攻撃者は、例えば、LDAP クエリの最後にある (&) 文字列を使用して、引数が真であるとサーバーに思わせることができます。アプリケーションがパスワードの検証にLDAPを使用している場合、LDAPインジェクションによって引数を強制的にTrueにすると、パスワードがなくても、権限のないユーザーが管理者としてネットワークにログインできる可能性があります。

ネットワークでLDAPインジェクションをL-DON'Tにする

LDAPインジェクションを防止する最善の方法の1つは、LINQtoADなど、LDAPインジェクションに対抗するために特別に設計されたフレームワークを実装することです。ネットワーク上にLDAPクエリを利用するアプリケーションがすでに存在する場合は、これができないこともある。しかし、そのような場合でも、新しいアプリケーションには、インジェクション耐性のあるフレームワークを使用することをお勧めします。

LDAPを使用する既存のアプリケーションでも、ホワイトリストの検証や入力のサニタイズを行うことで、インジェクションに対する耐性を高めることができます。可能であれば、ユーザーの入力を限られた信頼できる値のセットに制限してください。そうでない場合は、LDAP クエリの一部であるユーザーの入力を最初にサニタイズする必要があります。また、GET および POST パラメータ、Cookie、HTTP ヘッダーも攻撃のベクターとして機能することがあるので、これらを含めることを忘れないでください。入力のサニタイズを行うために独自の関数を書かないでください。代わりに、信頼できるサードパーティのセキュリティに特化したライブラリやフレームワークの組み込みAPIを使用してください。

対象となる対策だけでなく、ネットワーク上で必要最小限の権限を持つLDAP照会アプリケーションを割り当てるなど、適切なコンピューティング・プラクティスを行うことも有効です。これにより、万が一、LDAPインジェクションが通過してしまった場合でも、その被害を軽減することができます。

LDAPインジェクションの詳細情報

さらに読みたい方は、OWASP の LDAP インジェクションに関する記事や、インジェクション防止のためのチートシートをご覧ください。また、サイバーセキュリティチームを究極のサイバー戦士に育成するSecure Code Warrior プラットフォームの無料デモで、新たに得た防御の知識を試すこともできます。この脆弱性やその他の脅威の対策についての詳細は、Secure Code Warrior ブログをご覧ください。

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。