[解説] Flowiseにおける危険なPythonデシリアライズによるRCE脆弱性 (GHSA-x6vm-w76m-8j7g)
はじめに:Flowiseと今回の脆弱性の概要
皆さん、こんにちは!今回は、AIエージェントをローコード/ノーコードで構築できる人気のツール「Flowise」に関する深刻なセキュリティ脆弱性について解説します。Flowiseは、Langchain.jsをベースに、AIエージェントやチャットボットを視覚的に構築できる便利なツールとして、多くの開発者に利用されています。
今回の脆弱性 (GHSA-x6vm-w76m-8j7g / CVE-2026-69256) は、Flowiseの「CSVAgent」ノードにおいて、ユーザーが提供したPythonコードがWebAssembly上でPythonを実行する`pyodide`を介して実行されるプロセスに潜んでいました。その結果、攻撃者がリモートで任意のコードを実行できるRCE(Remote Code Execution)脆弱性として、`critical`な深刻度が付けられています。
脆弱性の詳細:`pandas.read_pickle()`の落とし穴
FlowiseのCSVAgentノードは、CSVファイルをPandasライブラリで処理するために、ユーザーが特定のPython関数(`customReadCSVFunc`)を提供できる設計になっていました。開発者は、悪意のあるコードの実行を防ぐために、`import`、`eval()`、`exec()`、`os.`などの危険なPython構文を検出するデニスト(ブラックリスト)を実装していました。これは、ユーザー入力を直接実行する際の基本的なセキュリティ対策と言えます。
しかし、このデニストは巧妙に回避されました。攻撃者は、Pandasライブラリが提供する`read_pickle()`関数を悪用しました。`read_pickle()`は、Pythonの`pickle`プロトコルでシリアライズされたデータをデシリアライズする機能を持っています。Pythonの`pickle`は非常に強力ですが、信頼できないソースから提供されたデータをデシリアライズすると、任意のコード実行につながる危険性があることで知られています。
今回のケースでは、攻撃者が`pandas.read_pickle()`を呼び出すことで、デニストで禁止されているキーワード(`import`や`os`など)を直接使うことなく、悪意のあるペイロードをデシリアライズし、結果としてシステムのコマンドを実行することが可能になりました。これは、特定のキーワードをブロックするだけでは、すべての潜在的な攻撃経路を塞ぎきれない典型的な例と言えるでしょう。
PoCの解説:攻撃手法の具体例
攻撃者は、まずリバースシェルを起動するような悪意のあるPythonオブジェクトを`pickle`形式でシリアライズし、Base64エンコードします。次に、FlowiseのCSVAgentノードの「Additional Parameters」に、以下のPoCコードを注入します。
注目すべきは、`MiniBytesIO`というカスタムクラスが定義されている点です。これは、`pandas.read_pickle()`がファイルライクオブジェクトを期待するのに対し、`import io.BytesIO`や`open()`がデニストによって禁止されているため、Base64デコードしたデータをメモリ上でファイルライクに扱うための巧妙な工夫です。このようにしてペイロードが注入されたチャットフローに対してAPIリクエストが送信されると、バックエンドで`pyodide`がコードを実行し、リバースシェルが確立されます。
フロントエンドエンジニアが学ぶべきこと
この脆弱性は直接的にはバックエンドのFlowiseに関するものですが、フロントエンドエンジニアにとっても重要な教訓がいくつかあります。
1. **入力バリデーションの重要性:** クライアントサイドでの入力チェックはユーザー体験のために不可欠ですが、セキュリティの観点からはサーバーサイドでの厳格なバリデーションとサニタイズが絶対必要です。フロントエンドから送られるデータが、バックエンドでどのように処理されるかを常に意識しましょう。
2. **信頼できないデータの処理:** ユーザーからの入力を直接コードとして実行したり、危険なデシリアライズ関数に渡したりすることは極めて危険です。もし`pyodide`のような技術を使ってブラウザ内でPythonコードを実行するような機能がある場合、サンドボックス環境の設計や、外部からのコード注入に対する徹底した防御策が求められます。
3. **サンドボックスの限界:** 特定の関数やキーワードをブラックリスト化するだけでは、十分なセキュリティ対策とは言えません。今回のように、別の正当な関数を介して悪用される可能性があります。ホワイトリスト方式での許可された操作のみの実行や、より根本的なサンドボックスからのエスケープ対策を検討することが重要です。
4. **サードパーティライブラリの危険性:** Pandasのような便利なライブラリであっても、その機能(例: `read_pickle()`)が持つ潜在的なセキュリティリスクを理解しておく必要があります。ライブラリのドキュメントやセキュリティ勧告を定期的に確認する習慣をつけましょう。
対策と推奨事項
Flowiseを利用している場合は、速やかに最新バージョンにアップデートし、脆弱性が修正されたパッチを適用してください。
一般的に、ユーザーが提供するコードを直接実行する機能は、極力避けるべきです。やむを得ず実行する場合は、厳密に許可された操作のみをホワイトリスト方式で実行させ、分離されたセキュアなサンドボックス環境(コンテナなど)で行うように設計を再検討しましょう。
`pandas.read_pickle()`やPythonの`pickle`モジュールなど、デシリアライズ機能は信頼できるソースから生成されたデータに対してのみ使用し、ユーザー入力など外部からのデータには絶対に適用しないようにしてください。
まとめ
今回のFlowiseの脆弱性は、たとえセキュリティ対策を講じていても、巧妙な手法によって回避される可能性があることを示しています。フロントエンド開発者も、バックエンドのセキュリティメカニズムを理解し、システム全体として多層的な防御策を考慮することの重要性を再認識する良い機会です。日々の開発において、常にセキュリティ意識を持って取り組んでいきましょう。