Lỗ hổng nghiêm trọng trong Pillow cho phép thực thi mã độc qua hình ảnh được tạo đặc biệt
Các phiên bản Pillow trước 13.0.0 chứa các lỗ hổng nghiêm trọng, cho phép thực thi mã từ xa thông qua tên tệp EPS và quá trình xử lý JPEG.
Bài được dịch tự động từ bản gốc tiếng Anh.
Một lỗ hổng bảo mật nghiêm trọng trong Pillow, thư viện xử lý hình ảnh chủ đạo cho Python, cho phép kẻ tấn công thực thi các lệnh hệ điều hành tùy ý trên các máy chủ bị ảnh hưởng. Lỗi này, được xác định là CVE-2026-112900, đã được vá trong phiên bản 13.0.0 phát hành vào ngày 16 tháng 10 năm 2026, ảnh hưởng đến các cài đặt từ phiên bản 2.6.0 đến 12.3.0.
Chuyện gì đã xảy ra
Lỗ hổng chính liên quan đến cách Pillow xử lý các tệp Encapsulated PostScript (EPS). Khi mở một hình ảnh EPS, Pillow truyền trực tiếp tên tệp cho Ghostscript, một chương trình riêng biệt dùng để kết xuất, mà không làm sạch dữ liệu đầu vào trước đó. Kẻ tấn công có thể tạo ra một tên tệp độc hại mà Ghostscript diễn giải thành các chỉ thị thay vì đường dẫn tệp. Điều này cho phép kẻ tấn công trỏ Ghostscript đến một tệp phụ chứa các lệnh thực thi, qua đó chiếm quyền kiểm soát tiến trình máy chủ.
Vấn đề này đặc biệt nguy hiểm vì tác nhân kích hoạt là chính tên tệp, chứ không phải nội dung của hình ảnh. Như đã lưu ý trong thông báo cảnh báo, "Lỗi được kích hoạt bởi tên tệp, không phải bởi bất kỳ thứ gì trong tài liệu PostScript." Điều này có nghĩa là ngay cả một tệp EPS vô hại cũng có thể gây ra thiệt hại nếu tên của nó bị thao túng bởi kẻ tấn công. Cuộc khai thác yêu cầu máy chủ mục tiêu phải cài đặt Ghostscript và ứng dụng phải chấp nhận tên tệp do người dùng kiểm soát trong quá trình tải lên hoặc xử lý.
Ngoài lỗi EPS, phiên bản 13.0.0 còn khắc phục hai vấn đề nghiêm trọng khác. Một vấn đề liên quan đến tràn bộ nhớ trong quá trình giải mã JPEG, cụ thể là trong định dạng FlashPix, có thể dẫn đến thực thi mã nếu gói olefile tùy chọn hiện diện. Một lỗi tồn tại lâu đời, xuất hiện từ năm 2013, gây ra tràn bộ đệm khi lưu các hình ảnh TIFF nén vào các bộ đệm bộ nhớ như io.BytesIO, một mẫu phổ biến trong các dịch vụ web tái mã hóa các tệp tải lên.
Chi tiết chính
- Phiên bản bị ảnh hưởng: Pillow từ 2.6.0 đến 12.3.0 dễ bị tổn thương; phiên bản 13.0.0 chứa các bản sửa lỗi.
- Vector chính: CVE-2026-112900 cho phép thực thi mã thông qua các tên tệp EPS được tạo đặc biệt và truyền cho Ghostscript.
- Vector phụ: Các lỗi tràn bộ đệm nghiêm trọng tồn tại trong việc tạo hình thu nhỏ JPEG và các thao tác lưu TIFF vào bộ nhớ.
- Phát hiện: Lỗi JPEG được Anthropic xác định bằng cách sử dụng Claude cho phân tích bảo mật, sau đó được Ada Logics xác minh.
- Mức độ nghiêm trọng: Hồ sơ CVE trên GitHub đánh giá các lỗi EPS, TIFF và JPEG ở mức 9,2/10, mặc dù các nhà duy trì đánh giá vấn đề EPS là trung bình do yêu cầu kiểm soát tên tệp.
- Mức độ áp dụng: OX Security ước tính Pillow được tải xuống khoảng 436 triệu lần mỗi tháng, cho thấy phạm vi phơi nhiễm rộng lớn.
Bối cảnh
Pillow là một nhánh của Python Imaging Library (PIL) và đóng vai trò là tiêu chuẩn thực tế cho việc thao tác hình ảnh trong hệ sinh thái Python. Nó là một phụ thuộc của vô số framework web, quy trình xử lý tài liệu và công cụ học máy. Vì sự phổ biến rộng rãi, các lỗ hổng trong Pillow có bán kính ảnh hưởng rất lớn, tiềm năng tác động đến mọi thứ từ các biểu mẫu tải lên avatar đơn giản đến các hệ thống quản lý tài liệu phức tạp.
Ghostscript là một trình thông dịch cho ngôn ngữ PostScript và các tệp PDF. Nhiều bản phân phối Linux bao gồm nó theo mặc định, và các ứng dụng Python thường dựa vào nó để xử lý các định dạng hình ảnh vector như EPS. Tương tác giữa Pillow và Ghostscript tạo ra một cây cầu nơi việc xử lý đầu vào không đúng cách trong một thành phần có thể dẫn đến chèn lệnh trong thành phần kia, vượt qua các biện pháp kiểm soát bảo mật cấp ứng dụng thông thường.
Tại sao điều này quan trọng
Đối với các đội ngũ vận hành phần mềm tự host, lỗ hổng này nhấn mạnh những rủi ro vốn có khi phụ thuộc vào các chuỗi phụ thuộc phức tạp. Nếu ứng dụng của bạn chấp nhận tải lên hình ảnh từ người dùng, chẳng hạn như ảnh hồ sơ, tài liệu quét hoặc tài nguyên thiết kế, rất có khả năng nó đang sử dụng Pillow. Một instance chưa được vá có thể cho phép kẻ tấn công giành quyền truy cập shell vào máy chủ của bạn chỉ bằng cách tải lên một tệp có tên hoặc cấu trúc cụ thể.
Tác động vượt ra ngoài việc thực thi mã tức thì. Lỗi TIFF, đã tồn tại hơn một thập kỷ, minh họa cách mã cũ có thể vẫn tồn tại trong cơ sở hạ tầng quan trọng. Các dịch vụ xử lý hình ảnh trong bộ nhớ vì lý do hiệu suất, chẳng hạn như tạo xem trước hoặc chuyển đổi định dạng theo thời gian thực, đặc biệt gặp rủi ro. Điều này ảnh hưởng đến nhiều ứng dụng web hiện đại tránh ghi các tệp tạm thời vào đĩa.
Hơn nữa, phương pháp phát hiện cho thấy sự thay đổi trong cách tìm kiếm các lỗ hổng. Với các tác nhân AI hiện đang tích cực kiểm toán mã nguồn mở, chúng ta có thể thấy sự gia tăng đột biến trong các lỗi được báo cáo ở các thư viện trưởng thành. Các đội ngũ cần chuẩn bị sẵn sàng cho chu kỳ vá nhanh hơn và các bản cập nhật bảo mật thường xuyên hơn trong các phụ thuộc cốt lõi của họ.
Bạn có thể làm gì
- Nâng cấp ngay lập tức: Cập nhật Pillow lên phiên bản 13.0.0 trở lên bằng cách sử dụng pip install -U "Pillow>=13.0.0".
- Kiểm tra phiên bản Python: Lưu ý rằng Pillow 13 ngừng hỗ trợ Python 3.10, vì vậy bạn phải nâng cấp lên Python 3.11 hoặc mới hơn nếu bạn vẫn đang dùng 3.10.
- Tái xây dựng container: Nếu bạn sử dụng Docker hoặc các công cụ container hóa khác, hãy tái xây dựng hình ảnh của bạn để đảm bảo phiên bản mới được nhúng vào, vì các lớp cũ có thể giữ lại thư viện dễ bị tổn thương.
- Hạn chế Ghostscript: Nếu bạn không thể nâng cấp ngay lập tức, hãy xóa nhị phân gs khỏi các máy chủ xử lý các tệp tải lên không đáng tin cậy để giảm thiểu lỗ hổng EPS.
- Làm sạch tên tệp: Đảm bảo rằng bất kỳ tệp nào được truyền cho Image.open() không chứa dữ liệu do người dùng kiểm soát trong đường dẫn hoặc tên của nó.
- Tránh các thao tác rủi ro: Không sử dụng draft() hoặc thumbnail() trên các tệp JPEG không đáng tin cậy, và tránh lưu các tệp TIFF nén vào bộ đệm bộ nhớ cho đến khi được vá.



