
This is an article about pentesting blockchain infrastructure, wallets, and custodial apps. We did numerous security reviews of such “web2.5” systems and wanted to share our experience.
What is web2? Many would agree that in one phrase you can define it as “centralized (web) applications”.
What is web3? Conversely, we’ll define web3 as “decentralized applications”, such as L1 or L2 nodes, decentralized relayers, smart contracts, etc.
Now what the hell is web2.5? I defined anything between web2 and web3 as “web2 applications integrated with web3", such as on- and off-ramp solutions, CEX’s, wallets, deployment infrastructure, crypto payment gateways, etc.
Web2.5 is technically same as web2: centralized applications running on a single or a distributed infrastructure without any DLT, blockchain, or consensus.
However, there’s a Web2<>Web3 integration part which is crucial for the security of the whole system, and you need to know how to deal with the blockchain to be able to test it.
The attack surface of web2.5 is potentially bigger than in normal web2 because there’re more untrusted inputs and more execution flows to consider.

Looking at the data flows of the web2.5 systems, what are the untrusted inputs in web2.5 vs web2?
The inputs in web2 are:
The inputs in web2.5 include all above and also:
Let’s list some attack vector ideas that you can include in your penetration testing pipeline for various types of the web2.5 projects. This is not a full checklist but rather a list of a few partly non-obvious ideas that you can use during the engagements.
Off-ramp is a solution that allows people to exchange their crypto for the fiat money. Therefore, there should be a deposit component that has to correctly process the blockchain transactions to ensure that a user actually paid the required crypto amount.
This procedure is quite different from the normal fiat card transactions, so there’re a few specific attack scenarios.
Check the following test cases:
On-ramp is a solution that allows people to exchange their fiat money for crypto. Therefore, there should be a withdrawal component that sends crypto to a user.
If done without taking into account the blockchain peculiarities, this component could be vulnerable.
Check the following test cases:
Custody, as its name indicates, is a core component of any custodial system: it’s responsible for generating the keys, signing transactions, processing deposits and withdrawals.
If the custody is compromised, the whole product can go bankrupt, so it’s crucial to carefully audit it. For maximum coverage, we’d recommend taking a white-box approach additionally to black-box penetration testing.
Check the following test cases:
The client apps are mobile and desktop wallets, dApps, explorers, various frontends.
The security of such applications is often downplayed and boiled down to the developers’ trust level because the biggest problem could be backdoors. However, apart from intentional backdoors, there’re many other threats.
Check the following test cases:
All the components of a web2.5 system together form a web2.5 infrastructure. It could be a CEX, a custodial staking product, a trading solution, etc.
Check the following test cases:
There’re other server-side components of the web2.5 services that somehow interact with the blockchains. These could be, for example, analytic tools or deployment tools.
Check the following test cases:
Doing security reviews for web2.5 systems requires on one hand strong experience in the application security assessment, penetration testing, and on the other hand — understanding of the blockchains, smart contracts, and web3 in general.
It’s useful to take a bird view and try to think what kind of new data flows and new invariants does the integration with web3 add to a system.
Web2.5 Security was originally published in Decurity on Medium, where people are continuing the conversation by highlighting and responding to this story.
The researchers who write this are the ones who run the audits.