Skip to content

Slack OAuth state is not session-bound, enabling integration CSRF

Moderate
carderne published GHSA-hc5h-gqhc-4h79 Aug 20, 2026

Package

Trigger.dev webapp (Web application)

Affected versions

<= 4.5.11

Patched versions

>= 4.5.12

Description

Summary

Trigger.dev’s organization-level Slack OAuth flow uses the target Trigger.dev organization ID directly as the OAuth state value. The callback does not verify that the authenticated browser session initiated the OAuth transaction.

An attacker can authorize the Trigger.dev Slack application in an attacker-controlled Slack workspace, preserve the unredeemed callback URL, and convince an authenticated member of a target Trigger.dev organization to open it. Trigger.dev may then store the attacker-controlled Slack integration in the victim organization.

Safe reproduction design

I did not test Trigger.dev production or contact Slack.

A safe local regression test can:

  1. Create a target organization and an authenticated victim member.

  2. Ensure the victim session never initiated Slack OAuth.

  3. Mock oauth.v2.access() so ATTACKER_CODE returns credentials for a synthetic attacker-controlled workspace.

  4. Send the victim session to:

    /integrations/slack/callback?code=ATTACKER_CODE&state=ORG_TARGET

  5. On the vulnerable revision, verify that the exchange occurs and an integration for ORG_TARGET is created with the attacker workspace.

  6. After remediation, verify rejection occurs before token exchange and that no integration or secret is created.

This report is based on a high-confidence static source trace. The local runtime harness was not executed because the available offline dependency cache lacked @changesets/cli@2.26.2.

Impact

The attacker may cause a victim Trigger.dev organization to connect an attacker-selected Slack workspace. Subsequent operational alerts or Slack integration actions could be delivered to that workspace.

Prerequisites include knowledge of the target organization ID, a valid short-lived Slack authorization code, and interaction from an authenticated member of the target organization.

Severity

Moderate

CVE ID

No known CVE

Weaknesses

Cross-Site Request Forgery (CSRF)

The web application does not, or cannot, sufficiently verify whether a request was intentionally provided by the user who sent the request, which could have originated from an unauthorized actor. Learn more on MITRE.

Credits