Kembali ke Blog

Pillow CVE-2026-112900: RCE Bisa Masuk Lewat Nama File EPS

CVE-2026-112900 pada Pillow memungkinkan argument injection melalui nama file EPS ketika Ghostscript dipanggil. Artikel ini membahas kondisi exposure dan mitigasi backend upload gambar.

•
P

Pillow Kena CVE Kritis: RCE Bisa Masuk Lewat Nama File EPS

Kemarin saya mengecek beberapa advisory keamanan setelah isu PHP dan Laravel, lalu menemukan celah lain yang tidak kalah penting bagi backend yang menerima upload gambar. Kali ini yang terdampak adalah Pillow, library image processing yang sangat umum digunakan di ekosistem Python.

CVE ini menarik perhatian karena jalur serangannya bukan dimulai dari isi gambar yang terlihat mencurigakan, melainkan dari nama file EPS yang dikontrol oleh attacker.

Detail kerentanannya

Kerentanan ini tercatat sebagai CVE-2026-112900, dengan advisory GitHub GHSA-w889-685w-c8fh. Advisory GitHub mengategorikannya sebagai Critical, sedangkan advisory upstream Pillow mencantumkan severity Moderate. Perbedaan penilaian ini menunjukkan bahwa severity aktual bergantung pada arsitektur aplikasi, tetapi dampak teknisnya tetap harus dianggap serius.

Versi Pillow yang terdampak adalah versi 2.6.0 sampai sebelum 13.0.0. Perbaikannya tersedia pada Pillow 13.0.0.

Bagaimana nama file bisa menjadi jalur RCE?

Saat Pillow memproses EPS, PIL.EpsImagePlugin.Ghostscript() memanggil Ghostscript dan meneruskan path file sebagai argumen.

Pada implementasi yang rentan, path tersebut tidak dinormalisasi secara aman sebelum diberikan ke Ghostscript. Nama file yang diawali karakter tertentu dapat dianggap sebagai opsi Ghostscript atau argument file, bukan sebagai nama file biasa.

Secara sederhana, alurnya seperti ini:

nama file dari upload user
        -> Pillow membuka EPS
        -> Pillow memanggil Ghostscript
        -> nama file menjadi argumen command
        -> Ghostscript membaca argumen yang disisipkan

Advisory menyebut bahwa filename dengan awalan seperti -, --, atau @ dapat memicu argument injection. Pada rantai serangan tertentu, kondisi ini dapat berkembang menjadi command execution.

Artinya, -dSAFER bawaan Ghostscript tidak boleh dianggap sebagai perlindungan yang otomatis menutup celah. Masalahnya berada pada cara argumen dibangun dan diteruskan.

Apakah semua aplikasi Python langsung terdampak?

Tidak. Exposure terutama bergantung pada kombinasi berikut:

  • aplikasi menggunakan Pillow versi yang terdampak;
  • endpoint menerima file dari user atau sumber tidak tepercaya;
  • format EPS diizinkan;
  • aplikasi memproses EPS menggunakan Pillow;
  • Ghostscript terpasang dan dapat dipanggil oleh service;
  • nama file upload masih memengaruhi path pemrosesan;
  • proses aplikasi memiliki permission yang terlalu luas.

Jika aplikasi hanya menerima JPEG, PNG, dan WebP, lalu menolak EPS berdasarkan content yang benar-benar terdeteksi, risiko terhadap CVE khusus ini jauh lebih rendah.

Tetap saja, mengganti ekstensi file saja tidak cukup. Content-Type dari browser juga dapat dipalsukan.

Mitigasi yang perlu dilakukan

1. Update Pillow

Perbarui Pillow ke versi 13.0.0 atau lebih baru, lalu uji seluruh pipeline image processing:

python3 -m pip install --upgrade "Pillow>=13.0.0"

Pada production, gunakan virtual environment dan lock dependency agar versi yang diuji sama dengan versi yang dideploy.

2. Tolak EPS jika tidak dibutuhkan

Untuk fitur upload gambar umum, allowlist format raster seperti JPEG, PNG, dan WebP. Jangan menjadikan ekstensi file atau MIME dari client sebagai satu-satunya validasi.

