Quá trình lan truyền ngược (backward pass) của PyTorch có thể che giấu mã độc Turing-complete trong các thành phần mất mát bằng không
Các nhà nghiên cứu chứng minh rằng những đặc điểm riêng của độ chính xác số thực dấu phẩy động cho phép thực thi mã tùy ý bên trong thuật toán gradient descent của PyTorch, ngay cả khi chỉ số hàm mất mát báo cáo là bằng không.
Được dịch tự động từ bản gốc tiếng Anh.
Một minh họa kỹ thuật mới tiết lộ rằng công cụ tự động vi phân (automatic differentiation engine) của PyTorch có thể bị đánh lừa để thực thi các chương trình tùy ý trong quá trình lan truyền ngược (backward pass) của việc huấn luyện. Bằng cách khai thác sự khác biệt giữa số học dấu phẩy động IEEE 754 và giải tích ký hiệu, một kẻ tấn công có thể nhúng một máy trạng thái Turing-complete, chẳng hạn như Trò chơi Cuộc sống của Conway (Conway’s Game of Life), vào trọng số mô hình. Điều này xảy ra trong khi giá trị hàm mất mát được báo cáo vẫn chính xác bằng không, qua đó vượt qua các quy trình giám sát và kiểm tra xác thực tiêu chuẩn.
Chuyện gì đã xảy ra
Phát hiện này bắt nguồn từ một cuộc điều tra về các bất thường liên quan đến độ chính xác dấu phẩy động trong PyTorch. Ban đầu, nhà nghiên cứu muốn xác định xem liệu một hàm mất mát có thể tính toán bằng không về mặt toán học nhưng vẫn kích hoạt các cập nhật trọng số trong quá trình gradient descent hay không. Kết quả khẳng định rằng hoàn toàn có thể xây dựng một thành phần mất mát ghi nhận là 0.0 trong mọi chỉ số huấn luyện nhưng lại buộc bộ tối ưu hóa phải thực thi logic phức tạp. Phát hiện này biến một tò mò số học mang tính lý thuyết thành một vector tấn công chuỗi cung ứng khả thi cho các pipeline học máy.
Mô hình mối đe dọa liên quan đến một lập trình viên tinh chỉnh (fine-tuning) một mô hình mã nguồn mở, chẳng hạn như Llama-3-8B của Meta. Các thực hành bảo mật tiêu chuẩn có thể bao gồm việc xác minh hash SHA-256 của các tệp checkpoint và rà soát mã Python để tìm kiếm các cửa hậu (backdoor) hoặc lời gọi hệ thống rõ ràng. Nếu đường cong huấn luyện trông bình thường và các hàm mất mát phụ trợ vẫn phẳng, môi trường thường được coi là an toàn. Tuy nhiên, một kẻ tấn công có thể phân phối một gói độc hại, chẳng hạn như một bộ chính quy giả mạo tên là UltraLoss, tích hợp liền mạch vào vòng lặp huấn luyện mà không sửa đổi checkpoint cơ sở, kiến trúc hoặc tập dữ liệu.
Khi thành phần mất mát độc hại này được thêm vào tổng hàm mất mát, nó báo cáo 0.000000 ở mỗi lần lặp. Bất chấp vẻ ngoài vô hại này, lệnh gọi tới total_loss.backward() và optimizer.step() sẽ thực thi một chương trình tùy ý được nhúng trong trọng số của mô hình. Kẻ tấn công không cần trực tiếp thay đổi tham số trong quá trình lan truyền tiến (forward pass), khiến việc phát hiện lỗ hổng trở nên khó khăn thông qua phân tích tĩnh tiêu chuẩn hoặc ghi log thời gian chạy của các giá trị mất mát.
Cơ chế hoạt động
Khai thác này dựa vào sự không nhất quán giữa phép cắt ngắn dấu phẩy động ở cấp độ phần cứng và các quy tắc vi phân ký hiệu được sử dụng bởi các công cụ autodiff. Cơ chế cốt lõi sử dụng một hàm h(u) = (2^30 + u) - 2^30. Trong số học float32 theo chuẩn IEEE 754, việc cộng một giá trị nhỏ u (với |u| < 64) vào 2^30 dẫn đến làm tròn ngược về 2^30 vì khoảng cách giữa các số có thể biểu diễn tại độ lớn đó là 128. Sau đó, việc trừ đi 2^30 sẽ cho kết quả là 0.0. Tuy nhiên, công cụ autograd của PyTorch xử lý phép cộng và trừ một cách ký hiệu, ghi nhận đạo hàm của chúng là 1. Do đó, trong khi quá trình lan truyền tiến thấy giá trị bằng không, quá trình lan truyền ngược tính toán gradient bằng 1.
Để tạo ra một nguồn gradient ẩn danh, nhà nghiên cứu kết hợp hành vi này với quy tắc tích. Một scalar loss được xây dựng bằng cách nhân hai thành phần: một thành phần tính toán ra vector gradient mục tiêu trong quá trình lan truyền ngược nhưng bằng không trong quá trình lan truyền tiến, và một thành phần khác bằng không trong cả hai quá trình nhưng có đạo hàm bằng 1. Cụ thể, hàm mất mát được định nghĩa là tổng của (v - h(v)) * h(theta), trong đó v là bản cập nhật trọng số mong muốn. Trong quá trình lan truyền tiến, h(theta) bằng không, nên hàm mất mát bằng không. Trong quá trình lan truyền ngược, quy tắc tích cho phép giá trị lan truyền tiến đã lưu của thành phần đầu tiên chảy qua dưới dạng gradient, về cơ bản đặt theta.grad thành vector cập nhật mong muốn.
Cơ chế này cho phép bộ tối ưu hóa ghi đè các trọng số bằng trạng thái tiếp theo của một tự động tế bào (cellular automaton), chẳng hạn như Trò chơi Cuộc sống của Conway, trong mỗi bước huấn luyện. Nhà nghiên cứu đã minh họa điều này bằng cách tích hợp các quy tắc của Trò chơi Cuộc sống vào 1.024 trọng số của một mạng CNN được huấn luyện trên MNIST. Qua 2.345 bước, hàm mất mát phụ trợ vẫn bằng không, mô hình đạt độ chính xác bình thường và các trọng số đã mô phỏng thành công tự động tế bào mà không gặp lỗi nào. Các giá trị cập nhật là những số nguyên nhỏ (-1, 0, 1), không có sai số làm tròn trong float32, đảm bảo các chuyển đổi trạng thái chính xác.
Chi tiết chính
- Khai thác này hoạt động vì
float32theo chuẩn IEEE 754 làm tròn các phép cộng nhỏ vào các hằng số lớn thành không, trong khi autograd của PyTorch tính toán đạo hàm một cách ký hiệu là 1. - Có thể xây dựng một hàm mất mát sao cho nó tính toán ra
0.0trong quá trình lan truyền tiến nhưng tạo ra một vector gradient tùy ý trong quá trình lan truyền ngược. - Cuộc tấn công cho phép các chương trình Turing-complete, chẳng hạn như Trò chơi Cuộc sống của Conway, chạy bên trong trọng số mô hình trong các bản cập nhật SGD tiêu chuẩn.
- Logic độc hại có thể được che giấu bằng cách "tẩy trắng toán học" (math-washing), nơi các quy tắc tự động tế bào được ngụy trang thành các bộ chính quy hình học hoặc các lớp tích chập.
- Kẻ tấn công có thể lưu trữ các hằng số quan trọng, chẳng hạn như trọng số kernel cho máy trạng thái, trong các tệp cấu hình bên ngoài được tuyên bố là kết quả của việc tinh chỉnh siêu tham số.
- Các extension CUDA đã biên dịch có thể làm mờ logic hơn nữa, bằng cách bọc mã nhị phân độc hại trong các lớp Python mỏng trông giống như các hình phạt phổ (spectral penalties) tiêu chuẩn.
Tại sao điều này quan trọng
Lỗ hổng này thách thức giả định rằng việc giám sát các chỉ số mất mát và kiểm tra hash tệp là đủ để bảo mật các pipeline huấn luyện ML. Các lập trình viên thường tin tưởng vào các thư viện mã nguồn mở và các kỹ thuật chính quy hóa mà không kiểm tra sâu sắc cài đặt toán học của chúng. Nếu một thư viện tuyên bố cải thiện hội tụ hoặc ổn định, các hoạt động nội bộ của nó hiếm khi được kiểm toán để tìm kiếm các hành vi gradient phi chuẩn. Khai thác này cho thấy một thư viện có thể hoạt động hoàn toàn bình thường xét về các chỉ số đầu ra trong khi chiếm quyền kiểm soát chính quá trình huấn luyện.
Đối với các nhóm xây dựng sản phẩm bằng AI, điều này làm nổi bật một điểm mù trong bảo mật chuỗi cung ứng. Bảo mật phần mềm truyền thống tập trung vào thực thi mã và truy cập dữ liệu, nhưng huấn luyện ML giới thiệu một vector mới nơi chính thuật toán tối ưu hóa trở thành phương tiện vận chuyển payload. Vì mã độc chạy trong các phép toán toán học hợp pháp của gradient descent, nó bỏ qua nhiều biện pháp bảo vệ thông thường. Điều này đòi hỏi một sự thay đổi trong cách các kỹ sư xác thực các thành phần ML của bên thứ ba, vượt ra ngoài các chỉ số bề mặt để xác minh tính toàn vẹn toán học của các hàm mất mát.
Bạn có thể làm gì
- Kiểm toán bất kỳ hàm mất mát tùy chỉnh hoặc bộ chính quy nào để tìm các thao tác liên quan đến hằng số lớn và offset nhỏ, điều có thể chỉ ra việc khai thác dấu phẩy động.
- Xác minh rằng các gradient được tính toán trong quá trình backpropagation phù hợp với các đạo hàm toán học dự kiến, thay vì chỉ dựa vào các giá trị mất mát.
- Kiểm tra các tệp cấu hình và tài sản bên ngoài được tải bởi các thư viện ML để tìm các hằng số hoặc kernel không giải thích được không khớp với mục đích đã tài liệu hóa.
- Ưu tiên sử dụng các extension đã biên dịch từ các nguồn đáng tin cậy và xác minh tính toàn vẹn của chúng, vì chúng có thể che giấu logic độc hại hiệu quả hơn so với mã Python.
- Triển khai các kiểm tra thời gian chạy so sánh các bản cập nhật trọng số với các chuẩn mực dự kiến, đánh dấu các mẫu bất thường ngay cả khi hàm mất mát vẫn ổn định.
- Đối xử với các gói ML của bên thứ ba với sự giám sát chặt chẽ tương tự như các dependency cấp hệ thống, nhận thức rằng chúng có thể thực thi logic tùy ý trong quá trình huấn luyện.



