QLNX: Linux RAT Hoàn Toàn Mới Nhắm Vào Developer Và Đường Dẫn Thẳng Vào Supply Chain

Tổng quan
Ngày 04/05/2026, Các nhà nghiên cứu công bố phân tích về QLNX (Quasar Linux RAT), một Linux implant chưa từng được ghi nhận trước đây với tỷ lệ phát hiện cực thấp. Tại thời điểm công bố, chỉ có 4 trong tổng số các giải pháp bảo mật phát hiện được binary của nó là độc hại.
QLNX không phải một infostealer đơn giản. Đây là nền tảng post-exploitation đầy đủ tính năng được thiết kế đặc biệt để nhắm vào developer workstation và CI/CD build host, với mục tiêu duy nhất: thu thập credential để từ đó xâm nhập vào software supply chain.
Attacker kiểm soát được máy của một package maintainer có nghĩa là họ có thể publish malicious code lên NPM, PyPI, hoặc inject backdoor vào container image. Đây không phải rủi ro lý thuyết. Tháng 3/2026, vụ tấn công vào LiteLLM supply chain theo đúng pattern này: credential bị đánh cắp từ một developer tool được dùng để trojanize một Python package có 3,4 triệu lượt download mỗi ngày. QLNX được trang bị đủ capability để thực hiện toàn bộ kill chain đó.
Đối tượng rủi ro cao nhất: Developer và DevOps engineer đang dùng Linux workstation hoặc quản lý CI/CD pipeline với quyền publish lên package registry hay cloud infrastructure.
Hành động ưu tiên: Hunt process masquerading là kernel thread từ path lạ, check /etc/ld.so.preload và /tmp/.X752e2ca1-lock, deploy hunting query từ Trend Vision One.
Bối cảnh: Developer là mục tiêu vì lý do cụ thể
Vài năm trở lại đây, open-source package ecosystem trở thành một trong những attack vector hiệu quả nhất. Không phải vì NPM hay PyPI có lỗ hổng kỹ thuật đặc biệt, mà vì một thực tế đơn giản: một package maintainer có account đã được compromise có thể publish code ngay lập tức đến hàng triệu downstream user mà không cần ai xem xét.
Attacker hiểu điều này từ lâu. Thay vì tấn công trực tiếp vào package registry, target dễ hơn nhiều là người đang quản lý package đó. Máy tính cá nhân của một developer thường có AWS credential, Kubernetes token, Docker registry access, SSH key đến production server, và NPM token có quyền publish. Tất cả trong một nơi, thường không được bảo vệ ở cùng mức độ như enterprise server.
QLNX được xây dựng để khai thác chính xác attack surface này. Nó chạy chủ yếu trên Linux developer workstation và CI/CD build host với Debian, Ubuntu, RHEL, Fedora, và Arch. Malware compile rootkit và PAM module trực tiếp trên máy nạn nhân bằng kernel header có sẵn của host, giúp nó thích ứng với nhiều kernel version khác nhau thay vì phụ thuộc vào binary đã build sẵn.
Thông tin malware
| Thuộc tính | Chi tiết |
|---|---|
| Tên | Quasar Linux RAT, QLNX |
| MD5 | 70f70743f287a837d17c56933152a8a6 |
| SHA1 | b0f2c668cbdd63a871c90592b6c93e931115872e |
| SHA256 | ea1d34b21b739a6bbf89b3f7e67978005cf7f3eda612cefc7eac1c8ead7c5545 |
| File format | ELF 64-bit LSB PIE executable, x86-64 |
| File size | 147.91 KB (151.464 bytes) |
| Version | 1.4.1 (trong beacon packet) |
| Phát hiện bởi | 4/nhiều vendor tại thời điểm public |
| Phát hiện bởi Trend Micro | Backdoor.Linux.QLNX.A |
| Attribution | Chưa xác định |
| Vector lây nhiễm | Chưa xác định |
| Discoverers | Aliakbar Zahravi, Ahmed Mohamed Ibrahim, Trend Micro |
| Công bố | 04/05/2026 |
Cơ chế thực thi: Biến mất khỏi disk ngay khi chạy
Bước đầu tiên sau khi thực thi là xóa bản thân khỏi disk. QLNX dùng memfd_create (syscall 319) để tạo anonymous RAM-backed file descriptor, copy toàn bộ binary vào đó, rồi gọi execveat (syscall 322) để re-execute từ memory. File gốc trên disk bị xóa ngay bằng unlink.
Kết quả: /proc/self/exe trỏ về memfd:... thay vì path thật. Mọi file-based scan đều không có gì để phát hiện. Nếu execveat không khả dụng trên kernel cũ, fallback là /proc/self/fd/<memfd>.
Để tránh tạo nhiều instance, malware dùng file lock tại /tmp/.X752e2ca1-lock, một path được thiết kế nhái theo X11 socket lock file hợp lệ. Nếu lock đã tồn tại nghĩa là instance khác đang chạy, malware thoát ngay lập tức.
Runtime profiling
Sau khi đứng vững trong memory, QLNX profile host để biết mình đang ở đâu và có thể làm gì:
| Flag | Nguồn | Mục đích |
|---|---|---|
g_is_root |
getuid() == 0 |
Mở khóa các capability chỉ dùng khi có root |
g_kernel_version |
uname() |
Quyết định kỹ thuật injection nào khả dụng |
g_memfd_supported |
Probe syscall 319 | Fileless execution |
g_has_proc_mem_write |
Kernel >= 3.2 check | /proc/pid/mem injection |
g_yama_ptrace_scope |
/proc/sys/kernel/yama/ptrace_scope |
ptrace injection có bị chặn không |
g_selinux_enforce |
/sys/fs/selinux/enforce |
SELinux đang enforce không |
g_has_devinput |
/dev/input/event* |
Raw keylogger có dùng được không |
g_has_x11 |
DISPLAY environment variable |
X11 keylogger và screenshot |
g_has_gcc |
Probe /usr/bin/gcc |
Compile rootkit và PAM hook |
g_is_containerized |
/.dockerenv, cgroup check |
Đang trong container hay không |
Kết quả profiling quyết định capability nào được bật trong session đó. Nếu không có root, các persistence mechanism đòi quyền root sẽ không được cài. Nếu không có gcc, rootkit compile-on-target sẽ không khả dụng.
Giả mạo kernel thread
Để tránh bị phát hiện trong ps hay top, QLNX random chọn một trong các tên kernel thread hợp lệ và áp dụng nhất quán vào ba nơi:
[kworker/0:0] [kworker/u8:2] [migration/0]
[ksoftirqd/0] [rcu_sched] [watchdog/0]
Tên được ghi vào argv[0] (thay đổi những gì ps và /proc/pid/cmdline hiển thị), prctl(PR_SET_NAME) (thay đổi tên kernel thread hiển thị trong top/htop), và /proc/self/comm. Đồng thời, hai biến môi trường forensically quan trọng là _ (chứa path gốc của binary) và OLDPWD bị xóa bằng unsetenv.
Persistence: 7 cơ chế hoạt động đồng thời
QLNX không chỉ dùng một cơ chế persistence mà hỗ trợ bảy cơ chế có thể stack lên nhau, operator chọn từ C2 dựa trên kết quả profiling:
| Loại | Method | Path | Quyền cần |
|---|---|---|---|
| 0 | Systemd system service | /etc/systemd/system/quasar_linux.service |
Root |
| 1 | .bashrc injection | ~/.bashrc |
User |
| 2 | Crontab @reboot | crontab entry | User |
| 3 | Systemd user service | ~/.config/systemd/user/quasar_linux.service |
User |
| 4 | SysVinit init.d | /etc/init.d/quasar_linux |
Root |
| 5 | LD_PRELOAD shared library | /etc/ld.so.preload + /usr/lib/libsecurity.so.1 |
Root + gcc |
| 6 | XDG desktop autostart | ~/.config/autostart/quasar_linux.desktop |
User + desktop |
Mọi artifact đều được embed string QLNX_MANAGED dưới dạng comment để malware tự phân biệt entry của mình với service hệ thống hợp lệ khi scan.
Cơ chế LD_PRELOAD đặc biệt nguy hiểm. Khi đã có entry trong /etc/ld.so.preload, mọi chương trình dynamically-linked chạy trên hệ thống đều trigger malware: ls, cat, ssh, sudo, bash. Điều này có nghĩa là nếu responder kill process QLNX mà chưa xóa entry trong /etc/ld.so.preload, malware sẽ được respawn ngay lập tức bởi lệnh tiếp theo bất kỳ mà admin chạy.

