
GhostAction Phishing Campaign
OpenSourceMalware analyzes a targeted phishing email from my-github[.]com (same server 193.32.204[.]199 as GhostAction's CI/CD exfiltration) that impersonated a GitHub new-sign-in alert. Recovered HTML and a HAR show a GitHub reverse proxy that captures passwords and TOTP codes, rewrites GitHub subdomains, and injects JavaScript that silently completes an OAuth device flow with repo, workflow and read:org scopes, then exfiltrates the token to TCP/8443. It includes a per-session redirect controller, mutable redirect behavior seen in URLScan, a victim's audit-log outcome (MFA stopped escalation), IOCs, and response guidance.
What it is
OpenSourceMalware's write-up of a targeted phishing email from noreply@my-github[.]com ("[GitHub] New sign-in from Moscow, Russia"). It is the GhostAction operators' move from malicious Actions workflows to phishing maintainers. The domain resolves to 193.32.204[.]199, the same server that receives the stolen CI/CD secrets. The lure URL was https://my-github[.]com/SDRVuhYw.
How it works
- The site is a reverse proxy of real GitHub pages, not a static clone.
POST /sessionsends the login and password to the attacker origin. GitHub hostnames are rewritten togithub.,api.,docs.,support.andcollector.my-github.com. - An injected script waits for an authenticated-user avatar. It then starts an OAuth device flow with client ID
Ov23ctrqCqZ79UaYKwyqand scopesrepo+workflow+read:org. It loads/login/device, fills in the user code, addsauthorize=1and posts the approval through the victim's proxied session. The victim never types a code or approves anything knowingly. - The token goes to
https://my-github.com:8443/t?value=<token>&user=.... - A second script,
/s/6b159fd2…23f2.js, polls for JSON containingredirect_urland assigns it totop.location.href. This gives the operator per-session control over where the victim lands. - The
workflowscope fits the campaign's next step, committing files under.github/workflows/.
What to do
Block and hunt:
my-github.comand*.my-github.com193.32.204.199- TCP/8443 to the campaign domain
- the TXT record
google-site-verification=gp-lwE_I_dYU0TINi0fb4XEB0QpjviIXSPE69Kiyyew noreply@my-github.com- the subject fragment "New sign-in from Moscow, Russia"
- the lure IP
95.214.27[.]108in message bodies. It is lure content, not attacker infrastructure: RIPE places it in Bulgaria.
Static and telemetry markers: vh_device cookie, /vh_beacon, console strings VH1 ok, VH3 code, VH4 auth, VH5 TOKEN.
If someone opened the link and may have entered credentials or a code:
- Preserve browser, DNS, proxy and endpoint telemetry first.
- From a clean device, revoke sessions and tokens and reset credentials.
- Review SSH and GPG keys, OAuth and GitHub App authorizations, and repo and org activity.
- Remove any OAuth grant for client
Ov23ctrqCqZ79UaYKwyq. - Org owners should review OAuth app access policy.
- Check reachable repos for unexpected workflows, unsigned direct pushes, modified release assets, new deploy keys, changed webhooks and trigger-only commits.
- Rotate package-publishing, cloud, deployment and CI/CD secrets. Deleting a malicious workflow does not invalidate secrets already copied.
If you received a similar message, keep the original .eml file. Forwarded copies lose the headers.
Caveats
- The HAR proves the password and a one-time code were sent to the attacker origin. However, the OTP was posted to
/sessions/verified-device, and no POST of the/sessions/two-factorform appears. - The HAR shows no
/login/device/code, token or 8443 requests. The OAuth automation is confirmed from source only; successful token issuance and receipt are unverified. - Redirect behaviour is mutable. URLScan saw a Rickroll on 2026-10-09, then
github.comon 2026-10-10. Scanner results alone cannot clear the URL. The captured redirect response was HTML, not the JSON the controller expects. - The Amazon SES eu-west-1 delivery inference rests on a retained message-ID format only, and the original authentication headers are missing.
- The HTML's meta verification token
Apib7-…also appears in an unrelated PDF, so it is not a reliable pivot. The DNS token is the better one. my-gitlab[.]comis an unconfirmed watchlist item.- Phishing is not proven to have caused earlier GhostAction compromises.
- In the one victim they worked with, an additional MFA challenge stopped escalation, though the attacker did log in.
Organisations named here
- 193.32.204.199
- Amazon SES
- Loganaden Velvindron
- my-github.com
- OAuth device flow
- Ov23ctrqCqZ79UaYKwyq
- reverse-proxy phishing
- TOTP phishing
Technologies named here
- GitHub accounts of open-source developers and maintainers
- GitHub OAuth device flow
- GitHub Actions workflows and secrets
- GitHub authenticator-app TOTP two-factor authentication
- GitHub Security Audit Logs
- Downstream credentials reachable from maintainer accounts
- Amazon SES eu-west-1
- Wayback Machine, Common Crawl, OTX, RIPE
- Static/telemetry pivots
- GitHub
- OAuth
- GitHub Actions
- URLScan
- GitGuardian
- Amazon SES
Techniques named here
- Supply-chain attack via compromised maintainer accounts
Threat actors named here
- Related naming-pattern watchlist domain my-gitlab[.]com
- GhostAction
Related in Threat Intel
Reverse Engineering the Six Stages of MacSync Stealer and RAT
AI-Coded Malware | Analyzing Vibe-Coded AD Enumeration | Huntress
