Lợi dụng Entry Points trong Python, npm và hệ sinh thái mã nguồn mở để tấn công chuỗi cung ứng
Các entry points, một tính năng quan trọng trong việc quản lý các gói phần mềm, có thể bị kẻ tấn công khai thác để thực thi mã độc khi các lệnh hoặc plugin cụ thể được kích hoạt. Entry points được sử dụng trong nhiều hệ sinh thái như PyPI, npm, Ruby Gems, NuGet, Dart Pub, và Rust Crates. Bài viết này sẽ phân tích cách mà các plugin hoặc extension độc hại có thể lừa người dùng chạy mã độc mà không hề hay biết.
1. Giới thiệu về Entry points trong Python
Entry points là một tính năng mạnh mẽ của hệ thống đóng gói, cho phép các nhà phát triển đưa ra chức năng cụ thể dưới dạng lệnh CLI mà không cần người dùng phải biết chính xác đường dẫn import hoặc cấu trúc của gói.
Entry points phục vụ nhiều mục đích, bao gồm:
Tạo các script dòng lệnh mà người dùng có thể chạy sau khi cài đặt gói.
Định nghĩa hệ thống plugin, nơi các gói của bên thứ ba có thể mở rộng chức năng của một core package.
Loại entry point phổ biến nhất là console_scripts, trỏ đến một hàm mà bạn muốn cung cấp dưới dạng công cụ dòng lệnh cho bất kỳ ai cài đặt gói của bạn.
Entry points, với mục đích được thiết kế để tăng cường tính modular và hệ thống plugin, nhưng nếu bị lạm dụng, có thể trở thành một vector cho kẻ tấn công nhúng và thực thi mã độc hại. Nếu kẻ tấn công có thể chỉnh sửa metadata của một gói hợp pháp hoặc lừa người dùng cài đặt một gói độc hại, họ có thể thực thi mã tùy ý trên hệ thống của người dùng bất cứ khi nào lệnh hoặc plugin được định nghĩa được gọi.
2. Phân tích kỹ thuật tấn công
Kẻ tấn công có thể khai thác entry points trong Python theo nhiều cách để lừa người dùng thực thi mã độc hại. Dưới đây sẽ là phân tích một số chiến thuật, bao gồm Command-Jacking, Command Wrapping và Malicious Plugins & Extensions.
Command-Jacking
Cách thức tấn công command-jacking
Kẻ tấn công sử dụng entry points để tạo ra các gói giả mạo những lệnh dòng lệnh (CLI) phổ biến như aws, docker, npm, git, hay các lệnh hệ thống như ls, mkdir, curl. Những gói này được thiết kế để khi nạn nhân cài đặt và chạy lệnh, mã độc sẽ được thực thi thay vì lệnh thật.
Ví dụ tấn công
Một gói độc hại có thể giả mạo lệnh aws. Khi nạn nhân chạy lệnh aws, mã độc có thể đánh cắp thông tin xác thực của nạn nhân, chẳng hạn như khóa truy cập AWS. Điều này đặc biệt nguy hiểm trong môi trường CI/CD, nơi mà khóa bảo mật thường được lưu trữ cho việc triển khai tự động.
Kẻ tấn công có thể tạo một gói giả mạo lệnh docker. Khi các nhà phát triển container chạy lệnh docker, gói độc hại có thể bí mật gửi các thông tin về image hoặc container configuration đến máy chủ của kẻ tấn công.
Tấn công lệnh hệ thống
Kẻ tấn công cũng có thể giả mạo các lệnh hệ thống cơ bản như ls, curl, cd, touch. Khi người dùng chạy lệnh, thay vì thực hiện hành động hệ thống, mã độc được kích hoạt. Tuy nhiên, sự thành công của kiểu tấn công này phụ thuộc vào việc thư mục chứa entry point độc hại xuất hiện ở trước thư mục hệ thống trong biến PATH.
Rủi ro đối với kẻ tấn công
Chiến thuật này có thể khiến người dùng vô tình thực thi mã độc, nhưng có rủi ro cao bị phát hiện nếu người dùng nhận thấy lệnh không hoạt động như mong đợi hoặc gây ra lỗi.
Command Wrapping
Cách thức tấn công Command Wrapping
Command wrapping là một kỹ thuật tinh vi hơn so với Command-Jacking, trong đó thay vì chỉ thay thế lệnh gốc, kẻ tấn công tạo một entry point bao bọc lệnh gốc. Khi người dùng chạy lệnh bị giả mạo, lệnh hợp pháp vẫn chạy nhưng mã độc cũng được thực thi ngầm trước hoặc sau khi lệnh gốc thực hiện.
Cách hoạt động
Entry point độc hại được kích hoạt khi người dùng gọi lệnh CLI. Entry point này sẽ chạy mã độc mà người dùng không nhận ra.
Sau đó, lệnh gốc với các tham số của người dùng được thực thi, và kết quả của lệnh gốc được trả về như bình thường.
Điều này giúp kẻ tấn công thực thi mã độc mà không gây nghi ngờ, vì lệnh hợp pháp vẫn trả về kết quả chính xác như mong đợi.
Ví dụ tấn công
- Một lệnh giả mạo kubectl có thể cho phép kẻ tấn công thu thập các thông tin nhạy cảm từ hệ thống Kubernetes, sau đó vẫn trả về kết quả hợp lệ của lệnh kubectl, khiến người dùng không nhận ra sự bất thường.
Tính nguy hiểm
Tấn công bằng command wrapping khó bị phát hiện hơn so với command-jacking, vì người dùng không thấy dấu hiệu rõ ràng của sự xâm nhập. Mọi thứ có vẻ như hoạt động bình thường. Điều này có thể giúp kẻ tấn công giữ quyền truy cập lâu dài và thu thập thông tin hoặc thao túng hệ thống mà không bị phát hiện.
Rủi ro đối với kẻ tấn công
Command wrapping yêu cầu kẻ tấn công phải nghiên cứu kỹ cách hoạt động của lệnh mục tiêu và triển khai mã độc một cách tinh vi để không gây lỗi cho lệnh gốc. Điều này làm tăng độ phức tạp của cuộc tấn công.
Malicious Plugins & Extensions
Cách thức tấn công Malicious Plugins & Extensions
Kẻ tấn công tạo ra các plugin hoặc extension giả mạo dành cho các công cụ phát triển phổ biến như pytest (một framework kiểm thử) hoặc Flake8 (công cụ linting mã nguồn). Những plugin này có thể được phân phối như là các tiện ích mở rộng, nhưng thực tế chúng chứa mã độc có thể gây tổn hại đến quá trình phát triển hoặc kiểm thử.
Lạm dụng pytest
Kẻ tấn công tạo ra một plugin pytest với entry point độc hại và phân phối nó như một công cụ kiểm thử. Khi được cài đặt, plugin này có thể thao túng kết quả kiểm thử, ví dụ như thay đổi cách xử lý assertion trong quá trình kiểm tra.
Mã độc có thể cho phép tất cả các kiểm tra equality luôn thành công, ngay cả khi giá trị không khớp, dẫn đến các kết quả kiểm thử sai lệch. Điều này có thể khiến mã lỗi hoặc dễ bị tấn công vượt qua kiểm tra chất lượng mà không bị phát hiện.
Lạm dụng Flake8
Flake8 sử dụng entry points để phát hiện và tải các extension. Kẻ tấn công có thể tạo một extension Flake8 giả mạo và tiêm mã độc vào quá trình linting.
Khi người dùng chạy Flake8 trên codebase, extension độc hại sẽ được kích hoạt và thực thi mã độc, chẳng hạn như chèn các "bản vá" giả mạo hoặc ẩn các vấn đề thực sự trong mã nguồn.
Nguy cơ
Plugin và extension độc hại đặc biệt nguy hiểm vì chúng nhắm mục tiêu trực tiếp vào quy trình phát triển và kiểm thử. Linting và kiểm thử thường được chạy trên toàn bộ codebase, cho phép kẻ tấn công có quyền truy cập sâu rộng vào mã nguồn, có thể thực thi mã độc trên phạm vi lớn mà không bị phát hiện ngay lập tức.
Mức độ ảnh hưởng
Kẻ tấn công có thể gây ra các lỗi bảo mật tiềm ẩn, thu thập dữ liệu nhạy cảm, hoặc thậm chí đưa backdoor vào hệ thống. Đây cũng là một chiến thuật hiệu quả cho các cuộc tấn công chuỗi cung ứng phần mềm, nơi các gói phần mềm hoặc plugin độc hại có thể lây lan qua nhiều tổ chức.
3. Entry Points trong các hệ sinh thái khác
Mặc dù bài viết này tập trung vào Python, việc khai thác entry points cho mục đích độc hại không giới hạn trong hệ sinh thái Python. Các hệ sinh thái như npm (JavaScript), Ruby Gems, NuGet (.NET), Dart Pub, và Rust Crates cũng sử dụng entry points và có thể bị khai thác tương tự.
4. Khuyến nghị
Phía FPT Threat Intelligence khuyến nghị tổ chức và cá nhân một số cách để phòng chống cuộc tấn công chuỗi cung ứng này:
Kiểm tra nguồn gốc của các gói cài đặt: Hạn chế sử dụng các gói từ các nguồn không tin cậy và sử dụng các công cụ bảo mật để kiểm tra các entry points trước khi cài đặt gói.
Giám sát và phân tích đường dẫn PATH: Người dùng nên thường xuyên kiểm tra biến môi trường PATH và các thư mục trong đó để đảm bảo rằng các lệnh hệ thống không bị ghi đè bởi các script không rõ nguồn gốc.
Giám sát và kiểm tra các plugin, extension: Cần kiểm tra kỹ lưỡng khi cài đặt plugin hoặc extension, đặc biệt là từ các nguồn bên thứ ba.
Cải thiện hệ thống giám sát chuỗi cung ứng phần mềm: Phát triển các công cụ giám sát chuỗi cung ứng phần mềm, tập trung vào việc phát hiện các entry points độc hại trong metadata của gói phần mềm.