js2py は、Pythonインタープリタ内でJavaScriptコードを評価できる人気のPythonパッケージです。さまざまなWebスクレイパーが、ウェブサイト上のJavaScriptコードを解析するために使用しています。
js2py 内部のグローバル変数の実装には脆弱性が存在し、攻撃者が js2py 環境内のPythonオブジェクトへの参照を取得できるため、攻撃者はJS環境から脱出してホスト上で任意のコマンドを実行できます。
通常、ユーザーは js2py.disable_pyimport() を呼び出して、JavaScriptコードが js2py 環境から脱出するのを防ぎます。しかし、この脆弱性を利用すると、攻撃者はこの制限を回避して、ターゲットホスト上で任意のコマンドを実行できます。
脅威アクターは、悪意のあるJavaScriptファイルを含むウェブサイトをホストしたり、HTTP APIを介して悪意のあるスクリプトを送信して被害者に解析させることができます。これにより、攻撃者はターゲット上で任意のシェルコマンドを実行し、ホスト上でリモートコード実行を行うことができます。
js2py は python3.12 をサポートしていません。pip install js2py を実行して js2py をインストールし、poc.py を実行します。poc.py はホスト上で head -n 1 /etc/passwd; calc; gnome-calculator; kcalc; の実行を試みます。Success! the vulnerability exists... を出力するか、電卓をポップアップ表示します。現在、公式の修正は提供されていません。ユーザーは fix.py を使用して js2py を動的にパッチするか、patch.txt を使用してソースコードを修正できます。
私は2月にこの脆弱性を発見し、公式リポジトリにPRを提出しました。しかしその後、そのPRは忘れられていました。4か月が経過したため、今ここでPoCと修正を公開することにしました。