The Month GitHub Public Contributions Exploded

To date, GitHub remains the most widely used code storage cloud platform. The amount of data pushed to GitHub every year is tremendous. In 2025 alone, GitGuardian’s Public Monitoring platform analyzed more than 2 billion commits. This represents around 5.5M commits per day and an impressive amount of data.

However, since July 2026, this number has exploded. In June, the commit rate was stable, at around 8 million commits per day, in line with the increasing trend we had observed over the past months. But starting in mid-July, the commit rate moved to 10 million on the 6th of July, then rose to 18 million on the 25th, up to nearly 40 million on July 31st. This is about 5x the June baseline.

Number of commits per day from June to August 5th

Upon inspection in our own monitoring, we noticed an unusually large number of commits with similar characteristics:

  • They are created on repositories that use a legitimate-looking username, but a completely random 6-letter lowercase name.
  • They use random e-mail addresses unrelated to the username, hosted on hotmail.com, outlook.com, and icloud.com.
  • The web-flow built-in GitHub user creates them.
  • They contain a long commit message that often contains the whole pushed file: only one per commit.

The committed files contain a mix of Chinese characters, domain names, URLs, and AI-generated images. Each repository can contain more than a thousand different files.

One of the many similar ad bearing repositories

In recent days, the number of those commits has become so high that it represents the majority of observable public events. Querying the GitHub Archive database, at the time of writing, out of the last 1,000 observed events, 728 are linked to those commits.

Similarly, this activity is now so dominant that querying GitHub’s public events feed yields mostly spam data.

$ curl "https://api.github.com/events?per_page=100" | jq .[].repo.name
fairchip250/hkrkor
rapidhawk0220/nxxrlb
bjarstae71/hdwvnf
bakbardo/ffgfkj
jppsmc/sgmcib
assanivewar9/lssorn
quiettree28943/tmvhqz
saxihafte/njzgow
se6776998/lylwts
emeraldtree3745/dvaeei
amberbyte5998/drqftk
runtechx/dns.runtech.ao
winder67fogr/genvcp
[...]

In fact, the public event feed is currently saturated, with the maximum capacity of 300 events at any given time reached.

$ curl -I "https://api.github.com/events?per_page=100" 
HTTP/2 200 
[..]
link: <https://api.github.com/events?per_page=100&page=2>; rel="next", <https://api.github.com/events?per_page=100&page=3>; rel="last"

What’s the point of this?

Most of the commits in this campaign reference short domain names hosted under the .cc and .vip TLDs. On a subset of 1,000,000 commits, we identified about 50 different domains. The whois data for those domains does not provide any meaningful information about their owners, except for one, RE87[.]VIP, which discloses a registrant organization name:

$ whois RE87[.]VIP
Domain Name: re87[.]vip
[...]
Registrant Organization: zhou yong kang

A reverse whois lookup on this name lands a hundred additional, similar-looking domains, registered between December 2025 and July 2026.

The hostnames point to various IP addresses, some of which are shared.  The 50 domains in our studied sample pointed to 22 different IP addresses. Most of those addresses are hosted in Hong Kong, on different AS (autonomous systems, the blocks of IP addresses each network operator manages independently):

  • CLOUDIE-HKD
  • CLOUDIE-HK
  • VAPELINE1-HK
  • NET4-9558400015 (HONGKONG CLOUD NETWORK TECHNOLOGY CO., LIMITED) via COGENT-149-88-16
  • RONGHE-HK

It is worth noting that the same domain set is also found advertised on other websites, mainly the Russian social network VK.

Querying the hosts over HTTP returns a simple page, consisting mainly of a JS script (domains modified to avoid unwanted browsing).

// 定义不同设备类型的域名列表
const mobileUrls = [
    'https://m.kwck37y5-ry556com[.]xyz',
    'https://m.q9sk3enp-ry557com[.]xyz',
    'https://m.gkbxm4zj-ry556com[.]xyz'
];

const desktopUrls = [
    'https://kwck37y5-ry556com[.]xyz',
    'https://q9sk3enp-ry557com[.]xyz',
    'https://gkbxm4zj-ry556com[.]xyz'
];

// 检测设备类型
function detectDeviceType() {
    const userAgent = navigator.userAgent;
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
    return isMobile ? 'mobile' : 'desktop';
}

// 测试域名打开速度
function testUrls(urls, callback) {
    const results = [];
    const startTime = Date.now();

    // 测试每个域名的响应速度
    urls.forEach((url, index) => {
        const img = new Image();
        img.onload = () => {
            const endTime = Date.now();
            results.push({ url, time: endTime - startTime });
            if (results.length === urls.length) {
                // 所有域名测试完成,调用回调函数
                callback(results);
            }
        };
        img.onerror = () => {
            // 如果图片加载失败,记录一个较大的时间
            const endTime = Date.now();
            results.push({ url, time: 1000 });
            if (results.length === urls.length) {
                // 所有域名测试完成,调用回调函数
                callback(results);
            }
        };
        img.src = `${url}/static/local/img/common/b81b0dcdf3f2107f.jpg`; // 假设每个域名下都有一个 test.jpg 文件
    });
}