Contoh pendekatan di sisi aplikasi:

from PIL import Image

ALLOWED_FORMATS = {"JPEG", "PNG", "WEBP"}

with Image.open(uploaded_file) as image:
    if image.format not in ALLOWED_FORMATS:
        raise ValueError("Image format is not allowed")

3. Jangan gunakan nama file asli sebagai path proses

Buat nama internal acak untuk setiap upload:

from pathlib import Path
from uuid import uuid4

safe_name = f"{uuid4().hex}.upload"
safe_path = Path("/srv/app/uploads") / safe_name

Nama asli boleh disimpan sebagai metadata jika dibutuhkan, tetapi jangan diteruskan sebagai path ke image processor.

4. Isolasi image processing

Jalankan worker pemrosesan gambar sebagai user non-root, tanpa akses ke secret aplikasi, dan dengan batas CPU, memory, timeout, serta filesystem yang jelas.

Jika Ghostscript tidak dibutuhkan, hapus atau batasi aksesnya setelah memastikan tidak ada service lain yang menggunakannya.

5. Audit pipeline upload

Cari seluruh titik yang menggunakan Pillow atau Ghostscript, termasuk worker asynchronous, thumbnail generator, OCR, document converter, object-storage processor, dan endpoint upload.

Jangan hanya memeriksa aplikasi web utama. Job background sering kali memiliki permission yang lebih besar dan berjalan lebih lama tanpa terlihat oleh user.

Hasil pengecekan pada environment yang saya kelola

Saya juga melakukan pengecekan langsung terhadap server yang menjalankan website production. Tidak ditemukan instalasi package Python Pillow atau Ghostscript pada system environment yang diperiksa. Source production yang diperiksa juga berbasis Laravel/PHP dan tidak menunjukkan pipeline Python Pillow.

Karena itu, belum ada bukti bahwa website yang saya kelola terdampak langsung oleh CVE ini. Namun, aplikasi client yang memiliki service Python, fitur upload EPS, atau worker image processing tetap harus diaudit secara terpisah.

Checklist cepat administrator

[ ] Cari Pillow pada semua virtual environment
[ ] Periksa requirements.txt, pyproject.toml, poetry.lock, dan lockfile lain
[ ] Cek apakah Ghostscript terpasang
[ ] Cari penggunaan Image.open() dan EpsImagePlugin
[ ] Inventarisasi endpoint upload
[ ] Nonaktifkan EPS jika tidak diperlukan
[ ] Update Pillow ke 13.0.0 atau lebih baru
[ ] Ganti nama file upload menjadi nama internal acak
[ ] Jalankan image worker sebagai non-root
[ ] Uji token, secret, filesystem, dan jaringan setelah patch

Kesimpulan

CVE-2026-112900 adalah pengingat bahwa validasi upload tidak berhenti pada isi file. Nama file, cara command dibangun, library converter, dan permission worker juga merupakan bagian dari attack surface.

Untuk backend yang menerima gambar dari user, keputusan paling aman adalah menolak EPS jika format tersebut tidak memiliki kebutuhan bisnis yang jelas. Jika EPS memang harus diproses, update Pillow, normalisasi path, isolasi Ghostscript, dan lakukan pengujian adversarial sebelum membuka kembali endpoint upload.

Referensi

  1. GitHub Advisory Database, Pillow: Argument Injection in Ghostscript call, potentially leading into RCE, CVE-2026-112900, dipublikasikan 17 October 2026: https://github.com/advisories/GHSA-w889-685w-c8fh
  2. Pillow security advisory, Argument Injection in Ghostscript call, potentially leading into RCE, dipublikasikan 17 October 2026: https://github.com/python-pillow/Pillow/security/advisories/GHSA-w889-685w-c8fh
  3. PyPI Pillow, versi terbaru yang tersedia: https://pypi.org/project/pillow/
  4. Pillow Security Handbook: https://pillow.readthedocs.io/en/stable/handbook/security.html

Tanggal pengecekan: 24 October 2026