Hình 2. LD_PRELOAD trigger logic: mọi chương trình dynamically-linked đều spawn lại QLNX (Nguồn: Trend Micro)
Rootkit hai tầng: Userland và Kernel
Tầng 1: LD_PRELOAD userland rootkit
QLNX không ship precompiled rootkit binary. Thay vào đó, nó embed full C source code dưới dạng string literal trong binary, viết ra /tmp/.hide_src_XXXXXX.c, compile bằng gcc của host thành libsecurity_utils.so.1, và đăng ký vào /etc/ld.so.preload.
Rootkit hook tám libc function bằng dlsym(RTLD_NEXT, ...):
| Function bị hook | Hành vi |
|---|---|
readdir / readdir64 |
Bỏ qua directory entry khớp với tên ẩn hoặc PID của malware |
stat / lstat |
Trả về ENOENT cho path cần ẩn |
__xstat / __lxstat |
Tương tự (legacy glibc wrapper) |
open |
Trả về ENOENT |
fopen |
Trả về NULL với ENOENT |
access |
Trả về ENOENT |
File bị ẩn gồm: binary QLNX, libsecurity_utils.so.1, pam_security.so, và log file .ICE-unix, .Test-unix trong /var/log/. Timestamp của rootkit .so được timestomp để khớp với /usr/lib/libc.so.6, tránh nổi bật khi forensic timeline analysis.
Vì rootkit được load vào mọi process qua ld.so.preload, các công cụ thông thường như ls, find, stat, ps đều bị ảnh hưởng. Sysadmin chạy ls /usr/lib/ sẽ không thấy rootkit .so. Forensic responder dùng find sẽ không tìm thấy file độc hại.

