Ly Gravity

The Provider That Never Existed: Mage's Fail-Open OAuth and the Credential Aggregator Problem

BullBlock • • Finance

An HTTP request is a small thing.

GET /api/v1/oauth/callback?provider=null. No authorization code. No state parameter. No session cookie. No credentials of any kind.

The Provider That Never Existed: Mage's Fail-Open OAuth and the Credential Aggregator Problem

On any Mage OSS deployment at or below version 0.9.80, that request returns an authenticated session. Not a redirect to a login page. Not a 401. Not a 500 with a stack trace. A session — signed, valid, and carrying whatever the instance had been configured to reach: the S3 access key, the Snowflake warehouse password, the Salesforce OAuth token, the secrets bound to ML workflow steps. The OAuth library did its job. It saw that the named provider did not exist and returned an error condition. Then the error handler — written by a team that understood authentication as a feature to be integrated rather than a boundary to be enforced — declined to stop. Control flowed past the error, into the branch that mints sessions, and the session was minted.

CVSS 9.8. Network exploitable, low complexity, no privileges required, no user interaction. The score is not inflated. It is the arithmetic of a system that answered a question nobody should have been able to ask, and answered it with a yes.

What unsettles me is not the severity. It is the shape of the defect. I have spent years arguing that trust is a protocol, not a promise, and here is a case where the protocol was present, the detection logic worked, and the only thing missing was a single word that would have ended the function. The bug is not a failure of cryptography or of OAuth or even of intent. It is a failure of control flow in the one place where control flow is the entire security model.

Context: why a data pipeline tool holds the keys to everything

Mage is an open-source data pipeline orchestration platform — the category that includes Airflow, Dagster, and Prefect. Its job is unglamorous and total: schedule tasks, resolve dependencies, retry failures, move data from sources to sinks. To do that job it must authenticate against everything it touches. It does not merely read your warehouse. It holds the credential that reads your warehouse, indefinitely, in a configuration store, on an always-on host.

That architectural fact matters more than the CVE. Mage produces no data of its own. It is a credential aggregator — a relay where the trust of five separate systems is concentrated into a single process. The security economics of this arrangement are well understood in theory and almost never accounted for in practice. When an identity provider is breached, the attacker receives identity. When a credential aggregator is breached, the attacker receives data, plus the credentials that reach the data, plus the credentials that reach everything those credentials were reused for. The loss is not additive. It compounds.

OAuth 2.0's callback endpoint is the most exposed surface in this arrangement. It is the one route that must accept unauthenticated inbound traffic by design, because the whole point of the redirect is that the user arrives without a session. Every security property of the flow — state binding, code verification, provider validation, PKCE — is a check that must be performed on a request the system has already agreed to trust provisionally. That is a narrow, hostile place to write code.

The Provider That Never Existed: Mage's Fail-Open OAuth and the Credential Aggregator Problem

The classification here is precise: CWE-390, Detection of Error Condition Without Action. Not CWE-287, improper authentication, which describes a check that was written wrongly. CWE-390 describes a check that worked and was then ignored. The distinction is not academic. A wrongly written check is a bug. An ignored check is a design philosophy, and design philosophies replicate.

The affected range is everything at or below 0.9.80. The fix landed as commit 76c4f46 across two pull requests, #6204 and #6205. Two PRs for one vulnerability is the detail I would put at the top of an audit memo, and I will return to why.

Core: what actually failed, and why the failure is a class rather than an instance

Reconstructing the path from the disclosure details, the sequence is unambiguous.

Market Prices

BTC Bitcoin
$81,727.2 +0.04%
ETH Ethereum
$2,411.44 -0.93%
SOL Solana
$103.1 -1.71%
BNB BNB Chain
$720.2 -0.32%
XRP XRP Ledger
$1.29 -1.39%
DOGE Dogecoin
$0.0788 -2.16%
ADA Cardano
$0.2188 -2.23%
AVAX Avalanche
$9.78 -2.64%
DOT Polkadot
$1.1 -4.62%
LINK Chainlink
$11.94 -2.60%

Fear & Greed

53

Neutral

Market Sentiment

Event Calendar

{{年份}}
30
04
upgrade Celestia Mainnet Upgrade

Improves data availability sampling efficiency

28
03
unlock Arbitrum Token Unlock

92 million ARB released

08
04
upgrade Solana Firedancer

Independent validator client goes live on mainnet

12
05
halving BCH Halving

Block reward halving event

15
04
halving Bitcoin Halving

Block reward reduced to 3.125 BTC

10
05
upgrade Ethereum Pectra Upgrade

Raises validator limit and account abstraction

18
03
unlock Sui Token Unlock

Team and early investor shares released

22
03
unlock Optimism Unlock

Circulating supply increases by about 2%

Altseason Index

40

Bitcoin Season

BTC Dominance Altseason

Gas Tracker

Ethereum 28 Gwei
BNB Chain 3 Gwei
Polygon 42 Gwei
Arbitrum 0.5 Gwei
Optimism 0.3 Gwei

Market Cap

All →
# Coin Price
1
Bitcoin BTC
$81,727.2
1
Ethereum ETH
$2,411.44
1
Solana SOL
$103.1
1
BNB Chain BNB
$720.2
1
XRP Ledger XRP
$1.29
1
Dogecoin DOGE
$0.0788
1
Cardano ADA
$0.2188
1
Avalanche AVAX
$9.78
1
Polkadot DOT
$1.1
1
Chainlink LINK
$11.94

🐋 Whale Tracker

🟢
0x3fd2...86a9
1h ago
In
122.02 BTC
🔵
0xa733...a800
1h ago
Stake
941,484 USDT
🔵
0x4037...a024
1d ago
Stake
3,303,931 USDT

💡 Smart Money

0xd880...1c4c
Experienced On-chain Trader
+$3.5M
87%
0x00a4...e96c
Institutional Custody
+$3.7M
84%
0x978b...cf80
Institutional Custody
+$1.3M
75%

Tools

All →