
Passed an Audit but Still Vulnerable? Here's Why
3 minutes ago
Nov 13, 2026

A clean audit report feels like a finish line. The findings are resolved, the badge goes on the website, the launch date is set, and everyone on the team breathes out. Then, a few weeks or months later, an audited protocol gets drained, and the question everybody asks is the obvious one: how can this happen when it was audited?
The uncomfortable answer is that an audit is much narrower than most people assume. A smart contract audit is an expert review of a defined set of code, at a specific point in time, against a specific set of assumptions. It tells you that qualified reviewers looked at that code and found, and helped fix, the issues they could identify within that scope. It does not tell you that the protocol is safe in every circumstance, forever. Those are very different claims, and confusing the two is behind a surprising number of real incidents.
None of this is an argument against audits. They catch serious problems, and launching without one is a gamble no responsible team should take. The point is that an audit is one control in a security programme, not the whole programme. If you are not sure what a report really covers, our guide on what to look for in a security audit report is a good starting point.
An audit reviews the code as it existed on a particular date, usually a specific commit. The moment the team adds a feature, tweaks a fee mechanism, integrates a new asset or refactors a function, the audited version and the live version begin to drift apart. Each change, however small, can introduce a flaw or quietly break an assumption that the original review relied on.
This is one of the most common failure patterns in the industry. A protocol is audited, ships, and then keeps iterating quickly because the market demands it. Months later, a meaningful share of the logic has never been reviewed by anyone outside the team. Our guide on how often smart contracts should be audited explains why a single report rarely covers a contract's whole lifecycle.
It sounds almost too basic to mention, but it happens: the contract that ends up on-chain is not exactly the one that was reviewed. A last minute fix gets pushed, a constructor parameter is set incorrectly, a different compiler version is used, or an old build is deployed by mistake. The audit report refers to one version, and the live contract is another.
The fix is procedural. Verify that the deployed bytecode matches the audited commit, confirm that configuration values match what was reviewed, and publish the verified source so that anyone can check. A crypto contract scanner can help with a quick independent look at a deployed address.
Audit reports usually track the status of each finding: fixed, partially fixed, acknowledged or disputed. A finding marked as acknowledged means the team understood the issue and chose not to resolve it, sometimes for a good reason, and sometimes because of a deadline. Over time, it is easy for those unresolved items to be forgotten, even though the report still carries the project's name and a reassuring headline.
When a protocol is exploited through a weakness that was technically flagged in its own audit, it is rarely because the auditors missed it. It is because the finding sat in the report without a proper fix and a re-review. Treat every open finding as a live risk until it is closed and verified.
Scope is where a lot of false confidence comes from. An audit might cover the core vault contracts but exclude the governance module, the oracle integration, the upgrade proxy or a recently added strategy. The report is accurate about what it reviewed. But the exploited component was never in scope, and users reading a headline that says audited had no way of knowing.
If part of your system holds, routes or controls value, it belongs in scope. If budget forces a smaller review, be honest about what was excluded, and plan the next review for those pieces. Our overview of what a smart contract audit costs can help you plan a scope that matches your real risk.
A flawless contract can still be controlled by a weak key. If an owner or admin address can upgrade the contract, change fees, mint tokens or move funds, then whoever holds that key effectively holds the protocol. A single externally owned account, a leaked deployer key, or a multisig with too few signers and too much concentration of trust turns a secure codebase into a single point of failure.
Audits generally flag centralisation risks, but they cannot fix how a team stores keys, who has access, or how quickly access is revoked when someone leaves. Hardware security modules or multi party computation, genuine multisig approval, timelocks on upgrades and a documented offboarding process are operational controls that live outside the code.
DeFi protocols do not exist in isolation. They read prices from oracles, route trades through other protocols, hold tokens issued by third parties and sometimes depend on bridges to move assets. Each of those is a dependency whose behaviour can change, fail or be manipulated.
An oracle that can be nudged with a flash loan, a token with unusual transfer logic, or a bridge with a weak validator set can all undermine a protocol whose own code is perfectly sound. Audits typically assume that external components behave as documented. Attackers do not. If your protocol touches cross-chain infrastructure, our explainer on what a crypto bridge is is worth reading for the risks it introduces.
Code can do exactly what it was written to do and still be exploitable, because the design itself has a flaw. Incentives that can be gamed, reward formulas that break under extreme inputs, collateral rules that fail in a sharp market drop, or governance that can be bought cheaply are all economic problems rather than coding bugs.
Some audits examine this closely and others focus mainly on implementation. Be clear with your auditor about whether economic modelling is in scope, and consider a separate review of your incentives. Our guide to tokenomics design principles covers the design side of the question.
Finally, a protocol is more than its contracts. Front ends, DNS records, APIs, cloud accounts, build pipelines and team devices all sit around the on-chain code. A hijacked front end can trick users into signing a malicious transaction. A compromised developer machine can leak a key. A poisoned dependency in a build step can ship malicious code. None of that appears in a smart contract audit, because none of it is a smart contract.
If any of the following sounds familiar, your audit may be giving you more comfort than it deserves:
Treat any change to core logic, fee mechanics, permissions or integrations as a trigger for a new review, scaled to the risk it introduces. A focused review of a diff is far cheaper than a full audit, and far cheaper than an incident.
Check that the deployed bytecode and constructor settings match what was audited, publish verified source code, and keep a record linking each deployment to the commit that was reviewed.
Fixes can introduce new bugs, particularly when made under time pressure. A follow-up review confirms that each remediation works and has not created a new problem.
Include governance, oracles, upgrade proxies and any module that can move or lock funds. If something has to be left out, document it and schedule it.
Different techniques find different problems. Penetration testing examines the infrastructure around your contracts, such as APIs, admin interfaces and cloud environments. Formal verification can mathematically prove that critical properties hold under every input, which is especially valuable for core accounting and access control logic. Combining manual review with black box and white box testing gives a more complete picture than any single approach. Depending on your stack, a specialist review such as an Ethereum smart contract audit or a Rust smart contract audit will also bring chain specific expertise that a generalist review can miss.
An audit cannot watch your protocol after it goes live. Real time monitoring can flag abnormal transaction patterns, unusual contract calls and suspicious wallet behaviour as they happen, giving your team a chance to pause the system before an exploit drains everything. Monitoring is the control that covers the gaps every point in time review leaves behind.
Use multisig and hardware backed key storage, apply least privilege, put timelocks on upgrades, rehearse an incident response plan and review access regularly. Our list of cybersecurity best practices for Web3 businesses covers many of these habits, and our overview of common smart contract vulnerabilities is a useful reference for what reviewers look for in the code itself.
If you are a user or investor rather than a builder, you can still ask sensible questions. Is the audit recent, and does it match the deployed contract? Were all high and critical findings fixed? What was out of scope? Who controls the admin keys, and is there a timelock? Has the code changed since the report? A quick run through free smart contract audit tools and our guide on how to check if a smart contract is safe can help you answer several of these yourself.
An audit is one of the most valuable things a protocol can do for its security, and it is also only one layer of it. It reviews a defined scope at a single moment in time. Code changes, deployments drift, findings go unfixed, keys get mishandled, dependencies fail, incentives get gamed and the infrastructure around the contracts gets attacked, all without a single line of audited code being at fault.
The protocols that stay safe tend to treat the audit as the beginning of a security programme: re-reviewing after change, verifying deployments, closing every finding, testing the surrounding systems, locking down keys and watching their contracts around the clock. If you want a partner for that whole lifecycle, rather than a one off report, talk to Cyberscope about your next audit and what should sit around it.