Transparent Tribe (APT36/Earth Karkaddan) is actively targeting government and defense entities in India and Afghanistan with a previously undocumented Rust implant family — RUSTYSHADE, RUSTYMOVE, PSNATCH, and BASHNATCH — using private GitHub repositories as command-and-control infrastructure. If your SOC treats GitHub traffic as implicitly trusted, you have a blind spot this campaign is built to exploit.
Introduction
Zscaler ThreatLabz has attributed a fresh wave of intrusions to Transparent Tribe, the Pakistan-aligned threat actor also tracked as APT36 and Earth Karkaddan. The campaign — reported under an operation codename — introduces an entirely new toolset: RUSTYSHADE and RUSTYMOVE, implants written in Rust; PSNATCH, a PowerShell-based payload; and BASHNATCH, a Bash-based counterpart for Linux targets. The targeting is precise: government and defense organizations in India and Afghanistan.
Two aspects of this campaign demand immediate defensive attention. First, the shift to Rust is not cosmetic. Rust binaries compile to large, statically-linked executables that defeat many signature-based detections, complicate reverse engineering, and let the actor ship one codebase across Windows and Linux. Second, the use of private GitHub repositories as a C2 channel is a deliberate evasion play. GitHub is on virtually every enterprise allowlist; TLS-encrypted traffic to api.github.com and raw.githubusercontent.com blends into developer noise, and token-authenticated access to private repos means defenders cannot passively observe the C2 content from outside.
This is confirmed, in-the-wild, nation-state-attributed activity — not a theoretical capability. Defense-sector and government networks in South Asia are the named targets, but any organization with geopolitical adjacency, defense supply-chain exposure, or diplomatic missions in the region should treat this as actionable intelligence.
Technical Analysis
Threat actor and targeting
Transparent Tribe (APT36 / Earth Karkaddan) is a long-running espionage actor historically focused on Indian government, military, diplomatic, and education sectors. This campaign extends targeting to Afghan government and defense entities. There is no CVE associated with this activity — this is a capability-driven intrusion set, not vulnerability exploitation. Initial access for APT36 historically relies on spear-phishing with malicious documents and trojanized installers; defenders should assume the same delivery vector until ThreatLabz publishes otherwise.
The new toolset
| Tool | Language | Platform | Role (per reporting) |
|---|---|---|---|
| RUSTYSHADE | Rust | Windows (primary) | Core implant / backdoor |
| RUSTYMOVE | Rust | Windows | Secondary Rust-stage tooling (lateral movement / tasking support) |
| PSNATCH | PowerShell | Windows | Script-based payload, likely staging/collection |
| BASHNATCH | Bash | Linux | Script-based payload for Linux targets |
The paired PSNATCH/BASHNATCH design mirrors the cross-platform intent of the Rust components: APT36 wants one operational playbook that executes on both Windows endpoints and Linux servers common in government infrastructure.
GitHub-as-C2: how it works (defender's view)
The implants authenticate to GitHub using an embedded or retrieved personal access token (PAT) and interact with attacker-controlled private repositories as a dead-drop C2 channel. The typical pattern for this technique:
- Tasking: The implant polls GitHub's REST API (
api.github.com/repos/<owner>/<repo>/contents/..., commit history, or issue/gist comments) to retrieve encrypted or encoded tasking. - Execution: Commands run locally; Rust implants commonly shell out to
cmd.exe, PowerShell, or/bin/bashfor execution. - Exfiltration: Results are staged, compressed/encrypted, and pushed back as commits, file uploads, or release assets — outbound traffic is standard HTTPS to GitHub domains over 443.
Why this defeats naive controls: domain-reputation filtering sees github.com (trusted); TLS inspection without endpoint telemetry sees encrypted API calls indistinguishable from a developer's IDE; and because the repositories are private, external researchers and takedown teams cannot enumerate the C2 content without the token.
Where it fails (your opportunity): developer workstations poll GitHub from browsers, git clients, IDEs, and CI runners — not from unsigned, freshly-dropped PEs in user-profile directories, and not on rigid beacon-like intervals from servers with no developer function. The process context of the connection is the detection surface, not the destination.
Rust binary observable characteristics
Rust-compiled implants present consistent, huntable traits:
- Large file size (often 3–15 MB) for a single-purpose binary due to static linking
- Embedded strings referencing the Rust toolchain (
rustc, cargo build paths such as/rustc/...orC:\Users\<dev>\.cargo\) - Frequently unsigned, dropped in
%APPDATA%,%LOCALAPPDATA%\Temp,C:\ProgramData, or user-writable paths masquerading as legitimate software (update services, document readers) - Child processes of
cmd.exe,powershell.exe, orwscript.exe/mshta.exewhen delivered via phishing documents or script loaders
Exploitation status
- Active exploitation: Confirmed. This is an in-the-wild espionage campaign against named government and defense targets.
- CVE / CISA KEV: None. No vulnerability identifier is associated with this reporting; do not hunt for a patch — hunt for behavior.
- Attribution confidence: Zscaler ThreatLabz attributes with stated confidence to Transparent Tribe based on infrastructure, targeting, and tooling overlaps.
Detection & Response
The defensible detection surface for this campaign is: (1) Rust-implant execution context — unsigned binaries in user-writable paths spawning shells; (2) script-based staging via PowerShell and Bash consistent with PSNATCH/BASHNATCH; (3) non-developer processes establishing TLS sessions to GitHub API/content endpoints, especially with periodic timing. The rules below target those behaviors without relying on per-campaign hashes that will rotate.
---
title: Unsigned Binary in User-Writable Path Spawning Shell - Suspected Rust Implant Behavior
id: 3f8a2c41-7b1e-4d9a-b6c2-9e5f0a1d3c4b
status: experimental
description: Detects unsigned executables running from user-profile or ProgramData paths spawning cmd.exe or powershell.exe, consistent with Rust-based implants (RUSTYSHADE/RUSTYMOVE) executing tasking retrieved from dead-drop C2.
references:
- https://thehackernews.com/2026/09/transparent-tribe-deploys-new-rust.html
- https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/09/15
tags:
- attack.execution
- attack.t1059
logsource:
category: process_creation
product: windows
detection:
selection_path:
ParentImage|contains:
- '\AppData\Roaming\'
- '\AppData\Local\'
- '\ProgramData\'
- '\Users\Public\'
selection_child:
Image|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\pwsh.exe'
filter_known:
ParentImage|contains:
- '\Microsoft\Teams\'
- '\slack\'
- '\discord\'
- '\Code\'
- '\JetBrains\'
condition: selection_path and selection_child and not filter_known
falsepositives:
- Electron-based chat/collaboration apps spawning shells for updates
- Developer tooling installed in user scope
level: high
---
title: Non-Developer Process Network Connection to GitHub API
id: 8c1d4e72-5a3b-4f6c-9d2e-1b7a0c3e5f68
status: experimental
description: Detects processes outside an expected developer/tooling baseline initiating connections to GitHub API or raw content endpoints, consistent with implants using private GitHub repositories as a dead-drop C2 channel as reported for Transparent Tribe.
references:
- https://thehackernews.com/2026/09/transparent-tribe-deploys-new-rust.html
- https://attack.mitre.org/techniques/T1102/
author: Security Arsenal
date: 2026/09/15
tags:
- attack.command_and_control
- attack.t1102.002
logsource:
category: network_connection
product: windows
detection:
selection_dest:
DestinationHostname|endswith:
- 'api.github.com'
- 'raw.githubusercontent.com'
- 'uploads.github.com'
- 'objects.githubusercontent.com'
filter_tools:
Image|endswith:
- '\git.exe'
- '\git-remote-https.exe'
- '\gh.exe'
- '\Code.exe'
- '\devenv.exe'
- '\idea64.exe'
- '\cursor.exe'
- '\node.exe'
- '\python.exe'
- '\chrome.exe'
- '\msedge.exe'
- '\firefox.exe'
filter_path:
Image|contains:
- '\GitHub Desktop\'
- '\GitHubDesktop\'
condition: selection_dest and not filter_tools and not filter_path
falsepositives:
- Package managers and auto-updaters fetching from GitHub (tune per environment baseline)
- CI/CD agents - scope out build server subnets in your SIEM layer
level: high
---
title: Encoded or Download-Cradle PowerShell Consistent with PSNATCH-Style Staging
id: 5e2b9a18-4c7d-4e1a-8f3b-6d0c2a9b1e47
status: experimental
description: Detects PowerShell execution patterns typical of script-based payloads such as PSNATCH - encoded commands, download cradles, and hidden window execution from non-standard parent processes.
references:
- https://thehackernews.com/2026/09/transparent-tribe-deploys-new-rust.html
- https://attack.mitre.org/techniques/T1059/001/
author: Security Arsenal
date: 2026/09/15
tags:
- attack.execution
- attack.t1059.001
logsource:
category: process_creation
product: windows
detection:
selection_img:
Image|endswith:
- '\powershell.exe'
- '\pwsh.exe'
selection_flags:
CommandLine|contains:
- ' -enc '
- ' -encodedcommand'
- ' -ec '
- ' -w hidden'
- ' -windowstyle hidden'
- 'iex('
- 'invoke-expression'
- 'downloadstring'
- 'invoke-webrequest'
- 'invoke-restmethod'
filter_admin:
ParentImage|endswith:
- '\sccm\ccmexec.exe'
- '\svchost.exe'
condition: selection_img and selection_flags and not filter_admin
falsepositives:
- Enterprise software deployment tooling using encoded PowerShell
- Administrative automation - baseline and allowlist known management parent processes
level: medium
// Hunt: Processes outside a developer baseline talking to GitHub C2-capable endpoints,
// correlated with periodic (beacon-like) connection cadence - Transparent Tribe GitHub dead-drop C2 pattern.
let Lookback = 7d;
let GitHubEndpoints = dynamic(["api.github.com", "raw.githubusercontent.com", "objects.githubusercontent.com", "uploads.github.com"]);
let DevTools = dynamic(["git.exe", "git-remote-https.exe", "gh.exe", "Code.exe", "devenv.exe", "node.exe",
"python.exe", "chrome.exe", "msedge.exe", "firefox.exe", "idea64.exe", "cursor.exe", "GitHubDesktop.exe"]);
DeviceNetworkEvents
| where TimeGenerated > ago(Lookback)
| where RemoteUrl in (GitHubEndpoints) or RemoteUrl endswith ".githubusercontent.com"
| where not (InitiatingProcessFileName in (DevTools))
| summarize ConnectionCount = count(),
FirstSeen = min(TimeGenerated),
LastSeen = max(TimeGenerated),
DistinctRemoteIPs = dcount(RemoteIP),
CommandLines = make_set(InitiatingProcessCommandLine, 5)
by DeviceName, InitiatingProcessFileName, InitiatingProcessFolderPath, RemoteUrl
| where ConnectionCount >= 10 // periodic polling over the lookback window
| extend SuspiciousPath = InitiatingProcessFolderPath has_any ("\\AppData\\", "\\ProgramData\\", "\\Users\\Public\\", "\\Temp\\")
| project FirstSeen, LastSeen, DeviceName, InitiatingProcessFileName, InitiatingProcessFolderPath,
RemoteUrl, ConnectionCount, SuspiciousPath, CommandLines
| order by SuspiciousPath desc, ConnectionCount desc;
-- Hunt: Unsigned/odd executables in user-writable paths with active or recent
-- network connections to GitHub infrastructure - RUSTYSHADE/RUSTYMOVE endpoint sweep.
LET conns <= SELECT Pid, Name, Path, Status,
Laddr.IP AS LocalIP, Laddr.Port AS LocalPort,
Raddr.IP AS RemoteIP, Raddr.Port AS RemotePort
FROM netstat()
WHERE RemotePort = 443
AND (Path =~ '(?i)AppData|ProgramData|Users\\\\Public|Temp')
SELECT Pid, Name, Path, Status, LocalIP, LocalPort, RemoteIP, RemotePort,
timestamp(epoch=now()) AS CollectionTime
FROM conns
ORDER BY Name
-- Companion artifact: enumerate recently created executables in staging directories
-- LET drops <= SELECT FullPath, Size, Mtime, Btime
-- FROM glob(globs=['C:/Users/*/AppData/Roaming/**/*.exe',
-- 'C:/Users/*/AppData/Local/**/*.exe',
-- 'C:/ProgramData/**/*.exe'])
-- WHERE Mtime > now() - 1209600 -- last 14 days
-- AND Size > 2000000 -- Rust static binaries are typically multi-MB
-- SELECT FullPath, Size, Mtime FROM drops ORDER BY Mtime DESC
# Transparent Tribe / GitHub-C2 exposure audit and hardening - run elevated on Windows endpoints.
# Purpose: (1) find non-developer processes holding GitHub sessions, (2) audit staging dirs for
# recent large unsigned binaries, (3) verify Script Block Logging for PSNATCH-style payloads.
$ghCidrs = @("140.82.112.0/20","185.199.108.0/22","4.237.0.0/16","20.26.0.0/16") # core GitHub ranges - refresh from https://api.github.com/meta
# 1. Live connections to GitHub from unexpected processes
$ghIPs = (Invoke-RestMethod -Uri "https://api.github.com/meta" -UseBasicParsing).web +
(Invoke-RestMethod -Uri "https://api.github.com/meta" -UseBasicParsing).api |
Where-Object { $_ -match '^\d' } | ForEach-Object { ($_ -split '/')[0] }
Get-NetTCPConnection -State Established -RemotePort 443 -ErrorAction SilentlyContinue |
Where-Object { $ghIPs -contains $_.RemoteAddress } |
ForEach-Object {
$p = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
[PSCustomObject]@{ Time=Get-Date; Process=$p.ProcessName; Path=$p.Path; Remote=$_.RemoteAddress }
} | Format-Table -AutoSize
# 2. Recent (>2MB) unsigned executables in common implant staging paths (Rust binaries are large)
$staging = "$env:APPDATA","$env:LOCALAPPDATA","C:\ProgramData","C:\Users\Public"
Get-ChildItem -Path $staging -Recurse -Filter *.exe -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-14) -and $_.Length -gt 2MB } |
ForEach-Object {
$sig = Get-AuthenticodeSignature $_.FullName
if ($sig.Status -ne 'Valid') {
[PSCustomObject]@{ Path=$_.FullName; SizeMB=[math]::Round($_.Length/1MB,1); Modified=$_.LastWriteTime; Signature=$sig.Status }
}
} | Sort-Object Modified -Descending | Format-Table -AutoSize
# 3. Verify PowerShell Script Block Logging is enabled (critical for PSNATCH detection)
$sbl = Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -ErrorAction SilentlyContinue
if (-not $sbl -or $sbl.EnableScriptBlockLogging -ne 1) {
Write-Warning "Script Block Logging DISABLED - enabling"
New-Item "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Force | Out-Null
Set-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Name "EnableScriptBlockLogging" -Value 1
}
# 4. Confirm Sysmon/audit coverage: process creation with command line (Event 4688 cmdline)
$audit = (auditpol /get /subcategory:"Process Creation" 2>$null) -join ' '
if ($audit -notmatch 'Success') { Write-Warning "Process Creation auditing not capturing Success events - remediate via GPO" }
#!/bin/bash
# Linux-side hunt for BASHNATCH-style staging and GitHub C2 beacons. Run via your EDR remote shell or cron.
# 1. Bash processes holding outbound 443 sessions (scripts should rarely hold sockets directly)
ss -tnp state established '( dport = :443 )' 2>/dev/null | grep -E 'bash|sh,' || echo "[+] No shell-held 443 sessions"
# 2. Cron/systemd persistence dropped in the last 14 days (common for script implants)
find /etc/cron* /var/spool/cron /etc/systemd/system ~/.config/systemd 2>/dev/null -type f -mtime -14 -ls
# 3. Recent ELF binaries in world-writable or home staging paths (BASHNATCH fetch-and-run targets)
find /tmp /var/tmp /dev/shm /home -type f -executable -mtime -7 2>/dev/null -exec file {} \; | grep -i elf
# 4. Shell history artifacts showing GitHub API token usage or curl to raw.githubusercontent
grep -rE 'api\.github\.com|raw\.githubusercontent\.com|Authorization: token|GITHUB_TOKEN' /home/*/.bash_history /root/.bash_history 2>/dev/null
Remediation
There is no patch for this campaign — remediation is architectural and behavioral. Prioritize the following:
- Egress policy for GitHub (highest impact, lowest cost). Government and defense networks with no legitimate developer population should not permit arbitrary endpoints to reach
api.github.comor*.githubusercontent.com. Where developers exist, implement egress allowlisting scoped to developer VLANs/identity groups and alert on GitHub API traffic from any other segment — especially servers. This single control breaks the reported C2 channel without breaking the business. - TLS inspection with destination categorization. If you perform TLS interception, create a dedicated category for code-hosting platforms (GitHub, GitLab, Bitbucket, Pastebin-class services) and alert on long-lived, periodic, or non-browser user-agent sessions. Dead-drop C2 clients typically present static or library-default user agents.
- Application control on endpoints. Enforce WDAC/AppLocker rules blocking unsigned executables in
%APPDATA%,%LOCALAPPDATA%,%ProgramData%, andC:\Users\Publicon Windows; usefapolicydor equivalent on Linux servers. Rust implants need to execute from somewhere — deny the cheap paths. - PowerShell and Bash telemetry. Confirm PowerShell Script Block Logging and Module Logging are enabled fleet-wide (Event ID 4104 is your PSNATCH tripwire). On Linux, forward
bashhistory,auditdexecve records, and syslog to your SIEM — BASHNATCH-style payloads are trivially visible with execve logging and nearly invisible without it. - Phishing-resilient initial access controls. APT36's delivery vector is spear-phishing. Enforce MFA resistant to push fatigue (FIDO2 where possible), block macro execution from internet-sourced documents via Mark-of-the-Web policy, and detonate attachments in a sandbox that extracts Rust-binary metadata, not just signatures.
- Threat hunt now. Run the KQL query above across the last 30 days, not 7. Espionage actors dwell. Any endpoint showing periodic GitHub API connections from an anomalous process in a user-writable path warrants full DFIR triage: memory acquisition, persistence enumeration, and lateral movement review.
- Reference reporting. Monitor Zscaler ThreatLabz's published research on this operation for IOCs and YARA rules as they are released, and track Transparent Tribe under MITRE ATT&CK (T1102.002 — Web Services: Bidirectional Communication, and T1059 — Command and Scripting Interpreter) for technique mapping in your detection coverage matrix.
If you are a government, defense, or defense-adjacent organization in South Asia — or a supplier to one — treat this as an active threat to your environment today, not an intelligence curiosity.
Related Resources
Security Arsenal Managed SOC Services AlertMonitor Platform Book a SOC Assessment soc-mdr Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.