
Overview
This report provides a follow-up analysis of the data from the "APT Down - The North Korea Files" leak, originally published in Phrack Magazine. The leak included the actor's VMware VM and VPS dump files, which allowed for an in-depth analysis of their activities and helped infer the threat actor behind the operations.
Notably, the leaked files contained rootkit source code that was a direct match for a rootkit identified by our firm during a 2022 incident investigation at a South Korean financial institution. The code logic and even the encryption keys were identical. Furthermore, we discovered the source code for an updated 2025 version of this rootkit.
Other findings include an exploit for an Ivanti 1-day vulnerability, what appears to be exfiltrated source code from the Ministry of Foreign Affairs website and the GPKISecureWebX solution, and evidence of phishing attacks targeting the Public Prosecutor's Office and the Defense Counterintelligence Command. These findings indicate that the actor has been persistently and actively targeting South Korea. The exfiltration of data that is difficult to obtain externally, combined with the use of a custom rootkit and a 1-day exploit, suggests the actor possesses a high level of technical capability and has achieved deep network penetration to steal sensitive data.
File Analysis Overview
Before delving into the analysis, this section provides a brief overview of the files that were released alongside the "APT Down - The North Korea Files" report.

List of public files posted on the .onion site
The main files are work.zip, vps.zip, and file-lists_and_misc.zip, which are described below.
work.zip
A dump of the actor's VMware VM (Deepin 20.9), containing their workstation environment. It includes malware source code, attack tools, exfiltrated data, and various logs.
The host machine's
C:\drive was mounted viahgfs, allowing for the inspection of files on the actor's host system.
vps.zip
A dump of a VPS owned by the actor, which contains a history of its use in spear-phishing attacks and various logs.
Evidence of spear-phishing campaigns targeting multiple organizations, including the Defense Counterintelligence Command and the Public Prosecutor's Office, can be found here.
file-lists_and_misc.zip
Contains the actor's Google Timeline, command history, and a complete file listing of the workstation.
The full file list makes it possible to identify paths that do not exist in the main dump files.
1. Malware and Attack Analysis
This section analyzes the malware discovered in the actor's VMware dump and the spear-phishing and infrastructure operations identified in the VPS dump. Notably, the rootkit and backdoor found in the tomcat20220420_rootkit and tomcat20250414_rootkit_linux234 directories are linked to a past incident at a South Korean financial institution investigated by our team.
1.1. tomcat20220420_rootkit
1.1.1. Backdoor
The backdoor source code is located in the work/home/user/Desktop/tomcat20220420_rootkit/tomcat20220420_rootkit/work directory. The backdoor's primary functions are to execute malicious commands or to act as a proxy for relaying network traffic. It is always executed by the rootkit and does not run as a standalone process.
The backdoor's execution arguments are described in the table below.
caption - Command-line options
When the proxy flag is enabled, the command-handling logic is bypassed, and the backdoor waits to receive an AES-256-CBC encrypted "__step2__".

caption - Data validation logic in master.c
The AES key and IV are as follows:
AES key:
603deb15153a715e2b73aef3857d758b1f552c573e6158d72d9811a33914defeIV:
603deb15153a715e2b73aef3857d758b1f552c573e6158d72d9811a33914defe
To masquerade its traffic, the backdoor can wrap its socket communication in one of the following protocols, as defined in install_common.h:
HTTP
HTTPS
SSL
TCP
SMTP

caption - Protocol definition in install_common.h
All data, including command codes, is encrypted and decrypted using a multi-byte XOR operation with the key "1101link". The implementation of this logic results in an operation equivalent to a single-byte XOR with the value 1.

caption - EncodeDecode function in encrypt.c
The supported commands are listed below.
caption - Backdoor command descriptions
1.1.2. syslogk rootkit
The file work/home/user/Desktop/tomcat20220420_rootkit/tomcat20220420_rootkit/main.c contains the source code for the syslogk rootkit. This rootkit hides the directory containing the backdoor and related malware to evade detection. It also ensures the backdoor only runs when triggered by a specific magic packet from the actor.
The rootkit hooks three functions to hide processes, ports, and directories.
caption - Function hooks
The hooked functions use strstr to compare target entries against predefined strings (process names, paths, ports) and remove any matches before returning the results.
The rootkit then uses nf_register_hook to register callback functions at two Netfilter hook points:
NF_INET_LOCAL_IN: Intercepts packets just before they are delivered to a local process.NF_INET_LOCAL_OUT: Intercepts packets just before they are sent from a local process.

caption - Netfilter hook registration logic in hkcap.c
This allows the rootkit to monitor all traffic and execute malicious actions upon receiving a magic packet.
The NF_INET_LOCAL_IN callback function inspects incoming TCP packets, decrypts the payload, and checks if it matches specific conditions. The decryption keys are listed below.
caption - Decryption keys
The conditions and corresponding actions are detailed below.
caption - Conditions and actions
At the NF_INET_LOCAL_OUT hook point, the callback function changes the source port of packets originating from the backdoor to a non-listening port.
After registering the Netfilter callbacks, the rootkit removes itself from the system's module list to evade detection by tools like lsmod.

caption - hide_module function
The hidden rootkit can be made visible again by writing the value of MAGIC_DRBIN (defined in install.h) to a specific file controlled by the rootkit.

caption - proc_write function logic
1.1.3. Backdoor Client
The file work/home/user/Desktop/tomcat20220420_rootkit/tomcat20220420_rootkit/work/tcat.c contains the source code for the backdoor client. This tool was likely run by the actor on their C&C server.
The client accepts several command-line options, which are detailed below.
caption - Command-line options
Commands can be delivered to the backdoor in four ways:
single cmd: Sends a single command to the backdoor for execution.
single daemon cmd: Sends a command to be executed in a new process on the backdoor host.
input loop: Enters an interactive loop, accepting commands until
exitis entered.kernel cmd: Sends a command to be executed by the kernel module without returning output.
Except for the input loop, the client terminates after sending the command. The commands available in the input loop are listed below.
caption - Backdoor client command descriptions
All communication is encrypted with the XOR key "1101link". For each message, the client computes a SHA512 hash of the password combined with the GENERAL_MODULE and GENERAL_PROTOCOL values defined in common.h. This hash is prepended to the message before transmission. Communication with the backdoor can be configured to use one of the following protocols:
TCP
HTTP
OLD HTTP (A variant of HTTP that does not use cookies)
1.2. tomcat20250414_rootkit_linux234
1.2.1. Backdoor
The directory work/mnt/hgfs/Desktop/tomcat20250414_rootkit_linux234/tomcat20250414_rootkit_linux2345/work contains the source code for the 2025 version of the backdoor. This is an upgraded version of the 2022 backdoor, with new features such as password verification for delayed callbacks, configurable callback timers, and rate-limiting for file transfers. Its command-line options are listed below.
caption - Command-line options
In addition to the existing password, this version introduces a master password. When a client connects, the backdoor computes a SHA512 hash of the master password and connection settings. The master password, !@nf4@#fndskgadnsewngaldfkl, is defined in common.h. While the hash is stored in a global variable and checked during SSL communications, it is not actively used. The client's provided password is then hashed in the same manner and verified.

