P.K. SHARMA

Cyber security intelligence, AI governance, practitioner analysis

A Chinese-speaking crew turned Brazilian .gov sites into SEO infrastructure. Their Apache module strips the CSP on three paths and leaves the rest correct.

The homepage returns a valid policy, so the obvious check cannot fail. A security header is a property of a response, not of a site.

By Parminder Kumar Sharma · · 7 min read

An ornate brass keyhole escutcheon on a dark aged wooden door, with a thin beam of warm light escaping through the open keyhole into the darkness, lit by a crimson rim light.

Check Point Research published an account this morning of a Chinese-speaking cluster it calls Gambling Goblin, which has been compromising Brazilian government and educational web servers since mid-2025 and turning them into search-engine infrastructure for gambling and sports-betting fraud.

The reputation of a .gov.br domain is the asset being stolen. Not its data, not its users, its search ranking.

The mechanism is a malicious Apache module, and it contains the finding a defender can act on today. The module does not compromise the whole site. It rewrites three hardcoded path prefixes, reverse-proxies those to attacker infrastructure, forwards the original Host header, and strips the site's Content-Security-Policy for exactly those paths while leaving the rest of the server untouched.

One server, two postures, decided by the path

ONE SERVER, TWO POSTURES, DECIDED BY THE PATHSame hostname, same certificate, same Apache process. Only the prefix differs.A request arrivesone compromised .gov.br hostThe module reads the pathregistered at Apache’s name-translation stageANY OTHER PATHServes the site’s own contentRestrictive CSP, unchangedNothing to see in a header scanscript-src 'self'/wps  /bmw  /cardReverse-proxied to attacker IPOriginal Host header forwardedCSP replaced with a permissive one'unsafe-inline' 'unsafe-eval' https: data: blob:So curling your own homepage proves nothing. It is not the path that was changed.The certificate is valid, the domain is genuine, the reputation is real, and the browser protections are off for exactly three prefixes.AND THE MODULE ITSELF IS DRESSED TO PASS A GLANCECompiled on the victim with apxs, sources and build artefacts deleted, then timestomped to match mod_ssl or mod_suexec.Mechanism from Check Point Research, “Gaming the system”, 2 September 2026, which published the module’s source behaviour. Prefixes arethe ones in their samples and are hardcoded per build, so they are an indicator of these samples rather than a fixed list to search for.
The three prefixes are the least durable part of this and the easiest to over-fit to. They are compiled into the module, so the next build uses different ones. What transfers is the shape: a security header that is correct everywhere you look and absent where you do not.
Mechanism from Check Point Research's account of the module's source, published 2 September 2026. The three prefixes are the ones in their samples and are compiled into each build, so treat the shape as the finding rather than the strings.

Why the obvious check fails

A site owner who wants to know whether they are affected will fetch their own homepage and look at the response headers. That test cannot fail, because the homepage is not what was changed.

Check Point describe the module registering at Apache's name-translation stage and inspecting every incoming request for a small set of hardcoded prefixes, in their samples /wps, /bmw and /card. On a match the request becomes a reverse-proxy request to an upstream address compiled into the module. On anything else, nothing happens.

For the matched paths the module "strips the upstream site's Content-Security-Policy headers" and "replaces them with a deliberately permissive policy that allows inline and dynamically evaluated scripts, third-party assets, and data: and blob: sources".

So the site keeps a valid certificate, a genuine domain, a real reputation and a correct security policy everywhere anybody looks, and loses its browser protections on three paths nobody enumerated.

That is the transferable lesson, and it is not about Apache. A response header is a property of a response, not of a site. Any monitoring that samples one URL per domain is measuring the wrong thing.

Take this with you

What to actually run this week

  • Compare security headers across paths on your own estate, not just at the domain root. A Content-Security-Policy that is present on / and absent on /something is the signal here, and the differential is what makes it detectable at all.
  • Diff your loaded Apache modules against your configuration management, by content rather than by timestamp. The installer deletes its sources and build artefacts, then timestomps the .so and its load-config files to match mod_ssl or mod_suexec, so file dates are actively untrustworthy.
  • Look for apxs and Apache development packages on production web servers. The module is compiled on the victim, which means a build toolchain arrived on a machine that has no reason to hold one.
  • Check whether mod_proxy, mod_headers and mod_rewrite were enabled without a change record. The installer enables the stock modules its own module depends on, and that is a configuration change your change control should have seen.
  • Search your own domains in a search engine, restricted to your site, and read what comes back. This campaign is monetised through search results, so the poisoned pages are indexed by design and visible to you the same way they are visible to a victim.
  • Do not build detection around /wps, /bmw or /card. Those are hardcoded per build and the next one differs. The durable indicator is the header differential and the unexplained module.

