News Security Research
Categories
Launch App
Security Research

Post-Mortem: How Upgradeability Became the Attack Vector in PAID Network

Published on February 12, 2026

Post-Mortem: How Upgradeability Became the Attack Vector in PAID Network

On March 5th, 2021, at approximately 20:00 UTC+2, an attacker minted 59,471,745 PAID tokens from a contract they did not deploy, using functions that did not exist in any audited version of the code. The token price dropped 85% within minutes. The entire sequence took less than 30 minutes.

No smart contract vulnerability was exploited. No novel cryptographic attack was executed. The audited code performed exactly as written.

The attack vector was the architecture itself.


Background: What PAID Network Was

PAID Network was a DeFi protocol built on Ethereum, positioning itself as a business contract and payment infrastructure layer. The project had undergone a formal security audit by CertiK prior to launch. Its token contract was verified on Etherscan. By the standards commonly applied in early 2021, it appeared to be a credible, audited project.

The audit, however, only covered the code as it existed at the time of the review. What it could not cover — structurally, by definition — was any code that might be added to the contract after deployment.

This is the central flaw of upgradeable contract architecture, and it is the flaw that was exploited.


The Technical Sequence

The attack proceeded in four discrete steps, each a direct consequence of the one before it.

Step 1: Ownership transfer via compromised private key.

The PAID token was deployed behind an upgradeable proxy — a standard OpenZeppelin TransparentUpgradeableProxy pattern. This architecture separates logic from storage: a proxy contract holds state, while a separate implementation contract holds the code. The proxy owner — a single Ethereum address — controls which implementation the proxy points to.

That owner address was controlled by a private key. That private key was compromised.

With the key, the attacker transferred proxy ownership to an address under their control. From this point forward, the attacker had full administrative authority over the contract.

Step 2: Contract upgrade with new functionality.

The attacker called upgradeTo() on the proxy, replacing the existing implementation contract with a new one. The replacement contract introduced two functions that were absent from the audited codebase: an externally callable burn() function and an externally callable mint() function.

These functions did not circumvent any access control in the original contract. They were simply added to it — permitted in full by the upgradeable architecture that the original deployment relied upon.

Step 3: Burn to clear supply headroom.

The PAID token had a hard-coded maximum supply. At the time of the attack, that cap was already reached — all tokens had been minted at launch. To create space for new minting, the attacker burned approximately 60 million PAID tokens from existing circulation, targeting supply that could not be sold by its holders.

This step reveals deliberate execution. The attacker understood the supply constraints and engineered a solution within them.

Step 4: Mint and liquidate.

With supply headroom created, the attacker minted 59,471,745 PAID tokens to an address they controlled. They then approved the Uniswap router and began selling into the open market.

In 17 minutes, 2,501,203 PAID tokens were converted to 2,040 ETH before the PAID team identified the exploit and pulled Uniswap liquidity. The token price had collapsed 85% by the time the liquidity removal halted further selling.

The remaining minted tokens — the vast majority of the 59 million — were never successfully liquidated. The exploiter’s address still held them when the market for PAID effectively ceased to exist.


The Audit Did Not Fail

This detail deserves explicit treatment, because it is frequently mischaracterized.

CertiK’s audit was technically accurate. The contract they reviewed contained no exposed mint or burn functions, no reentrancy vulnerabilities, no integer overflow risks. Their findings were correct for the code they examined.

The audit failed at a structural level — not because of methodological error, but because the audit’s scope was bounded by a point in time, while the contract’s attack surface was unbounded by design.

An upgradeable contract is not a fixed artifact. It is a mutable system whose future state is controlled by whoever holds the proxy owner’s private key. Auditing an upgradeable contract is equivalent to auditing a document that anyone with administrator access can rewrite after the review is complete. The audit result is valid at the moment of signing. It carries no forward guarantee.

This is not a criticism of any particular audit firm. It is a structural property of upgradeable architecture.


The Proxy Owner Key: A Single Point of Failure

The most direct failure in the PAID incident was key management — but tracing the root cause to “key compromise” stops one level too shallow.

The more precise failure was the existence of a single private key with unconstrained authority over a live production contract holding significant investor value. That key was the attack surface. Whether it was phished, leaked through operational error, or accessed through a compromised development environment is secondary. The critical fact is that its existence as a single point of failure was an architectural decision, not an accident.