caption - passcheck_check function in encrypt.c
The password is Miu2jACgXeDsxd. Configuration settings, including the password, can be modified in config.sh and are applied at build time.

caption - Default settings in config.sh
The communication protocols are the same as the 2022 version:
HTTP
HTTPS
SSL
TCP
SMTP
While the original XOR key is still present, five new XOR keys and corresponding encryption/decryption functions have been added.

caption - All XOR keys found in encrypt.c
This version adds several new commands and modifies the behavior of commands with "TRANSFER" in their names. The newly added command codes are:
CMD_NEW_UPLOADCMD_NEW_DOWNLOADCMD_LISTEN_PROXY_TRANSCMD_TRANSFERCMD_PROXY_TRANSFERCMD_SOCKS_PROXY_TRANSFERCMD_SOCKS_PROXYCMD_NEW_SINGLE_CMD
The command behaviors are detailed in the table below. (new or significantly modified commands are grouped with an asterisk).
caption - Backdoor command descriptions
1.2.2. syslogk rootkit
The file at work/mnt/hgfs/Desktop/tomcat20250414_rootkit_linux234/tomcat20250414_rootkit_linux2345/main.c is the 2025 version of the rootkit. Like its predecessor, it registers callbacks at Netfilter hook points, but it features significant changes to its function hooking, module hiding, and Netfilter implementation.
While the 2022 rootkit used the udis86 library for function hooking, the 2025 version uses the khook library.

caption - Left: 2022 rootkit (udis86). Right: 2025 rootkit (khook).
This version hooks a total of five functions, up from three in the 2022 version.
caption - Function hooks
The number of Netfilter hooks has increased from two to four.
NF_INET_LOCAL_IN: Before a packet is delivered to a local process.NF_INET_LOCAL_OUT: Before a packet is sent from a local process.NF_INET_PRE_ROUTING: Immediately after a packet enters the network stack.NF_INET_POST_ROUTING: Just before a packet is placed on the wire, after routing.

caption - Netfilter hook registration logic in hkcap.c
The NF_INET_PRE_ROUTING callback performs two main actions. First, it checks for a magic packet to execute the backdoor, similar to the NF_INET_LOCAL_IN hook in the 2022 version. However, the condition is simpler: it only checks for a TCP SYN packet where the ID and sequence number are present in the id_list and seq_list.
If the condition is met, the packet's window value is used to determine which masquerade protocol to use when launching the backdoor.
caption - Masquerade protocols
The method for executing the backdoor has also changed significantly. Instead of /bin/sh -c, this version uses call_usermodehelper to launch the backdoor on a random port between 3000 and 8000.

caption - kernel_run function in hkcap.c
The second action of the
PRE_ROUTING
hook is to change the destination port of any packet from the C&C IP to the randomly generated backdoor port. This allows the actor to communicate with the backdoor without knowing the randomly assigned port in advance.

caption - Code to change packet destination in hkcap.cThe NF_INET_LOCAL_IN callback function then changes the packet's destination port again, from the random port to the actual port the backdoor is listening on. This two-step redirection appears designed to obscure the backdoor's true listening port.

caption - Code to change packet destination to the backdoor port in hkcap.c
The NF_INET_LOCAL_OUT callback changes the source port of outgoing backdoor packets from the listening port to an arbitrary port.
The NF_INET_POST_ROUTING callback then changes the source port from the arbitrary port to the actual C&C port.

caption - Code to change packet destination to the actor's port in hkcap.c
The rootkit's hiding mechanism has been enhanced to remove the module from sysfs in addition to the standard module list.

caption - Module hiding code in hkmod.c
The sysfs-related functions are taken directly from the kv_hide_mod function of the KoviD rootkit.

caption - kv_hide_mod function in the KoviD rootkit
While writing a specific string to the rootkit still unhides it, this version adds the ability to dynamically configure the ports used by the Netfilter hooks by writing other specific strings.

caption - Port configuration code in hkcap.c
All strings written to the rootkit, except for the unhide command, are first decrypted with AES-256-CBC. The key and IV are as follows:
AES key:
d03deb92153a71458973aef3857d75b27e552cc63e6158a8339811873994de47IV:
efa3c987532cc0bdac533845ad8df5ea
The actions triggered by writing to the rootkit are listed below.
caption - Strings and triggered actions
1.2.3. Backdoor Client
The file
work/mnt/hgfs/Desktop/tomcat20250414_rootkit_linux234/tomcat20250414_rootkit_linux2345/work/tcat.c contains the source code for the 2025 backdoor client. Compared to the 2022 version, the primary change is the removal of the kernel command (kc) option. A new LLL option for specifying a log file path has been added. The full list of options is below.
caption - Command-line options
With the removal of the kernel command feature, commands are delivered in three ways:
single cmd: Sends a single command to the backdoor for execution.
single daemon cmd: Sends a command to be executed in a new process on the backdoor host.
input loop: Enters an interactive loop, accepting commands until
exitis entered.
While the 2022 client only accepted simple commands, the 2025 client allows options to be specified for each command, enabling more precise control. The number of top-level commands has decreased, but their functionality is more sophisticated. The commands available in the input loop are listed below.
caption - Backdoor client command descriptions
A full analysis of the new features was not possible, as key functions for the new commands (e.g., tcat_new_send_file, tcat_new_recv_file) were not defined in the provided source code.
Unlike the 2022 client, which sent a SHA512 hash of the password with every communication, the 2025 client sends it only once during the initial connection.
All communication is still encrypted with the XOR key "1101link". However, the available communication protocols have changed. The "OLD HTTP" option has been removed, and HTTPS and SMTP have been added. The supported protocols are:
TCP
HTTP
HTTPS
SMTP
1.3. Cobalt Strike
1.3.1. Cobalt Strike Loader
A Rust-based loader designed to decrypt and execute embedded shellcode was found at the following paths:
work/mnt/hgfs/Desktop/New folder (2)/DboRrmSS.exework/mnt/hgfs/Desktop/New folder (2)/m01QzOfI.exework/mnt/hgfs/Desktop/New folder (2)/voS9AyMZ.tar.gzwork/home/user/.cache/vmware/drag_and_drop/0pkbW4/3Powwovv.exework/home/user/.cache/vmware/drag_and_drop/gWMDML/GnAN3FhY.exework/home/user/.cache/vmware/drag_and_drop/QqiN9h/DboRrmSS.exework/home/user/.cache/vmware/drag_and_drop/rM0FG0/m01QzOfI.exe
The loader dynamically resolves Windows APIs using djb2 hashing. It then decrypts the shellcode with AES-256-CBC and executes it in memory.