Hình 3. Embedded C source code của rootkit trong QLNX binary, được compile tại chỗ bằng gcc của host (Nguồn: Trend Micro)
Tầng 2: eBPF kernel-level rootkit controller
Ở tầng kernel, QLNX dùng Linux BPF subsystem để ẩn PID, file, và network port trực tiếp từ kernel. QLNX không chứa kernel-side eBPF program mà đóng vai trò là userland controller, tạo và quản lý BPF map:
| Action | Mục tiêu | Giới hạn |
|---|---|---|
| Hide/Unhide PID | BPF hash map | Tối đa 64 entry |
| Hide/Unhide file | BPF LRU hash map | Tối đa 64 entry |
| Hide/Unhide port | BPF array map | Tối đa 32 entry |
Yêu cầu: root privilege và kernel >= 4.18. Bước check runtime bao gồm test BPF syscall để verify BPF support thực sự khả dụng trên hệ thống đó.
Kết hợp cả hai tầng, LD_PRELOAD rootkit ẩn file và process khỏi userland tool, còn eBPF maps ẩn chúng khỏi kernel-level query như BPF-based monitoring tool. Đây là defense-in-depth theo chiều ngược lại: depth cho attacker, blind spot cho defender.
PAM Backdoor: Intercept Mật khẩu Trước Khi Được Mã Hóa
PAM inline-hook backdoor
Đây là component tinh vi nhất trong QLNX. Tương tự rootkit, PAM backdoor không được ship dưới dạng precompiled binary mà được embed dưới dạng C source code, compile tại chỗ thành pam_security.so, cài vào /etc/ld.so.preload.
Vì PAM (Pluggable Authentication Module) là layer xử lý authentication cho sudo, ssh, su, và login trên Linux, một PAM hook được load vào mọi process có nghĩa là attacker nhận được plaintext password của mọi authentication event trên hệ thống.
Ba chức năng của PAM backdoor:
Master password bypass: Hardcode O$$f$QtYJK làm master password. Bất kỳ authentication nào với mật khẩu này sẽ succeed bất kể account, không cần biết password thật.
Credential harvesting: Mọi authentication event được XOR-encrypt và lưu vào:
/var/log/.ICE-unix(SSH/PAM authentication)/var/log/.Test-unix(SSH, SCP, SU, sudo)
Cả hai file đều được rootkit ẩn khỏi ls và find thông thường.
SSH session monitoring: Log outbound SSH session data để hỗ trợ lateral movement reconnaissance.
Timestamp của pam_security.so được timestomp theo pam_unix.so hợp lệ để qua mặt forensic timeline analysis.

