Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Giám sát I/O và Hiểu Rõ fork/exec trong Linux

    Giám sát I/O và Hiểu Rõ fork/exec trong Linux

    Trong vận hành hệ thống Linux, ngoài việc giám sát CPU và bộ nhớ, I/O (Input/Output) cũng là một yếu tố cực kỳ quan trọng. Nhiều sự cố về hiệu năng hoặc tấn công khai thác tài nguyên thường để lại dấu hiệu qua I/O, ví dụ: ghi/đọc dữ liệu bất thường từ ổ đĩa, hoặc tiến trình sinh ra tải I/O cao liên tục.
    1. Giám sát I/O với iostat

    Công cụ iostat (I/O statistics) thuộc gói sysstat cho phép bạn theo dõi hoạt động I/O của hệ thống. Lệnh này có thể chạy ở chế độ snapshot (chụp nhanh tại thời điểm hiện tại) hoặc real-time monitoring (giám sát liên tục).
    Ví dụ:

    iostat 2
    • 2 là khoảng thời gian refresh (giây).
    • Nếu bỏ 2 → chỉ hiển thị một lần (snapshot).
    Kết quả mẫu:

    Linux 4.4.0-22-generic (carl) 06/11/2016 _x86_64_(4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.88 0.00 0.22 0.00 0.00 97.90 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.18 1.14 4.89 691475 2978716

    Phân tích:
    • avg-cpu: Phần trăm thời gian CPU dành cho user, system, iowait (thời gian chờ I/O), idle.
    • Device:
      • tps – Transfers per second (số lần truyền dữ liệu mỗi giây).
      • kB_read/s / kB_wrtn/s – Số KB đọc/ghi mỗi giây.
      • kB_read / kB_wrtn – Tổng số KB đọc/ghi từ khi khởi động.
    Ứng dụng thực tế:
    • Xác định ổ đĩa hoặc thiết bị lưu trữ nào đang bị “quá tải”.
    • Điều tra hoạt động bất thường, ví dụ:
      • Malware hoặc tiến trình bị compromise ghi log/đọc dữ liệu liên tục.
      • Backup jobs chạy sai lịch, gây ảnh hưởng dịch vụ.

    2. Quan hệ giữa fork() và exec() trong Linux

    Để hiểu rõ hành vi tiến trình khi giám sát hệ thống, bạn cần nắm vững hai khái niệm cốt lõi:
    • fork() – Tạo một bản sao (child process) từ tiến trình cha (parent process). Cả hai tiến trình này chạy song song.
    • exec() – Thay thế tiến trình hiện tại bằng một chương trình mới.
    Mối quan hệ thực tế:
    • Mô hình phổ biến: Parent → fork() → Child → exec() chương trình khác.
    • Khi exec() được gọi, toàn bộ code và vùng nhớ của tiến trình hiện tại sẽ bị thay thế bằng binary mới, nhưng PID vẫn giữ nguyên.
    Ví dụ C đơn giản:


    #include <stdio.h> #include <unistd.h> int main() { pid_t pid = fork(); if (pid == 0) { // Tiến trình con char *args[] = {"ls", "-l", NULL}; execvp("ls", args); } else { // Tiến trình cha wait(NULL); printf("Child process finished.\n"); } return 0; }

    Ý nghĩa với kỹ sư vận hành/bảo mật:
    • Giải thích vì sao một số tiến trình “biến hình” trên top hoặc ps.
    • Hỗ trợ forensic: biết tiến trình ban đầu là gì, tiến trình sau exec là gì.
    • Phát hiện hành vi ẩn mình (process masquerading) của malware.

    3. Kết hợp Giám sát I/O và fork/exec trong Phân tích Sự cố

    Một số tình huống thực tế:
    • Web server bị tấn công RCE → tiến trình web (nginx, apache) fork() ra child, rồi exec() chạy binary đào coin, ghi I/O cao trên /tmp.
    • Backup script lỗi → fork() nhiều lần, exec() lệnh tar hoặc rsync, gây tải I/O đột biến.
    Quy trình điều tra:
    1. Dùng iostat để xác định thiết bị I/O bất thường.
    2. Dùng top hoặc ps -ef để tìm tiến trình liên quan.
    3. Phân tích lịch sử tiến trình (PID tree) để thấy chuỗi fork() và exec().
    4. Thực hành Forensic: Tìm tiến trình ẩn thông qua I/O và phân tích fork/exec

    Mục tiêu:
    • Xác định tiến trình gây tải I/O bất thường.
    • Truy ngược chuỗi cha-con (parent-child process tree) để hiểu cách tiến trình được tạo ra.
    • Phát hiện hành vi ẩn mình (process masquerading) hoặc thực thi trái phép.

    Bước 1 – Giám sát I/O

    Chạy lệnh:

    iostat 2
    • Quan sát cột tps, kB_read/s, kB_wrtn/s.
    • Xác định thiết bị có hoạt động I/O cao bất thường (thường là sda, nvme0n1...).
    Ví dụ bất thường:

    Device: tps kB_read/s kB_wrtn/s sda 120.00 10240.00 51200.00

    → Ổ sda đang ghi tới 50MB/s liên tục, cần kiểm tra tiến trình nào đang gây ra.
    Bước 2 – Tìm tiến trình liên quan

    Sử dụng iotop (nếu có) hoặc lọc với ps và lsof.
    Cách 1 – iotop (real-time I/O per process):

    sudo iotop -o
    • Tùy chọn -o chỉ hiển thị tiến trình thực sự có I/O.
    • Xem cột DISK WRITEDISK READ.
    Cách 2 – lsof (file descriptors):

    sudo lsof | grep deleted
    • Malware hoặc tiến trình ẩn thường ghi vào file đã bị xóa (ẩn khỏi ls), nhưng vẫn tồn tại trong memory.

    Bước 3 – Phân tích chuỗi cha-con

    Khi đã có PID khả nghi, ví dụ PID=4321:

    ps -o pid,ppid,cmd -p 4321
    • PID – Process ID hiện tại.
    • PPID – Parent Process ID (cha).
    Lặp lại truy ngược:

    ps -o pid,ppid,cmd -p <PPID>
    • Tiếp tục cho đến khi gặp tiến trình gốc (thường là dịch vụ hệ thống hoặc shell).

    Bước 4 – Xác định hành vi fork/exec
    • Nếu thấy tiến trình cha là dịch vụ web (ví dụ nginx: worker process) mà con lại là binary lạ (/tmp/.xminer), thì khả năng cao là:
      1. Dịch vụ web bị khai thác → fork() sinh ra tiến trình con.
      2. Tiến trình con exec() để chạy binary đào coin/malware.

    Bước 5 – Ghi log và cô lập
    • Ghi lại thông tin PID, PPID, command, thời điểm.
    • Kill tiến trình khả nghi:
    kill -9 <PID>
    • Sau đó kiểm tra persistence (cron jobs, systemd service, rc.local) để đảm bảo malware không tái khởi động.

    💡 Mẹo thực chiến:
    • Dùng pstree -p để xem toàn bộ cây tiến trình, rất trực quan để thấy chuỗi fork/exec.
    • Tích hợp giám sát iostat + ps + lsof vào script để phát hiện tự động.

    Attached Files
    Đặng Quang Minh, CCIE#11897 (Enterprise Infrastructure, Wireless, Automation, AI), CCSI#31417

    Email : dangquangminh@vnpro.org
    https://www.facebook.com/groups/vietprofessional/
Working...
X