caption - API hashing function
The AES keys and IVs for each loader instance are listed below.
caption - Cobalt Strike Loader AES keys and IVs
1.3.2. Shellcode
The shellcode executed by the Cobalt Strike Loader decrypts and runs the final Cobalt Strike Beacon payload in memory. This shellcode was also found as standalone files at the following paths:
work/home/user/.cache/vmware/drag_and_drop/5wdgDr/payload.binwork/home/user/.cache/vmware/drag_and_drop/6bX9mm/Black.x64.exework/home/user/.cache/vmware/drag_and_drop/NDBu65/payload.binwork/home/user/.cache/vmware/drag_and_drop/yf91yD/payload.binwork/home/user/.cache/vmware/drag_and_drop/zlLWeR/payload.bin
The file work/home/user/.cache/vmware/drag_and_drop/6bX9mm/Black.x64.exe is a compiled executable but is functionally identical to the other shellcode files.

caption - DIE result for Black.x64.exe
Like the loader, the shellcode dynamically resolves Windows APIs using djb2 hashing. The embedded Cobalt Strike Beacon is decrypted using RC4 and executed in memory.

caption - RC4 ksa function
The RC4 keys used by each file are listed below.
caption - Shellcode RC4 keys
Notably, the Cobalt Strike Beacons deployed via this shellcode patch ETW and AMSI functions to evade detection. The encrypted beacon configuration was truncated, preventing a full analysis of its contents.
1.3.3. Cobalt Strike Beacon
The source code for a Cobalt Strike Beacon was found under work/mnt/hgfs/Desktop/111/beacon. Upon execution, it decrypts its configuration using a single-byte XOR key (0x2e). A portion of the decrypted configuration, as parsed by CobaltStrikeParser, is shown below.

caption - CobaltStrikeParser output
Although the configuration contains a C&C server address and endpoint, the beacon ignores these and uses hardcoded values instead.

caption - send_Metadata function in comm.cpp
After parsing the configuration, the beacon generates metadata to send to the C&C server. Key values are listed below.
caption - Metadata fields
After sending the initial metadata, it begins polling for commands from the C&C server via HTTP GET requests every 5 seconds and sends the results back via HTTP POST. The supported command ids are listed below.
caption - Cobalt Strike Beacon commands
The majority of commands are either unimplemented or disabled, suggesting this is an incomplete version of the beacon.
1.3.4. C# Loader
The directory work/home/user/Desktop/0128.zip contained a C# loader (ok.dll), its source code (ok.cs), and a runner script (ok.sct) designed to inject a Cobalt Strike Beacon into another process.
The frequent use of the word "test" in function names and arguments suggests this tool was experimental.
ok.hta
The ok.hta file is an HTML Application that downloads a script from hxxp://192.168[.]123.200/ok.sct and calls its Fuk method.

caption - ok.hta content
The downloaded script is presumed to be the ok.sct file found in the same archive.
ok.sct
This script deserializes an embedded byte array into a C# object and invokes its Work method. This object is presumed to be the ok.dll loader.

caption - deserialization code in C# Loader
The C# loader injects a Cobalt Strike Beacon into a conhost.exe process. The beacon payload is stored as a zlib-compressed and Base64-encoded string.

caption - Cobalt Strike Beacon decode function
Below is a portion of the beacon's configuration, extracted using CobaltStrikeParser.

caption - CobaltStrikeParser output
1.4. Ivanti Connect Secure
1.4.1. BRUSHFIRE
The zip file at work/mnt/hgfs/Desktop/ivanti-new-exp-20241220.zip contains Python scripts that leverage an Ivanti Connect Secure RCE exploit to deploy a backdoor.
The script crafts a clientCapabilities value to trigger CVE-2025-0282 and achieve RCE.

caption - exploit in exp*.py
CVE-2025-0282 has been exploited by UNC5221, a suspected China-nexus threat actor.
Multiple versions of these scripts were found, all functionally equivalent with minor variations in function offsets and service endpoints. The command-line arguments accepted by the scripts are listed below.
caption - Command-line options
The script establishes a random 3-byte magic value and a random 4-byte key for each host. It uses the RCE exploit to execute plugins/install, which overwrites the legitimate ssl_read function with the backdoor from plugins/ssl_read. During communication, when the backdoor receives a payload starting with themagic value, it XOR-decrypts the rest of the payload with the key and executes it as shellcode.

caption - shellcode execution code in ssl_read
The script generates and uploads different shellcode payloads to the target server based on the provided options. It uses the replace method to patch the shellcode, adapting hardcoded placeholder values for the target environment. The table below details the options that deploy shellcode from the plugins directory and the purpose of each payload.
caption - Options and corresponding shellcode
The plugins/ssl_read backdoor and its associated file paths match the description of the BRUSHFIRE malware used by UNC5221, as detailed in this report.
1.4.2. SPAWN Family Client
The zip file at work/mnt/hgfs/Desktop/New folder/203.234.192.200_client.zip was found to contain a tunneling script, an SSH client, and an SSH private key. The included readme.txt file contains instructions for using client.py and controller.py to connect to 203.234[.]192.200, an IP address belonging to the South Korean news organization Hankyoreh.

caption - content of readme.txt
client.py uses a SOCKS5 proxy to tunnel network traffic and accepts the following options:
caption - Option descriptions
client.py initializes values for client_hello and client_key_exchange packets, which are used as follows:
client_hello: Before transmission, random data is written toclient_hello[15:43], the CRC32 checksum of this data is written toclient_hello[11:15], and a random 32-bytesessionidis included in the message.client_key_exchange: Before transmission, a random 256-byte value is written to thepremasterfield, and a random 32-byte value is written to theenc_handshake_msgfield.
The initial hardcoded value of client_hello is identical to the magic packet in the SPAWNMOLE sample detailed in this UNC5221 report. The runtime modification—writing random data and its CRC32 checksum—is consistent with the behavior of the SPAWNCHIMERA sample described in JPCert's report.
Like SPAWNMOLE, SPAWNCHIMERA was deployed by UNC5221 using CVE-2025-0282 as an initial access vector.
controller.py is an SSH client that uses the SOCKS5 proxy established by client.py for communication.

caption - SSH client code in controller.py
SPAWNMOLE was discovered alongside SPAWNSNAIL, which is capable of running an SSH server. SPAWNCHIMERA also includes SSH server functionality. Therefore, controller.py is likely a client for the SSH server component of either SPAWNSNAIL or SPAWNCHIMERA.
1.4.3. ROOTROT Client
The script at work/mnt/hgfs/Desktop/ivanti_control/main.py functions as a client for a webshell. Depending on the options provided, it generates a Perl script fragment, Base64-encodes it, sets a cookie to the encoded value, and sends an HTTP GET request. The options and their corresponding scripts are listed below.
download {file_path}{command}
Both Perl scripts Base64-encode their output and wrap it in HTML comments. The main.py client then extracts the content of the last comment in the HTTP response, Base64-decodes it, and prints the result.

