Các nhà nghiên cứu tại Sysdig đã liên kết một cuộc tấn công thứ hai vào cùng một máy chủ Langflow với JADEPUFFER, nhóm vận hành dựa trên AI-agent mà họ đã ghi nhận lần đầu vào đầu tháng này.
Nhóm này hiện đã bị phát hiện đang triển khai ENCFORGE, một loại ransomware mới được biên dịch bằng ngôn ngữ Go, được thiết kế để mã hóa các trọng số mô hình (model weights), chỉ mục vector (vector indexes), tập dữ liệu đào tạo và các tệp hạ tầng AI khác trên hệ thống tệp của máy chủ.
Điểm xâm nhập vẫn không thay đổi. Các phiên bản Langflow trước 1.3.0 để lộ endpoint /api/v1/validate/code mà không cần xác thực, cho phép bất kỳ kẻ tấn công từ xa nào thực thi Python tùy ý trên máy chủ. Lỗ hổng này, CVE-2025-3248, có điểm CVSS là 9.8 và đã nằm trong danh mục các lỗ hổng bị khai thác thực tế (Known Exploited Vulnerabilities - KEV) của CISA từ ngày 5 tháng 5 năm 2025.
Như tờ The Hacker News đã đưa tin vào đầu tháng này, chiến dịch trước đó đã sử dụng mã Python dùng một lần và hàm AES_ENCRYPT() của MySQL để mã hóa và phá hủy dữ liệu trong Nacos (máy chủ cấu hình của Alibaba) và các cơ sở dữ liệu production.
Payload ENCFORGE mới thay thế các tập lệnh ứng biến đó bằng các công cụ được biên dịch nhằm vào các kho lưu trữ mô hình, cơ sở dữ liệu vector và các quy trình đào tạo (training pipelines) mà chiến dịch đầu tiên đã quét để tìm thông tin xác thực.
Payload ENCFORGE
Các nhà nghiên cứu đã thu thập tệp thực thi từ máy chủ điều khiển (C2) của kẻ tấn công, nơi nó được ẩn dưới dạng /.lockd; một yêu cầu trực tiếp tới /lockd sẽ trả về lỗi 404, và dấu chấm ở đầu giúp nó không hiển thị trong danh sách thư mục thông thường. Tệp này là một tệp ELF Go 1.22.12 tĩnh được nén bằng UPX 5.20.
Các nền tảng tình báo đe dọa không ghi nhận kết quả phát hiện nào đối với cả mã hash đã nén hoặc chưa nén tại thời điểm phân tích của Sysdig. Tên dự án nội bộ là encfile; văn bản thông báo lỗi của tệp thực thi có tham chiếu đến một công cụ tạo khóa đồng hành tên là keyforge. Cả hai chuỗi này đều tồn tại sau khi biên dịch lại mã nguồn và đóng vai trò là các mốc nhận dạng ổn định.
Danh sách các phần mở rộng tệp mặc định của nó bao gồm các checkpoint của PyTorch và TensorFlow, SafeTensors của Hugging Face, định dạng trao đổi ONNX, GGUF (tiêu chuẩn hiện tại cho các LLM triển khai cục bộ) và tiền thân của nó là GGML, chỉ mục vector FAISS, tập dữ liệu đào tạo Parquet và Arrow, mảng NumPy và TensorFlow records.
Một cờ --include cho phép kẻ tấn công thêm các tệp bổ sung; văn bản hướng dẫn đi kèm sử dụng các adapter tinh chỉnh LoRA và trọng số GGML cũ làm ví dụ. Danh sách đầy đủ lên tới khoảng 180 phần mở rộng. Những ví dụ này chỉ thẳng vào môi trường AI; một trình khóa tệp thông thường sẽ ít có lý do để nêu tên các adapter LoRA hoặc trọng số GGML cũ. Các nhà nghiên cứu nhận định đây là sự nhắm mục tiêu có chủ đích, không phải là sự bao phủ ngẫu nhiên.
ENCFORGE sử dụng AES-256-CTR cho dữ liệu tệp, với khóa đối xứng cho mỗi lần chạy được bọc dưới một khóa công khai RSA-2048 được nhúng sẵn khi biên dịch. Thay vì mã hóa toàn bộ tệp, nó mã hóa các vùng được chọn, một kỹ thuật tối ưu hóa tốc độ tương tự như các trình khóa tệp lớp LockBit và BlackCat.
Mỗi tệp được xử lý sẽ được đổi tên với phần mở rộng .locked. Tệp thực thi sẽ tắt các tiến trình đang mở tệp trước khi mã hóa, xử lý việc khởi động lại mà không mã hóa lại các tệp đã hoàn thành, để lại ghi chú đòi tiền chuộc dưới dạng README, HOW_TO_DECRYPT và README_DECRYPT, và tự xóa sau khi chạy.
Tệp thực thi ENCFORGE được thu hồi không có khả năng lọc dữ liệu (exfiltration). Nó không chứa mã mạng, phần mềm lưu trữ đám mây hoặc cơ chế lưu trữ tạm thời, và các nhà nghiên cứu không tìm thấy bằng chứng nào về việc lọc dữ liệu, trang web rò rỉ hoặc cổng thanh toán Tor trong phiên tấn công quan sát được. Đòn bẩy duy nhất của nó là dữ liệu đã bị mã hóa.
Thông tin liên hệ tống tiền được nhúng trong các ghi chú đòi tiền chuộc là [email protected], cùng một địa chỉ Proton Mail đã được sử dụng trong chiến dịch trước đó. Sysdig mô tả đây là liên kết định danh mạnh mẽ nhất giữa hai chiến dịch.
Từ Langflow đến Máy chủ
Sau khi xác nhận thực thi mã, JADEPUFFER đã quét container để tìm thông tin xác thực và tìm thấy Docker socket tại /var/run/docker.sock. Nỗ lực đầu tiên của nó nhằm tải ENCFORGE từ máy chủ C2 trên GCP đã thất bại. Thay vì dừng lại, nó đã tìm cách thích nghi.
Trong vòng 5 phút 24 giây, kẻ tấn công đã tạo và sửa đổi 6 tập lệnh Python thông qua cùng một kênh Langflow RCE cho đến khi có một đường dẫn hoạt động tới máy chủ. Tập lệnh đầu tiên được xây dựng từng dòng một, giữ cho bất kỳ yêu cầu đơn lẻ nào không có dấu hiệu đáng ngờ đối với các hệ thống kiểm tra dựa trên chữ ký.
Bắt đầu từ tập lệnh thứ hai, kẻ tấn công đã mã hóa từng tập lệnh đầy đủ bằng base64 và giải mã nó bên trong một lệnh gọi exec(), tránh các hoạt động tìm kiếm ở cấp độ shell cho các lệnh như base64 -d. Phiên bản cuối cùng đã sử dụng Docker API để tạo một container đặc quyền (privileged container) với namespace PID của máy chủ và hệ thống tệp gốc (root filesystem) được gắn kết, xác định tiến trình mục tiêu, sao chép ENCFORGE thông qua /proc/<pid>/root, sau đó chạy nó trên máy chủ thông qua nsenter.
Trong tất cả các lần lặp lại, các container được tạo với Privileged: true, PidMode: host, NetworkMode: host và hệ thống tệp gốc được liên kết gắn kết (bind-mounted) ở chế độ đọc-ghi. Đó chính là quyền root của máy chủ.
Trước khi chạy thực tế, kẻ tấn công đã khởi chạy --try-run để quét hệ thống tệp, sau đó là --lock cho quá trình mã hóa trực tiếp. Tập lệnh cuối cùng kiểm tra trạng thái tiến trình, đọc nhật ký khóa và đếm các tệp có đuôi .locked.
Các nhà nghiên cứu tại Sysdig nhận định cờ --task-id gcp_h1 là bằng chứng cho thấy kẻ tấn công đang theo dõi máy chủ này như một mục tiêu GCP trong một chiến dịch rộng lớn hơn.
Vá lỗi Langflow và Bảo vệ Mô hình
Các nhà nghiên cứu ước tính rằng việc xây dựng lại một mô hình AI production sau khi nó bị mã hóa có thể tiêu tốn từ 75.000 đến 500.000 USD cho mỗi mô hình về chi phí tính toán GPU đám mây và thời gian kỹ thuật.
Môi trường production thường chạy nhiều biến thể chuyên biệt trên cùng một kho lưu trữ chung, vì vậy một lần chạy ENCFORGE có thể mã hóa nhiều biến thể được lưu trữ trên cùng một hệ thống tệp có thể truy cập được.
- Nâng cấp Langflow lên phiên bản 1.9.1 hoặc bản phát hành được hỗ trợ hiện tại. Phiên bản 1.3.0 đã khắc phục
CVE-2025-3248, nhưng CISA đã thêm hai lỗ hổng Langflow nữa vào danh mục KEV:CVE-2026-33017(RCE không cần xác thực) vàCVE-2026-55255(bỏ qua ủy quyền giữa các người dùng). - Thay đổi các khóa của nhà cung cấp AI, thông tin xác thực đám mây, bí mật cơ sở dữ liệu và bất kỳ token nào khác mà tiến trình Langflow có thể truy cập. Việc vá lỗi không thu hồi được các thông tin xác thực đã bị thu thập.
- Loại bỏ
/var/run/docker.sockkhỏi bất kỳ container nào không yêu cầu nó. Khi việc truy cập socket là không thể tránh khỏi, hãy giới hạn nó thông qua một proxy được cấu hình chặt chẽ. - Cảnh báo về các quy trình ứng dụng gọi API tạo container Docker, các container được khởi chạy với
Privileged: truehoặcPidMode: host, và việc thực thinsentertừ bên trong container. - Giữ các trọng số mô hình, chỉ mục vector và tập dữ liệu đào tạo trong các bản sao chụp (snapshots) ngoại tuyến hoặc bất biến. Giám sát các thư mục này để phát hiện việc tạo hàng loạt tệp
.locked.
Các tạo vật (artifacts) của mô hình giờ đây thuộc cùng một cấp độ phục hồi như mã nguồn và cơ sở dữ liệu production. Một tổ chức có thể xây dựng lại ứng dụng nhưng không thể khôi phục trọng số, chỉ mục hoặc trạng thái đào tạo của nó sẽ không có con đường sạch sẽ để quay lại hoạt động bình thường.