คำตอบสั้น ๆ: รับมือ Cryptojacking เมื่อเซิร์ฟเวอร์ถูกฝังตัวขุดเหรียญจน CPU 100% ยืนยันอาการ แยกเครื่องด้วย Security Group เก็บหลักฐาน หากลไกฝังตัว และปิดทางที่ถูกเจาะ
คู่มือนี้อธิบาย Cryptojacking ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Cryptojacking คือการที่ผู้บุกรุกแอบใช้ CPU ของเซิร์ฟเวอร์คุณขุดเหรียญคริปโต ส่วนใหญ่เป็น Monero ด้วยโปรแกรมอย่าง XMRig อาการที่เห็นคือ CPU ขึ้นไปค้างที่ 100% ตลอดเวลาแม้ไม่มีผู้ใช้ เว็บช้าลงทันที และมีโปรเซสชื่อแปลกหรือชื่อเลียนแบบโปรเซสของระบบ Cryptojacking ไม่ใช่แค่ปัญหาเรื่องประสิทธิภาพ เพราะการที่ใครสักคนรันโปรแกรมบนเครื่องคุณได้ แปลว่าเขาเข้ามาถึงระดับสั่งคำสั่งได้แล้ว
คู่มือนี้เหมาะกับผู้ดูแล Linux Server ที่สงสัยว่าเครื่องถูกฝังตัวขุดเหรียญ เมื่อทำตามครบ คุณจะยืนยันได้ว่าเป็น Cryptojacking จริงหรือไม่ แยกเครื่องไม่ให้เสียหายเพิ่ม เก็บหลักฐานก่อนลบ หากลไกที่ทำให้ตัวขุดกลับมาเอง หาช่องทางที่ผู้บุกรุกเข้ามา และตัดสินใจได้ว่าจะล้างเครื่องเดิมหรือติดตั้งใหม่
สิ่งที่ต้องเตรียม
- สิทธิ์ root และการเข้าเครื่องผ่าน Console ผ่าน Web UI เผื่อต้องปิดการเข้าถึงทางเครือข่าย
- สิทธิ์แก้ Security Group และสร้าง Snapshot ในพอร์ทัลของผู้ให้บริการ
- ข้อมูลสำรองย้อนหลังหลายรุ่น เพื่อหารุ่นที่สร้างก่อนเครื่องถูกเจาะ
- รายชื่อผู้ที่ต้องแจ้งเมื่อเกิดเหตุ Cryptojacking เช่น หัวหน้าฝ่ายไอที เจ้าของระบบ และที่ปรึกษากฎหมายถ้าเครื่องเก็บข้อมูลส่วนบุคคล
- สมุดจดเวลาและทุกคำสั่งที่รัน เพราะลำดับเหตุการณ์สำคัญมากเมื่อต้องรายงานภายหลัง
ขั้นตอนที่ 1: ยืนยันอาการ Cryptojacking
เริ่มจากแยกให้ออกว่า CPU 100% มาจาก Cryptojacking ไม่ใช่งานปกติที่หนัก ดูโปรเซสที่ใช้ CPU สูงสุด พร้อมบรรทัดคำสั่งเต็มและเวลาที่รันมาแล้ว
top -c -o %CPU
ps -eo pid,user,%cpu,etime,cmd --sort=-%cpu | head -10
สัญญาณที่ชี้ว่าเป็น Cryptojacking ได้แก่
- โปรเซสใช้ CPU เกือบทุก core ต่อเนื่องหลายชั่วโมงหรือหลายวัน
- ชื่อโปรเซสเป็นตัวอักษรสุ่ม ชื่อที่รู้จักกันอย่าง xmrig, kdevtmpfsi, kinsing หรือชื่อเลียนแบบ kernel thread เช่น
kworkerdsหรือ[kthreadd] - ไฟล์โปรแกรมอยู่ใน
/tmp,/var/tmp,/dev/shmหรือโฟลเดอร์ซ่อนที่ขึ้นต้นด้วยจุด - มีการเชื่อมต่อออกไปพอร์ตแปลก ๆ ค้างไว้ตลอด เช่น 3333, 4444 หรือ 5555 ซึ่งพบบ่อยกับ mining pool
ตรวจว่าโปรเซสมาจากไฟล์ใดด้วย ls -l /proc/PID/exe kernel thread จริงไม่มีไฟล์โปรแกรมบนดิสก์ ถ้าโปรเซสที่ชื่อเหมือน kernel thread ชี้ไปไฟล์ใน /tmp หรือขึ้นว่า (deleted) แสดงว่าเป็นของปลอม ถ้า CPU เต็มแต่ top ไม่แสดงโปรเซสใดผิดปกติ ให้ตรวจ cat /etc/ld.so.preload ไฟล์นี้ปกติไม่มีหรือว่างเปล่า ถ้ามีไลบรารีแปลกอยู่ อาจเป็นตัวซ่อนโปรเซส ซึ่งหมายถึงผู้บุกรุกที่วาง Cryptojacking ได้สิทธิ์ root แล้ว
ขั้นตอนที่ 2: แยกเครื่องที่โดน Cryptojacking ด้วย Security Group
อย่าเพิ่งปิดเครื่องหรือลบไฟล์ เพราะหลักฐานในหน่วยความจำจะหายไป ให้ตัดการเชื่อมต่อจากภายนอกก่อน ในพอร์ทัล TDC Enterprise แก้ Security Group ของเครื่อง (ดูวิธีใน คู่มือ Security Group) ดังนี้
- Inbound: เหลือเฉพาะ SSH จาก IP ของผู้ดูแลที่กำลังตรวจ ปิดพอร์ตอื่นทั้งหมดชั่วคราว รวมถึงเว็บ
- Outbound: จำกัดให้เหลือน้อยที่สุด เพื่อตัดทางที่ตัวขุดส่งงานไป mining pool และตัดการดาวน์โหลดตัวใหม่
จากนั้นสร้าง Snapshot ของดิสก์เก็บไว้เป็นหลักฐานของเหตุ Cryptojacking Snapshot นี้ห้ามนำไปกู้เป็นเครื่องใช้งาน เพราะมีมัลแวร์อยู่ข้างใน ถ้าเครื่องกำลังโจมตีเครื่องอื่นหรือส่งสแปมออกไป การตัดเครือข่ายสำคัญกว่าการเก็บหลักฐานทุกชิ้น ให้ตัดก่อนแล้วค่อยเก็บ
ขั้นตอนที่ 3: เก็บหลักฐาน Cryptojacking ก่อนลบ
บันทึกสถานะของเครื่องลงโฟลเดอร์เดียว แล้วคัดลอกออกไปเก็บนอกเครื่อง เปลี่ยน 4127 เป็น PID ที่พบในขั้นตอนที่ 1
IR=/root/ir-$(date +%F); mkdir -p $IR; cd $IR
ps auxwwf > ps.txt
ss -tanp > ss.txt
last -aiF > last.txt
cp /proc/4127/exe ./miner.bin
tr '\0' ' ' < /proc/4127/cmdline > cmdline.txt
ls -l /proc/4127/cwd > cwd.txt
sha256sum miner.bin > sha256.txt
journalctl --since "-7 days" > journal.txt
cp -a /var/log/auth.log* /var/log/secure* . 2>/dev/null
kill -STOP 4127
cp /proc/PID/exe ได้สำเนาไฟล์โปรแกรมแม้ผู้บุกรุกจะลบไฟล์ต้นฉบับไปแล้ว ค่า sha256 ใช้ค้นในฐานข้อมูลมัลแวร์สาธารณะได้โดยไม่ต้องอัปโหลดไฟล์ kill -STOP หยุดโปรเซสไว้ชั่วคราวโดยไม่ปิด CPU จะลดลงทันทีแต่หน่วยความจำยังอยู่ ส่วน -F ของ last แสดงวันเวลาเต็มของแต่ละการล็อกอิน
ขั้นตอนที่ 4: หากลไกที่ทำให้ตัวขุดกลับมาเอง
มัลแวร์ Cryptojacking เกือบทุกตัวฝังกลไกให้ตัวขุดเริ่มใหม่เมื่อถูกปิด ถ้า kill แล้วกลับมาในไม่กี่นาที ต้นเหตุอยู่ในรายการต่อไปนี้
# crontab ของทุกผู้ใช้ และ cron ของระบบ
for u in $(cut -d: -f1 /etc/passwd); do crontab -l -u "$u" 2>/dev/null | sed "s/^/$u: /"; done
ls -la /etc/cron.d /etc/cron.hourly /var/spool/cron* 2>/dev/null
cat /etc/crontab
# systemd unit ที่ถูกสร้างหรือแก้ใน 30 วัน
find /etc/systemd /usr/lib/systemd /lib/systemd -name '*.service' -mtime -30 2>/dev/null
# คีย์ SSH ที่ถูกเพิ่ม และบัญชีที่มี UID 0
find / -xdev -name authorized_keys -exec ls -l {} \; 2>/dev/null
awk -F: '$3==0 {print $1}' /etc/passwd
# ไฟล์ที่ถูกล็อกไม่ให้ลบ และตัวซ่อนโปรเซส
lsattr -a /etc/cron.d /tmp /var/tmp 2>/dev/null | grep -- '-i-'
cat /etc/ld.so.preload 2>/dev/null
ตรวจไฟล์ตั้งค่า shell อย่าง ~/.bashrc และ /etc/profile.d/ ด้วย และตรวจว่าโปรแกรมระบบถูกแก้หรือไม่ด้วย sudo debsums -c บน Ubuntu หรือ sudo rpm -Va บน AlmaLinux ถ้าพบว่าโปรแกรมอย่าง ps, top หรือ ss ถูกแก้ ถือว่าผู้บุกรุกได้ root แล้ว จดทุกสิ่งที่พบพร้อมเวลาแก้ไขของไฟล์ (stat ไฟล์) เพื่อสร้างลำดับเหตุการณ์ของ Cryptojacking ครั้งนี้