コード・インジェクションは、サードパーティがサーバー側のソフトウェアでコードを実行できるようにする重要な脆弱性です。式言語(Expression language)インジェクションは、サーバーから機密データを開示するリモート・コード実行の一種です。リモート・コードは、変数、パスワード、機能、コードを実行して表示します。最悪の場合、攻撃者がサーバーのリモート制御を行う可能性があります。
式言語インジェクションとは?
式言語インジェクションは、JavaServer Pages(JSP)、Active Server Pages(ASP)、Web サーバー上でホストされる他の式言語に影響を与える脆弱性です。これらの言語はインタープリタ型言語であり、サーバーに送信されたコードはアプリケーションの実行時にコンパイルされます。一方、標準的なコンパイル型言語では、バイナリ実行ファイルが使用されます。インタープリタ型言語では、ユーザーがページを要求したときにコードがサーバーにコンパイルされます。
式言語(EL:Expression language)アプリケーションが式言語のインジェクションに対して脆弱である場合、攻撃者は、クエリ文字列またはフォーム・オブジェクトのいずれかで、精巧なコードをアプリケーションに入力として送信します。コードは実行時にコンパイルされ、変数、パスワード、その他の機密情報を表示できます。EL の脆弱性は、古くなったバージョンのインタープリタ型言語では一般的であるため、従来型アプリケーションは本番環境に展開する前にペネトレーション・テストを受ける必要があります。重要なイベントの発生後、データ漏洩やエクスプロイトを修復するためにディザスタ・リカバリ計画が必要です。
式言語インジェクションの仕組み
インタープリタ型言語を実行しているアプリケーションは、入力からコードと特殊文字をスクラブする必要があります。入力をスクラブしないと、アプリケーションはコードを受け入れ、サーバー上で実行します。ほとんどの EL インジェクションの脆弱性は JSP に関わるため、次の例では JSP コードを使用します。以下のスニペットは、EL インジェクションに対して脆弱なコードの一行の例です。
<spring:message code="${param['message']}" text=""/>
この例では、コード属性は文字列を含むパラメータを使用します。攻撃者がコードをパラメータにインジェクションした場合、コンパイルされ、サーバー上で実行されます。ローカルの Web ページにはこのコードが表示されないため、攻撃者は一般的なスクリプトを使用して EL インジェクションの脆弱性を検出します。
式言語インジェクションにつながる一般的な脆弱性
EL インジェクションの脆弱性は、他のインジェクションの脆弱性と同様に、サーバー・アプリケーションへの入力の検証がないことに起因します。上記と同じ例を使用すると、メッセージ文字列は無害な文字列である可能性がありますが、コードである可能性もあります。無害な文字列を送信する代わりに、ユーザーが以下を送信したと仮定します。
${"aaaa".toString().concat(T(java.lang.Runtime).getRuntime().exec('ls -l'))}
上記の入力は、サーバー上でシステム・コマンド “ls -l” の実行を試みます。このコマンドは、現在のディレクトリ内のファイルとディレクトリをリストします。ファイルのリストを使用すると、攻撃者は別のコマンドを送信して、ファイルのコンテンツを開いてウィンドウに表示することができます。ファイルには、パスワードなどの機密データが含まれている可能性があります。攻撃者はそこからサーバーにアクセスし、さらに悪意のあるアクションを実行する可能性があります。
式言語インジェクションの検出
ホワイトボックスとブラックボックスの両方のペネトレーション・テストにより、EL インジェクションの脆弱性を検出します。ホワイトボックス・テストは、セキュリティの専門家がコードの脆弱性を確認する方法です。企業は、セキュリティ・レビュー担当者にコードを提供し、レビュー担当者は、レポート内の全てのコードの脆弱性を特定します。これは、データ保護に対する一般的な積極的なアプローチです。
ブラックボックスのペネトレーション・テストでは、攻撃者と同じ形式のスキャンと脆弱性検出を使用します。セキュリティの専門家がコードを知らずにアプリケーションを攻撃するため、検証や防御をテストできます。グレーボックス・テストは、ブラックボックスとホワイトボックスのテストの組み合わせであり、多くの場合、Web アプリケーションのペネトレーション・テストに選ばれています。
式言語インジェクションの防止
EL インジェクション攻撃を検出する最良の方法は、コードを検証し、特定の文字で入力を削除することです。例えば、名前フィールドの入力には「<」や「>」をを入れないでください。開発者は、これらの文字を検出して削除したり、入力をドロップしてエラーをユーザーに表示するために構築されたライブラリを使用する必要があります。
他のキャラクターも悪意ある可能性があります。JSP ページでは、コード・スニペットは「<%」で始まり、「%>」で終わります。これらの文字は入力から削除する必要があります。攻撃者は、悪意のあるコードの多数の組み合わせを実行して検出をバイパスするため、それを検出するための最良の方法は、入力検証用に構築されたライブラリを使用することです。SIEM アプリケーションは、エクスプロイトを検出し、アプリケーションがターゲットである場合に分析を提供することもできます。
まとめ
EL インジェクションの脆弱性は、重大なセキュリティ問題として扱う必要があります。インジェクションの脆弱性や、機密データを開示する可能性のあるその他の問題がないか、インタープリタ型言語アプリケーションを常にテストしてください。開発者は、検証ツールを使用して EL インジェクションを検出して阻止し、JSP と ASP を使用する従来型アプリケーションは、厳重に監視する必要があります。
ピュア・ストレージは、セキュリティ・インフラと脅威監視を導入し、アプリケーションをセキュリティ攻撃から保護します。