
Appsmith Table Widgetにおける保存型XSSを実証するProof-of-conceptで、XSS-to-CSRF攻撃による垂直権限昇格と完全な管理者乗っ取りに至ることを示します。
Appsmith における保存型 XSS を介した権限昇格の Proof-of-Concept
開示情報: GHSA-5hw4-whxv-6794 を介して私が最初に報告しました
⚠️ 許可されたペネトレーションテスト/研究目的のみで使用してください。
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2026-30862 |
| 深刻度 | 🔴 Critical |
| CVSS スコア | 9.1 |
| CVSS ベクター | [CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H] |
| CWE | CWE-79、CWE-269、CWE-352 |
| 影響を受ける製品 | Appsmith ≤ 1.95 |
| パッチ適用バージョン | 1.96 |
| アドバイザリ | GHSA-5hw4-whxv-6794 |
Table Widget(TableWidgetV2)に重大な保存型 XSS の脆弱性が存在します。根本原因は、React コンポーネントのレンダリングパイプラインにおける HTML サニタイズの欠如であり、悪意のある属性が DOM に挿入されることを可能にします。「Invite Users」機能を悪用することで、通常のユーザーアカウント([email protected])を持つ攻撃者がシステム管理者に高権限 API 呼び出し(/api/v1/admin/env)を実行させ、完全な管理者アカウント乗っ取りにつながる可能性があります。
1. 根本原因: 出力サニタイズシンクの欠如 この脆弱性は Table Widget のレンダリングエンジンに存在します
ファイル: app/client/src/widgets/TableWidgetV2/component/cellComponents/BasicCell.tsx
BasicCell コンポーネントは、columnType が URL または Plain Text に設定されている場合、データのサニタイズに失敗します。ユーザーが指定した生の値が React の子要素として直接レンダリングされ、ブラウザが実行可能な HTML として解釈します。
脆弱なコードスニペット(132〜143行目および172〜173行目):
const contentToRender = useMemo(() => {
switch (columnType) {
case ColumnTypes.URL:
// サニタイズなしで 'url' を href に直接挿入
return <a href={url} target="_blank">{value}</a>;
default:
return value; // 141行目: 生の値が返される
}
}, [columnType, url, value]);
// 173行目: サニタイズされていないコンテンツが DOM に注入される最終シンク
<Content ref={contentRef}>{contentToRender}</Content>
2. 攻撃ベクトル: ソーシャルエンジニアリングによる XSS-to-CSRF(Invite 機能) SESSION クッキーは HttpOnly で保護されていますが、XSRF-TOKEN は document.cookie を介してアクセス可能です。Appsmith では任意のユーザーが他のユーザーをアプリに「招待」できるため、攻撃者はこれを配信メカニズムとして使用し、管理者のアクティブセッション内で**クロス権限リクエストフォージェリ(CPRF)**を実行できます。
ステップ 1: XSS 脆弱性の検証
通常のユーザーアカウントでログインします: [email protected]。
新しいアプリケーションを作成し、Table Widget を追加します。
Table Data プロパティに以下を注入します:
[{ "id": 1, "payload": "" }]
-- ステップ 2: 武器化(完全な管理者乗っ取り)
[email protected] として、管理環境を変更するように設計された以下のペイロードで Table Data を更新します:[
{
"id": 1,
"Status": "System Update Required",
"payload": "alert('Admin Privileges Granted to [email protected]'));\">"
}
]
「Share」 機能を使用して、システム管理者([email protected])をアプリに招待します。これにより、管理者は招待を開いた際に悪意のあるテーブルを表示せざるを得なくなります。
管理者がアプリを起動すると、スクリプトがバックグラウンドで実行されます。管理者の XSRF-TOKEN を読み取り、PUT リクエストを送信して [email protected] を管理ホワイトリストに追加します。
結果: [email protected] として再度ログインします。Admin Settings とすべてのインスタンス設定への完全なアクセス権が付与されます。
脆弱性の種類: 保存型 XSS / 垂直権限昇格。
深刻度: 9.1(Critical)| CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
リスク: Appsmith インスタンスの完全な侵害。攻撃者は機密の環境変数、データベース認証情報へのアクセスを取得し、インスタンス内の任意のアプリケーションを変更する能力を得ます。
シンクのサニタイズ: BasicCell.tsx および関連コンポーネントのすべての動的出力を DOMPurify.sanitize() でラップします。
CSP の強化: 厳格な connect-src ポリシーを実装し、XSS ペイロードから管理エンドポイントへの不正な API 呼び出しを防止します。
https://github.com/user-attachments/assets/206a10e4-1619-4887-a552-99761baa0a29