Cryptojacking: รับมือเซิร์ฟเวอร์โดนขุดเหรียญจน CPU 100%

รับมือ Cryptojacking เมื่อเซิร์ฟเวอร์ถูกฝังตัวขุดเหรียญจน CPU 100% ยืนยันอาการ แยกเครื่องด้วย Security Group เก็บหลักฐาน หากลไกฝังตัว และปิดทางที่ถูกเจาะ

โดย ทีมงาน THAI DATA CLOUD อ่าน 14 นาที

แชร์FacebookXLINELinkedIn
Cryptojacking — Cryptojacking: รับมือเซิร์ฟเวอร์โดนขุดเหรียญจน CPU 100%
Cryptojacking: รับมือเซิร์ฟเวอร์โดนขุดเหรียญจน CPU 100%

คำตอบสั้น ๆ: รับมือ Cryptojacking เมื่อเซิร์ฟเวอร์ถูกฝังตัวขุดเหรียญจน CPU 100% ยืนยันอาการ แยกเครื่องด้วย Security Group เก็บหลักฐาน หากลไกฝังตัว และปิดทางที่ถูกเจาะ

คู่มือนี้อธิบาย Cryptojacking ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Cryptojacking คือการที่ผู้บุกรุกแอบใช้ CPU ของเซิร์ฟเวอร์คุณขุดเหรียญคริปโต ส่วนใหญ่เป็น Monero ด้วยโปรแกรมอย่าง XMRig อาการที่เห็นคือ CPU ขึ้นไปค้างที่ 100% ตลอดเวลาแม้ไม่มีผู้ใช้ เว็บช้าลงทันที และมีโปรเซสชื่อแปลกหรือชื่อเลียนแบบโปรเซสของระบบ Cryptojacking ไม่ใช่แค่ปัญหาเรื่องประสิทธิภาพ เพราะการที่ใครสักคนรันโปรแกรมบนเครื่องคุณได้ แปลว่าเขาเข้ามาถึงระดับสั่งคำสั่งได้แล้ว

คู่มือนี้เหมาะกับผู้ดูแล Linux Server ที่สงสัยว่าเครื่องถูกฝังตัวขุดเหรียญ เมื่อทำตามครบ คุณจะยืนยันได้ว่าเป็น Cryptojacking จริงหรือไม่ แยกเครื่องไม่ให้เสียหายเพิ่ม เก็บหลักฐานก่อนลบ หากลไกที่ทำให้ตัวขุดกลับมาเอง หาช่องทางที่ผู้บุกรุกเข้ามา และตัดสินใจได้ว่าจะล้างเครื่องเดิมหรือติดตั้งใหม่

สิ่งที่ต้องเตรียม

  • สิทธิ์ root และการเข้าเครื่องผ่าน Console ผ่าน Web UI เผื่อต้องปิดการเข้าถึงทางเครือข่าย
  • สิทธิ์แก้ Security Group และสร้าง Snapshot ในพอร์ทัลของผู้ให้บริการ
  • ข้อมูลสำรองย้อนหลังหลายรุ่น เพื่อหารุ่นที่สร้างก่อนเครื่องถูกเจาะ
  • รายชื่อผู้ที่ต้องแจ้งเมื่อเกิดเหตุ Cryptojacking เช่น หัวหน้าฝ่ายไอที เจ้าของระบบ และที่ปรึกษากฎหมายถ้าเครื่องเก็บข้อมูลส่วนบุคคล
  • สมุดจดเวลาและทุกคำสั่งที่รัน เพราะลำดับเหตุการณ์สำคัญมากเมื่อต้องรายงานภายหลัง
ลำดับขั้นการรับมือ Cryptojacking ตั้งแต่ยืนยันอาการ แยกเครื่อง เก็บหลักฐาน หากลไกฝังตัว หาทางเข้า จนถึงติดตั้งใหม่และเปลี่ยนรหัสผ่าน
แยกเครื่องและเก็บหลักฐานก่อนลบเสมอ การ kill ทันทีทำให้เสียร่องรอยและตัวขุดมักกลับมา

ขั้นตอนที่ 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 แล้ว

ผลคำสั่ง ps ss และ crontab แสดงตัวขุดที่รันจาก /tmp เชื่อมต่อ mining pool และ cron ที่ดาวน์โหลดสคริปต์ซ้ำ ซึ่งเป็นสัญญาณ Cryptojacking
ไฟล์ใน /tmp ที่ถูกลบแล้ว การเชื่อมต่อขาออกค้าง และ cron ที่ดาวน์โหลดสคริปต์ คือรูปแบบที่พบบ่อย

ขั้นตอนที่ 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 ครั้งนี้

แผนภาพทางเข้าของ Cryptojacking ผ่าน SSH รหัสผ่านอ่อน Docker API และ Redis ที่เปิดสาธารณะ ไปจนถึงกลไกฝังตัวและ mining pool
ลบตัวขุดอย่างเดียวไม่พอ ต้องปิดทางเข้าและลบกลไกฝังตัวทุกจุด ไม่เช่นนั้นจะกลับมาอีก

