{"id":4096,"date":"2026-11-08T09:48:19","date_gmt":"2026-11-08T17:48:19","guid":{"rendered":"https:\/\/cyber.mag212.com\/fake-github-security-tools-prebuild-backdoors-infostealers\/"},"modified":"2026-11-08T09:48:19","modified_gmt":"2026-11-08T17:48:19","slug":"fake-github-security-tools-prebuild-backdoors-infostealers","status":"publish","type":"post","link":"https:\/\/cyber.mag212.com\/fr\/fake-github-security-tools-prebuild-backdoors-infostealers\/","title":{"rendered":"Fake GitHub &#8216;Security Tools&#8217; Use Hidden Build Hooks to Drop AsyncRAT and Infostealers on 2,000+ PCs"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">For about two years, one unnamed threat actor has seeded GitHub with trojanized projects. Its lures have moved from crypto-game bots and cheats to fake &#8220;security tools&#8221; aimed at pentesters, SOC analysts and security developers. Doctor Web says more than 2,000 Windows PCs were infected when it did its research. Building or running one of these repositories was enough to install a heavily evasive Electron loader, which then delivered AsyncRAT, a crypto clipper and a Telegram-exfiltrating stealer. Security professionals keep VPN profiles, SSH\/FTP client configs and client credentials on their workstations, and that is exactly what this malware collects.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>What<\/strong><\/td><td>Trojanized GitHub repositories posing as security utilities, game bots and crypto tools<\/td><\/tr><tr><td><strong>Reported<\/strong><\/td><td>Doctor Web report dated 5 November 2026; BleepingComputer coverage 6 November 2026<\/td><\/tr><tr><td><strong>Actor<\/strong><\/td><td>A single, unattributed actor; first repositories appeared about two years ago<\/td><\/tr><tr><td><strong>Scale<\/strong><\/td><td>More than 2,000 Windows PCs infected at the time of Doctor Web&#8217;s research (vendor figure, not independently verified)<\/td><\/tr><tr><td><strong>Trigger<\/strong><\/td><td>Visual Studio PreBuildEvent in <code>.csproj<\/code>, PowerShell in <code>.suo<\/code>, or whitespace-hidden code in <code>.py<\/code>\/<code>.go<\/code> files<\/td><\/tr><tr><td><strong>Malware<\/strong><\/td><td>Trojan.Loader.3261 (<code>Microsoft.exe<\/code>), BackDoor.AsyncRAT.115, Trojan.Clipper.688, JS.Stealer.191<\/td><\/tr><tr><td><strong>CVE<\/strong><\/td><td>None. This is social engineering plus abuse of build features, not a vulnerability<\/td><\/tr><tr><td><strong>IOCs<\/strong><\/td><td>17 SHA-1 hashes, 4 domains, 2 IPs, 9 example repositories in DoctorWebLtd\/malware-iocs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What happened<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Doctor Web found malicious code in Visual Studio projects hosted in infected GitHub repositories. The first wave targeted crypto-wallet users with blockchain-game projects, game bots and cheats. One lure was tied to Catizen, a Telegram-based game platform, and came with step-by-step Visual Studio instructions written for less technical users. The actor later switched to projects that claim to automate scanning, security testing and log analysis. One example, reported by BleepingComputer, presented itself as a lightweight tool for parsing, cleaning and formatting output from the Fscan network scanner. Doctor Web&#8217;s IOC list names it <code>Trivexqbk\/FscanOutput-Beautify<\/code>, alongside eight other example repositories.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1800\" height=\"1013\" src=\"https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/fake-github-security-tools-prebuild-backdoors-infostealers-diagram.jpg\" alt=\"Attack chain diagram: trojanized GitHub repo, PreBuildEvent or hidden code, PowerShell stager, Trojan.Loader.3261 Mode3 and Mode2 evasion, then AsyncRAT, clipper and stealer exfiltrating via Telegram\" class=\"wp-image-4095\" srcset=\"https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/fake-github-security-tools-prebuild-backdoors-infostealers-diagram.jpg 1800w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/fake-github-security-tools-prebuild-backdoors-infostealers-diagram-300x169.jpg 300w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/fake-github-security-tools-prebuild-backdoors-infostealers-diagram-1024x576.jpg 1024w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/fake-github-security-tools-prebuild-backdoors-infostealers-diagram-768x432.jpg 768w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/fake-github-security-tools-prebuild-backdoors-infostealers-diagram-1536x864.jpg 1536w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/11\/fake-github-security-tools-prebuild-backdoors-infostealers-diagram-18x10.jpg 18w\" sizes=\"auto, (max-width: 1800px) 100vw, 1800px\" \/><figcaption class=\"wp-element-caption\">Diagram: MAG212 CYBER<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How the attack works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stage 0: the trigger.<\/strong> Early repositories shipped a <code>.csproj<\/code> with a <code>PreBuildEvent<\/code>. Visual Studio runs that event before compilation, so pressing Build runs the attacker&#8217;s command. Some repositories also carried <code>.suo<\/code> (solution user options) files that contained a PowerShell command. In the later security-tool lures, Python and Go files hid the payload with what Doctor Web calls &#8220;malicious code concealed behind a large number of whitespaces&#8221;. The malicious statement sits far to the right of an innocent line, past the edge of a browser or editor viewport.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stage 1: PowerShell.Packed.270.<\/strong> The script is written to <code>C:\\Users\\Public\\Pictures\\t.ps1<\/code> or <code>L.ps1<\/code>. It does not hard-code its next hop. It reads an encrypted string from attacker servers or from legitimate services (Pastebin, YouTube, Telegram, Google Docs, GitCode) and decrypts it into a download link for <code>Quixo.7z<\/code>. That archive is pulled from attacker infrastructure or a GitHub release and unpacked to <code>C:\\ProgramData\\Windows.Microsoft.Photos<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stage 2: Trojan.Loader.3261.<\/strong> <code>Microsoft.exe<\/code> is a modular Electron application (version 1.4.5 at the time of analysis). It downloads <code>Nexara.7z<\/code>, which holds the encrypted modules and a config, and reports system information to a Telegram bot. It escalates privileges and disables Defender, UAC, notifications, System Restore and VSS. It removes ESET, McAfee and Malwarebytes if they are installed, and edits the <code>hosts<\/code> file to block antivirus vendors&#8217; domains. It also deletes other files in <code>drivers\\etc<\/code>, which defeats users who keep copies of the hosts file there.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deployment runs in one of two main modes. <strong>Mode3<\/strong> (default) does the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Parent PID spoofing, so the process appears to be a child of <code>explorer.exe<\/code>.<\/li>\n\n<li>Disables Smart App Control by changing the <code>VerifiedAndReputablePolicyState<\/code> registry value.<\/li>\n\n<li>Unhooks <code>ntdll.dll<\/code> by restoring a clean copy from disk over EDR hooks.<\/li>\n\n<li>Makes direct syscalls with Halo&#8217;s Gate-style SSN resolution.<\/li>\n\n<li>Patches <code>EtwEventWrite<\/code> and <code>AmsiScanBuffer<\/code> in memory.<\/li>\n\n<li>Injects the <code>boot_f<\/code>, <code>kernel_f<\/code> and <code>thread_f<\/code> modules into <code>RegAsm.exe<\/code>, <code>dwwin.exe<\/code> or <code>dwm.exe<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If those modules fail, <strong>Mode2<\/strong> takes over. It adds Defender exclusions for <code>regasm.exe<\/code> and <code>dwm.exe<\/code>, then drops a randomly named PowerShell script (PowerShell.Inject.245) in the temp folder. That script decrypts the modules and injects them into <code>RegAsm.exe<\/code>. Doctor Web also describes a less documented &#8220;Mode3non&#8221; variant and a legacy &#8220;Handler&#8221; path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stage 3: payloads.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>BackDoor.AsyncRAT.115:<\/strong> two identical copies on different ports, so two operators can control one host.<\/li>\n\n<li><strong>Trojan.Clipper.688:<\/strong> injected by Trojan.InjectNET.14. It swaps wallet addresses on the clipboard and sends screenshots, window titles, user login and IP address to Telegram.<\/li>\n\n<li><strong>JS.Stealer.191:<\/strong> an Electron stealer that checks for VMs and sandboxes. It takes browser data, FileZilla XML, <code>MobaXterm.ini<\/code>, Total Commander <code>wcx_ftp.ini<\/code>, VPN settings, messenger files, gaming accounts and Discord tokens, then exfiltrates them through a Telegram bot.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Doctor Web also found an unfinished Electron component, <code>Lodge.7z<\/code>, which contains <code>WUDFHost.exe<\/code>. Its code points to future features: a service created with <code>sc.exe<\/code>, and re-downloading <code>Microsoft.exe<\/code> if it is deleted. The project is still being developed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Editorial ATT&amp;CK mapping (MAG212, not published by Doctor Web):<\/em> T1134.004 parent PID spoofing; T1562.001 impair defenses; T1562.006 indicator blocking (ETW); T1055 process injection; T1115 clipboard data; T1567 exfiltration over a web service.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Indicators and detection<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The full set is in Doctor Web&#8217;s <code>malware-iocs<\/code> repository, under <code>Trojan.Loader.3261\/README.adoc<\/code>. It lists 17 SHA-1 hashes, plus delivery URLs that abuse Pastebin, YouTube, Telegram, Google Docs and GitCode. The network indicators are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Domains: muckanthropic[.]com, muckcoding[.]com, muckdeveloper[.]com, muckduck.duckdns[.]org<\/li>\n\n<li>IPs: 130.12.182[.]172, 130.12.182[.]209<\/li>\n\n<li>Host artifacts: <code>C:\\Users\\Public\\Pictures\\t.ps1<\/code> \/ <code>L.ps1<\/code>, <code>C:\\ProgramData\\Windows.Microsoft.Photos\\<\/code>, <code>Nexara\\manifest\\config.json<\/code>, <code>thumbcache_*.dll<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>MAG212 recommendation:<\/strong> run a quick triage on any analyst or developer workstation that may have built third-party tools. Doctor Web does not give the full Smart App Control key path. The one below is where Windows normally stores that value.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Host artifacts named by Doctor Web\n'C:\\Users\\Public\\Pictures\\t.ps1','C:\\Users\\Public\\Pictures\\L.ps1',\n'C:\\ProgramData\\Windows.Microsoft.Photos' | ForEach-Object { \"{0} : {1}\" -f $_, (Test-Path $_) }\n\n# Defender exclusions added in Mode2 (look for regasm.exe \/ dwm.exe)\n(Get-MpPreference).ExclusionProcess\n\n# Smart App Control state (0 = off)\nGet-ItemProperty 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\CI\\Policy' -Name VerifiedAndReputablePolicyState\n\n# Hosts file entries redirecting security-vendor domains\nSelect-String -Path C:\\Windows\\System32\\drivers\\etc\\hosts -Pattern 'eset|mcafee|malwarebytes'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In EDR or SIEM, look for these patterns. <code>MSBuild.exe<\/code> or <code>devenv.exe<\/code> spawning <code>powershell.exe<\/code>. <code>RegAsm.exe<\/code>, <code>dwm.exe<\/code> or <code>dwwin.exe<\/code> making outbound connections. Non-browser processes calling api.telegram[.]org. Unexpected Electron binaries running from <code>C:\\ProgramData<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vetting and building third-party GitHub tools safely<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Doctor Web&#8217;s own advice is short. Keep signatures current, scan everything you download, including repositories, and treat security tooling like any other untrusted code. The steps below are <strong>MAG212 recommendations<\/strong> that build on that advice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Hunt build hooks before opening the solution.<\/strong> Clone the repository without opening it in Visual Studio, then search the MSBuild files:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># PowerShell\nGet-ChildItem .\\repo -Recurse -Include *.csproj,*.vcxproj,*.vbproj,*.props,*.targets,*.sln |\n  Select-String -Pattern 'PreBuildEvent|PostBuildEvent|&lt;Exec |powershell|-enc' |\n  Select-Object Path, LineNumber, Line\n\n# Linux\/macOS\ngrep -rnEi 'PreBuildEvent|PostBuildEvent|&lt;Exec |powershell|-enc' \\\n  --include='*.csproj' --include='*.vcxproj' --include='*.props' --include='*.targets' .\/repo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Hunt for whitespace padding.<\/strong> Legitimate code rarely has 100+ consecutive spaces or tabs followed by more code on the same line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># PowerShell: runs of 100+ whitespace characters followed by code\nGet-ChildItem .\\repo -Recurse -File -Include *.py,*.go,*.cs,*.ps1,*.js,*.csproj |\n  Select-String -Pattern '[ \\t]{100,}\\S' |\n  Select-Object Path, LineNumber, @{n='LineLength';e={$_.Line.Length}}\n\n# grep equivalent, plus a long-line report\ngrep -rnE '[[:blank:]]{100,}[^[:blank:]]' --include='*.py' --include='*.go' --include='*.cs' .\/repo\nfind .\/repo -type f \\( -name '*.py' -o -name '*.go' \\) -exec awk 'length &gt; 300 {print FILENAME\": line \"FNR\" (\"length\" chars)\"}' {} +<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>3. Strip per-user files.<\/strong> <code>.suo<\/code> files and the <code>.vs\\<\/code> folder are per-user state and almost never belong in a public repository. Treat their presence as a red flag and delete them before you open the solution.<\/li>\n\n<li><strong>4. Read diffs, not the rendered page.<\/strong> Use <code>git diff<\/code>, or an editor with word-wrap and visible whitespace. GitHub&#8217;s web view and narrow editor panes are exactly what this concealment relies on.<\/li>\n\n<li><strong>5. Check provenance.<\/strong> Look for throwaway accounts with no history, keyword-stuffed repo names, inflated stars, a single bulk commit, and &#8220;tools&#8221; that wrap a well-known project (Fscan, FRP) without linking upstream. Prefer the upstream project or a vendor-signed release.<\/li>\n\n<li><strong>6. Build in a disposable VM.<\/strong> Use a non-persistent VM or Windows Sandbox with no corporate credentials, no mapped drives, no browser profiles and no VPN configs. Restrict its egress, or route it through a logging proxy, and revert to a snapshot after every build. Keep in mind that JS.Stealer.191 checks for VMs, so a clean sandbox run proves nothing.<\/li>\n\n<li><strong>7. Separate tooling from secrets.<\/strong> Never build untrusted code on the machine that holds client VPN profiles, MobaXterm\/FileZilla sessions or password vaults.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What to do now<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Block and sweep:<\/strong> add the four domains and two IPs to DNS and proxy blocklists, and search 90 days of logs for them.<\/li>\n\n<li><strong>Hash-hunt:<\/strong> load the 17 SHA-1 hashes from the IOC repository into EDR.<\/li>\n\n<li><strong>If a host is hit<\/strong> (MAG212 recommendation): treat it as fully compromised. The loader dismantles AV, VSS and System Restore, so reimage the machine rather than cleaning it in place. Then rotate everything the stealer targets from a clean device: browser-saved passwords and sessions, VPN credentials, FTP\/SSH client secrets, Discord tokens and any client credentials. Check crypto transactions for swapped addresses.<\/li>\n\n<li><strong>Policy<\/strong> (MAG212 recommendation): require that tooling from GitHub be built only in an approved sandbox, and alert when a build tool spawns PowerShell.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What we still don&#8217;t know<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Doctor Web gives no geography for the infections, no attribution, no total number of repositories (the IOC file lists nine examples) and no takedown status. MAG212 did not open the listed repositories to check whether they are still live. The 2,000-PC figure comes only from Doctor Web. The current loader&#8217;s persistence mechanism is not documented. The ATT&amp;CK mapping above is ours.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related on MAG212 CYBER<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cyber.mag212.com\/the-trusted-path-mag212-cyber-daily-november-8-2026\/\">The Trusted Path: MAG212 CYBER Daily, November 8, 2026<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/news.drweb.com\/show\/?i=15311&amp;lng=en&amp;c=5\" target=\"_blank\" rel=\"noopener\">Doctor Web: &#8220;Insolence beyond belief. Threat actors target information security developers on GitHub&#8221;<\/a> (5 November 2026)<\/li>\n\n<li><a href=\"https:\/\/github.com\/DoctorWebLtd\/malware-iocs\/blob\/master\/Trojan.Loader.3261\/README.adoc\" target=\"_blank\" rel=\"noopener\">Doctor Web on GitHub: Trojan.Loader.3261 indicators of compromise<\/a> (accessed 8 November 2026)<\/li>\n\n<li><a href=\"https:\/\/www.bleepingcomputer.com\/news\/security\/fake-security-tools-on-github-push-backdoors-and-infostealers\/\" target=\"_blank\" rel=\"noopener\">BleepingComputer: &#8220;Fake security tools on GitHub push backdoors and infostealers&#8221;<\/a> (Bill Toulas, 6 November 2026)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Written and edited by El Mostafa Ouchen for MAG212 CYBER. Facts verified against the sources above as of 8 November 2026.<\/em><\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>A two-year campaign of trojanized GitHub repositories, now posing as security tools, used Visual Studio pre-build events and whitespace-hidden code to infect 2,000+ Windows PCs with AsyncRAT, a clipper and a Telegram stealer.<\/p>","protected":false},"author":1,"featured_media":4094,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,15],"tags":[272,270,269,273,263,161,149,81,271,274],"class_list":["post-4096","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cyber-incidents","category-threat-intelligence","tag-asyncrat","tag-doctor-web","tag-github","tag-infostealer","tag-iocs","tag-powershell","tag-supply-chain","tag-threat-hunting","tag-trojan-loader-3261","tag-visual-studio"],"_links":{"self":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/4096","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/comments?post=4096"}],"version-history":[{"count":0,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/4096\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/media\/4094"}],"wp:attachment":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/media?parent=4096"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/categories?post=4096"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/tags?post=4096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}