Skip to main content

On 14 August, Decrypt reported that Singapore authorities have put the bill for fake LinkedIn crypto job scams at $11.8 million. The interesting part is not the number. It is the method: malware planted during a bogus coding assessment harvested a session token, bypassed multi factor authentication, and reached a code repository.

Read that again. No key was cracked. No contract was exploited. No oracle was manipulated. Somebody applied for a job, was asked to complete a take home task, ran it, and the attacker inherited a live session into the place where the software gets written.

TL;DR

  • Singapore authorities link $11.8 million in losses to fake LinkedIn crypto job offers, with malware delivered through a fake coding assessment (Decrypt, 14 August 2026).
  • The attack harvested a session token, defeating multi factor authentication, and reached a code repository. Nothing cryptographic failed.
  • This is the twentieth unasked half of fairness: THE VERSION YOU DID NOT PIN. Every fairness claim describes a snapshot of code, while players interact with whatever is deployed today.
  • The test: not “is this game fair”, but “who can change this game after I have checked it, and would I be able to see the change happen”.
  • Satoshie’s answer is subtraction rather than assurance: contracts on Base with no admin key and no upgradeable proxy, so changing the logic means deploying to a new address, in public, in a block.

The attack surface was a career, not a cipher

Crypto security discourse is obsessed with the parts that are mathematically interesting. Elliptic curves. Post quantum roadmaps. Reentrancy. The actual attack path here ran through ambition: a recruiter message, a flattering job description, a technical assessment a developer wanted to pass.

And once the malware ran, the target was not the developer’s wallet. It was their repository access. A drained wallet is a theft with a fixed size. Repository access is a position: the ability to influence what everybody else runs later, at a time of your choosing.

The industry has been trained by three years of headlines to ask whether a protocol has been audited. Almost nobody asks the follow up question, which is the one this story quietly poses: audited when, and who has been able to push since?

The twentieth unasked half: the version you did not pin

Every fairness claim in this industry is a claim about a specific artefact at a specific moment. “Our RNG was certified.” “Our contract was audited by a reputable firm.” “We integrate Chainlink VRF.” All of those sentences have an invisible timestamp attached, and none of them come with a guarantee that the thing described is the thing currently taking your money.

Software is not a document. It is a moving target maintained by people who can be phished, bribed, impersonated or, as in Singapore, simply invited to an interview. The gap between “the code that was reviewed” and “the code that runs when you press the button” is not a theoretical concern. It is the normal operating condition of every product you use.

So the test this story produces is not about honesty at all. It is about mutability:

If somebody wanted to change the rules of this game tomorrow morning, what would they need, and what would I see?

Three answers are possible. In a closed web2 casino, they would need a deployment pipeline, which they already have, and you would see nothing, because there is no observable version number on a server binary. In an upgradeable smart contract, they would need the admin key, and you would see a transaction, if you were watching the right address and knew what an upgrade looks like. In an immutable contract, they would need to deploy an entirely new contract at a new address, and you would see it, because the old one still sits there behaving exactly as it did yesterday.

Why gaming is a worse case than wallets

Wallet software and exchange backends get compromised too, but they have a forensic advantage: the damage eventually appears on chain as coins moving. Somebody notices. Somebody tweets a transaction hash. The failure is loud.

Gaming has no such tell. A payout function quietly amended to shave two percent off a win rate produces exactly what an unlucky fortnight produces. There is no theft transaction, no drained treasury, no incident report, just a slow, statistically deniable transfer from players to the house. Three properties stack against the player: frequency, because a casino resolves thousands of outcomes a day and each is an opportunity; invisibility, because the outcome distribution is the only evidence and it is noisy by design; and incentive, because the code change an attacker would make is the same one a dishonest operator would make for profit. Nobody at a hardware wallet company profits from weak entropy. Somebody at a closed casino profits daily from a shaved payout table.

The honest limits

Immutability does not make you immune to a compromised developer. If a project ships an upgradeable proxy and the deploy key ends up on an attacker’s machine, the attacker owns the game, and no amount of verifiable randomness will help. Chainlink VRF answers exactly one question, “was this draw manipulated”, and it is completely silent on who controls the contract that consumes the result. A perfect VRF integration inside a contract with an owner function that can rewrite the payout logic is theatre with better props.

Nor does immutability protect the front end. Somebody with repository access can change the website rather than the contract, point your browser at a different address, and the honest contract will sit there being honest while nobody uses it. That is the fourth unasked half, and it still holds.

What immutability actually buys is narrower and more useful than it sounds. It converts a silent, deniable, gradual change into a discrete public event with a timestamp and a block number. It does not prevent betrayal. It makes betrayal something you can point at.

What this means for Satoshie

Satoshie’s raffles and coinflip run as contracts on Base with no admin key and no upgradeable proxy. There is no owner function that can adjust odds, no pause switch that can strand an in flight draw, no migration path that moves your entry into a contract you never agreed to. The VRF coordinator is fixed at deployment. If we wanted to change how a game works, we could not push it: we would have to deploy something new, at a new address, and ask you to use it, in full view, with the old contract still sitting on chain as a permanent record of what it always did.

That is not a claim about our integrity, and it should not be read as one. It is a claim about the size of the hole a compromised laptop could put in the product, which is the only security property worth advertising. Go and check it. Pull the contract on Basescan, look for an upgrade mechanism, look for an owner, and if you find one on any platform you play on, ask who holds it and what their recruitment process looks like.

The right question was never “do you trust them”. It is “what would they have to do to change this, and would you find out”.

📷 Photo by Pankaj Patel on Unsplash

Valentina Ní Críonna

Author Valentina Ní Críonna

More posts by Valentina Ní Críonna