Hình 4. PAM backdoor C source code embedded trong QLNX, compile tại chỗ bằng gcc của host (Nguồn: Trend Micro)
PAM credential logger
Song song với inline-hook backdoor, QLNX có một PAM credential logger đơn giản hơn: compile từ C source thành /usr/lib/.libpam_cache.so, lưu service name, username, và authentication token dưới dạng plaintext vào /tmp/.pam_cache.
Command Infrastructure: 58 Lệnh Trên 3 Transport
QLNX đăng ký 58 command handler trong dispatch table. Mỗi entry map một command ID đến handler function:
typedef struct {
__int16 command_id;
char _pad[6];
void *handler;
} command_handler_entry_t;
3 transport backend
Tất cả đều dùng cùng binary command protocol. Mọi session đều bắt đầu bằng 4-byte magic identifier 51 4C 4E 58 (ASCII "QLNX"):
| Transport | Mặc định | Encoding |
|---|---|---|
| Custom TCP/TLS | Có, version này | Binary framing trực tiếp qua TLS |
| HTTPS | Backup | Base64-encoded, POST push + GET poll |
| HTTP | Backup | Tương tự HTTPS nhưng plaintext |
Check-in beacon
Khi kết nối thành công, malware gửi beacon packet chứa: malware version (1.4.1), OS version, privilege level (Admin/User), geolocation từ ip-api.com, machine fingerprint (SHA256 của MAC address hoặc /etc/machine-id), username, hostname, và IPv4 interfaces.
Để tránh network beaconing detection, sleep interval giữa các lần reconnect được random từ 3.000 đến 15.000ms kèm jitter 30%.

Hình 5. QLNX TCP handshake, SSL decrypted packet cho thấy beacon packet structure (Nguồn: Trend Micro)
Capability set đầy đủ
| Nhóm | Capabilities |
|---|---|
| Execution và evasion | Fileless execution via memfd_create + execveat, self-deletion, process name spoofing, single-instance mutex |
| Rootkit và ẩn náu | LD_PRELOAD hooks (readdir, stat, open, fopen), eBPF maps ẩn PID/file/port từ kernel |
| Persistence | systemd system/user service, crontab @reboot, init.d, XDG autostart, .bashrc injection, LD_PRELOAD |
| Credential và data harvesting | SSH key, browser database (Chrome/Chromium/Firefox), cloud config file, PAM plaintext password, /etc/shadow, clipboard, shell history |
| Surveillance | Keylogger (/dev/input raw events + X11 fallback), screenshot, clipboard monitoring |
| Networking và tunneling | TCP tunnel, port forwarding, SOCKS proxy, port scanning, raw packet capture, SSH lateral movement |
| Remote control | Interactive PTY reverse shell, file manager đầy đủ, process management, power control, privilege escalation qua sudo/pkexec |
| Advanced offensive | In-memory .so reflective loading, process injection via /proc/pid/mem và ptrace, BOF/COFF execution, P2P mesh network, inotify filesystem monitoring, timestomping |
Credential Theft: Một Lệnh Lấy Tất Cả
Khi operator trigger command 0x90, QLNX chạy bốn sub-harvester liên tiếp:
SSH: id_rsa, id_ed25519, id_ecdsa, id_dsa, known_hosts, authorized_keys.
Browser: Login database và cookie của Chrome, Chromium, Firefox.
Developer và cloud credential:
.npmrc NPM registry token
.pypirc PyPI upload credential
.git-credentials Git token
.gitconfig Git configuration
.aws/credentials AWS access key + secret
.aws/config AWS CLI configuration
.kube/config Kubernetes service account token
.docker/config.json Docker Hub credential
.vault-token HashiCorp Vault token
.terraform.d/credentials.tfrc.json Terraform credential
~/.config/gh/hosts.yml GitHub CLI token
.env Environment variable file
System và misc: /etc/shadow (khi root), Bash/Zsh/MySQL/PSQL shell history, X11 clipboard content qua xclip/xsel.
Tất cả được tag theo category, application name, file path, và raw content trước khi exfiltrate.

