
CVE-2021-26084の技術分析と概念実証エクスプロイト。これはAtlassian Confluence ServerのOGNLインジェクション脆弱性です。根本原因の分析、脆弱なパラメータのマッピング、検出ガイダンスが含まれます。
影響範囲
原因、悪用方法
Confluence は、URL を Java クラスにマッピングして「アクション」と呼ばれるものを作成するフレームワークを使用しています。アクション URL は「.action」で終わり、confluence-.jar 内の xwork.xml と、同梱プラグインの JAR ファイル内の atlassian-plugin.xml で定義されます。各アクションには、アクション名を定義する name 属性、アクションを実行する Java クラスを定義する class 属性が少なくとも 1 つ含まれ、アクションの結果に基づいてアクション呼び出し後に表示される Velocity テンプレートを決定する result 要素が少なくとも 1 つ含まれます。アクションから返される一般的な値は「error」、「input」、「success」ですが、XWork XML の result 要素と一致する場合は任意の結果を使用できます。アクションには、指定された Java クラスの特定のメソッドを呼び出すための method 属性を含めることができます。コマンドが指定されていない場合、doDefault() メソッドが呼び出されます。以下は、createpage-entervariables アクションの action 要素です。

com.atlassian.confluence.pages.actions.PageVariablesAction クラスの doEnter() メソッドは、doenterpagevariables.action へのリクエストを処理し、「error」、「input」、「success」の値を返します。これにより、Velocity テンプレートが表示されます。
ここで、action 要素の「name」属性値はパス /.action に対応し、要素は error/success などに基づいてレスポンスの一部としてどのテンプレートを表示するかを示します。したがって、この例では /pages/doenterpagevariables.action にアクセスするだけで Velocity テンプレートファイルが表示されます。

Velocity テンプレートが HTML ページでどのように表示されるかを確認できます。

テンプレート内のタグ名をパラメータとして入力すると、リクエストパラメータから取得された値がレスポンスに返されていることがわかります。

#tag の使用方法: #tag (“attribute1”, “attribute2”, “attribute3”)
これらの属性は、レンダリング中に AbstrctTagDirective.applyAttributes() で取得されます。

#tag ("Hidden" "name='queryString'" "value='ahihihi'")
AbstrctTagDirective.applyAttributes() メソッドによって属性が取得された後、AbstrctUITag.doEndTag() AbstractUITag.evaluateParams() に渡されます。

その後、expression の形式で WebWorkTagSupport.findValue() OgnlValueFinder.findValue() に渡されます。

その後、SafeExpressionUtil.isSafeExpression() に渡されます。

ここで expression はコンパイルに渡され、ブラックリストがチェックされてキャッシュにプッシュされます。コンパイルステップを経ると ASTConst 形式にコンパイルされ、評価されると事前にコンパイルされた文字列が返されます。

入力から expression に「'」が追加されると、HTML エンティティ形式にエスケープされます。

エスケープが行われるのは HtmlAnnotationEscaper.annotatedValueInsert() です。

ここで ognl.JavaCharStream.readChar() メソッドが呼び出され、Unicode エスケープ文字が評価されるため、「\u0027」を渡すと「'」に変換されます。したがって、エスケープして OGNL 式を追加することができます。

ただし、次の OGNL のブラックリストを回避する必要があります。

「getClass」メソッドや「.class」プロパティの代わりに Array アクセサを使用することで回避できます。
queryString=aaa\u0027%2b#{\u0022\u0022[\u0022class\u0022]}%2b\u0027bbb

検出方法
リクエスト URI のパスコンポーネントに、次の表の「URI Path」列のいずれかの文字列が含まれるすべての HTTP トラフィックリクエストを監視します。
| URI Path | Vulnerable Parameters
/users/darkfeatures.action | featureKey
/users/enabledarkfeature.action | featureKey
/users/disabledarkfeature.action | featureKey
/login.action | token
/dologin.action | token
/signup.action | token
/dosignup.action | token
/pages/createpage-entervariables.action | queryString, linkCreation
/pages/doenterpagevariables.action | queryString
/pages/createpage.action | queryString
/pages/createpage-choosetemplate.action | queryString
/pages/docreatepagefromtemplate.action | queryString
/pages/docreatepage.action | queryString
/pages/createblogpost.action | queryString
/pages/docreateblogpost.action | queryString
/pages/copypage.action | queryString
/pages/docopypage.action | queryString
/plugins/editor-loader/editor.action | syncRev
そのようなリクエストが見つかった場合は、HTTP リクエストメソッドを確認する必要があります。リクエストメソッドが POST の場合は、HTTP リクエストのボディ内で上記の表の対応する影響を受けるパラメータを探し、リクエストメソッドが GET の場合は、HTTP リクエストのリクエスト URI 内でパラメータを探します。いずれかの影響を受けるパラメータの値に「\u0027」またはその URL エンコード形式が含まれているかどうかを確認します。含まれている場合、そのトラフィックは悪意があると見なされ、この脆弱性を悪用する攻撃が進行中である可能性があります。