caption - The function that sends the request and decodes the response
ROOTROT, as described in this UNC5221 report, is a Perl-based web shell that Base64-decodes a cookie value before executing it with eval. It then sends the Base64-encoded results back within HTML comments. This behavior confirms that main.py is the client for the ROOTROT web shell.
Like the other UNC5221 malware mentioned, ROOTROT has been found in attacks targeting Ivanti Connect Secure vulnerabilities.
1.5. Phishing Attacks
1.5.1. Naver AitM Attack
Files related to an Adversary-in-the-Middle (AitM) attack targeting Naver credentials were found in work/mnt/hgfs/Desktop/New folder/vps2/Cipherishing. The file work/mnt/hgfs/Desktop/New folder/readme.txt contains a configuration guide written in Chinese.

caption - content of readme.txt
Below is a machine translation of
readme.txt:
The script work/mnt/hgfs/Desktop/New folder/vps2/Cipherishing/cipherginx.py acts as a proxy between Naver and the victim. When the victim accesses Naver through this proxy, their headers, cookies, username, and password are saved to the cookies directory under the following filenames:
{nid_id}.headers{nid_id}.cookieaccounts.txt

caption - accounts.txt writer in cipherginx.py
The configuration file work/mnt/hgfs/Desktop/New folder/vps2/Cipherishing/naverconfig.py contains a malicious JavaScript payload. The proxy injects this payload into the Naver login page to capture and exfiltrate user credentials.

caption - Naver credential exfiltration code in naverconfig.py
Scripts using the exfiltrated credentials to steal the victim's email, contacts, account details, and other data were found at the following paths:
caption - File descriptions
1.5.2. Kakao Login Phishing Attack
The file vps/var/www/html/kakao-login.php is a phishing page that spoofs the Kakao login portal. The HTML template for this page is located at vps/var/www/html/templates/kakao.html.
On a GET request, kakao-login.php checks if a cookie named ft is set. If the cookie exists, it redirects the user to https://mail.daum.net.

caption - GET request handler
If the ft cookie is not set, the script displays the fake Kakao login page. When a user attempts to log in, the form submits the entered credentials via a POST request.
Upon receiving a POST request, the script saves the credentials to log/password_log.txt and sets the ft cookie to no.