A contract with no upgrade function has no proxy owner key to compromise. A contract with no admin address has no admin address to target. The attack surface was created when the contract was designed to be upgradeable. The key compromise was the exploitation of that surface — not the surface itself.

This distinction matters for how you build. The response to the PAID incident should not be “use better key management.” It should be “eliminate the key.”


The Upgrade Function as an Undisclosed Attack Surface

From an investor’s perspective, the upgradeable proxy introduced a risk that was not visible from the token contract’s verified source code alone.

An investor examining the PAID token contract on Etherscan would see verified code with no mint or burn functions. That verification is accurate. What it does not show is the proxy architecture sitting above the implementation — the layer that allows the implementation to be replaced entirely.

The mint function that was used to drain value from investors did not exist in any form accessible to them at the time they entered the market. It was added after their position was established, by an attacker who gained access to a single key.

This is the investor-facing consequence of upgradeable architecture: the contract you reviewed is not the contract you are exposed to. The contract you are exposed to is whatever the proxy owner decides to deploy next.


Structural Prevention: What Immutability Would Have Changed

An immutable contract — one deployed without upgrade functionality, without a proxy owner, without any administrative address — changes the threat model entirely.

There is no upgradeTo() function to call. There is no proxy owner key to compromise. There is no pathway to introduce new mint or burn functions after deployment. The contract that investors review at launch is the contract that executes for the duration of its existence.

The audit result holds permanently, not just at the moment of signing.

This is not a theoretical property. It is the direct operational consequence of removing upgrade mechanisms from the architecture. An attacker with a compromised private key and no upgradeable proxy has no attack vector. The key controls nothing of value.

The PAID incident is sometimes framed as an argument for better security practices around key management — hardware security modules, multisig governance, timelock mechanisms. These are improvements over a single EOA proxy owner, and they reduce the probability of successful exploitation. They do not eliminate the attack surface. A 3-of-5 multisig controlling an upgradeable proxy is still an upgradeable proxy. It requires more coordination to exploit, but the exploit pathway exists.

Immutability eliminates the pathway.


The Audit Fallacy in Upgradeable Systems

The PAID incident illustrates a broader pattern in how the DeFi ecosystem reasons about contract security. An audit is treated as a permanent certification of safety rather than a time-bounded review of a static artifact.

For immutable contracts, this approximation is reasonable. The audited code is the deployed code. Absent an undiscovered vulnerability in the original review, the security properties hold.

For upgradeable contracts, the approximation fails. The audit certifies a version. The proxy owner controls which version is active. These two facts cannot be reconciled into a durable security guarantee.

Founders who deploy upgradeable contracts and cite their audit as evidence of security are providing investors with a guarantee that the architecture structurally cannot support. The audit is real. The guarantee is not.


Timeline Summary

Time (UTC+2)Action
20:00Attacker transfers proxy ownership to controlled address
~20:00Contract upgraded; mint and burn functions introduced
~20:02~60M PAID tokens burned to clear supply cap
~20:0259,471,745 PAID tokens minted to attacker address
~20:02Attacker begins selling on Uniswap
20:17PAID team detects exploit, pulls Uniswap liquidity
20:17~2.5M tokens sold for 2,040 ETH ($3M at time of exploit)
Post-attackPAID v1 invalidated; v2 airdrop announced as remediation

Total elapsed time from first transaction to liquidity pull: approximately 17 minutes.


Conclusion

The PAID Network exploit was not a smart contract hack. No audited code was broken. No cryptographic primitive was bypassed. The attack was a precise traversal of an intentionally designed upgrade pathway, executed by an entity that gained control of a single private key.

The lesson is architectural, not operational.

Contracts that can be upgraded can be upgraded by anyone who controls the upgrade key — legitimately or otherwise. The security guarantee of an upgradeable system is bounded by the security of that key, now and in perpetuity, for the lifetime of the protocol. That guarantee is not mathematical. It is organizational, operational, and human — and therefore fallible.

Immutability is the only property that removes the variable. A contract with no upgrade function cannot be upgraded. The functions investors see at deployment are the functions that will execute at any point in the future. The audit holds. The threat model is closed.

Write once. Run forever.


0xKeep operates on an immutable, zero-admin-key architecture. No wallet — including those controlled by the 0xKeep team — can pause, modify, or interact with deployed contracts. Time is the only admin.

Deploy on Base, Arbitrum, or Optimism at 0x-keep.xyz Follow protocol updates: @0xKeep_official

Back to Home