LDAPはよく知られたプロトコルで、多くのWebサイトがLDAPサービスを利用しています。MicrosoftのADやRed Hat Directoryを採用している場合、LDAPはその中核をなします。
認証情報の保管やSSO環境の実現に役立つこのサービスは、リソースへのアクセス管理や変更権限の管理など、多くの面で有用です。
しかし、これらの情報が漏れると、デジタル資産が危険にさらされることになります。
開発者やサイト運営者として、LDAPインジェクションの概要とその影響、そして対策方法を知らなければ、より大きな問題に発展する恐れがあります。以下を参考に、しっかりと理解を深めてください。
SQLインジェクションを聞いたことがあり、LDAPの仕組みを理解している場合、概要は把握されているかもしれません。しかし、正確な理解のため、シンプルに説明いたします。
LDAPインジェクション攻撃では、攻撃者が問い合わせ入力を操作し、ディレクトリへ不正アクセスを試みます。このディレクトリには、貴社や利用者のメール、ユーザー名、パスワードなどが保存されている可能性があり、侵入されると大きな被害につながります。
一般的に、攻撃者はLDAPサービスを利用しているデジタル環境のセキュリティ上の隙を探ります。弱いフィルタリング機構を突くため、無加工のユーザー入力(例えば、システムに侵入するためのLDAP問い合わせ)を送信し、アプリへ侵入しようとします。
成功すると、攻撃者は目的に応じてアクセス情報を変更、削除、悪用、または追加することが可能です。
LDAPインジェクションの例を紹介し、より詳しく説明します:
一般的なLDAP問い合わせは、様々な文字、記号、引用符などの組み合わせです。アンパサンドやアスタリスクが複数含まれる場合もあります。攻撃者がLDAP対応のログインページに到達し、ユーザー名を把握している場合、パスワード欄にLDAP問い合わせを入力して認証処理がこの欄を無視するよう仕向けることが可能です。
その結果、攻撃者は入力されたユーザー名のアカウントにアクセスでき、パスワードは不要となります。
同様に、より高度な攻撃では、攻撃者がLDAPディレクトリに侵入し、LDAPツリーを改変する可能性もあります。この場合、権限を奪ったり譲渡したりすることで、サイトや組織全体の資産やデータの権限体系を混乱させる恐れがあります。
例えば、eコマースサイトや情報を扱うサイトでは、ユーザーが商品検索やカテゴリによる情報の絞込みを行います。攻撃者が共通のパラメータを取得できると、その値に『*』(アスタリスク=全て)を渡すことで、全情報へのアクセスが可能になる恐れがあります。
この攻撃では、攻撃者はルートディレクトリではなく特定のユーザーのアカウントやデータにアクセスします。弱いフィルタリングの隙を突き、メタ文字(例:記号やアンパサンド)で検証を回避し、認証を突破します。
例えば、攻撃者はユーザー名やパスワードの入力を省略できますが、LDAP問い合わせを利用することで、権限を昇格させることが可能となります。
貴社内では、誰もがアクセスできる情報も多く存在します。一般的な通知、各種情報、報告書、プロジェクトの詳細などが含まれます。
これは、ユーザーの役割やセキュリティレベルでデータをフィルタしているに過ぎないため、攻撃者が認証時にこれらの情報を無視させることに成功すると、ディレクトリ内の全情報を閲覧することができるようになります。
この手法はSQLインジェクションに非常に似ています。たとえば、サーバーがアクションを起こすために『TRUE』(1)または『FALSE』(0)の回答を求める場合、好みの2進数入力を与えるだけで不正アクセスが可能となります。見た目以上に試行錯誤が多く、実行には時間がかかります。
LDAP問い合わせでは条件演算子が使用可能であり、ここで攻撃者が介入するチャンスが生まれます。一般的な条件問い合わせは、複数の開閉引用符とANDやORの演算を含み、有効な問い合わせとして成立するようパラメータや括弧を挿入できれば、セキュリティや認証を突破できる可能性があります。
複数の『&』演算子を使用したLDAP問い合わせはANDタイプです。すべての値が一致した場合に成立するため、攻撃者は挿入したコードが結果をFALSE(0)に変えないよう注意する必要があります。
例えば、Titanの女性専用時計の情報を取得するため、攻撃者は実際の問い合わせを次のように改変できます:
例:
ACTUAL_QUERY&(brand=titan)(type=female))
このタイプでは、与えられた条件のうち1つがTRUEであればよく、処理は左から右に進みます。攻撃者が追加の条件(悪意あるコード)を挿入し、結果がTRUEとなれば、好むデータにアクセスが可能です。
例:
ACTUAL_QUERY|(brand=titan)(type=*))
ANDタイプの問い合わせが出力を返さない場合、サーバーはブラインド攻撃に対して脆弱であることを意味します。攻撃者は出力が得られないオブジェクトを探し、そこから広範なデータを抽出しようとします。
例:
例えば、あるオンラインベーカリーで、‘chocolate’タイプの『cake』を検索しても何も返らない場合:
(&(objectClass=Cake)(type=Chocolate*))
これは、現在、販売中のチョコレートケーキが存在しないためです。しかし、攻撃者が『*)(objectClass=*))(&(objectClass=void』と検索すると、問い合わせは次のようになります:
(&(objectClass=*)(objectClass=*))(&(objectClass=void)(type=Chocolate*))
結果として、出力にはクッキーやキャンディーなど、すべてのチョコレート関連の商品が含まれます。
‘OR’タイプのブラインドLDAPインジェクションは、ANDタイプと同様の仕組みで動作しますが、‘OR’条件で構築された問い合わせに適用されます。
例:
先の例で攻撃者がORタイプのLDAP問い合わせを突破するには、以下の問い合わせを利用します:
(|(objectClass=void)(objectClass=void))(&(objectClass=void)(type=Chocolate*))
どちらの場合も攻撃者は悪意あるコードを挿入しますが、SQLとLDAPでの注入手法は同一とは言えません。主な違いは、問い合わせに使用する言語と、影響を及ぼすシステムやアプリの種類にあります。
SQLインジェクションは、SQLデータベースでデータを検証するウェブフォームを狙います。一方、LDAPディレクトリ内の情報がLDAPインジェクションの対象となるため、組織内のデータや利用者に関する問題が中心です。
これらの侵入の深刻さは十分ご理解いただけたかと思います。サイト運営者や作成者として、被害を防ぐための対策を知ることが重要です。以下、その方法を説明します:
入力を精査することでインジェクションのリスクは低減されます。例えば、アスタリスク、AND、OR、引用符など、問い合わせの構文を変化させる記号に検証を設ければ、フィルタリングの回避は困難になります。
また、許可リストを設定し、特定の記号(例:0~9の数字、A~Zの文字など)のみを入力として受け入れるようにすると、さらに安全です。
LDAP問い合わせの作成時に『(』や『)』を使用しない方が良いです。これにより、攻撃者が括弧を追加して問い合わせの意味を変えることを防止できます。
静的コードの確認や、アプリ内の各モジュールの品質検証、加えて手動またはツールを用いたテストを行うことで、攻撃者に悪用される前に脆弱性を発見できます。
ネットワーク内で各ユーザーや階層に役割を割り当てる際は、ゼロトラストや最小権限の考え方を採用することが推奨されます。これにより、LDAPサーバへのアクセス管理が効率的になります。別のユーザーやアプリに代わってリクエストを処理する場合、プロキシや認証の実装も有効です。
通常、攻撃者はLDAPインジェクション成功前に複数の問い合わせやリクエストを実行します。こうした異常な動作を識別する仕組みを導入すれば、検出は難しくありません。
攻撃者の試みを検出し、被害が及ぶ前にインジェクションを防ぐためのベストプラクティスは以下の通りです:
アプリおよびAPIセキュリティは無視できません。LDAPディレクトリのデータはこれらを通じて取得されるため、最適なセキュリティテスト手法を模索し、必要に応じて専門家に相談すべきです。APIセキュリティについては、Wallarmのプラットフォームを利用することで、効率的なテストが可能です。
LDAPを利用したアプリでは、攻撃者が不注意や脆弱性を突くことがないよう十分注意する必要があります。これを実現するため、LDAPインジェクションやその他のサイバー攻撃を防ぐあらゆる手法を取り入れることが求められます。上記の記事が、適切なセキュリティ対策の一助となれば幸いです。
最新情報を購読