こんにちは、くまさかです。
07/18 頃に公開されました Apache Spark のWebUI にて OSコマンドインジェクション脆弱性である CVE-2022-33891 について紹介します。
なお、本脆弱性は特別な準備は特に必要なく、未認証であっても、細工した HTTPパラメータを付与することで、任意のコード実行が容易です。
そのため、インターネット上に Apache SparkのWebUI を解放し管理している方は注意が必要です。
●影響対象
Apache Spark の以下のバージョンが影響を受けます。
・Apache Spark 3.0.3まで
・Apache Spark 3.1.1 から3.1.2
・Apache Spark 3.2.0 から3.2.1
また、本脆弱性は、デフォルトの設定では影響を受けず、UI の認証を有効化している場合に影響を受けます。
・Apache Spark の UI(WebUI) を利用している
・Apache Spark の設定(spark-defaults.conf)にて、spark.acls.enable が有効(true)である
●考えられる影響
OSコマンドインジェクションが可能なため、任意のコード実行による情報の窃取や改ざん、サービス停止等、様々な影響が考えられます。
また、認証プロセスの応答を偽装することで、他ユーザへのなりすましも考えられます。
●対策
影響を受けるバージョンの修正版がリリース済みの為、更新が有効な対策です。
・Apache Spark 3.1.3
・Apache Spark 3.2.2
また、3.3系は本脆弱性の対象外の為、そちらへの更新も有効です。
・Apache Spark 3.3.0
●脆弱性レポート
本脆弱性の修正は、比較的理解が容易です。
以下は、本脆弱性修正の一部です。
修正からわかる通り、修正前では、受け取ったパラメータである username を bash で実行する形式で渡しています。
イメージとしては、以下のようなコマンドが実行されます。
今回の脆弱性では、こちらの username が GETパラメータからそのまま渡されている事を悪用し、コマンド置換を利用した任意のコード実行が可能です。
GNU/コマンド置換
例えば、username へ、`:>/have_CVE-2022-33891` を入れる事で、以下のようなコマンドが実行されます。
`:>/have_CVE-2022-33891` は、コマンド置換され、サーバ上で :>/have_CVE-2022-33891 として動作し、空のファイルが生成されます。
なお、認証試行としては失敗するため、応答としては、403 になります。(しかし、ここで認可されているユーザ情報をうまく返却できるとユーザ偽装できる可能性があります。)
また、ご存じの方も多いように、任意のコードが実行できるということは、リバースシェル確立もネットワーク環境によっては容易です。
以上のように、HTTP(s) の疎通があれば攻撃が成功してしまう可能性がある為、影響対象となりうる環境では、対策が必須となります。
さて、今回は、比較的攻撃が容易な、CVE-2022-33891 について簡単に紹介しました。
Apache Spark UI をインターネット上に開いた形で運用する場合、認証や TLS の設定を有効化されている方がほとんどかと思います。Apache Spark のアクセス制御機能(spark.acls.enable)を有効にされている環境では、対応をご検討ください。
なお、更新が難しく、Apache Spark WebUI を非公開にできないケースでは、コマンド置換で有効なパターンである、「``」や、「$()」が含まれるリクエストが到達した際に適切なアクションを講じる事ができるか確認する事が重要となりますが、例に挙げていない特殊なパターンによる攻撃の可能性もゼロではありません。
そのため、継続的にインターネット上に開いた形で運用する場合には、原則、修正版への更新を推奨致します。
●参考
・ https://nvd.nist.gov/vuln/detail/CVE-2022-33891
・ https://issues.apache.org/jira/browse/SPARK-38992