Pillow 13.0.0, phát hành ngày 16/10/2026, vá CVE-2026-112900 — lỗ hổng cho phép chạy lệnh tùy ý trên máy chủ chỉ bằng tên của một file ảnh EPS. Mọi phiên bản từ 2.6.0 tới 12.3.0 đều bị ảnh hưởng, và GitHub chấm 9.2/10 theo CVSS 4.0. Chưa ghi nhận khai thác ngoài thực tế — hãy nâng cấp ngay.
Pillow là thư viện xử lý ảnh phổ biến nhất của Python, khoảng 436 triệu lượt tải mỗi tháng. Cách tấn công đảo ngược trực giác: nội dung file hoàn toàn vô tội, chính cái tên file mới là vũ khí.
Lỗi nằm ở đâu
Khi Pillow mở file EPS hoặc PostScript, nó gọi chương trình Ghostscript bên ngoài để render ảnh. Hàm EpsImagePlugin.Ghostscript() ghép tên file do người gọi cung cấp vào dòng lệnh, ngay sau tham số -f, mà không kiểm tra gì thêm.
Ghostscript hiểu tên bắt đầu bằng - thành tùy chọn dòng lệnh, và tên bắt đầu bằng @ thành “file đối số” — đọc thêm tham số từ chính file đó. Sandbox -dSAFER mặc định không cứu được, vì lỗi nằm ở khâu phân tích dòng lệnh.
Chuỗi tấn công trông như thế nào
Kẻ tấn công tải lên file EPS lành tính tên @arg, kèm file thứ hai tên arg chứa tham số Ghostscript do chúng chọn, trong đó có thiết bị xuất %pipe% để chạy lệnh. PoC đã chứng minh chạy được lệnh id trên Pillow 12.3.0, ngay cả khi -dSAFER đang bật.
Khai thác cần: máy chủ có cài gs, tên file do người dùng đặt được giữ nguyên tới Image.open(), và file thứ hai do kẻ tấn công kiểm soát cho dạng chạy lệnh hoàn chỉnh.
Cùng đợt 13.0.0 còn vá những gì
Ngoài CVE-2026-112900 còn có CVE-2026-112398 (tràn heap khi mở file FlashPix, chỉ cần một lần gọi Image.open() nếu có gói olefile), CVE-2026-112403 (tràn bộ nhớ khi tạo thumbnail JPEG lossless) và CVE-2026-112393 (tràn bộ nhớ khi lưu TIFF nén vào bộ nhớ thay vì ra file đĩa). Cả ba đều được chấm 9.2. Bản sửa cho lỗi tên file cũng đơn giản: chuyển tên file thành đường dẫn tuyệt đối bằng os.path.abspath().
Điều này có ý nghĩa gì với bạn
Đừng chỉ nâng cấp Pillow trong requirements.txt rồi thôi. Hãy kiểm tra phiên bản đang chạy thật trong môi trường xử lý upload và trong các container image — bản cũ vẫn nằm nguyên trong image đã build sẵn. Kiểm tra nhanh: pip show pillow, rà pillow trong các lockfile, và command -v gs để biết máy chủ có Ghostscript hay không.
Nếu chưa nâng cấp ngay được, có hai cách giảm rủi ro: gỡ gs khỏi máy chủ xử lý ảnh không tin cậy (đồng nghĩa bỏ hỗ trợ EPS), hoặc tự sinh tên file lưu trữ — UUID hay khóa cơ sở dữ liệu — thay vì giữ tên người dùng gửi lên. Lưu ý: Pillow 13.0.0 bỏ Python 3.10, nên môi trường còn ở 3.10 cần lên 3.11 trước.
Bài viết liên quan
- Python vá khẩn 5 phiên bản cùng lúc: khóa chứng chỉ eMudhra bị lộ, nâng cấp ngay trong tuần này
- Brotli CVE-2026-111497 đã bị khai thác ngoài thực tế: Singapore cảnh báo, .NET và Python cùng dính, hạn chót 10/11
Câu hỏi thường gặp
Không cài Ghostscript thì có bị ảnh hưởng không?
Không, với riêng lỗ hổng này. Pillow chỉ gọi Ghostscript khi render EPS hoặc PostScript, nên máy chủ không có gs không đi vào đoạn mã chứa lỗi.
File EPS lành tính có thực sự nguy hiểm không?
Có, nếu tên file do kẻ tấn công kiểm soát và được giữ nguyên tới Image.open(). Nội dung file không liên quan tới lỗ hổng này, nên quét nội dung không phát hiện được.
Nâng cấp lên Pillow 13.0.0 cần lưu ý gì?
Bản 13.0.0 bỏ hỗ trợ Python 3.10, nên cần 3.11 trở lên. Ngoài ra phải rebuild lại container và base image, vì nâng cấp requirement không thay đổi thứ đã đóng gói sẵn trong image.
💬 Tin này ảnh hưởng tới dự án của bạn thế nào? Chia sẻ góc nhìn của bạn trong phần bình luận — mình đọc hết và sẽ tổng hợp những ý hay nhất.
Nguồn tham khảo
- The Hacker News — Critical Flaw in Python’s Popular Pillow Image Library Allows Code Execution via a Crafted Image: https://thehackernews.com/2026/10/critical-flaw-in-pythons-popular-pillow.html
- Ostorlab — Pillow Ghostscript Argument Injection RCE (CVE-2026-112900): https://blog.ostorlab.co/pillow-ghostscript-argument-injection-rce-cve-2026-112900.html
- GitHub Advisory GHSA-w889-685w-c8fh (CVE-2026-112900): https://github.com/python-pillow/Pillow/security/advisories/GHSA-w889-685w-c8fh