ขั้นตอนที่ 5: หาช่องทางที่ผู้บุกรุกใช้วาง Cryptojacking

การลบ Cryptojacking โดยไม่ปิดทางเข้า ทำให้เครื่องถูกเจาะซ้ำได้ในเวลาไม่นาน ช่องทางที่พบบ่อยบนเซิร์ฟเวอร์คลาวด์มีดังนี้

  • SSH ที่ใช้รหัสผ่านเดาง่าย: ค้น grep "Accepted" /var/log/auth.log* (หรือ /var/log/secure บน AlmaLinux) หาการล็อกอินสำเร็จจาก IP ที่ไม่รู้จัก
  • Docker API ที่เปิดพอร์ต 2375 โดยไม่มี TLS: ใครก็สั่งสร้างคอนเทนเนอร์ที่เข้าถึงดิสก์ของเครื่องได้ ตรวจด้วย ss -ltnp | grep -E ':2375|:2376'
  • Redis ที่ฟัง 0.0.0.0:6379 โดยไม่มีรหัสผ่าน: ผู้โจมตีใช้คำสั่งของ Redis เขียนไฟล์ cron หรือคีย์ SSH ลงเครื่อง ดูการตั้งค่าที่ปลอดภัยใน คู่มือติดตั้ง Redis
  • เว็บแอปหรือปลั๊กอินที่ไม่ได้อัปเดต: ถ้าตัวขุดรันด้วยผู้ใช้ www-data, apache หรือ nginx ให้ค้น access log ช่วงเวลาที่ไฟล์มัลแวร์ถูกสร้าง หา POST ไปยังไฟล์แปลก ๆ
  • ฐานข้อมูลหรือแผงจัดการที่เปิดสู่อินเทอร์เน็ตด้วยรหัสผ่านอ่อน เช่น PostgreSQL, Jenkins หรือ phpMyAdmin

ชื่อผู้ใช้ที่รันตัวขุดบอกระดับความเสียหายของ Cryptojacking ถ้าเป็นผู้ใช้ของเว็บ ผู้บุกรุกอาจยังไม่ได้ root ถ้าเป็น root หรือพบตัวซ่อนโปรเซส ให้ถือว่าทั้งเครื่องไม่น่าเชื่อถือแล้ว

ขั้นตอนที่ 6: ตัดสินใจติดตั้งใหม่หรือล้างเครื่องเดิม

หลังเหตุ Cryptojacking คำแนะนำโดยทั่วไปของผู้ตอบสนองเหตุการณ์คือ ติดตั้งใหม่จากอิมเมจที่สะอาด เมื่อผู้บุกรุกได้สิทธิ์ root หรือเมื่อยังอธิบายไม่ได้ว่าเข้ามาทางไหน เพราะไม่มีทางมั่นใจว่าลบ backdoor ครบทุกตัว ขั้นตอนคือสร้างเครื่องใหม่ ปิดช่องทางที่พบในขั้นตอนที่ 5 ก่อนเปิดใช้ แล้วกู้เฉพาะข้อมูล (ไม่ใช่โปรแกรมหรือคอนฟิกทั้งเครื่อง) จากข้อมูลสำรองที่สร้างก่อนวันที่ถูกเจาะ ตรวจไฟล์เว็บที่กู้มาว่าไม่มี web shell ปน

การล้าง Cryptojacking บนเครื่องเดิมพอรับได้เฉพาะเมื่อตัวขุดรันด้วยผู้ใช้ที่สิทธิ์จำกัด รู้ทางเข้าชัดเจนและปิดแล้ว และไม่พบร่องรอยการยกระดับสิทธิ์ ลบไฟล์และกลไกฝังตัวทั้งหมดที่พบ ฆ่าโปรเซสที่หยุดไว้ด้วย kill -9 PID แล้วเฝ้าดู CPU และการเชื่อมต่อขาออกอย่างน้อยหนึ่งสัปดาห์

ไม่ว่าจะเลือกทางใด ต้องเปลี่ยนรหัสผ่านและคีย์ทุกชุดที่อยู่บนเครื่อง ได้แก่ รหัสผ่านผู้ใช้ คีย์ SSH รหัสผ่านฐานข้อมูล ไฟล์ .env API key และ token ของบริการภายนอก เพราะผู้บุกรุกอ่านได้ทั้งหมด

ตารางเปรียบเทียบการติดตั้งเครื่องใหม่กับการล้างเครื่องเดิมหลัง Cryptojacking ทั้งเงื่อนไข ความมั่นใจ และเวลาหยุดระบบ
เมื่อผู้บุกรุกได้ root หรือยังไม่รู้ทางเข้า ให้ติดตั้งใหม่จากอิมเมจสะอาด