What the research does not claim

Two things are stated plainly in the source and will not survive the retelling.

The initial access was never observed. Check Point say so directly: "We have not directly observed this group's initial access." What they found was an exposed open directory holding a Go binary, a scanning and reconnaissance agent the operators call cluster-asset-mapping, or cam-agent. That tells you what the group uses to find targets. It does not tell you how any specific server fell, and a chain diagram that begins with a scanner exploiting a web server is drawing an inference rather than an observation.

The attribution carries a stated confidence level. They "assess with medium-to-high confidence" that Gambling Goblin is tied to Earth Berberoka, the cluster Trend Micro documented in 2022, and they show their work: shared oRAT codebase and operator routes, an AlphaAgent sample uploaded in the same archive as previously attributed tooling, Chinese-language operator artefacts, lookalike domain tradecraft, and C2 on an Amazon ASN the group has used before.

That is how attribution should be published, and it is worth naming because the contrast is sharp. Yesterday we covered Google's report on Breeze Comet, another actor operating against Brazilian payment infrastructure. That report stated no confidence level at all, and one outlet nonetheless reported it as a high-confidence attribution. Same country, same week, two very different standards of disclosure.

The AI claim, and how hedged it currently is

One sentence in the research is going to travel further than its evidence.

Describing the Bash installer, Check Point note that "the script's status messages are written in Chinese and decorated with emoji, a style that may point to AI-assisted development".

Read it exactly as written. It is an observation about formatting, offered as a possibility, with no supporting analysis. It is not a claim that the malware was written by a model, and Check Point do not present it as one.

It will be reported as one. The pattern is now familiar enough on this site to predict: a hedged sentence in a vendor report becomes a headline, and the qualifier does not survive the second telling. We have watched it happen four times in a fortnight with exploitation claims. This is the same mechanism applied to AI attribution, which is a harder claim to falsify and therefore a more durable error.

What is established, and what is inferred

ClaimStanding in the source
The Apache module reverse-proxies three prefixes and strips CSPEstablished. They analysed the module’s source, opsproxy.c
Compiled on the victim, artefacts deleted, files timestompedEstablished. Described from the Bash installer
Phishing pages impersonate Google Play, Microsoft Store and Amazon, monetised through gamblingEstablished. Fetched from the hardcoded upstream addresses
Parallel networks in Vietnamese, Spanish and English, with daily domain generationEstablished. Found by pivoting through the infrastructure
Tied to Earth BerberokaAssessed at medium-to-high confidence, with three named overlaps
How any server was initially compromisedNot observed. Inferred from a scanner found in an open directory
AI-assisted developmentSpeculation, hedged as “may point to”, resting on emoji in status messages
One configuration change from delivering malwareA capability observation, not observed behaviour. Nothing is reported as having been delivered
Every row is from Check Point Research's account of 2 September 2026. The distinction matters because the strength of the evidence varies sharply across a single report, and a summary tends to flatten it.

The pattern worth naming

This is the third time in four days that a briefing here has come down to the same shape: a control that is genuinely present, and absent exactly where it matters.

Packagist removed thirteen malicious packages and the fourteenth stayed listed. The KEV catalogue holds a JFrog entry, and it is not the JFrog flaw being exploited. Now a government site serves a correct Content-Security-Policy on every path except the three that were rewritten.

In all three cases the check a competent person would run returns a clean result. That is not coincidence, it is selection: attackers who leave the obvious indicator intact survive longer than those who do not, so the surviving campaigns are the ones that look fine from the front.

The practical response is unglamorous and it is the same each time. Check the specific thing rather than the general one, by identifier rather than by product, by path rather than by domain.

Sources

  1. PrimaryGaming the system: how a Chinese-speaking actor turned Brazilian government sites into an SEO weapon, by Amit Yardeni, 2 September 2026Check Point Researchaccessed 2026-09-02
  2. PrimaryEarth Berberoka, the 2022 cluster Check Point assesses at medium-to-high confidence as the linkTrend Microaccessed 2026-09-02

Share this briefing

Know someone who owns this problem? Send it to them.

Related briefings

The briefing, in your inbox

Practitioner analysis of cyber and AI security news. No vendor noise.

One email per briefing. Unsubscribe any time.