VIRUS LÂY FILE ELF TRÊN LINUX SỬ DỤNG KỸ THUẬT PREPENDING INFECTION

Published By: RD TEAM

Published On: 02/02/2026

Published in:

Trong môi trường Linux, nơi mà các tệp thực thi chủ yếu sử dụng định dạng ELF (Executable and Linkable Format), có một kỹ thuật lây nhiễm cổ điển nhưng vẫn cực kỳ hiệu quả đó chính là prepending infection.

Mình từng đọc qua nhiều bài về malware Linux, thấy kỹ thuật này hay ho vì nó đơn giản, không đụng chạm quá sâu vào cấu trúc ELF Header hay Program Header Table, mà vẫn khiến file bị nhiễm chạy bình thường, chỉ "thêm" hành vi virus ở phần đầu. Hôm nay mình ngồi tổng hợp lại và viết 1 bài blog về chủ đề này, kèm mã assembly và ví dụ code cụ thể để các bạn nghiên cứu, detect và có thể ứng dụng để viết tool gỡ bỏ loại malware này.

Virus mà mình đề cập trong bài viết này sẽ tập trung vào việc ghép mã virus vào đầu các tệp thực thi hợp lệ để lan truyền mà không phá hủy chức năng gốc. Chương trình bị nhiễm vẫn chạy bình thường, chỉ thêm hành vi virus ở đầu (payload + lây lan), khiến người dùng khó phát hiện.

Linux

Lưu ý quan trọng trước khi đọc tiếp: Các mô tả dưới đây chỉ nhằm phục vụ nghiên cứu và kiểm thử. Tác giả không chịu trách nhiệm với mọi hành vi sử dụng các tri thức này để thực hiện hoạt động tấn công phá hoại.

1. Mục tiêu của bài blog này

Mục tiêu của kỹ thuật này là giúp người đọc hiểu về cách virus hoạt động để có thể phát hiện và viết công cụ gỡ bỏ, giúp bảo vệ hệ thống Linux khỏi loại mã độc này.

2. Sơ lược về kỹ thuật

Hãy tưởng tượng bạn có một file thực thi ELF bình thường, ví dụ file hello in ra "Hello World!". Rồi một ngày, bạn chạy nó và bất ngờ thấy thêm dòng:

Hello! This is a simple virus!

Hello World!

File vẫn chạy ngon lành, nhưng đã bị "nhiễm" một đoạn code lạ ở đầu. Đó chính là bản chất của prepending infection. 

Virus đã chèn chính nó vào đầu file host, đẩy toàn bộ code gốc ra sau, rồi thêm một signature nhỏ (ở đây là 4 byte: 4033 nếu muốn bạn có thể ký hiệu cho nó thành những ký hiệu khác) ở cuối file để đánh dấu là virus "đã nhiễm" thành công vào file. Khi kernel load file từ offset 0, virus chạy trước, làm payload + lây lan, sau đó mới nhường cho host gốc bằng cách fork một tiến trình khác để chạy host gốc.

3. Cấu trúc file ELF

Cấu trúc file ELF

Mỗi file ELF gồm có phần header, các bảng chứa thông tin quản trị và các đoạn chứa dữ liệu và code của chương trình. 3 phần chính của thông tin quản trị của file ELF là ELF Header, Section Header Table và Program Header Table. ELF Header trỏ đến section và Program Header Table, Section Header Table giữ thông tin về các section của file ELF trên đĩa và Program Header Table chứa thông tin về cách copy các section từ ổ đĩa vào bộ nhớ khi thực thi.

Đa số các file ELF chứa đầy đủ 3 phần như hình bên, song chỉ có phần header là bắt buộc. Đối với loại file executable ELF, trường bắt buộc phải có là Program Header Table, trong các file linkable thì trường Section Header Table là bắt buộc.

Khi chạy file virus, file bị nhiễm sẽ có cấu trúc:

[ Virus code đầy đủ ] + [ Host code nguyên bản (toàn bộ file ELF gốc) ] + [ Signature 4 bytes: 0x0FC1 (4033) ]

ELF Header ở đầu giờ là của virus nên khi ta thực hiện kernel load, nó sẽ đọc header virus, entry point của virus sẽ ở trước. ELF Loader sẽ load segment từ đầu nên virus sẽ thực thi đầu tiên, còn phần host vẫn nguyên vẹn, chỉ bị "đẩy lùi" offset.

