RACE CONDITION

How Lumora raised the cost of an attack from $400 to $250k

A double-spend on the withdrawal limit, inside a 200 ms window. Now Lumora tracks what it costs to break in.

RACE CONDITION

How Lumora raised the cost of an attack from $400 to $250k

A double-spend on the withdrawal limit, inside a 200 ms window. Now Lumora tracks what it costs to break in.

RACE CONDITION

How Lumora raised the cost of an attack from $400 to $250k

A double-spend on the withdrawal limit, inside a 200 ms window. Now Lumora tracks what it costs to break in.

>$250k

to exploit, up from about $400

200 ms

double-spend window closed

Breakcost

now reported to the board

INDUSTRY

Crypto custody infrastructure

STAGE

Series B · 45 engineers

LOCATION

Miami, FL

SURFACE TESTED

API

The situation

At a custody company, a single flaw is a direct path to customer funds. Lumora’s team had long vulnerability lists, but no way to tell the board how hard the company was to break.

The exploit

Two parallel withdrawal requests could both pass the limit check within 200 ms. Feint automated the race and drained a test wallet past its limit, at an attack cost of about $400 in tokens.


# feint · two withdrawals fired 12 ms apart, limit $500
POST /v1/wallets/w_93/withdraw  {"amount": 450}  ->  200
POST /v1/wallets/w_93/withdraw  {"amount": 450}  ->  200

# balance after both requests
GET /v1/wallets/w_93  ->  {"balance": -400, "limit": 500}

# attack cost: about $400 in tokens
# feint · two withdrawals fired 12 ms apart, limit $500
POST /v1/wallets/w_93/withdraw  {"amount": 450}  ->  200
POST /v1/wallets/w_93/withdraw  {"amount": 450}  ->  200

# balance after both requests
GET /v1/wallets/w_93  ->  {"balance": -400, "limit": 500}

# attack cost: about $400 in tokens
# feint · two withdrawals fired 12 ms apart, limit $500
POST /v1/wallets/w_93/withdraw  {"amount": 450}  ->  200
POST /v1/wallets/w_93/withdraw  {"amount": 450}  ->  200

# balance after both requests
GET /v1/wallets/w_93  ->  {"balance": -400, "limit": 500}

# attack cost: about $400 in tokens

The fix

The pull request moved the limit check and the debit into one transaction, and added a concurrency test that replays the race on every merge.

What changed

Finding the next path now costs an attacker more than $250k in tokens, measured with Breakcost. That one number has replaced the vulnerability count in Lumora’s board reporting.

“We don’t track vulnerabilities anymore. We track what it costs to break us.”

Jordan Kim

Head of Security

GET STARTED

Run your first attack on your own code.

Point Feint at staging. Within the hour you’ll have a proven finding, or a clean report you can show your auditor.

No credit card · First exploit within the hour

GET STARTED

Run your first attack on your own code.

Point Feint at staging. Within the hour you’ll have a proven finding, or a clean report you can show your auditor.

No credit card · First exploit within the hour

GET STARTED

Run your first attack on your own code.

Point Feint at staging. Within the hour you’ll have a proven finding, or a clean report you can show your auditor.

No credit card · First exploit within the hour

© 2026 Feint, Inc.

SOC 2 in progress · HIPAA · GDPR · Made in Framer

Create a free website with Framer, the website builder loved by startups, designers and agencies.