Apache Log4jに見つかった脆弱性「Log4Shell」とは
多くの企業で使われている「Apache Log4j(アパッチログフォージェイ)」と呼ばれるソフトウェアにおいて、「Log4Shell」と呼ばれる脆弱性が発見されました。この脆弱性を放置した場合、大きなダメージを受ける可能性があるため、迅速な対処が求められています。ここでは、Log4jとLog4Shellについて解説していきます。
目次
ソフトウェアにログ出力のための機能を提供するLog4j
オープンソースプロダクトとして公開されているソフトウェアである「Apache Log4j(アパッチログフォージェイ)」(以下、Log4j)において、2021年12月、任意のコードをリモートで実行できるゼロデイ脆弱性が発見されました。一般公開されている脆弱性には、共通脆弱性識別子(CVE:Common Vulnerabilities and Exposures)が割り当てられていて、この脆弱性の識別子は「CVE-2021-44228」となっています。なお、脆弱性(Vulnerability)とは、セキュリティ上のリスクがある設計上のミスやバグです。
CVE-2021-44228は「Log4Shell」と呼ばれています。この深刻な脆弱性が悪用されると、ランサムウェアへの感染や個人情報の漏えいなどが起きる可能性があるうえ、Log4Shellが残されたサーバーを踏み台に、社内の別のサーバーなどへ不正アクセスするラテラルムーブメント(侵入拡大)も十分に考えられるため、迅速な対処が必要です。
では、そもそもLog4jとは何のためのソフトウェアなのでしょうか。
Webサーバーやメールサーバーを構築するためのソフトウェアやデータベースといったミドルウェア、あるいは業務アプリケーションなどは、一般的に実行した処理などを出力する仕組みを備えています。
この出力されたものがログで、ソフトウェアの実行状況の把握やデバッグ、サイバー攻撃の分析などといった用途に用いられます。またWebサーバーでは、ユーザーのアクセス数のカウントやWebサイト上におけるユーザーの行動の把握などといった目的でログが使われています。
このログを作成する仕組みがライブラリ(ソフトウェアを開発する際に利用する部品)やユーティリティ(補助的な機能を提供するソフトウェア)として提供されていれば、そのための機能を各々のソフトウェアで個別に開発することなくロギングが可能になります。そうしたログ出力ライブラリの1つとして開発され、オープンソースとして公開されているものの1つがLog4jです。
Log4jはApacheソフトウェア財団のプロジェクトである「Apache Logging」で開発されたオープンソースソフトウェアの1つであり、Javaで開発したプログラムに対してログを記録・出力するための機能を提供します。なおApache Loggingでは、Log4jのほか、Microsoft .NET向けの「Apache Log4Net」や、C++向けの「Apache log4cxx」なども開発しています。
このLog4jで提供される機能の1つに、ログの出力があります。出力先としては標準出力やファイルがあるうえ、syslogやWindowsのイベントログの仕組みを利用してログを出力することも可能です。
またLog4jには「FATAL」(致命的なエラー)や「ERROR」(エラー)、「WARN」(警告)、「INFO」(情報)といったログレベルがあり、レベルに応じて出力先を変えるといったことが可能です。
ログを整形するための仕組みとして用意されているのがレイアウトと呼ばれるコンポーネントで、タイムスタンプやログレベル、内容の順番などを自由に制御することができます。
このLog4jにはバージョン1系(Apache Log4j 1)とバージョン2系(Apache Log4j 2)があります。ゼロデイ脆弱性が発見されたのはバージョン2系で、「Apache Log4j-core 2.15.0」より前のバージョンです。バージョン1系であっても、Log4jの設定ファイルを変更することができれば影響を受ける可能性があるとされていますが、そのためには事前に何らかの方法で不正にシステムにアクセスする必要があり、リモートで今回発見された脆弱性を利用した攻撃の影響を受けることはないとJPCERT/CCでは解説しています。
ランサムウェアなどへの感染や情報漏えいの危険性があるLog4Shell
Log4jに見つかった深刻な脆弱性であるLog4Shellを利用すれば、任意のコードをリモートで実行する、RCE(Remote Code Execution:リモートコード実行)が可能です。背景にあるのはLookupと呼ばれる機能やJNDI(Java Naming and Directory Interface)と呼ばれる仕組みの処理にある問題で、攻撃者が送信した文字列をLog4jがログとして記録すると、その文字列に記述された通信先やサーバー内部のファイルからjava classファイルと呼ばれるファイルを読み込んで実行してしまうというものです。
具体的なシナリオ(攻撃ベクトル)の1つとして、Log4jを利用しているWebサーバーへの攻撃(ハッキング)が考えられます。多くのWebサーバーは、クライアントからのアクセスがあったとき、要求されたURLをログに記録します。そこで悪意のある文字列を含んだURLを作成し、そのURLを用いてWebサーバーにアクセスするという形です。これによって悪意のある文字列を含んだURLがログに記録され、たとえばインターネット上に公開されたサーバーからマルウェアをダウンロードさせて、Webサーバーにマルウェアを感染させるといったことが可能になります。
すでにLog4Shellを狙った攻撃やハッキングは多数発生しています。JPCERT/CCでは、12月10日から16日の間にハニーポットで観測されたLog4Shellを狙った通信の推移をまとめています。それによれば、12月10日の10件を皮切りに、11日は46件、12日には79件と着実に増加しています。
◇Apache Log4j2のRCE脆弱性(CVE-2021-44228)を狙う攻撃観測
https://blogs.jpcert.or.jp/ja/2021/12/log4j-cve-2021-44228.html
トレンドマイクロでは、ボットネットであるマルウェア「Mirai」や、コインマイナーである「Kinsing」をサーバーに感染させるサイバー攻撃に、Log4Shellが使われているとしています。
そのように、Log4Shellはマルウェア「Mirai」などに容易に悪用できることに加え、さまざまなコードをリモートで実行できることから、極めて危険度の高い脆弱性であると言えます。実際、Apacheソフトウェア財団は、Log4ShellのCVSSレーティングを「10」に指定しています。
CVSSはCommon Vulnerability Scoring Systemの略で、共通脆弱性評価システムと訳されています。脆弱性を評価するオープンかつ汎用的な評価手法であり、脆弱性の深刻度を0から10までの数値でレーティングしています。数値が大きくなるほど深刻度が高くなり、10はもっとも深刻な脆弱性であることを示しています。このことから、Log4Shellが極めて重大な意味を持つ脆弱性であることがわかるでしょう。
Log4Shellが発見された後も、Log4jにはCVE-2021-45046やCVE-2021-45105といった脆弱性が発見されています。CVE-2021-45046は同様にリモートでコードを実行できる脆弱性であり、CVSSレーティングは9.0となっています。また、CVE-2021-45105はDoS(Denial of Service:サービス拒否)攻撃に利用される可能性がある脆弱性です。
Log4Shellへの対策を講じる際には、このように新たに発見された脆弱性に関する情報なども収集しつつ、適切に作業を進める必要があります。
Log4Shellへの対策を怠った企業の責任を追及すると表明したFTC
このLog4Shellへの対策として、まず検討したいのがバージョンアップです。Apacheソフトウェア財団は、Java 8以降のユーザー向けである「2.17.1」、Java 7ユーザー向けの「2.12.4」、Java 6ユーザー向けの「2.3.2」を公開しています(2022年1月20日現在)。可能であれば、これらのバージョンへの移行をまず検討すべきでしょう。
さらにLog4Shellの回避策についても公開されていて、JPCERT/CCでは「Apache Log4jの任意のコード実行の脆弱性(CVE-2021-44228)に関する注意喚起」とするドキュメントの中で、回避策に言及しています。
なおLog4Shellへの対策が遅れている場合、すでにオープンソースを受けている可能性があります。Log4Shellによりランサムウェアなどのマルウェアに感染させられるといった被害も報告されているため、不審なファイルやプロセスの有無を確認したいところです。またLog4jから出力されているログに、不審な文字列が含まれていないかもチェックしましょう。
Log4Shellの脆弱性は極めて危険であることから、こうした対策は早急に行う必要があります。実際、アメリカのFTC(Federal Trade Commission:連邦取引委員会)は、消費者保護の観点から、Log4Shellへの対策を怠った企業の責任を追及することを表明しました。
またLog4Shellへの対応が遅れた、あるいは放置したことでサイバー攻撃を受け、それによって個人情報が漏えいしたといった事態を招くことになれば、企業のセキュリティに対する姿勢が厳しく問われるでしょう。場合によっては、ブランドイメージが毀損することにもなりかねません。
Log4Shellへの具体的な対策
Log4Shellのような脆弱性への対処を考える際に、重要になるのが脆弱性管理のための取り組みです。これは社内で利用しているシステムに関し、使われているソフトウェアやそのバージョンなどといった情報を集約し、さらに脆弱性に関する情報を収集します。仮に何らかのソフトウェアで脆弱性が発見された際には、そのソフトウェアが社内で使われているかどうかを素早く確認し、バージョンアップなどの対策を講じていくことになります。
今回のLog4Shellで言えば、まず脆弱性に関する情報が提供されたタイミングで、Log4jを使っている社内のシステムを素早く特定します。すでに修正バージョンが提供されているタイミングであればバージョンアップの計画を行い、まだ修正バージョンが提供されていなければ対策を講じることで、Log4Shellを用いたサイバー攻撃を受ける可能性を低減することができるでしょう。
この脆弱性管理において重要となるのは、社内システムで利用されているソフトウェアとそのバージョンの把握です。たとえばIT部門でシステム構成を管理しているが、事業部門が独自にシステムを構築し、その内容をIT部門に知らせていなかった場合、事業部門が構築したシステムで使われているソフトウェアに脆弱性が発見されたとしても、素早く対処することができません。このため、社内で使われているシステムに関する情報を集約し、一元的に管理するための仕組みやルールの整備が求められます。
とはいえ、Log4Shellへの対応で難しいのは、さまざまなソフトウェアでLog4jが使われている点です。Javaを用いて開発された、ミドルウェアや業務用アプリケーションなどでは、ログの出力にLog4jを用いることは珍しくありません。このため、ユーザー側でLog4jを使っている認識がなくても、実は導入しているソフトウェアがLog4jを使っていることが十分に考えられます。Log4Shellへの対策を進める際には、こうしたことも意識しながら作業を進めなければなりません。
なお、こうした脆弱性対応に有効なソリューションとして挙げられるのが、「Tanium(タニウム)」を活用したNTT Comの「エンドポイントマネジメントソリューション」です。このソリューションでは、脆弱なインスタンスを検知できるほか、侵害の兆候を捉える仕組みもあります。エンドポイント隔離や封じ込めのための仕組みやアップデートやアップグレード、パッチ適用の効率化のための機能を備えているのもメリットです。
このエンドポイントマネジメントソリューションを利用すれば、Log4jが実行されているサーバーを素早く特定することができるうえ、侵害の兆候を捉えて素早く対処することが可能になります。またLog4Shellを悪用した侵害の痕跡を検出することも可能であり、網羅的な対策を実現できます。
このような脆弱性が発覚した際、迅速かつ適切に対応したいと考えているのであれば、「トータルマネージドセキュリティ」の活用も検討すべきでしょう。これはユーザーの環境に合わせたセキュリティ管理体制を構築するほか、AIによるアノマリー検知によってゼロデイ攻撃や内部不正の検知および遮断を自動的に行うことができます。
Log4Shellは重大なセキュリティ危機であり、当然ながら放置することはできません。すぐに対策を講じましょう。