4. Các bước thực hiện kỹ thuật

Sang phần này, chúng ta sẽ đi chi tiết về cách virus thực hiện kỹ thuật lây file và chèn virus vào đầu file host và thực thi file gốc, bao gồm các bước chính:

  • Thực thi payload (độc hại)
  • Tìm tệp host sạch
  • Sửa tệp host
  • Thêm chữ ký vào file virus
  • Thực thi phần host
4.1. Thực thi payload (độc hại)

Trong bài viết này để đơn giản mình sẽ chỉ in ra "Hello! This is a simple virus!" bằng puts() từ libc. Nhưng trong thực tế thì có thể keylogging, backdoor, ransomware mini, gửi data ra ngoài... nhưng ta giữ đơn giản để dễ hiểu.

Thực thi payload
Payload được thực thi
4.2 Tìm tệp host sạch

Virus không ngồi yên, nó bắt đầu tìm "nạn nhân" mới để lây, virus sẽ duyệt qua các tệp trong thư mục và thực hiện kiểm tra xem file đó có phải là file ELF không và đã bị nhiễm chưa (sẽ giải thích cách hoạt động của hai hàm ở 4.2.1 và 4.2.2).

Tại sao chỉ thư mục hiện tại? Để đơn giản và tránh lây lan quá rộng (dễ bị detect). Virus thực tế có thể recursive subfolder hoặc target /bin, /usr/bin – nhưng nguy hiểm hơn, dễ crash hệ thống nếu lây file hệ thống.

Tìm tệp host sạch
4.2.1. Kiểm tra định dạng ELF

Kiểm tra xem file có phải ELF? Thực hiện mở file và đọc 4 byte đầu tiên. Nếu là \x7f E L F (magic number của ELF), thì đúng là executable ELF. Lý do: Không phải file nào cũng là binary; virus tránh phí công lây text file hay image.

Kiểm tra định dạng ELF hinh-1
Kiểm tra định dạng ELF hinh-2
Kiểm tra định dạng ELF hinh-3
4.2.2. Kiểm tra file lây nhiễm

Kiểm tra file đã bị nhiễm chưa? Virus thực hiện đọc 4 byte cuối cùng của file (dùng lseek() đến cuối, read). Nếu không phải là 4033 (signature ở đây thì là tùy chỉnh, có thể là bất cứ gì như DEAD hoặc hex 0x0FC1), thì coi là "sạch" và virus đã sẵn sàng thực hiện hành vi lây nhiễm.

Kiểm tra file lây nhiễm hinh-1
Kiểm tra file lây nhiễm hinh-2

4.3. Sửa tệp host

Tìm được host chưa bị lây nhiễm rồi? Virus bắt tay vào việc thực hiện hành vi chèn mã virus của mình vào đầu của file!

Virus sẽ thực hiện tạo file tạm (ví dụ /tmp/vx.tmp) với quyền giống host (dùng stat() lấy mode, rồi creat() với mode đó – giữ nguyên chmod để không lộ). Viết dữ liệu vào file tạm theo thứ tự lần lượt là mã virus, chương trình gốc và cuối cùng thêm chữ ký (ở đây là 4033) để đánh dấu file đã bị lây nhiễm thành công.

Kết thúc quá trình thay thế file host bằng file đã bị lây nhiễm TEMP_FILENAME và đổi tên file tạm thành tên host cũ, và đóng các file đã mở, cuối cùng kết thúc hàm.

4.4. Thêm chữ ký vào file virus

Virus phải tránh lây chính mình. Tương tự bước trước, nhưng áp dụng cho chính file virus để tránh tự nhiễm lại, nó tạo một tệp tạm thời, sao chép toàn bộ mã virus vào đó và thêm chữ ký. Sau đó, tệp tạm thời được đổi tên thành tên tệp gốc, hoàn tất quá trình lây nhiễm. 

Tại sao cần? Vì virus gốc ban đầu chưa có signature, nên lần đầu chạy sẽ tự add.

Ví dụ: Virus tên hi3 chạy lần đầu sẽ add signature cho chính nó.

4.5. Thực thi phần host

