tomcat vulnerability

【PoCあり】Tomcat脆弱性CVE-2020-9484を対策しなければならない条件とは?脆弱性の原因も含め解説

投稿日: カテゴリー: セキュリティ
Pocket

今回のTomcatの脆弱性は3つの条件を満たしたらアップデートすべし

今回のTomcatの脆弱性はサーバ上に任意の内容のファイルを配置することができる場合に、任意のコードを実行する可能性があります。
分類としてはデシリアイゼーション攻撃(Deserialization Attack:OWASP Top10)です。
以下の場合はアップデートすることを推奨します。(影響バージョン10.0.0-M4以下、9.0.34以下、8.5.54以下、7.0.10以下)

①ファイルのアップロード機能等があり任意のファイルを設置できる場合
②FileStoreのセッション保存先が判明している場合
③そのFileStoreでPersistenceManagerを使い、受け入れるオブジェクトのクラスの制限を設けていない場合

PoCは公開されており条件さえ整っていれば攻撃は容易です。

ysoserial.jarと言うjavaのシリアライズオブジェクトコードを生成するツールも公開されており攻撃コードを作成することは容易です。(この場合は電卓起動)

java -jar ysoserial.jar CommonsCollections2 "calc" > /tmp/evil.session

アップロード機能などからサーバに設置した後はJSESSION介してロードさせ、シリアライズされた攻撃コードが実行されます。

GET / HTTP/1.1 
Host: (ターゲットホスト)
Cookie: JSESSIONID=../../../tmp/evil

脆弱性が発生する原因

org.apache.catalina.session.FileStoreのloadメソッド( Session load(String id))が引数idの値に含まれるディレクトリ指定文字「../」を除外しないことが原因です。そして「セッションID.session」としてファイル保存されている状態かつオブジェクトの制限を受けない状態で設定されていることにより、要求されたファイルのロードが行われシリアライズされたコードが実行されることになります。

①ファイルのアップロード機能等があり任意のファイルを設置できる場合

.sessionなどが上がるかがポイントになります。検証機構をバイパスされないためにも拡張子の確認だけではなく、マジックバイトレベルでの検証することをご検討ください。検知の項目にも書いておりますが脆弱性によりファイルのアップロードを許すケースがあるので「../」が含まれるCookieがきた際は不審なファイルの生成がないか確認することを推奨します。

②FileStoreのセッション保存先が判明している場合

バージョンや環境により異なりますがある程度は推測可能です。デフォルトのエラーページ等バージョンの推定のヒントになる要素は徹底的に潰すべきです。
ここに「セッションID.session」としてファイル保存されています。

<Manager className="org.apache.catalina.session.PersistentManager" maxIdleBackup="60" maxIdleSwap="300">
    <Store className="org.apache.catalina.session.FileStore" directory="(XXX)"/>
</Manager>

③そのFileStoreでPersistenceManagerを使い、受け入れるオブジェクトのクラスの制限を設けていない場合

PersistenceManager + FileStoreは、メモリ上のセッションオブジェクトをファイル等に対して永続化することによる負荷軽減、セッションの共有ファイルシステムへの保存を目的として利用されることがあります。設定状態はcontext.xmlで確認できます。

オブジェクトの制限がないかについては、sessionAttributeValueClassNameFilter​の設定がnullの場合などが当てはまります。

    <Manager className="org.apache.catalina.session.PersistentManager"
      debug="0"
      saveOnRestart="false"
      maxActiveSession="-1"
      minIdleSwap="-1"
      maxIdleSwap="-1"
      maxIdleBackup="-1">
        <Store className="org.apache.catalina.session.FileStore" directory="./session" />
    </Manager>

参考:セッション永続化させない場合の有効期間(デフォルト)

Tomcat : 1800 秒 (30分)
WebLogic : 3600 秒 (60分)
WebSphere : 1800 秒 (30分)
JBoss : 1800 秒 (30分)

CVE-2020-9484の検知方法・軽減策

セッションIDに「../」が含まれていることが特徴なので攻撃兆候(IoC)です。また、このような通信が確認された場合不審なファイルのアップロードがないかどうか確認が必要です。(Tomcatは以前にPUTできてしまう脆弱性がありましたし)

以上です。参考になれば幸いです。