caption - POST request handler
Although password_log.txt contains 14 entries, all but one appear to be test data (e.g., (123123, 1212121212), (ttttt222, 2323232323).
1.5.3. Email Phishing Attack
Web server code for generating phishing emails and managing victim logs was found under vps/var/www/html.
The web server scripts save logs, and all except generator.php use a common format.
For parameters, only the xml parameter is treated specially, as detailed in the request.php section. Log files are saved with the format {name}.txt.{%Y%m%d}.
generator.php
vps/var/www/html/generator.php is a page for generating phishing emails. Its behavior depends on the value of the cookie HnoplYTfPX and the request method.
caption - Execution logic
The phishing email generation form contains the following fields.
caption - Phishing email generation form fields
The generated phishing email components are displayed as follows.
The value under content: is presumed to be the email body. Each generation is logged to log/generator_log.txt.{%Y%m%d} in the format below.
caption - Generated phishing email components
If the victim's email client is configured to load external resources, the img tag triggers a request to request.php.
request.php
vps/var/www/html/request.php logs victim system information to log/request_log.txt.{%Y%m%d}.
If the request URI contains .png, the script returns a randomly colored image. Otherwise, it returns a page containing JavaScript to gather information about the victim's system and sends the results as URL parameters.
caption - JavaScript files and collected information
The script then redirects to response.php?i={b64encode(email)}&{results}.
response.php The script at vps/var/www/html/response.php inspects the victim's IP address, user-agent, and locale. If these attributes meet specific criteria, the script Base64-decodes the i parameter and logs the result to log/response_log.txt.{%Y%m%d}. The conditions are as follows:
The locale is on a whitelist.
The IP address and user-agent are not on a blacklist.
The locale whitelist includes:
us
jp
ja
kr
ko
The user-agent blacklist includes:
bot
spider
crawl
trend
symantec
virus
spam
secure
The IP blacklist is detailed below.
caption - IP blacklist
A summary of the log files, their corresponding scripts, and activity statistics is provided below.
caption - Summary of all logs and actual victim logs
1.6. Yonsei University Email Exfiltration Malware
The script at vps/var/www/html/js/chks.js is designed to exfiltrate emails from Yonsei University's webmail service (mail.yonsei.ac.kr).
The script first collects user information from the endpoint https://mail.yonsei.ac.kr/common/json/agent.do. It then adds cimoon185@daum.net to the account's list of forwarding addresses.

caption - Forward function in chks.js
After setting up the forwarding rule, it exfiltrates all emails dated since 2017-10-01 from the ent_{user} and TOTAL mailboxes. The emails are sent to https://service.navers.org/emuy.php?i={user} via POST requests. Notably, the script manually constructs the multipart/form-data request bodies instead of using the standard FormData API.
2. Analysis of Exfiltrated Data
This section analyzes data from the actor's VMware VM dump that is normally impossible or difficult to obtain, classifying it as "exfiltrated data."
2.1. Ministry of Foreign Affairs' AyersRock Mail
The file work/mnt/hgfs/Desktop/mofa.go.kr.7z contains the source code for the AyersRock Mail solution, which is believed to have been used internally by the South Korean Ministry of Foreign Affairs (MOFA). AyersRock Mail is a webmail solution developed by Naravision in 2016 based on its Kebi Mail platform.
The extracted directory structure consists of Kebi-based modules such as kebi-batch, kebi-cor, and kebi-web-mail. Within these directories, various app-*.xml configuration files contain mail elements with the host value set to mofa.go.kr.

caption - Host value in the mail element of app-*.xml
The file mofa.go.kr/kebi-web-parent/mail/document/info.txt contains account credentials and notes for internal development servers, databases, and test servers.

caption - Content of info.txt
Another file, mofa.go.kr/kebi-web-parent/mail/document/worklist.txt, contains notes on development schedules and task lists.

caption - Content of worklist.txt
The presence of Git-related files like .gitignore and .gitmodules, along with developer-authored notes in info.txt and worklist.txt, suggests that mofa.go.kr.7z is an archive of files exfiltrated from the developer's Git repository.
2.2. Secureki APPM & iRASS
2.2.1. APPM & iRASS Server Management Programs
The path work/mnt/hgfs/Desktop/111/home/home contains appm and irass directories, which house programs likely used for managing APPM and iRASS servers, respectively.
APPM
The work/mnt/hgfs/Desktop/111/home/home/appm directory contains the appm_master binary and a crypto directory with encryption-related modules. During execution, appm_master checks for the existence of several binaries and configuration files, many of which are missing from the dump. Key missing files include cloud configuration files and a decrypted appmkey file.

caption - List of released files
iRASS
The work/mnt/hgfs/Desktop/111/home/home/irass/bin directory contains several iRASS-related binaries, including irass_master, irass_db, irass_admin, and irass_rdp. A history.txt file in this directory contains the keyword "KB국민은행"(KB Kookmin Bank) and appears to be a developer's log of issues and patches.

caption - Content of history.txt
2.3. Ministry of the Interior and Safety's GPKISecureWebX
2.3.1. GPKISecureWebX Source Code
The directory work/mnt/hgfs/Desktop/111/GPKISecureWebX contains the source code for GPKISecureWebX, a public certificate security program developed by Dream security.
A Visual Studio Build Log file, work/mnt/hgfs/Desktop/111/GPKISecureWebX/GPKISecureWebX.plg, contains the string "01\_행자부 웹보안API" (01_Ministry of Public Administration and Home Affairs Web Security API). "행자부" (Haengjabu) is the former name of the current Ministry of the Interior and Safety, linking this source code to the ministry's GPKI system.

caption - Content of GPKISecureWebX.plg
Additionally, the file work/mnt/hgfs/Desktop/111/1.rar is a compressed archive of the work/mnt/hgfs/Desktop/111/GPKISecureWebX directory.
2.3.2. GPKISecureWeb Package
The file work/mnt/hgfs/Desktop/111/gpki.7z contains GPKI API, GPKISecureWebX, and setup directories. The archive includes manuals for the standard GPKI API, as well as various keys and certificate files.
Notably, the gpki/gpkisecureweb/log directory contains certificate validation logs from December 2017 to April 2020.

caption - Part of the log content
2.3.3. GPKISecureWeb Documents and Module Source Code
The directory work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수 (01_Ministry of Public Administration and Home Affairs Web Security API (ORG) - Handover to Kwon Yu-mi) contains GPKISecureWeb-related documents for a personnel handover, along with the complete source code for all modules, including GPKIInstaller and GPKICertManager.
The following documents were identified:
work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/웹용 표준보안API_매뉴얼(유선).chmwork/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/설계문서/SSA_AO_AD_WT_002_웹보안 프로토콜설계서_Ver1.0_.docwork/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/행자부 웹보안API 인수인계.doc
The file properties indicate that the documents were created a long time ago.

caption - doc file info
The ReadMe.txt file at work/mnt/hgfs/Desktop/111/2/01_행자부 웹보안API(ORG) - 권유미 인수/02_src/ReadMe.txt provides a description of all the modules.

caption - Content of ReadMe.txt
2.4. GPKI Certificate and Private Key Files
The directory work/home/user/Downloads/cert/extracted-key-20200512 contains 2,475 certificate and private key files. The Subject field of the certificates revealed a variety of organizations, including the Ministry of Government Legislation ("법제처") and other government-affiliated agencies and committees. It is unclear how the actor collected these files.

caption - File listing of work/home/user/Downloads/cert/extracted-key-20200512
2.5. Onnara Login Automation Script
The directory work/mnt/hgfs/Desktop/111/onnara_auto contains a script that automates logins to Onnara, a service for public officials used by the South Korean government. The client_main.py script has a hardcoded account ID, organization ID, and subdomain for the Onnara service.

caption - main function in client_main.py
The login method involves executing the onnaraSSO.jar file, located in work/mnt/hgfs/Desktop/111/onnara_auto/script, to generate an SSO token based on the provided information.

caption - generate_L1 function in onnara_sso.py
The onnaraSSO.jar file encrypts or decrypts a string using either the ARIA or DES algorithm, depending on the options provided. The usage format is as follows:
onnaraSSO.jar <string> <0:DES | 1:ARIA> <0:encrypt | 1:decrypt>
The keys used for both ARIA and DES are hardcoded in the JAR file.
Traces of files transferred between the host and the VMware VM show that the actor left the output of a test run as comments in the onnara_sso_test.py file.

caption - Content of work/home/user/.cache/vmware/drag_and_drop/Z3INst/onnara/onnara_auto/onnara_sso_test.py
The directory work/home/user/.cache/vmware/drag_and_drop/Z3INst/onnara contains the file onnara9-onnara4-SSO-login.saz, which can be decompressed to reveal actual HTTP requests and responses.

caption - Content of onnara9-onnara4-SSO-login.saz/raw/001_c.txt
3. Actor and System Information
This chapter analyzes information about the threat actor and their system environment based on the disclosed data.
3.1. System Information
3.1.1. deepin
The actor's VMware VM ran deepin, a Linux distribution developed by a Chinese company primarily targeted at the Chinese market.
While independently verifiable data on user numbers is limited, deepin reported that it had "more than 3 million users worldwide" in December 2022 and claimed in September 2024 that it had "over 5.4 million loyal users, nearly 3 million of whom are from overseas". However, the lack of external verification casts doubt on the accuracy of these claims.
Obtaining statistics for Linux distributions is difficult, as the user base tends to oppose telemetry and data collection, and the small market for commercial desktop software limits market research. However, publicly available data can provide a rough estimate of the popularity of various distributions. The table below summarizes search volume, Stack Overflow Developer Survey results, and self-reported statistics for several distributions.
caption - Distribution Statistics
Based on these metrics, it is unlikely that deepin's user base outside of China approaches 3 million. Given the lack of independent verification, the number is more likely in the thousands. Furthermore, deepin is associated with the following issues:
Policies and Regulations: The EULA and Privacy Policy state that deepin collects personal information, "may collect and use your personal information without seeking your consent," and that matters "shall be governed by the laws of the P.R.C.".
History of Data Collection Controversies: deepin previously faced criticism for using CNZZ Analytics in its App Store. After clarifying that its function was similar to Google Analytics and announcing its removal, the company later quietly added Umeng+ Analytics.
Security: The deepin desktop environment has been criticized for recurring security issues and attempts to circumvent security validation, leading to its removal from openSUSE in May 2025.
In summary, the probability of a user outside of China choosing or using deepin is extremely low.
3.1.2. IME
Traces of multiple Chinese Input Method Editors (IMEs) were found on the VMware VM. As deepin is primarily targeted at the Chinese market, fcitx-pinyin, fcitx-sunpinyin, and fcitx-table-wubi are installed by default. If the system is installed with Chinese as the selected language, wubi, shuangpin, pinyin, and sunpinyin are enabled; if English is selected, they are disabled. Almost all of the locale-dependent features in configuration files are set to English, suggesting it was installed as English.

caption - List of fcitx packages in the default installation
Additional IME installations were identified:
fcitxplugins: Traces ofhuayupy,wbpy,rime, andiflyimebeing installed were found. The enabled input methods werewbpyandpinyin.ibusplugins: Traces ofrimebeing installed and used were identified.SogouPY: Evidence of additional configuration for Sogou Pinyin was present.

caption - diff of EnabledIMList in the default settings and work/home/user/.config/fcitx/profile
3.1.3. Other Artifacts
Installation and Locale Information
Almost all of the locale-dependent features in configuration files are set to English, indicating the system was configured as English. The content of work/home/user/.config/locale.conf is shown below.
caption - Content of work/home/user/.config/locale.conf
However, messages in logs such as work/var/log/{access.log*,vmware-network.*.log} are localized in Korean.

caption - Content of work/var/log/vmware-network.1.log
deepin Configuration Changes and Activity Traces
The file work/home/user/.config/deepin/dde-desktop/dde-desktop.conf references a ProtonVPN OpenVPN profile, though the profile itself was not present in the dump.

caption - Content of work/home/user/.config/deepin/dde-desktop/dde-desktop.conf
The file work/home/user/.config/deepin/dde-file-manager/dde-file-manager.obtusely.json contains a history of file access, including paths with personal information, as well as connections to remote and public shares. Examples include:
standard://downloads/cert/gpki_cert/*file:///mnt/hgfs/share_data/GitHack/www.caa.org.tw/*ftp:host=192.168.50.1:21212
In work/home/user/.config/deepin/dcc-weather-plugin.conf, the Location was set to Waterloo, Canada.

caption - Content of work/home/user/.config/deepin/dcc-weather-plugin.conf
Other application traces include:
FileZilla:
work/home/user/.config/filezilla/recentservers.xmlsuggests access toftp.fu-berlin.de, a public FTP mirror.Foxit Reader: A configuration file at
work/home/user/.config/Foxit Software/Foxit Reader.confreferenced a file path containing an email address:tmp/kclee/hiaei84@gmail.com.pst_pst_*.msg.
3.2. Browser Information
An analysis of all browser profiles under work/home/user revealed that the primary profile was work/home/user/.config/google-chrome/Default. The table below lists all browser profiles and their identified activity periods.
caption - Activity periods
The earliest record in the work/home/user/.config/google-chrome/Default profile is from 2020-12-02 01:56:37.844, with browsing history present from 2025-03-18 04:04:20.873 to 2025-05-28 07:11:01.791. The other profiles were either unused or showed only short-term activity.
3.2.1. Language
Historical versions of work/home/user/.config/google-chrome/Default/Preferences were preserved in files named .com.google.Chrome.*.
caption - last_engagement_time data
The timeline of changes is as follows:
Before 2020-04-23T10:28:01.605486:
intl.*_languageswas set to English and Chinese. Translation for Chinese was blocked (translate_blocked_languages).Before 2021-04-08T03:15:41.989060: Korean was added, and translation for Korean was blocked.
Before 2025-04-10T16:13:27.859136: Translation for English was also blocked.
The actor primarily accepted translation prompts for English and Korean pages, with the target translation language set to Chinese. There is no record of accepting translations from Chinese to any other language.
The actor mainly visited English and Chinese websites, with visits to Korean sites occurring until 2021-04-08. After 2025-04-10, visits to Korean sites were rare.
3.2.2. history
The work/home/user/.config/google-chrome/Default profile was used for both operational and non-operational activities. In addition to work-related browsing for vulnerabilities and malware, the history shows activity on forums and other sites.
A selection of visits related to Cobalt Strike is shown below.
caption - Cobalt Strike-related browsing history
A selection of visits related to rootkit is shown below.
caption - Rootkit-related browsing history
Visits to translate.google.* show that the actor frequently translated text from English and Korean documents, source code, and LLM responses into Chinese. Examples include:

caption - Example from Google Translate history
caption - Translation history examples
The actor was a frequent visitor to the Chinese forum acfun.cn/v/list63/index.htm. The first visit was recorded on 2021-05-19 03:08:57.000. During the period with available history (2025-03-18 to 2025-05-28), the page was visited 232 times, out of a total of 1,440 visits to acfun.cn.
Search engine usage frequency is shown below, with Baidu being the third most used after Google and DuckDuckGo.
caption - Search engine usage frequency
3.2.3. geolocation
Historical versions of work/home/user/.config/google-chrome/Local State were preserved in files named .com.google.Chrome.*. According to these records, Chrome's VariationsService detected the user's country changing in the following sequence: tw (Taiwan), hk (Hong Kong), jp (Japan), and sg (Singapore). Details are provided in the table below. The functions of variations_permanent_consistency_country and variations_country were confirmed by analyzing the source code.
caption - Geolocation data
Event pings found under work/home/user/.mozilla/firefox/06yb5px0.default-release/saved-telemetry-pings/ all had the search region set to HK (Hong Kong).
caption - Search engine region settings
The Thunderbird profiles under work/home/user/.thunderbird/ contained timezone settings.
The payload.info.timezoneOffset was identified in files within the work/home/user/.thunderbird/*/saved-telemetry-pings directories.
caption - payload.info.timezoneOffset data
In the Thunderbird profiles at work/home/user/.thunderbird/*, the times.json and prefs.js files revealed the firstUse timestamp and calendar.timezone.local setting, respectively.
caption - calendar.timezone.local data
Google's region detection, as reflected in the browser history, corroborates this data.
On
2020-12-21T16:07:17.035527, the title ofgoogle.comwasGoogle 搜尋(inwork/home/user/.mozilla/firefox/06yb5px0.default-release).On
2021-05-18 07:15:25.120, the title ofgoogle.comwasGoogle 検索(inwork/home/user/.config/BraveSoftware/Brave-Browser/Default).On
2021-05-18 07:15:30.999, the actor searched fortranslateongoogle.comand then navigated totranslate.google.co.jp(inwork/home/user/.config/BraveSoftware/Brave-Browser/Default).On
2025-03-19 01:15:18.988, the title ofgoogle.comwasGoogle 搜索(inwork/home/user/.config/google-chrome/Default).On
2025-03-27 04:52:26.132, the actor searched fortranslateongoogle.comand then navigated totranslate.google.com.sg(inwork/home/user/.config/google-chrome/Default).On
2025-05-13 05:08:47.578, the actor searched forgoogle searchongoogle.comand then navigated togoogle.com.sg(inwork/home/user/.config/google-chrome/Default).
Additionally, the titles of github.com pages were frequently localized to Chinese.
3.2.4. Other Artifacts
The path work/home/user/.config/baidunetdisk contains configuration files for the Baidu Netdisk client, a cloud storage and synchronization service from Baidu.

caption - baidunetdisk directory
The file work/home/user/.thunderbird/8inzqqf5.default-release/encrypted-openpgp-passphrase.txt indicates that the actor used OpenPGP within this Thunderbird profile.
Data stored in work/home/user/.config/google-chrome/Default/Local Storage shows that the actor visited amiunique.org, a site that analyzes the statistical uniqueness of a browser's fingerprint. The site stores the results locally.
The file work/home/user/.thunderbird/8inzqqf5.default-release/session.json records information about open windows and tabs. Analysis of the file paths reveals the following:
tos安装文件translates to "tos installation file".The email filenames appear to follow the Maildir mailbox format. If so,
S=indicates the file size.
A summary of all findings indicates the following:
The actor uses deepin, an operating system rarely used outside of China.
Traces of multiple, and only Chinese IMEs were found.
Browser history shows frequent visits to Chinese forums.
Translation history shows consistent translation from Korean and English to Chinese, with no instances of translation from Chinese.
While some Korean language artifacts were present, the evidence does not suggest the actor is Korean. Instead, the data strongly indicates that the actor is proficient in Chinese and familiar with the Chinese technology ecosystem (services and software).
4. Connection to a Past Incident in South Korea
4.1. Incident Overview
In 2022, our firm conducted an incident response investigation for a South Korean financial institution. The case began after a customer, who had entered personal information during a loan application, received a sales call from a different financial institution a few days later. Recognizing this as an anomaly, the client engaged our team to investigate.
Initial server forensics did not reveal any malicious executables. However, a network packet dump showed SMTP (25/tcp) sessions containing packets with both HTTP header/body data and an encrypted payload. We were able to determine the encryption key through pattern-based analysis and successfully decrypt the payload, which contained commands to execute malware. The decrypted data was as follows:
/etc/[malware_path]/[infostealer_loader] -jar /etc/[malware_path]/[infostealer] -url [db_info] -u [user_id] -p [password] -q[date_and_time] -qSTA MBDE -d "0:0, 1:1, 2:1, 5:0" -de "0"
exit
An infostealer and a backdoor were identified in the specified malware path, and subsequent disk image analysis confirmed the presence of a rootkit.
4.2. Malware Correlation
The infostealer used in the attack was custom-made to exfiltrate the actor's desired information. The backdoor and rootkit's configuration and behavior were identical to the backdoor and rootkit source code found in the actor's VMware VM dump within the tomcat20220420_rootkit directory.

caption - Left: main function source code from master.c (backdoor). Right: Pseudocode of the main function from the backdoor found in the incident.

caption - Left: init function source code from main.c (rootkit). Right: Pseudocode of the init_module function from the rootkit found in the incident.
While values set during build configuration by config.sh, such as the magic packet, rootkit name, and backdoor name, were different, various other values, including the communication data's XOR key and the AES key and IV, were identical.
4.3. Basis for Attribution
At the time of the 2022 incident, there was no public information on this backdoor and rootkit. Besides the fact that the rootkit was developed with reference to adore-ng, no specific actor could be identified. Code similarity and attack methods alone were insufficient to attribute the activity to a specific threat actor. However, based on the tactics, techniques, and procedures (TTPs), we concluded that it was not a DPRK-nexus APT group. The primary reasons were:
The incident centered on penetrating from an external to an internal server to steal customer data from a database, which was then likely used for voice phishing. This differs from the typical intelligence gathering or financial theft motives of DPRK APT groups.
The initial intrusion exploited a web service vulnerability, unlike the spear-phishing or social engineering techniques commonly used by DPRK APT groups. Furthermore, while they may compromise web servers, it is rare for them to use one as a C&C server to pivot deeper into an internal network.
There were no public reports of DPRK APT groups using a rootkit and backdoor against Linux systems.
In June 2022, Avast published a report naming the rootkit "syslogk," but it was described as having been found in the wild, and evidence for attribution remained scarce.
However, the original source code for the backdoor and rootkit has now been discovered in the actor's VMware VM dump, providing a strong basis for attribution. The directory name is also similar to the timeframe of the incident.
Therefore, we assess with high confidence that the actor described in the "APT Down - The North Korea Files" report is the perpetrator behind the 2022 breach of the South Korean financial institution.
Finally, the existence of a 2025 version of the backdoor and rootkit suggests that the actor has been continuously using and developing this malware since 2022. It is highly probable that the actor has conducted additional attacks beyond the 2022 financial institution case. Accordingly, a method for detecting infection is provided in Section 7, "syslogk Rootkit Infection Check Method."
5. Attribution and Rationale
We assess that the actor behind the "APT Down - The North Korea Files" is not the DPRK-nexus APT group Kimsuky, but rather the China-nexus group UNC5221. The rationale for this assessment is detailed below.
5.1. Kimsuky
5.1.1. Operation Covert Stalker
In a Naver phishing-related file (work/mnt/hgfs/Desktop/New folder/default-ssl.conf) from the actor's VMware VM dump, we identified the domain nid-security[.]com. This domain has a historical association with the IP address 27.255[.]80.170, which was linked to Kimsuky's "Operation Covert Stalker" in a 2024 AhnLab report. This same IP address is referenced in the actor's readme.txt file (work/mnt/hgfs/Desktop/New folder/readme.txt).
The readme.txt file instructs the user to set 27.255[.]80.170 as the "phishing VPS address." However, in a separate configuration file (work/mnt/hgfs/Desktop/New folder/forward.conf), the phishing VPS IP is set to 45.133[.]194.88.
Currently, nid-security[.]com resolves to 45.133[.]194.126, an IP in the same range as the one configured in forward.conf. While this demonstrates an infrastructure overlap, we assess that this evidence is insufficient to link the actor to Kimsuky.
5.1.2. Stolen GPKI Certificates
Numerous GPKI certificates were found in the actor's VMware VM dump. While Kimsuky's Troll Stealer is known to have a feature for exfiltrating GPKI certificates, the method used by the actor to steal these certificates is unknown, and no files related to Troll Stealer were discovered. Therefore, this is insufficient evidence to establish a link to Kimsuky.
5.1.3. Similar Targets
A Naver phishing-related file (work/mnt/hgfs/Desktop/New folder/htdocs/generator.php) in the actor's VMware VM dump contained the domain nid[.]navermails[.]com. While a report from AhnLab mentions this as a Naver phishing domain, the report does not attribute it to Kimsuky.
5.2. APT41 & UNC3886
5.2.1. Connection to the reptile Rootkit
The reptile rootkit has been reportedly used in attacks by APT41 and UNC3886.
The syslogk rootkit (found in the tomcat*_rootkit directories) shares the following commonalities with the reptile rootkit:
They use the same library for function hooking.
Some functions have similar code.
They use a port knocking mechanism to execute the backdoor.
Despite these similarities, we consider this connection weak because reptile is an open-source project. syslogk shows signs of borrowing from multiple open-source projects, including the direct use of source code from the KoviD rootkit. Therefore, this evidence is insufficient to link the actor to APT41 or UNC3886.
5.2.2. Use of TinyShell
Source code for TinyShell, a backdoor known to be frequently used by UNC3886, was found in the work/mnt/hgfs/share_data/backdoor/20220812/SSS directory. However, Google's reporting on TinyShell-based backdoors used by UNC3886 describes communication encrypted with AES, HMAC, or RC4. The TinyShell source code found in the dump uses AES and SHA1. Due to this difference in communication methods, the evidence is considered weak.
5.3. UNC5221
5.3.1. CVE-2025-0282 & BRUSHFIRE
CVE-2025-0282 is a remote code execution vulnerability in Ivanti Connect Secure that has been reportedly exploited by UNC5221 to deploy malware. Six Python scripts that exploit this vulnerability to deploy malware were found among the actor's files. The malware deployed by these scripts was identified as BRUSHFIRE, which was also observed in UNC5221 attacks.
The use of the same vulnerability and the deployment of the same malware provides a strong link to UNC5221.
5.3.2. SPAWN Family
The SPAWN family is a malware suite frequently used by UNC5221. Indicators related to this family were identified in the file work/mnt/hgfs/Desktop/New folder/203.234.192.200_client.zip. The related malware includes SPAWNMOLE, SPAWNSNAIL, and SPAWNCHIMERA.
The initial hardcoded client_hello value in client.py, which is modified at runtime, is identical to the magic packet of SPAWNMOLE, used in attacks by UNC5221. The modified client_hello value is consistent with the description of the SPAWNCHIMERA magic packet detailed in a JPCERT blog post. Like SPAWNMOLE, SPAWNCHIMERA was used in attacks by UNC5221 and was deployed via the aforementioned CVE-2025-0282 vulnerability.
The controller.py script is an SSH client that connects through the SOCKS5 proxy established by client.py. It is likely the client for either SPAWNSNAIL or SPAWNCHIMERA.
The discovery of multiple SPAWN family malware components, the match between the client_hello value and the SPAWNMOLE/SPAWNCHIMERA magic packets, and the fact that the SPAWN family is a signature toolset of UNC5221 all point to a strong connection.
5.3.3. ROOTROT
ROOTROT is a Perl-based webshell identified in attacks by UNC5221. It Base64-decodes a specific cookie value and executes it using eval. The results are then inserted into the HTTP response within an HTML comment.
The dump contained work/mnt/hgfs/Desktop/ivanti_control/main.py, a script assessed to be a client for ROOTROT. This script Base64-encodes a given command into a Perl script, sets it as the DSPSALPREF cookie value, and sends it via an HTTP GET request. This behavior perfectly matches the client-side actions required to interact with ROOTROT.
Furthermore, main.py decodes the content of the last HTML comment from the GET response to display the output, which is the standard method for a ROOTROT client to receive results. This provides another strong link to UNC5221.
However, it is possible that the actor acquired these UNC5221-related tools. This is supported by two observations:
Malware and Attack Guides
A
readme.txtfile with environment setup instructions written in Chinese was found in a directory related to the Naver Adversary-in-the-Middle (AitM) attack.Similarly, the
work/mnt/hgfs/share_data/backdoordirectory contained another Chinesereadme.txtfile and documents titled1.ko 图文编译 .doc(1.ko Image and Text Compilation.doc) and技术说明书 - 22.docx(Technical Manual - 22.docx).In contrast, the malware that appears to be under active development by the actor, such as the incomplete Cobalt Strike Beacon and the
syslogkrootkit, contains logic for testing and debugging but lacks any user guides.
Malware Containing the "contact" Keyword
The exploit script for CVE-2025-0282 prints the string
This version may exist vul, Please contact us to check.indetect_version. This suggests that the actor may have received the exploit from another individual or as part of a toolkit, rather than developing it themselves.
Ultimately, our analysis of the available data indicates the actor is proficient in Chinese and uses Chinese software, communities, and services. Based on the use of the deepin OS—a distribution developed in China and rarely used by non-Chinese speakers—we assess that the actor is likely Chinese. Furthermore, the presence of multiple malware families linked to UNC5221 attacks establishes a strong connection to that group.
6. Conclusion
This report provides a detailed analysis based on the "APT Down - The North Korea Files" report and its accompanying data leak.
The leaked files, which included dumps of the actor's VMware VM and VPS, are difficult to obtain under normal circumstances and provided a rare and detailed view into the actor's operations.
The data revealed numerous traces of attacks targeting South Korea, as well as files that appear to have been exfiltrated from South Korean corporations and government agencies. Most notably, we confirmed that the source code for the rootkit and backdoor found in the tomcat*_rootkit directories is a direct match for the malware recovered during a 2022 incident at a South Korean financial institution.
The existence of a 2025 version of this rootkit and backdoor, in addition to the 2022 version, indicates that the actor has been continuously upgrading and using this malware over a long period. Although a confirmed attack using this toolset occurred in 2022, the malware is difficult to detect, and its signs of infection are not obvious. We therefore assess it is highly probable that additional, unidentified attacks have occurred between 2022 and the present. Accordingly, we have provided a detailed infection-checking procedure in Section 7, "syslogk Rootkit Infection Check Method."
Based on our analysis, we assess the actor is a Chinese individual associated with the UNC5221 group, not the DPRK-nexus Kimsuky group. While we lack evidence to confirm the actor's ultimate sponsor, multiple artifacts point to a Chinese operator: malware-related files contained Chinese, the actor used Chinese software and online communities, and browser history showed consistent translation of Korean and English into Chinese. Furthermore, the Ivanti Connect Secure-related malware aligns closely with tools used in past UNC5221 operations.
Collectively, these findings indicate that the actor has persistently targeted South Korea. The use of a custom rootkit, the exploitation of a 1-day vulnerability, and the successful exfiltration of sensitive data from South Korean entities demonstrate that the actor possesses advanced technical capabilities and has succeeded in deeply penetrating target networks.
7. syslogk Rootkit Infection Check Method
During the 2022 incident investigation, we found that the syslogk rootkit was automatically loaded at boot by a script located in /etc/init.d. Analysis of the leaked files shows that the syslogk build process generates an installation script (install.sh), a removal script (del.sh), and a loader script (shservice). The generated shservice file is identical to the script recovered during the 2022 incident.

caption - Content of the shservice file
Therefore, the following detection methods are based on the artifacts generated by config.sh and the malware itself.
All scripts must be run with root privileges and are capable of detecting both the 2022 and 2025 versions of the rootkit and backdoor.
7.1. Checking for Hidden Files in /etc/init.d
This check verifies if a script that loads the rootkit at boot exists in /etc/init.d. Because the rootkit actively hides this script file, it cannot be detected by standard directory listing commands.
To circumvent this, we have developed a script that compares the total disk usage of the /etc/init.d directory with the sum of the disk usage of all visible files within it. A discrepancy indicates the presence of a hidden file. The script is provided in Appendix A, check-initd.sh.
7.2. Checking for the syslogk Rootkit
This method extracts the path to the syslogk rootkit based on strings found in the loader script. It uses the dump utility to create a raw dump of the /etc/init.d directory, so the dump package must be installed.
sudo apt install dump
If a matching string is found in the dump file, the script extracts the rootkit's path and identifies the unhide string needed to unload the module. It then writes this string to the rootkit to unhide and unload it.
The scripts are provided in Appendix B (find-syslogk.py) and Appendix C (find-syslogk.sh).
Note:
find-syslogk.pyrequires Python 3.7 or higher.
The dump utility may not function on all systems. If a hidden file is detected using the method in Section 7.1, we recommend performing a full disk image dump or mounting the disk in an analysis environment for further inspection.
7.3. Checking for a Running Backdoor Process
The backdoor process can be detected by comparing the list of processes obtained by enumerating /proc/*/cmdline with the results of direct lookups for each process ID (PID). The script scans all potential PIDs up to the highest one currently active. This may cause a temporary increase in system load on busy systems.
The scripts are provided in Appendix D (check-backdoor.py) and Appendix E (check-backdoor.sh).
Note:
check-backdoor.pyrequires Python 3.0 or higher.
8. Appendix
Appendix A. check-initd.sh
Appendix B. find-syslogk.py
Appendix C. find-syslogk.sh
Appendix D. check-backdoor.py
Appendix E. check-backdoor.sh
Popular Articles