// 选择最快域名并跳转
function redirectToFastestPage(urls) {
    testUrls(urls, (results) => {
        // 找到响应时间最短的域名
        const fastest = results.reduce((fastest, current) => {
            return current.time < fastest.time ? current : fastest;
        }, results[0]);

        // 跳转到最快的域名
        window.location.href = fastest.url+ '/register?key=686868';
    });
}

// 页面加载完成后执行跳转
window.onload = () => {
    const deviceType = detectDeviceType();
    const urls = deviceType === 'mobile' ? mobileUrls : desktopUrls;
    redirectToFastestPage(urls);

In essence, those hosts all serve as a redirection for other domains. Indeed, the script references 3 additional domains that follow a different naming pattern. It checks which of those hosts is the fastest and redirects the browser to it.

This behavior resembles a rudimentary implementation of a well-known technique used by online ad companies to optimize the ad load time on customers’ sites.

Here again, there are several second-level domains. From our original sample, we found 9 of them. The set of domains changes every day, and a given “frontend” domain can redirect to a different set of hosts. All second-level hosts are registered under the xyz TLD and resolve to an even smaller set of IP addresses:

  • 20.239.43.23
  • 20.255.186.227
  • 34.96.200.126
  • 57.158.72.61
  • 57.158.91.185

Those IP addresses all point to Google- or Microsoft-owned data centers in Hong Kong.

Last hop in this rabbit hole: the second-level hosts are queried over HTTPS on a /register endpoint. Querying it triggers a new redirection to a random-looking port on the same host.

$ curl -i https://fhnkzweq-hf332com[.]xyz/register HTTP/2 307 
server: openresty
date: Mon, 03 Aug 2026 15:56:13 GMT
content-type: text/html; charset=utf-8
content-length: 168
location: https://fhnkzweq-hf332com[.]xyz:5067/register

<html>
<head><title>307 Temporary Redirect</title></head>
<body>
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>openresty</center>
</body>
</html>

As it turns out, the hosts expose a large number of open TCP ports—half of which redirect to the other half at random.

All those layers of indirection ultimately lead to what appears to be a Chinese online gambling application.

Final website is an online lottery application

The copyright line at the bottom translates to “Rúyì cǎi”, a name widely reused throughout the whole site. This name matches the consumer brand name used by Beijing Jinruan Ruicai Technology Co, a company that operated paperless lottery services in China between 2010 and 2015. The company ceased online operations in 2015 when the Chinese government declared online lottery illegal.

Apart from impersonating the former lottery company, the site does not appear to have any malevolent behavior. Although some pages recommend downloading and using a VPN in case the site is geofenced, the download links appear to point to somewhat legitimate software (i.e., unknown Chinese VPN software).

Finally, the website advertises its own list of alternative domains that match the patterns and names we observed in the GitHub campaign, likely in an effort to be resilient against takedowns. This technique is common in threat actors' environments to ensure the continuity of illegitimate communication channels.

All in all, this massive campaign appears to have the sole purpose of promoting an illegal online lottery platform.

Same Pipeline, Different Detection

More than the illegal lottery site, the volume of public GitHub activity it took to get there is the interesting point: tens of millions of daily commits, more than 70% of public events, and an events feed pinned at its 300-event cap. At that scale, this spam accounts for the majority of what's visible on one of the Internet's largest public code bases.

It’s unclear what the site’s owners are trying to achieve with this campaign. The redirect chains and number of registered domains sound sufficient to ensure the site’s resilience. The presence of similar advertisements on VK could hint toward SEO optimization techniques: poor ones if we consider the current search results state. What we know for sure is the side effect on GitHub's public metrics: commit counts, repo counts, and active user counts are inflated by activity that has nothing to do with software development. The campaign also shows how, in the AI era, automating bot creation is increasingly easy, even on mature platforms like GitHub.

GitGuardian's Public Monitoring platform watches every commit pushed to GitHub, which is how this pattern surfaced in the first place: a sudden jump above our continuously tracked baseline, from 8 million commits a day in June to 40 million by the end of July. Catching that kind of shift as it happens, across millions of events a day, takes automated monitoring built for that scale.

Most of what we publish from our monitoring pipeline is about exposed secrets: API keys, credentials, and tokens leaking into public repositories. This campaign leaked something else: a redirect chain to an illegal gambling operation, but the mechanism for finding it was the same one we use every day. Whatever gets pushed to a public repository gets seen, credentials or campaign infrastructure alike.