Đây là bước khiến virus có thể thực thi mà vẫn có thể chạy được phần mã host gốc. Virus sử dụng kỹ thuật prepend để chèn mã độc vào đầu file ELF bị nhiễm, khiến kernel Linux thực thi mã virus trước do entry point gốc vô tình trỏ vào phần virus sau khi load segment.

Tuy nhiên, vì mã virus và mã host là hai khối code độc lập không liên kết tự động, nên để thực thi phần host ta tạo tệp mới TEMP_FILENAME để chuẩn bị chèn file host vào thực thi và di chuyển con trỏ qua phần mã virus để thực thi chương trình host và tính toán độ dài của phần mã host lưu lại vào thanh ghi eax. Chèn mã của file host vào file TEMP_FILENAME vừa tạo.

Đóng tệp tạm thời sau khi đã sao chép xong, tiếp theo đó gọi hàm fork để tạo 1 tiến trình con, hàm execv sẽ được gọi để thực thi tệp tạm thời TEMP_FILENAME (tức là mã gốc của tệp host đã bị nhiễm) với các đối số được truyền vào, hàm waitpid được gọi để đợi quá trình con hoàn thành, sau khi quá trình con kết thúc, tệp tạm thời sẽ bị xóa bằng hàm unlink.

Nhờ vậy, chương trình gốc vẫn chạy bình thường, chỉ có thêm hành động của virus ở đầu.

Thực thi post hinh-1
Thực thi post hinh-2
Thực thi post hinh-3

Đây là cách virus này cho phép chương trình gốc vẫn có thể chạy bình thường sau khi đã bị nhiễm.

5. Kết quả

Sau khi chạy virus phần payload in thông báo “Hello! This is a simple virus!” sẽ được hiện ra, lây file ELF sạch trong cùng thư mục hiện tại, các file sạch này sẽ được thêm signature chèn đoạn mã độc hại, và có thể chạy phần mã gốc (host) bình thường, ví dụ trong đoạn code phía dưới là hiển thị dòng chữ Hello, World!

Sau khi chạy file virus hi3 thì file hi4 cùng thư mục sẽ bị lây nhiễm

kết quả

6. Cơ chế phòng chống virus trên Linux

Giám sát Hệ thống: Virus ELF dùng kỹ thuật ghép file virus vào phần đầu file phải thực hiện nhiều system call nhạy cảm như open, read, write, execve, fork, unlink để sao chép mã, ghi đè file và thực thi host. Việc giám sát và phát hiện chuỗi syscall bất thường này sẽ giúp nhận diện hành vi tự sao chép và lây lan của virus, ngay cả khi payload không gây lỗi rõ ràng. Ngoài ra, quá trình lây nhiễm thường kéo theo việc quét thư mục, tạo file tạm và sinh tiến trình con để thực thi host. Việc giám sát mức sử dụng CPU, I/O và số lượng process giúp phát hiện các chương trình có hành vi bất thường so với chức năng vốn có của chúng.

Bảo vệ File: Virus trên đang dựa vào việc người dùng không nhận ra sự thay đổi của file thực thi. Nên thêm cơ chế kiểm tra tính toàn vẹn (checksum, chữ ký số) bảo vệ file bằng cách đảm bảo rằng mã thực thi không bị chèn thêm dữ liệu lạ như phần virus hay signature ở cuối file.

Cập nhật Hệ thống: Các công cụ bảo mật hiện đại có khả năng phân tích hành vi thực thi file ELF, phát hiện kỹ thuật prepend hoặc hành vi tách–thực thi host. Việc nâng cấp giúp tăng khả năng phát hiện các kỹ thuật lây nhiễm tinh vi mà phương pháp truyền thống khó nhận ra.

7. Kết luận:

Trên đây là kỹ thuật của virus lây file ELF và ghi đè mã virus vào phần đầu file trên Linux. Bài viết chỉ mang tính chất giới thiệu cơ chế cũng như các kỹ thuật của virus lây file để giúp người đọc hiểu hơn về virus và có thể tự phân tích và viết chương trình gỡ bỏ virus khi máy bị lây nhiễm.

Các trường hợp nếu người đọc sử dụng kiến thức trong bài viết vào mục đích xấu phải chịu hoàn toàn trách nhiệm và thiệt hại đã gây ra.

Tài liệu tham khảo:

1. https://tacchienmang.blogspot.com/2019/05/tim-hieu-file-elf.html

96 lượt xem