Hình 6. Credential theft module: một lệnh 0x90 lấy toàn bộ developer và cloud credential trong một lần sweep (Nguồn: Trend Micro)
P2P Mesh Network: Eradication Trở Nên Khó Hơn
QLNX bao gồm P2P mesh capability biến các implant riêng lẻ thành mạng lưới resilient. Mỗi implant có routing table để relay command đến agent khác trong mesh. Điều này có hai hệ quả:
Thứ nhất, attacker không cần kết nối trực tiếp đến mọi infected host. Đủ để kết nối đến một agent, sau đó relay qua mesh đến các agent khác.
Thứ hai, khi incident response cô lập một host, các implant còn lại trên network vẫn có thể duy trì C2 qua mesh. Eradication hoàn toàn đòi hỏi phải tìm và xóa sạch mọi infected node, không thể chỉ block C2 server là xong.
MITRE ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Triển khai trong QLNX |
|---|---|---|---|
| Execution | T1059.004 | Unix Shell | Interactive PTY reverse shell qua bash/zsh/sh |
| Execution | T1106 | Native API | memfd_create + execveat cho fileless execution |
| Persistence | T1543.001 | Launch Agent | systemd user service + XDG autostart |
| Persistence | T1543.002 | Systemd Service | /etc/systemd/system/quasar_linux.service |
| Persistence | T1053.003 | Cron | @reboot entry trong crontab |
| Persistence | T1546.004 | .bashrc/.bash_profile | Inject execution command vào shell init file |
| Defense Evasion | T1027 | Obfuscated Files | C source code embedded dưới dạng string literal |
| Defense Evasion | T1036.005 | Masquerading: Match Legitimate Name | Giả mạo tên kernel thread (kworker, ksoftirqd) |
| Defense Evasion | T1055.009 | Process Injection: Proc Memory | Inject qua /proc/pid/mem + ptrace |
| Defense Evasion | T1070.002 | Clear Linux/Mac System Logs | Xóa auth.log, syslog, wtmp, bash_history |
| Defense Evasion | T1070.006 | Timestomp | Rootkit .so timestamps khớp với libc.so.6 |
| Defense Evasion | T1014 | Rootkit | LD_PRELOAD hook + eBPF kernel maps |
| Defense Evasion | T1564.001 | Hidden Files and Directories | PAM log file tại /var/log/.ICE-unix |
| Credential Access | T1003.008 | /etc/passwd and /etc/shadow | Đọc /etc/shadow khi root |
| Credential Access | T1056.001 | Keylogging | Raw /dev/input events + X11 fallback |
| Credential Access | T1555.003 | Credentials from Web Browsers | Chrome/Chromium/Firefox login database |
| Credential Access | T1552.001 | Credentials In Files | .aws, .kube, .npmrc, .pypirc, .git-credentials |
| Discovery | T1082 | System Information Discovery | uname, geolocation từ ip-api.com, fingerprint từ /etc/machine-id |
| Discovery | T1083 | File and Directory Discovery | Sweep toàn bộ home directory tìm credential file |
| Discovery | T1057 | Process Discovery | Enumerate /proc/[pid]/comm |
| Collection | T1113 | Screen Capture | GDI screenshot capture |
| Collection | T1115 | Clipboard Data | Clipboard monitoring với SHA256 deduplication |
| Lateral Movement | T1021.004 | SSH | Dùng harvested SSH credential để SSH sang host khác |
| Command and Control | T1095 | Non-Application Layer Protocol | Custom binary protocol qua TLS |
| Command and Control | T1572 | Protocol Tunneling | TCP tunnel, SOCKS proxy, port forwarding |
| Command and Control | T1008 | Fallback Channels | TCP/TLS primary, HTTPS/HTTP fallback |
| Exfiltration | T1041 | Exfiltration Over C2 Channel | TLS-encrypted exfiltration qua custom TCP protocol |
Detection
QLNX được thiết kế để qua mặt file-based và signature-based detection. Những gì có giá trị là behavioral và artifact-based signal.
Signal 1: /etc/ld.so.preload chứa entry lạ
Đây là chỉ báo tin cậy nhất. Trong môi trường Linux bình thường, /etc/ld.so.preload thường rỗng hoặc không tồn tại. Bất kỳ entry nào trong file này đều cần được giải thích:
# Kiểm tra ngay
cat /etc/ld.so.preload
# Verify SHA256 của các .so đang được load
sha256sum $(cat /etc/ld.so.preload 2>/dev/null)
# Hunt entry QLNX cụ thể
grep -E "libsecurity_utils|libpam_cache" /etc/ld.so.preload
Signal 2: Mutex lock file đặc trưng
# Kiểm tra QLNX instance lock file
ls -la /tmp/.X752e2ca1-lock
# Hunt pattern: X lock file không có X server tương ứng
ls /tmp/.X*-lock | while read f; do
port=\((echo \)f | grep -oP '\d+')
if ! ss -tlnp | grep -q ":60${port} "; then
echo "Suspicious lock file (no X server): $f"
fi
done
Signal 3: PAM log file ẩn
# Kiểm tra trực tiếp bằng absolute path
# (rootkit ẩn chúng khỏi ls/find thông thường)
stat /var/log/.ICE-unix 2>/dev/null && echo "QLNX PAM log found"
stat /var/log/.Test-unix 2>/dev/null && echo "QLNX PAM log found"
stat /tmp/.pam_cache 2>/dev/null && echo "QLNX PAM cache found"
Signal 4: Process masquerading là kernel thread từ path lạ
Kernel thread hợp lệ không có /proc/<pid>/exe trỏ đến file executable vì chúng là in-kernel. Nếu thấy process tên [kworker/...] nhưng có executable path thì là red flag:
# Hunt process tên như kernel thread nhưng có exe path
for pid in /proc/[0-9]*/; do
pid_n=\((basename \)pid)
comm=\((cat "\)pid/comm" 2>/dev/null)
exe=\((readlink "\)pid/exe" 2>/dev/null)
if echo "\(comm" | grep -qE '^\[k(worker|softirqd|migration|watchdog|rcu)' && [ -n "\)exe" ]; then
echo "Suspicious process: PID=\(pid_n COMM=\)comm EXE=$exe"
fi
done
Signal 5: gcc compile suspicious source file
QLNX compile rootkit và PAM module tại chỗ. gcc chạy với các flag đặc trưng:
# Audit log hoặc EDR: hunt gcc compile shared library từ /tmp
auditctl -a always,exit -F arch=b64 -S execve \
-F exe=/usr/bin/gcc -k gcc_shared_compile
# SIEM query
process.name: "gcc"
AND process.args: ("-shared" AND "-fPIC")
AND (process.args: "/tmp/*" OR process.working_dir: "/tmp")
Signal 6: Outbound connection đến ip-api.com từ process không phải browser
QLNX query ip-api.com để lấy geolocation của victim trước khi gửi beacon. Nếu thấy Linux daemon hay non-browser process query endpoint này là đáng ngờ.
Trend Vision One Hunting Query
# Từ Trend Micro research:
# Implant execution
eventSubId:(2 OR 5) AND processFilePath:"quasar-implant"
# Mutex lock file
objectFilePath:"/tmp/.X752e2ca1-lock"
# LD_PRELOAD rootkit module
objectFilePath:"/usr/lib/libsecurity_utils.so.1"
# PAM log files
objectFilePath:("/var/log/.Test-unix" OR "/var/log/.ICE-unix")
# PAM hook source dropper
eventSubId:(101 OR 103) AND objectFilePath:/\/tmp\/\.pcs_[A-Za-z0-9]{6}/
# PAM hook compilation
processFilePath:/.*\/gcc/ AND processCmd:"-shared"
AND processCmd:"-fPIC" AND processCmd:"/usr/lib/.libpam_cache.so"
AND processCmd:"-lpam"
Network Detection (Trend Vision One)
Rule: 47135 - HTTP: Backdoor.Linux.QLNX.A Runtime Detection
Rule: 47136 - TCP: Backdoor.Linux.QLNX.A Runtime Detection
Nhận định
Tại sao 4 vendor phát hiện là con số đáng lo
Tại thời điểm Trend Micro công bố, chỉ 4 security solution phát hiện QLNX binary là độc hại. Với file size chỉ 147KB chứa đủ capability của một full-featured RAT, đây là tỷ lệ detection cực thấp. Nhưng con số 4 không phản ánh đúng vấn đề.
Vấn đề thực sự là mô hình detection. QLNX thực thi hoàn toàn từ memory, rootkit ẩn mọi artifact trên disk, và PAM backdoor intercept credential trước khi chúng được xử lý bởi bất kỳ security control nào. Kể cả khi tỷ lệ detection tăng lên 40 vendor sau khi hash được submit, malware đã không còn trên disk để scan. Tuy nhiên sự hiện diện của nó vẫn còn đó qua /etc/ld.so.preload, qua PAM hook, và qua P2P mesh.
Trend Micro phát hiện được QLNX thông qua AI-assisted threat hunting, không phải signature. Đây là hướng detection duy nhất có tính bền vững với loại threat này: behavioral anomaly trong process behavior, network pattern, và filesystem change, không phải file hash.
Developer workstation là "soft target" trong enterprise security model
Phần lớn enterprise security investment tập trung vào server và network perimeter. Developer laptop và workstation thường được exempt khỏi các control nghiêm ngặt nhất vì argument "cần flexibility để làm việc". Kết quả là máy của developer, nơi có tập trung nhiều nhất các high-value credential, lại được bảo vệ kém nhất trong fleet.
QLNX exploit chính xác khoảng trống này. Nhóm security phải shift mindset: developer workstation không phải "endpoint cần tradeoff giữa security và productivity" mà là "high-value target cần protection tương đương production server" vì credential trên đó có thể mở production environment.
Compile-on-target là xu hướng đang tăng, và nó phá vỡ prebuilt-binary detection
Cả rootkit lẫn PAM backdoor của QLNX đều được embed dưới dạng C source code và compile trực tiếp trên máy nạn nhân. Kỹ thuật này không chỉ bypass signature của precompiled binary mà còn tạo ra artifact khớp hoàn toàn với kernel version, glibc version, và PAM header của host đó.
Đây là pattern đã xuất hiện trong các chiến dịch trước như GhostPenguin (cũng được Trend Micro phát hiện bằng AI hunting), và QLNX cho thấy nó đang trở thành standard technique cho Linux malware targeting developer environment. Security control phụ thuộc vào "known bad binary hash" không đủ chống lại loại threat này.
Khuyến nghị hành động
Immediate (0-24h)
Chạy ngay các lệnh sau trên mọi Linux developer workstation và CI/CD build host trong môi trường:
# 1. Kiểm tra ld.so.preload
cat /etc/ld.so.preload
# Kết quả không rỗng: đòi hỏi điều tra ngay lập tức
# 2. Tìm QLNX lock file
ls -la /tmp/.X752e2ca1-lock 2>/dev/null && echo "ALERT: QLNX mutex found"
# 3. Kiểm tra PAM hidden log file
for f in /var/log/.ICE-unix /var/log/.Test-unix /tmp/.pam_cache; do
stat "\(f" 2>/dev/null && echo "ALERT: QLNX artifact at \)f"
done
# 4. Tìm QLNX rootkit và PAM hook
for f in /usr/lib/libsecurity_utils.so.1 /usr/lib/.libpam_cache.so; do
stat "\(f" 2>/dev/null && echo "ALERT: QLNX module at \)f"
done
# 5. Tìm QLNX binary hash
find / -type f -exec sha256sum {} \; 2>/dev/null | \
grep "ea1d34b21b739a6bbf89b3f7e67978005cf7f3eda612cefc7eac1c8ead7c5545"
Nếu có hit trên bất kỳ lệnh nào, cô lập host ngay lập tức và không attempt remove trước khi có IR team.
Block C2 tại network perimeter nếu biết địa chỉ, và hunt connection đến ip-api.com từ non-browser process trong proxy log.
Short-term (1-7 ngày)
Audit và hardening /etc/ld.so.preload:
# Trên mọi Linux host: verify ld.so.preload rỗng hoặc chỉ chứa approved entry
# Với production system có thể dùng file integrity monitoring
aide --init # Initialize AIDE database bao gồm /etc/ld.so.preload
Hạn chế access vào PAM configuration:
# Restrict write access đến PAM-related files
chmod 644 /etc/pam.conf
chmod 644 /etc/pam.d/*
chattr +i /etc/ld.so.preload # Immutable flag - cần root để override
# Monitor thay đổi PAM config bằng auditd
auditctl -w /etc/ld.so.preload -p wa -k pam_preload_change
auditctl -w /etc/pam.d/ -p wa -k pam_config_change
Triển khai monitoring gcc execution từ /tmp:
# auditd rule
-a always,exit -F arch=b64 -S execve -F exe=/usr/bin/gcc \
-F dir=/tmp -k gcc_tmp_compile
Rotate credential ngay nếu developer workstation có Linux:
Giả định worst-case đối với bất kỳ developer machine nào chưa được verify clean: rotate AWS key, revoke Kubernetes service account token, revoke NPM token, revoke PyPI API key, revoke Docker Hub credential, rotate GitHub personal access token. Đây là quy trình khẩn cấp khi chưa có forensic confirmation về trạng thái của máy.
Deploy detection rule trong EDR/SIEM:
# Persistent file creation
objectFilePath:"/usr/lib/libsecurity_utils.so.1"
OR objectFilePath:"/usr/lib/.libpam_cache.so"
# Lock file
objectFilePath:"/tmp/.X752e2ca1-lock"
# gcc compile suspicious .so
process.name:"gcc" AND process.args:"-shared" AND process.args:"/tmp/*"
Long-term
Đưa developer workstation vào cùng tier monitoring với production server. Điều này không có nghĩa là restrict toàn bộ developer workflow mà có nghĩa là đảm bảo EDR coverage, audit logging đầy đủ, và behavioral anomaly detection áp dụng nhất quán.
Thiết lập credential lifecycle management cho developer tool: NPM token, PyPI API key, và cloud credential phải có expiry date, phải được rotate định kỳ, và phải có monitoring cho unauthorized use. Một token không bao giờ expire là rủi ro cao hơn nhiều so với token có rotation policy 30 ngày.
Xây dựng supply chain signing policy: mọi package publish lên internal registry hay external registry phải được sign bởi key được quản lý bởi CI system, không phải từ personal developer key. Điều này giới hạn damage nếu personal credential bị đánh cắp, attacker không thể publish dưới danh nghĩa account có trust.
Xem xét deploy file integrity monitoring (FIM) cho các file nhạy cảm như /etc/ld.so.preload, /etc/pam.d/, và /usr/lib/*.so trên mọi Linux developer host. Thay đổi bất kỳ file nào trong danh sách này phải tạo alert ngay lập tức.
Indicators of Compromise
# SHA256 — Primary modules
ea1d34b21b739a6bbf89b3f7e67978005cf7f3eda612cefc7eac1c8ead7c5545 # quasar-implant
82DAA93219BA40A6E41CDF3174BA57EB5D3383D1CD805584E9954EB0200182A1 # libsecurity_utils.so.1
42D0C420EB5FE181388F2E4F0B7D7C0D302971E7A06FDC1BEC481B68C8CCAE1F # pam_security.so
C99CF0DC1EF1057D713CB082ACAF42E4DF4656809C91741752BDDCAB39BBFACA # hide_src_39ZzHo.c
EA89CAAB82181881D971BE312412795051F6322B105C8B9D29CFB5729FAB8D33 # pam_src_51YyC3.c
417430b2d4ae8d005224a9ff5dcb4007d452338acbcbcbb62c4e8ed1a70552dd # libpam_cache.so
d55549d5655e2f202e215676f4bdb0994ea08a93d15ec4ded413f64cfa7facc8 # pcs_a3kf9x.c
# MD5 / SHA1 (primary binary)
70f70743f287a837d17c56933152a8a6 # MD5
b0f2c668cbdd63a871c90592b6c93e931115872e # SHA1
# Persistent file artifacts
/usr/lib/libsecurity_utils.so.1 # LD_PRELOAD rootkit
/usr/lib/.libpam_cache.so # PAM credential hook
/etc/ld.so.preload # Modified: cả hai .so path được append
/tmp/.pam_cache # Plaintext credential log
/var/log/.Test-unix # Hidden log: SSH/SCP/SU/sudo passwords
/var/log/.ICE-unix # Hidden log: PAM passwords
/tmp/.X752e2ca1-lock # Single-instance mutex
# Persistence artifacts
~/.config/systemd/user/quasar_linux.service
~/.config/autostart/quasar_linux.desktop
/etc/systemd/system/quasar_linux.service
/etc/init.d/quasar_linux
# Dấu hiệu trong mọi persistence artifact:
# string "QLNX_MANAGED" embedded dưới dạng comment
# Temporary files (xóa sau khi dùng, dùng để tìm dấu vết)
/tmp/.hide_src_*.c # Rootkit source
/tmp/.pcs_* # PAM hook source
/tmp/.pam_src_* # PAM backdoor source
# Network pattern
Process gọi ip-api.com → geolocation lookup trước khi gửi beacon
Magic bytes trong TCP stream: 51 4C 4E 58 (ASCII "QLNX")
Jittered reconnect interval: 3.000-15.000ms base + 30% jitter
# PAM backdoor master password
O$$f$QtYJK # Hardcoded trong pam_security.so — authenticate vào bất kỳ account nào
# Process indicators
Tên process như kernel thread (kworker, ksoftirqd, migration, rcu_sched...)
nhưng có /proc/<pid>/exe path hợp lệ → process masquerading
Nguồn tham khảo:
- Quasar Linux (QLNX) – A Silent Foothold in the Supply Chain: Inside a Full-Featured Linux RAT With Rootkit, PAM Backdoor, Credential Harvesting Capabilities — Trend Micro TrendAI Research (Aliakbar Zahravi, Ahmed Mohamed Ibrahim)
- New stealthy Quasar Linux malware targets software developers — BleepingComputer
- Sophisticated Quasar Linux RAT Targets Software Developers — SecurityWeek
- Quasar Linux RAT Steals Developer Credentials for Software Supply Chain Compromise — The Hacker News
- Quasar Linux (QLNX): A Developer-Targeted Linux RAT and Detection Strategy — GuardSix (detection guidance bổ sung)