ขั้นตอนที่ 7: กันไม่ให้เกิด Cryptojacking ซ้ำ

  • ใช้ SSH Key แทนรหัสผ่าน ตาม คู่มือตั้งค่า SSH Key บน Linux และจำกัด SSH เฉพาะ IP ที่ไว้ใจใน Security Group
  • ไม่เปิดพอร์ตของ Docker API, Redis และฐานข้อมูลสู่อินเทอร์เน็ต ถ้าต้องเชื่อมระหว่างเครื่องให้ใช้เครือข่ายภายใน
  • ติดตั้งระบบกันบอตอย่าง CrowdSec หรือ Fail2ban และอัปเดตแพ็กเกจกับปลั๊กอินเว็บสม่ำเสมอ
  • ตั้งแจ้งเตือนเมื่อ CPU สูงต่อเนื่อง Cryptojacking มักถูกพบช้าเพราะไม่มีใครดูกราฟ ดู คู่มือ Cloud Server Monitoring
  • เปิด auditd บันทึกคำสั่งและไฟล์สำคัญ เพื่อให้ครั้งหน้ามีหลักฐานชัดกว่าเดิม

ถ้าเครื่องที่โดน Cryptojacking เก็บข้อมูลส่วนบุคคล ให้ประเมินว่าเหตุนี้เข้าข่ายการละเมิดข้อมูลส่วนบุคคลหรือไม่ PDPA กำหนดให้แจ้งสำนักงานคณะกรรมการคุ้มครองข้อมูลส่วนบุคคลภายใน 72 ชั่วโมงนับแต่ทราบเหตุ เว้นแต่การละเมิดนั้นไม่มีความเสี่ยงต่อสิทธิของเจ้าของข้อมูล ให้ตัดสินใจร่วมกับที่ปรึกษากฎหมายขององค์กร แนวทางการรับมือเหตุการณ์ทั่วไปดูเพิ่มเติมได้ที่ NIST SP 800-61 Incident Response

ปัญหาที่พบบ่อยเกี่ยวกับ Cryptojacking

kill โปรเซส Cryptojacking แล้ว CPU กลับมา 100% ในไม่กี่นาที เพราะอะไร?

มีกลไกฝังตัวที่เปิดตัวขุดใหม่ เช่น cron ที่ดาวน์โหลดสคริปต์ทุก 5 นาที systemd unit ที่ตั้ง Restart=always หรือโปรเซสเฝ้าระวังอีกตัวที่คอยเปิดตัวขุด ไล่ตรวจตามขั้นตอนที่ 4 และตัดเครือข่ายขาออกก่อน เพื่อให้สคริปต์ดาวน์โหลดตัวใหม่ไม่ได้

ClamAV หรือโปรแกรมสแกนไวรัสช่วยจัดการ Cryptojacking ได้หรือไม่?

ช่วยตรวจพบตัวขุดที่รู้จักแล้วได้บางส่วน ดู คู่มือ ClamAV แต่ไม่พบกลไกฝังตัวที่เป็นสคริปต์ธรรมดา และไม่ปิดช่องทางเข้า การสแกนจึงเป็นเพียงส่วนเสริม ไม่ใช่การแก้ปัญหา

Cryptojacking ไม่ได้ขโมยข้อมูล ทำไมต้องติดตั้งเครื่องใหม่?

เพราะผู้บุกรุกที่รันโปรแกรมขุดได้ก็รันโปรแกรมอื่นได้เช่นกัน หลายกลุ่มติดตั้ง backdoor สแกนหาเครื่องอื่นในเครือข่าย และขโมยคีย์ไปพร้อมกัน IP ของเครื่องอาจติดบัญชีดำจนอีเมลและบริการอื่นได้รับผลกระทบ จึงควรถือว่าเป็นการบุกรุกเต็มรูปแบบ

Cryptojacking ในคอนเทนเนอร์ Docker ต้องทำอย่างไร?

หยุดและเก็บคอนเทนเนอร์ไว้เป็นหลักฐานด้วย docker pause แล้วตรวจว่าคอนเทนเนอร์ใดถูกสร้างโดยไม่ได้ตั้งใจ (docker ps -a) และ image ใดดึงมาจากแหล่งที่ไม่รู้จัก ถ้าพบคอนเทนเนอร์ที่เมานต์ / ของเครื่องเข้าไป ให้ถือว่าเครื่องโฮสต์ถูกเจาะแล้วและทำตามขั้นตอนที่ 6

ถ้าต้องการให้ทีมงานช่วยตรวจสอบเหตุ Cryptojacking เก็บหลักฐาน และติดตั้งเครื่องใหม่อย่างปลอดภัย ติดต่อทีมงาน THAI DATA CLOUD ได้ทันที และสำหรับองค์กรที่ต้องการให้มีทีมเฝ้าระวังและตอบสนองเหตุการณ์อย่างต่อเนื่อง ดูรายละเอียดได้ที่หน้า Managed Security Services

อ่านเพิ่มเติมเกี่ยวกับ Cryptojacking

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน