Payload Logo
Important

The Day My GitHub Got Compromised: A Multi-Layer Malware Analysis

Author

Spicy Lyrics

Date Published

(posting this here, cause some Spicy Lyrics repos had malicious commits made)

Note: The following analysis contains code samples for educational purposes only. I've shared the obfuscation and delivery mechanisms to raise awareness, but have omitted the complete weaponized payload.


Well, it happened.

I was always like "ah, who would want to compromise MY GitHub account, right?" ...right?

Well I was wrong, and it happened.

On December 23, 2025, around 12 PM CET (noon), malicious code was pushed to a LOT of my repos — including both public and private ones. The attacker had somehow gained access to my account and systematically injected sophisticated malware across multiple repositories.

Initial Discovery

Thankfully, from my investigation, the code didn't leak to the main part of our backend services. Some of the builds failed, some ran, but thankfully they were isolated. The first indication something was wrong came when Vercel sent me an email about a deployment failing. Later when I got onto my computer, I decided to check my Vercel and GitHub repo, and there it was. The classic `preinstall.js`!


The Attack Architecture

Layer 1: Unicode Steganography

The initial infection vector used an advanced technique called Unicode steganography — hiding malicious code inside invisible Unicode characters (Variation Selectors). When you open the file in a code editor, it appears nearly empty or shows just a vertical bar. However, the file actually contains thousands of invisible characters that encode the entire next-stage payload.


The malware uses Unicode ranges U+FE00-FE0F and U+E0100-E+E01EF to hide data in plain sight. It extracts the low byte from each Unicode codepoint and reconstructs executable JavaScript that gets passed to eval().

Why this works: Visual code inspection fails completely. Certain developers scrolling through commits would see what appears to be an empty file or harmless code.

Layer 2: Sandbox Evasion

One variant included a 15-minute sleep delay before execution:

Most automated malware sandboxes timeout after 5-10 minutes, so the code would never execute in the analysis environment.

Layer 3: AES-256 Encrypted Payload

The third layer is a 54KB blob of AES-256-CBC encrypted data. The decryption keys are dynamically retrieved from HTTP response headers when downloading from the attacker's server:

Header: ivbase64 - initialization vector

Header: secretkey - 256-bit AES key


Only after successful decryption does the actual malicious code become visible.

Why this works: Static analysis tools cannot determine what the payload does without executing the code and fetching the decryption keys from a live server.

Layer 4: Blockchain-Based C2

The fourth layer implement the Solana blockchain as command-and-control infrastructure. Instead of using traditional C2 servers that can be taken down, the malware queries the Solana blockchain for configuration.

Specifically, it polls transaction memos from address BjVe... every 10 seconds, looking for JSON payloads containing:

URLs to download encrypted payloads

Decryption parameters passed via HTTP headers

The malware also implements persistence by creating an init.json file in the user's home directory, tracking infection age and preventing re-execution if the infection is less than 2 days old.

Why this works: Blockchain queries look like legitimate API traffic. The infrastructure is censorship-resistant and costs attackers nothing to maintain. Security tools monitoring for suspicious domains won't flag public blockchain RPC endpoints.

The code below executes the final payload for macOS devices:

Final Payload: Cryptocurrency Stealer

After all layers are unpacked, the malware executes a comprehensive data theft operation targeting macOS systems.

(We currently only extracted and analyzed the script that would run on macOS. Currently we're unsure how the script for other OSes works and looks like).

Browser Data Theft:

- Credentials from Chrome, Brave, Edge, Vivaldi, Opera, Firefox, Waterfox

- Cookies, form history, autofill data

- Encrypted password stores

- macOS Keychain database

Cryptocurrency Wallets:

- 150+ browser extension wallets (MetaMask and others)

- Desktop wallets: Electrum, Exodus, Ledger Live, Trezor Suite, Atomic, Coinomi, Wasabi, Bitcoin Core, Litecoin Core, Monero, and many more

- Configuration files from Binance, TonKeeper

Password Harvesting:
The malware displays a fake system dialog: "Required Application Helper. Please enter password for continue" with title "Application wants to install helper" — tricking users into entering their macOS password, which then gets validated and stored.

Document Exfiltration:
Scans Desktop, Documents, and Downloads for files matching extensions: txt, pdf, docx, zip, wallet, key, keys, doc, jpeg, png (up to 10MB total). Also targets Apple Notes databases.

Data Exfiltration:
All stolen data gets compressed into /tmp/out.zip and uploaded to:

- C2 Server: 45.32.150.251 (Vultr VPS, France)

- Payload Host: 45.32.151.157 (Vultr VPS, France)


Wallet Application Replacement:
If Ledger Live or Trezor Suite are detected, the malware downloads and installs trojanized versions from the attacker's server, replacing legitimate applications. These fake wallets intercept cryptocurrency transactions.

Infrastructure Details

@blueworldclass traced both IP addresses to Vultr hosted in France (same IP range, confirming shared infrastructure). The good news: Vultr is not a bulletproof hosting provider, and the malicious infrastructure was reported and likely taken down.

How Did They Get In?

I'm still investigating the initial compromise vector. The attack happening at noon suggests it could have been manual or triggered by something I did during normal development hours (since I wasn't at my computer at the time).

Likely candidates include:

- Compromised personal access token

- Leaked credentials from a previous breach

- Phishing attack I didn't catch

- Compromised development environment or IDE extension

Indicators of Compromise

If you think you might be affected, check for:

- Files: /tmp/ijewf/, /tmp/out.zip, /tmp/script_lock.tmp

- File in home directory: init.json

- Keychain entry: pass_users_for_script

- Network connections to Solana RPC endpoints or the Vultr IPs above

- Suspicious Unicode characters in JavaScript files

Lessons Learned

Use commit signing — GPG-signed commits make it harder for attackers to impersonate you

Monitor repository webhooks — Set up alerts for unauthorized commits

Review access tokens regularly — Rotate and remove unused tokens

Don't trust "empty" files — Unicode steganography is real and effective

Sandbox dependency updates — Test new dependencies in isolated environments

Supply chain attacks are evolving — Multiple encryption layers and blockchain C2 represent the new normal

Immediate Actions I Took

- Reset GitHub password with 2FA enabled

- Force-pushed clean commits to affected repositories

- Scanned all systems for the indicators above

- Reviewed audit logs for other compromised services

Timeline

December 23, ~12 PM CET: Initial compromise, malicious commits pushed

December 23, also ~12 PM CET: Commits reverted

December 23 8:36 PM CET: @blueworldclass contacts me with deeper analysis

December 23: @blueworldclass reports infrastructure to Vultr, remediation begins

Final Thoughts

This attack was remarkably sophisticated — far beyond what I'd expect targeting an individual developer. The combination of Unicode steganography, blockchain infrastructure, multi-stage encryption, and sandbox evasion shows a well-resourced threat actor.

If you maintain open-source projects or work with sensitive codebases, take this as a wake-up call. Modern supply chain attacks aren't just about typosquatting packages — they're about compromising legitimate maintainer accounts and injecting nearly-invisible malware that can survive multiple layers of code review.

Stay vigilant. Review commits, take security seriously.


Special thanks to @blueworldclass for the deep discovery and analysis.

The Vultr infrastructure has been reported and is likely offline. However, attackers can easily spin up new infrastructure, so remain vigilant for similar patterns in your own projects.


I will be updating this blog post as we gather more information.

I've also reported this incident to GitHub Support.


Wanna contribute? Contact me on my Discord @spikerko, or let us know at hi@spicylyrics.org.