ElasticセキュリティでCVE-2021-44228(Log4j2)のエクスプロイトを検知する
重要な注意点:
- Elasticは自社プロダクトの脆弱性について内部リスク評価を実施しています。評価の最新の状況と結果については、こちらの勧告をご確認ください。
- この記事は、2021年12月14日に更新されました。当初公開した記事に、検知とハンティングを強化する手法を追記しています。
概要
本ブログ記事はCVE-2021-44228の概要を説明するほか、Elasticセキュリティのユーザー向けに、環境内の脆弱性を利用するアクティブなエクスプロイトの検知ルールを提供します。
Elasticは新たな情報を把握次第、本記事を更新する予定です。この記事のバージョンは、2021年12月14日(火)時点での正確な情報をお伝えします。Apacheのアップデートについては、セキュリティページのLog4j2に関する記述から直接確認できる可能性があります。
CVE-2021-44228(Log4Shell)の概要
Log4j2はオープンソースのロギングフレームワークであり、エンドユーザーシステム上とサーバー上の両方で、多数のJavaベースアプリケーションに組み込まれています。2021年11月末、Alibabaのチェン・シャオジュン氏がリモートコード実行の脆弱性を特定し、報告しました。この脆弱性に付与されたCVE IDはCVE-2021-44228で、2021年12月10日より一般公開されています。この脆弱性のエクスプロイトは、フレームワークにパスされるユーザー入力を不正にデシリアライズして行われます。これによりリモートコードの実行が可能となるほか、攻撃者が環境変数などのセンシティブデータをリークする、あるいはターゲットシステム上で悪意のあるソフトウェアを実行するといった操作が可能となっています。
特定された脆弱性の影響は、Log4j2 version 2.0-beta9からversion 2.14.1までの、すべてのバージョンに及びます。この問題修正の初期メソッドとして多数のリリース候補が登場していますが、本記事の執筆時点では、フレームワークをLog4j2 2.15.0-rc2にアップグレードする対応が推奨されています。
複雑性が低く、かつ広範なエクスプロイトが見られることから、Log4j2の脆弱なバージョンを利用するソフトウェアが特定されたすべての環境において緩和策の実施は不可欠と考えるべきです。
ElasticセキュリティでLog4Shellのエクスプロイトを検知する
Elasticセキュリティのユーザーは、以下のイベント相関付け検知ルールを使用してLog4j2の脆弱性を狙うアクティブなエクスプロイトを特定することができます。 ホストベースのイベントデータの形式によって、以下の検知ルールを修正し、データフィールドと一致させる作業が必要となる場合があります。
エンドポイントデータを使用するユースケース向けの検知ルール
sequence by host.id with maxspan=1m
[network where event.action == "connection_attempted" and
process.name : "java" and
/*
outbound connection attempt to
LDAP, RMI or DNS standard ports
by JAVA process
*/
destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
[process where event.type == "start" and
/* Suspicious JAVA child process */
process.parent.name : "java" and
process.name : ("sh",
"bash",
"dash",
"ksh",
"tcsh",
"zsh",
"curl",
"perl*",
"python*",
"ruby*",
"php*",
"wget")] by process.parent.pid
Auditbeatデータを使用するユースケース向けの検知ルール
sequence by agent.id with maxspan=1m
[network where event.action == "connected-to" and
process.name : "java" and
/*
outbound connection attempt to
LDAP, RMI or DNS standard ports
by JAVA process
*/
destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
[process where event.type == "start" and
/* Suspicious JAVA child process */
process.parent.name : "java" and
process.name : ("sh",
"bash",
"dash",
"ksh",
"tcsh",
"zsh",
"curl",
"perl*",
"python*",
"ruby*",
"php*",
"wget")] by process.parent.pid
Endgameがストリーミングするイベントを使用するユースケース向けの検知ルール
sequence by agent.id with maxspan=1m
[network where event.category == "network" and
process.name : "java" and
/*
outbound connection attempt to
LDAP, RMI or DNS standard ports
by JAVA process
*/
destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
[process where event.type == "start" and
/* Suspicious JAVA child process */
process.parent.name : "java" and
process.name : ("sh",
"bash",
"dash",
"ksh",
"tcsh",
"zsh",
"curl",
"perl*",
"python*",
"ruby*",
"php*",
"wget")] by process.parent.pid
この検知ルールは、LDAP、RMI、DNS向けの標準ポートに対する連続のアウトバウンド接続試行(最近見られるJAVA/JNDIインジェクション攻撃を経由した悪用が多い)の後に、同じJavaプロセスインスタンスのチャイルドプロセスがくるパターンを探します。
次に、このルールが実際にlog4j2の脆弱性エクスプロイトをどのように検知するかを示します。
上のスクリーンショットでは、攻撃者が脆弱性を悪用し、Base64でエンコードしたペイロードでクリストフ・タファニデリーパー氏が作成した脆弱なアプリのサンプルを標的としていることがわかります。
これは、ElasticセキュリティがCVE-2021-44228のアクティブなエクスプロイトを検知し、悪用をアラートとタイムラインのビューで詳細に表示した際のスクリーンショットです。
上のスクリーンショットは、Javaがバッシュスクリプトをダウンロード、および実行するためのシェルスクリプトを実行したことを示す検知アラートの調査です。
【更新版】検知とハンティングを強化する手法
Java経由の疑わしいシェルコマンド実行
log4j経由でエクスプロイトに使われることが判明している既知の悪意のJavaクラスに基づいて、疑わしいシェルスクリプトと内部へのツール転送コマンドをハントすることができます。
process where event.type == "start" and
process.parent.name : "java*" and
/* Ingress tools transfer via common shell command interpreters */
/* linux or macos */
(
(process.name : ("sh", "bash", "python*") and
process.command_line : ("*curl*|*sh*", "*wget*|*bash", "*curl*|*bash*", "*curl*|*bash*", "*http*|*sh*", "*python*http*")) or
/* windows */
(process.name : ("powershell.exe", "pwsh.exe", "cmd.exe") and
process.command_line : ("*.downloadstring*", "*.downloadfile*", "*.downloaddata*", "*BitsTransfer*", "* -enc*", "* IEX*", "*wp-content*", "*wp-admin*", "*wp-includes*", "*$*$*$*$*$*", "*^*^*^*^*^*^*^*^*^*", "*.replace*", "*start-process*", "*http*", "*cmd*powershell*")))
Java経由の信頼できないファイル実行
Javaインタープリターが実行可能ファイル(PE/ELF)を作製した場合、および、その後ファイルが実行された場合に、その事象を特定します。
エンドポイントデータを使用するユースケース向けの検知ルール
sequence by host.id with maxspan=5m
[ file where event.type != "deletion" and
process.name : ("java", "java.exe", "javaw.exe") and
(file.extension : ("exe", "com", "pif", "scr") or
/* Match Windows PE files by header data (MZ) */
file.Ext.header_bytes : ("4d5a*", "7f454c46*")) and
not file.path : ("?:\\Program Files\\*",
"?:\\Program Files (x86)\\*") ] by file.path
[ process where event.type == "start" and
not process.code_signature.trusted == true ] by process.executable
sequence by agent.id with maxspan=5m
[ file where event.type != "deletion"
process.name : ("java", "java.exe", "javaw.exe")] by file_path
[ process where event.type == "start" and
not process.code_signature.trusted == true] by process_path
潜在的なCoinMinerアクティビティ
暗号通貨マイニングに共通するコマンドラインを調査します(log4jエクスプロイトによる攻撃で最も多く観測されているのがコインマイニングです)。
process where event.type == "start" and
process.command_line :
("* pool.*", "*-u*--coin*", "*.xmr.*", "*.xmr1.*",
"*stratum*", "*elitter.net*", "*cryptonight*",
"*-a scrypt*", "*stratum1*", "*-userpass*", "*-max-cpu-usage*",
"*qhor.net*", "*-wallet*pool*", "*--donate-level*", "*supportxmr.com*")
その他の有用なポストエクスプロイト検知手法に、次のものがあります。
コミュニティによる検知
コミュニティの数多くのメンバーがこの脆弱性の広範なエクスプロイトついて議論を重ね、インサイトを提供した結果、数々の初期検知メソッドが作成されました。セキュリティアナリストは、使用中のシステムにエクスプロイトが生じた形跡があるか、あるいはアクティブなエクスプロイトが存在するかを特定する目的で、これらのメソッドを活用することができます。
- GreyNoise teamはシステム内に格納されたログを確認するアナリスト向けに、エンコード、およびデコードされた両方のバリアントを含むペイロードなどの、一連のペイロード群を公開しました。このリソースは、脆弱性エクスプロイトを試みる初期のタグ付きIPリストの情報によって補完されます。
- Nextron Systemsのフロリアン・ロス氏は、初期のYARAシグネチャの一部と共に、ローカルのエクスプロイト向けにgrep / zgrepを使用するチェックリストをGistリストにまとめ、自身のGithubアカウントで公開しました。また、ロス氏は管理するシステムがエクスプロイトを被る可能性をテストするThinkst CanaryTokensを生成するメソッドも公開しています。
- ロブ・フラー氏(Mubix)はこちらで、フレームワークの脆弱なバージョン向けに既知のファイルハッシュリストを公開しています。
補助的緩和戦略
Apacheチームが発表した推奨ガイダンス(最新かつパッチ修正済みLog4j2フレームワークへデプロイをアップデートする)のほかにも、広範な関係者からエクスプロイトを回避する様々な緩和策の提案が挙がっています。
- Fastlyは、環境内のLog4jのバージョンがJVMでJAVA_OPTS=-Dlog4j2.formatMsgNoLookups=trueの実行をサポートするか確認し、リモートサーバーに対するルックアップ機能を無効化することを提案しています。この手法は、バージョン2.10.0から2.15.0に適合します。
- 脆弱なホストからのラテラルムーブメントや、ネットワーク全体に対するエクスプロイトを回避するには、潜在的に脆弱なシステムから、信頼できるアプリまたはサービスなどの外部リソースへの接続を制限することが推奨されます。
Elasticセキュリティより感謝を込めて
本ブログ記事で貢献をお伝えした各氏、ならびに、 今日、そして週末も不断の業務に取り組んでいる地球上のすべてのセキュリティチームに 深く感謝申し上げます。今回のように深刻かつ広範な脆弱性に直面した場合、 セキュリティコミュニティのオープン性とコラボレーションが、 すべてのエンドユーザーを保護する上で何よりも重要です。Elasticは一歩一歩、前へ進む皆様と共にあり、 これからも力を尽くしてまいります。
既にElasticセキュリティを導入済みのお客様は、 ご紹介した機能にプロダクトからアクセスしていただくことができます。これからElasticセキュリティを導入される場合は、 立ち上げに最適な短いトレーニングビデオ「Quick Start guides」(クイックスタートガイド)や、Elasticが提供する無料の基礎コースをご利用いただけます。Elasticは、Elastic Cloudの14日間トライアルを常時ご用意しています。また、セルフマネージド版のElastic Stackを無料でダウンロードしてお使いいただくこともできます。
参考資料
https://www.lunasec.io/docs/blog/log4j-zero-day/
https://www.crowdstrike.com/blog/log4j2-vulnerability-analysis-and-mitigation-recommendations/
https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/
https://www.greynoise.io/viz/query/?gnql=CVE-2021-44228