Jawaban langsung: CVE-2026-122006 membuat 1 upload berkas bisa menulis berkas di server Rails, tanpa login. Dengan Disk service, berkas di server juga bisa terbaca, termasuk secret_key_base. Hari ini, cek versi, update ke activestorage 8.1.4.1 atau 8.0.5.2 dengan mini_magick 5.1 atau lebih baru, lalu restart aplikasi.
Rails menilai celah ini critical dengan CVSS 3.1 9.8. Rilis yang sama menutup 21 advisory: 1 critical, 4 high, 13 medium, dan 3 low.
Kondisi utama: aplikasi Anda memakai processor :mini_magick dan menerima upload dari user yang tidak Anda kenal. Batas: artikel ini tidak memuat isi berkas jahat, payload, atau urutan serangan.
Kami membaca advisory Rails GHSA-f3w6-w445-fwh9, advisory Rails GHSA-v924-7rp8-4mxh, daftar advisory keamanan Rails, catatan CVE-2026-122006, rilis Rails 8.1.4.1, rilis Rails 8.0.5.2, halaman maintenance Rails, laporan Help Net Security tentang CVE-2026-66066, dan CISA KEV pada 5 November 2026, pukul 20.36 sampai 20.50 WIB. Kami menguji 3 skrip cek di container podman dengan image resmi ruby:3.4-bookworm dan aplikasi Rails 8.0.5.1 dummy, lalu update ke 8.0.5.2. Kami tidak menguji Rails 8.1, Rails 7.2, ImageMagick 7, dan serangan.
Masalah: 1 upload gambar bisa membuka server Rails Anda
Active Storage memeriksa setiap berkas saat berkas itu dilampirkan, jadi form upload apa pun menjadi pintu masuk.
Active Storage adalah bagian Rails untuk upload berkas: foto profil, lampiran pesanan, bukti transfer, dan dokumen. Saat berkas dilampirkan, Rails menjalankan analyzer untuk membaca ukuran gambar. Analyzer gambar memakai libvips atau ImageMagick.
Pada 4 November 2026, Rails merilis 8.0.5.2 dan 8.1.4.1. Rilis ini menutup celah di analyzer ImageMagick. Catatan CVE-2026-122006 terbit di hari yang sama, pukul 14.12 UTC.

Rilis 8.1.4 dan 7.2.4 pada 24 September belum menutup celah ini. Jadi aplikasi yang baru Anda update bulan lalu tetap rentan.
Cara kerja: analyzer ImageMagick saat berkas dilampirkan
Bagian ini memakai ringkasan resmi dari advisory. Tujuannya membantu Anda memilih langkah yang tepat, bukan menjelaskan cara menyerang.
Ringkasan CVE-2026-122006
Menurut advisory Rails GHSA-f3w6-w445-fwh9, ImageMagick memilih coder dari isi berkas, dan beberapa coder membaca berkas lain yang namanya ada di dalam gambar. Active Storage tidak membatasi coder ImageMagick. Analyzer berjalan saat berkas dilampirkan, jadi upload saja sudah memicu celah.
Akibatnya, penyerang tanpa login bisa menulis berkas di server. Dengan Disk service, penyerang juga bisa membaca berkas yang proses aplikasi bisa baca. Advisory menulis bahwa akses ini bisa naik menjadi eksekusi kode atau masuk ke sistem lain.
Advisory menulis 3 syarat, dan semua harus benar:
- Aplikasi memakai
config.active_storage.variant_processor = :mini_magick. Ini bawaan untukload_defaults 6.1atau lebih lama. - Policy ImageMagick di server tidak menolak coder itu. Policy paket Debian dan Ubuntu tidak menolaknya.
- Aplikasi menerima upload dari user yang tidak dipercaya.

Ringkasan GHSA-v924-7rp8-4mxh
Menurut advisory Rails GHSA-v924-7rp8-4mxh, Active Storage memberi nama berkas sementara dengan ekstensi dari nama upload. FFmpeg dan ImageMagick memilih decoder dari ekstensi itu bila isi berkas tidak jelas. FFmpeg dengan AviSynth bisa membuka berkas server atau memuat library.
Paket FFmpeg dari distro Linux umum tidak memakai AviSynth. Build GPL dari ffmpeg.org memakainya. Rilis yang sama menutup celah ini.
Advisory critical dan high di rilis 4 November
| ID | Area | CVSS 3.1 | Tingkat | Pintu masuk |
|---|---|---|---|---|
| GHSA-f3w6-w445-fwh9 (CVE-2026-122006) | Active Storage: analisa gambar ImageMagick menulis dan membaca berkas server | 9.8 | Critical | Upload berkas, tanpa login |
| GHSA-v924-7rp8-4mxh | Active Storage: ekstensi nama berkas memilih decoder video, audio, dan gambar | 8.8 | High | Upload berkas |
| GHSA-wm3x-v3qw-4jh3 | Action Pack: Strong Parameters bisa dilewati di Parameters#each_key | 7.5 | High | Request HTTP |
| GHSA-8474-xrp6-wh69 | Active Support: DoS di safe_constantize | 7.5 | High | Request HTTP |
| GHSA-2gff-2mmg-m73p | Action Dispatch RemoteIp: IP palsu (hanya 8.1) | 7.4 | High | Header proxy |
Daftar lengkap ada di daftar advisory keamanan Rails. Hanya GHSA-f3w6-w445-fwh9 yang punya ID CVE per 5 November 2026.
Status eksploitasi per 5 November 2026
Kami tidak menemukan laporan serangan, kode serangan publik, atau entri CISA KEV untuk CVE-2026-122006. Tetapi CVE-2026-66066, celah Active Storage di jalur libvips, diserang sekitar 1 bulan sesudah patch menurut laporan Help Net Security tentang CVE-2026-66066.
Analisa Rama Digital: patch Rails bersifat publik, jadi penyerang bisa membaca perubahan kodenya. Anggap celah ini mendesak, dan update hari ini.
Siapa yang paling berisiko
Risiko bergantung pada processor gambar, tempat simpan berkas, dan siapa yang bisa upload, bukan hanya pada versi.
| Kondisi aplikasi Rails | Risiko | Alasan |
|---|---|---|
:mini_magick dan form upload publik | Tertinggi | 1 upload sudah memicu analyzer |
Disk service (service: Disk di config/storage.yml) | Tinggi | Berkas di server bisa terbaca, termasuk rahasia |
| ImageMagick dengan policy bawaan Debian atau Ubuntu | Tinggi | Policy bawaan tidak menolak coder itu |
| Rails 7.2 atau lebih lama | Tanpa patch | Tidak ada rilis perbaikan. Pakai langkah 4, lalu naik lini |
Pindah dari :vips ke :mini_magick sesudah CVE-2026-66066 | Periksa | Pilihan itu menghindari celah lama, tetapi membuka celah baru |
:vips di versi aman CVE-2026-66066, atau tanpa upload dari luar | Rendah | Tetap update untuk 20 advisory lain |

Pada Agustus 2026, beberapa laporan menulis bahwa pengguna ImageMagick tidak kena CVE-2026-66066. Analisa Rama Digital: tim yang pindah ke :mini_magick karena laporan itu perlu cek lagi hari ini.
Celah upload berkas juga muncul di toko online lain, misalnya di peringatan Magento PolyShell CVE-2026-48356. Tim yang memakai runtime lain juga perlu membaca peringatan Node2Shell CVE-2026-111497 dan peringatan PHP2Shell CVE-2026-109618.
Versi rentan dan versi aman
Celah ini ada di gem activestorage, jadi yang menentukan adalah versi di Gemfile.lock, bukan versi Ruby.
| Gem | Versi rentan | Status per 5 November 2026 | Tindakan |
|---|---|---|---|
| activestorage 8.1 | 8.1.0 sampai 8.1.4 | Rentan | Update ke 8.1.4.1 |
| activestorage 8.0 | 8.0.0 sampai 8.0.5.1 | Rentan | Update ke 8.0.5.2, lalu rencanakan 8.1 |
| activestorage 7.2 | Semua, termasuk 7.2.4 | Tanpa patch | Naik ke 8.1.4.1. Sementara, langkah 4 |
| activestorage 7.1 dan lebih lama | Semua | Tanpa patch | Naik lini. Sementara, langkah 4 |
| mini_magick | Di bawah 5.1 | Aplikasi :mini_magick gagal boot sesudah update | Update ke 5.1 atau lebih baru (terbaru 5.4.0) |

Data versi berasal dari advisory Rails GHSA-f3w6-w445-fwh9, rilis Rails 8.1.4.1, dan rilis Rails 8.0.5.2. Menurut halaman maintenance Rails, security support Rails 8.0 berakhir 7 November 2026, dan Rails 8.1 sampai 10 Oktober 2027. Lini 7.2 tidak tercantum lagi.
Analisa Rama Digital: rilis 4 November tidak membawa 7.2.4.1. Jadi aplikasi 7.2 dan lebih lama hanya punya langkah 4 sampai naik ke 8.1.
Prasyarat sebelum mulai
- Akses ke repo aplikasi dan ke server yang menjalankan aplikasi.
- Akses
sudodi server, untuk policy ImageMagick dan restart. - Test suite atau daftar halaman yang Anda cek sesudah deploy.
- Backup database dan folder
storage/bila Anda memakai Disk service. - Jendela deploy 15 sampai 30 menit. Restart menghentikan request dan job sebentar.
Langkah 1: Cek versi activestorage dan mini_magick
Simpan skrip ini sebagai cek-versi-rails.sh di folder aplikasi. Skrip membaca Gemfile.lock, menilai versi activestorage dan mini_magick, dan menulis versi ImageMagick di server.
#!/usr/bin/env bash
# Cek versi activestorage dan mini_magick untuk CVE-2026-122006 (GHSA-f3w6-w445-fwh9).
# Skrip hanya membaca. Pakai: bash cek-versi-rails.sh [folder aplikasi]
# atau ketik versi manual: bash cek-versi-rails.sh activestorage=7.2.4 mini_magick=5.0.1
set -u
lebih_kecil() { [ "$1" != "$2" ] && [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n 1)" = "$1" ]; }
nilai_activestorage() {
local v=$1
case "$v" in
8.1.*) if lebih_kecil "$v" 8.1.4.1; then echo "RENTAN: update ke 8.1.4.1"; else echo "AMAN untuk CVE-2026-122006"; fi ;;
8.0.*) if lebih_kecil "$v" 8.0.5.2; then echo "RENTAN: update ke 8.0.5.2, lalu rencanakan 8.1 (security support 8.0 berakhir 7 Nov 2026)"
else echo "AMAN untuk CVE-2026-122006, rencanakan 8.1 (security support 8.0 berakhir 7 Nov 2026)"; fi ;;
*) echo "TANPA PATCH: naik ke 8.1.4.1, sementara jalankan langkah 4" ;;
esac
}
nilai_66066() {
local v=$1 batas
case "$v" in
8.1.*) batas=8.1.3.1 ;; 8.0.*) batas=8.0.5.1 ;; 7.*) batas=7.2.3.2 ;; *) echo "periksa: lini lama"; return ;;
esac
if lebih_kecil "$v" "$batas"; then echo "RENTAN juga (aman di $batas)"; else echo "aman"; fi
}
nilai_minimagick() {
if lebih_kecil "$1" 5.1; then echo "PERIKSA: di bawah 5.1, aplikasi :mini_magick gagal boot sesudah update. Jalankan bundle update mini_magick"
else echo "OK (5.1 atau lebih baru)"; fi
}
tampil() {
local as=$1 mm=$2
echo "activestorage $as: $(nilai_activestorage "$as")"
echo " CVE-2026-66066 (libvips, Juli 2026): $(nilai_66066 "$as")"
if [ -n "$mm" ]; then echo "mini_magick $mm: $(nilai_minimagick "$mm")"; else echo "mini_magick: tidak ada di Gemfile.lock"; fi
}
if [ $# -gt 0 ] && [[ "$1" == *=* ]]; then
AS=""; MM=""
for arg in "$@"; do
case "$arg" in activestorage=*) AS=${arg#*=} ;; mini_magick=*) MM=${arg#*=} ;; esac
done
[ -n "$AS" ] && tampil "$AS" "$MM"
exit 0
fi
APP=${1:-.}
LOCK="$APP/Gemfile.lock"
[ -f "$LOCK" ] || { echo "Gemfile.lock tidak ada di $APP"; exit 1; }
AS=$(sed -n 's/^ activestorage (\([0-9][^)]*\))$/\1/p' "$LOCK" | head -n 1)
MM=$(sed -n 's/^ mini_magick (\([0-9][^)]*\))$/\1/p' "$LOCK" | head -n 1)
RAILS=$(sed -n 's/^ rails (\([0-9][^)]*\))$/\1/p' "$LOCK" | head -n 1)
echo "== Aplikasi: $(cd "$APP" && pwd), rails ${RAILS:-tidak ada}"
if [ -z "$AS" ]; then echo "activestorage: tidak dipakai. CVE-2026-122006 tidak berlaku"; exit 0; fi
tampil "$AS" "$MM"
if command -v magick >/dev/null 2>&1; then IM=$(magick -version | head -n 1)
elif command -v convert >/dev/null 2>&1; then IM=$(convert -version | head -n 1)
else IM="tidak terpasang di mesin ini"; fi
echo "ImageMagick: ${IM#Version: }"
# Di folder aplikasi Rails (folder yang berisi Gemfile.lock)
bash cek-versi-rails.sh .
# Cek versi yang Anda salin dari server lain
bash cek-versi-rails.sh activestorage=7.2.4 mini_magick=5.0.1
# Cara manual tanpa skrip
bundle exec rails -v
grep -E '^ (activestorage|mini_magick) ' Gemfile.lock
convert -version | head -n 1

Skrip juga menilai CVE-2026-66066, karena aplikasi yang tertinggal di satu celah sering tertinggal di celah lain.
Cek hasil: "RENTAN" atau "TANPA PATCH" berarti lanjut ke langkah 2 dan 3 hari ini. "AMAN" tetap berarti jalankan langkah 5, karena celah ada sebelum Anda update.
Langkah 2: Cek processor, policy, dan tempat simpan berkas
Langkah ini menjawab 3 syarat advisory untuk aplikasi Anda.
Simpan skrip ini sebagai cek-paparan-rails.sh. Skrip membaca variant_processor dan load_defaults, policy ImageMagick, service di config/storage.yml, model dengan lampiran, dan analyzer video.
#!/usr/bin/env bash
# Cek 3 syarat CVE-2026-122006 dan analyzer video GHSA-v924-7rp8-4mxh di aplikasi Rails.
# Skrip hanya membaca. Pakai: bash cek-paparan-rails.sh [folder aplikasi] [environment]
set -u
APP=${1:-.}
ENVN=${2:-production}
cd "$APP" || exit 1
CFG="config/application.rb config/environments/$ENVN.rb"
[ -d config/initializers ] && CFG="$CFG $(ls config/initializers/*.rb 2>/dev/null | tr '\n' ' ')"
echo "== 1. Processor gambar (syarat 1)"
VP=$(grep -h -E '^[^#]*variant_processor *=' $CFG 2>/dev/null | tail -n 1 | sed 's/.*= *//')
LD=$(grep -h -E '^[^#]*load_defaults' config/application.rb | head -n 1 | grep -o -E '[0-9]+\.[0-9]+')
if [ -n "$VP" ]; then echo "variant_processor = $VP (tertulis di config)"
elif [ -n "$LD" ] && [ "$(printf '%s\n6.1\n' "$LD" | sort -V | tail -n 1)" = "6.1" ]; then VP=":mini_magick"; echo "variant_processor = :mini_magick (bawaan load_defaults $LD)"
else VP=":vips"; echo "variant_processor = :vips (bawaan load_defaults ${LD:-?})"; fi
case "$VP" in *mini_magick*) echo " TERBUKA: analyzer ImageMagick berjalan saat berkas dilampirkan" ;; *) echo " Syarat 1 tidak terpenuhi untuk CVE-2026-122006" ;; esac
echo "== 2. Policy ImageMagick (syarat 2)"
if command -v magick >/dev/null 2>&1; then IM="magick"; elif command -v convert >/dev/null 2>&1; then IM="convert"; else IM=""; fi
nilai_policy() {
local POL ATURAN hasil="" item jenis pola
POL=$($IM -list policy 2>/dev/null)
echo "$POL" | grep -E '^Path:' | sed 's/^/ /'
# Satu baris per aturan: jenis, hak, pola. Contoh: Coder None MSL
ATURAN=$(echo "$POL" | awk '/Policy:/{t=$2; r=""} /rights:/{r=$2} /pattern:/{print t, r, $2}')
for item in "Coder MSL" "Delegate gs" "Coder PS" "Coder PDF"; do
jenis=${item% *}; pola=${item#* }
if echo "$ATURAN" | grep -q -E "^$jenis None (.*[{,]$pola[,}].*|$pola|\*)$"; then hasil="$hasil $pola=ditolak"
else hasil="$hasil $pola=TIDAK-DITOLAK"; fi
done
echo " $hasil"
}
SP=$(ls -d "$(bundle exec ruby -e 'print Gem.loaded_specs["activestorage"]&.full_gem_path' 2>/dev/null)"/lib/active_storage/image_magick/policy.xml 2>/dev/null)
if [ -z "$IM" ]; then echo "ImageMagick tidak terpasang di mesin ini"
else
echo "Policy sistem:"; nilai_policy
if [ -n "$SP" ]; then echo "Policy dari activestorage (aktif lewat MiniMagick.cli_env sesudah restart):"; MAGICK_CONFIGURE_PATH=$(dirname "$SP") nilai_policy
else echo "Policy dari activestorage: TIDAK ADA (versi rentan, atau bundle tidak berjalan)"; fi
fi
echo "== 3. Tempat simpan berkas"
SV=$(grep -h -E '^[^#]*active_storage\.service *=' config/environments/$ENVN.rb 2>/dev/null | tail -n 1 | sed 's/.*= *:*//')
if [ -n "$SV" ] && [ -f config/storage.yml ]; then
JN=$(awk -v s="$SV:" '$1==s{f=1;next} f&&/^[^ ]/{f=0} f&&$1=="service:"{print $2; exit}' config/storage.yml)
echo "service = $SV ($JN)"
[ "$JN" = "Disk" ] && echo " TINGGI: dengan Disk service, berkas di server bisa terbaca. Ganti rahasia sesudah update"
else echo "service tidak ditemukan untuk $ENVN"; fi
echo "== 4. Model yang menerima lampiran (syarat 3, cek manual)"
grep -r -l -E 'has_(one|many)_attached' app/models 2>/dev/null | sed 's/^/ /'
echo " Cek mana yang bisa diisi user tanpa login atau user yang tidak Anda kenal"
echo "== 5. Analyzer video dan audio (GHSA-v924-7rp8-4mxh)"
if grep -q -E '^[^#]*(analyzers|previewers) *(=|-=|\.delete)' $CFG 2>/dev/null; then echo " Daftar analyzer atau previewer diubah di config"; else echo " Daftar bawaan: VideoAnalyzer, AudioAnalyzer, dan VideoPreviewer aktif"; fi
if command -v ffmpeg >/dev/null 2>&1; then
ffmpeg -hide_banner -buildconf 2>/dev/null | grep -q -i avisynth && echo " TINGGI: ffmpeg memakai AviSynth" || echo " ffmpeg tanpa AviSynth"
else echo " ffmpeg tidak terpasang: analyzer video tidak berjalan"; fi
bash cek-paparan-rails.sh .
# Environment lain, misalnya staging
bash cek-paparan-rails.sh . staging

Skrip membaca berkas config, jadi skrip tidak melihat nilai yang Anda pasang dengan cara lain. Untuk nilai saat aplikasi berjalan, pakai bin/rails runner 'p ActiveStorage.variant_processor'. Di uji kami, perintah ini menulis :mini_magick.
Cek hasil: catat processor, hasil MSL dan gs, dan jenis service. "TERBUKA" di bagian 1 dan "TIDAK-DITOLAK" di bagian 2 berarti aplikasi memenuhi 2 syarat pertama.
Langkah 3: Update, restart, dan ganti rahasia
Update adalah satu-satunya langkah yang menutup celah ini dan 20 advisory lain. Server membaca kode baru hanya sesudah restart.
# 3a. Update Rails, lalu mini_magick (diuji dari 8.0.5.1 ke 8.0.5.2)
bundle update rails --conservative
bundle update mini_magick --conservative
grep -E '^ (activestorage|mini_magick) ' Gemfile.lock
# 3b. Cek bahwa aplikasi boot dan policy dari activestorage aktif
bin/rails runner 'puts MiniMagick.cli_env["MAGICK_CONFIGURE_PATH"]'
bash cek-paparan-rails.sh . | grep -A 11 '== 2'
# Commit Gemfile.lock, deploy, lalu restart server aplikasi dan worker job.
# Contoh systemd (tidak diuji): sudo systemctl restart puma sidekiq

Di uji kami, bundle update rails tidak menaikkan mini_magick 5.0.1. Aplikasi lalu gagal boot dengan pesan bahwa Active Storage butuh mini_magick 5.1. Jadi selalu update kedua gem, lalu cek boot sebelum deploy.

3a. Rails 8.1, 8.0, dan aplikasi di container
- Rails 8.1: pakai perintah yang sama. Hasil yang benar: activestorage 8.1.4.1.
- Rails 8.0: update ke 8.0.5.2 hari ini. Rencanakan naik ke 8.1, karena security support 8.0 berakhir 7 November 2026.
- Image Docker: commit
Gemfile.lock, build ulang image, lalu ganti semua container web dan worker. - Rails 7.2 atau lebih lama: tidak ada patch. Pakai langkah 4 hari ini, lalu rencanakan naik ke 8.1.4.1.
3b. Cek policy aktif sesudah restart
Rilis aman membawa policy ImageMagick di dalam gem. Rails memasang folder policy itu lewat MiniMagick.cli_env, jadi setiap perintah ImageMagick dari MiniMagick memakai policy itu.
Policy ini tidak berlaku bila aplikasi mengganti MiniMagick.cli_env, memakai MiniMagick.cli_prefix, atau memasang MiniMagick::Shell sendiri. GraphicsMagick juga tidak membaca policy ImageMagick. Dalam kasus itu, pakai langkah 4a juga.
Aplikasi yang membuat preview PDF atau PostScript lewat ImageMagick bisa gagal sesudah update. Advisory meminta Anda mengizinkan lagi delegate gs dan coder yang perlu di policy host.
3c. Ganti rahasia bila Anda memakai Disk service
Update menutup celah, tetapi tidak membatalkan berkas yang sudah terbaca. advisory Rails GHSA-f3w6-w445-fwh9 meminta Anda mengganti secret_key_base dan semua rahasia yang proses aplikasi bisa baca.
# 3c. Disk service: buat secret_key_base baru (tidak diuji)
bin/rails secret
# Tulis nilai baru di credentials atau di env SECRET_KEY_BASE
EDITOR=nano bin/rails credentials:edit --environment production
Ganti juga master key, isi config/credentials.yml.enc, password database, kunci storage, dan token APIAPIPintu resmi yang dipakai 2 sistem untuk saling mengirim data, tanpa orang menyalin data secara manual.Buka glosarium pihak ketiga. Jangan simpan rahasia lama sebagai fallback. Semua sesi login akan berakhir, dan URL Active Storage yang ditandatangani tidak berlaku lagi.

Cek hasil: skrip versi menulis "AMAN", MiniMagick.cli_env menunjuk folder policy di gem activestorage, dan policy gabungan menolak MSL dan gs.
Langkah 4: Kurangi dampak sampai update selesai
Langkah ini mengurangi dampak, tetapi tidak menggantikan update. Rilis 4 November menutup 20 advisory lain yang langkah ini tidak sentuh.
Analisa Rama Digital: kami memilih 2 workaround resmi dari advisory. Kondisi: update belum bisa jalan hari ini, atau aplikasi memakai Rails 7.2 atau lebih lama. Batas: advisory menulis bahwa rantai serangan lain mungkin ada.
4a. Tambah policy activestorage ke policy ImageMagick sistem
# 4a. Ambil policy dari gem activestorage 8.1.4.1, lalu tambah ke policy sistem
mkdir -p /tmp/kerja && cd /tmp/kerja
gem fetch activestorage -v 8.1.4.1 && gem unpack activestorage-8.1.4.1.gem
grep '<policy ' activestorage-8.1.4.1/lib/active_storage/image_magick/policy.xml > aturan.xml
# Pastikan berkas policy hanya punya 1 baris </policymap>
grep -c '</policymap>' /etc/ImageMagick-6/policy.xml
sudo cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak
sudo sed -i '/<\/policymap>/e cat /tmp/kerja/aturan.xml' /etc/ImageMagick-6/policy.xml
# Cek hasilnya, lalu cek 1 gambar normal. Ganti /srv/toko dengan folder aplikasi Anda.
bash /srv/toko/cek-paparan-rails.sh /srv/toko | grep -A 5 '== 2'
identify /srv/toko/public/icon.png
# ImageMagick 7: ganti /etc/ImageMagick-6 dengan /etc/ImageMagick-7

Policy dari gem memuat 33 aturan. Advisory menulis 3 aturan minimum: tolak coder MSL, coder Ghostscript, dan delegate gs. Kami menyalin semua 33 aturan, karena itu sama dengan perilaku rilis aman.
Di uji kami, berkas policy Debian hanya punya 1 baris </policymap>, jadi perintah sed menaruh aturan tepat sebelum baris itu. Bila hasil grep -c bukan 1, tempel aturan dengan editor. Baca juga panduan security policy ImageMagick.
4b. Lepas analyzer video dan audio (GHSA-v924-7rp8-4mxh)
# 4b. config/initializers/active_storage_tanpa_video.rb (GHSA-v924-7rp8-4mxh)
Rails.application.config.active_storage.previewers -= [ActiveStorage::Previewer::VideoPreviewer]
Rails.application.config.active_storage.analyzers -= [ActiveStorage::Analyzer::VideoAnalyzer, ActiveStorage::Analyzer::AudioAnalyzer]
Di uji kami, initializer ini membuat daftar analyzer hanya berisi 2 analyzer gambar, dan daftar previewer hanya berisi 2 previewer PDF. Akibatnya, preview video dan data durasi berhenti sampai Anda update.
Cek hasil: skrip paparan menulis "MSL=ditolak gs=ditolak" di policy sistem, gambar normal tetap terbaca, dan bagian 5 menulis "Daftar analyzer atau previewer diubah".
Langkah 5: Cari tanda pemakaian
Celah ini ada sebelum Anda update, jadi cari tanda dari waktu sebelum update juga.
Simpan skrip ini sebagai cek-tanda-rails.sh. Skrip mencari berkas teks atau XML di folder storage, berkas baru di folder aplikasi, dan error ImageMagick di log produksi.
#!/usr/bin/env bash
# Cari tanda pemakaian CVE-2026-122006 di aplikasi Rails. Skrip hanya membaca.
# Pakai: bash cek-tanda-rails.sh <folder aplikasi> <sejak YYYY-MM-DD> [folder Disk service]
set -u
APP=${1:?folder aplikasi}
SEJAK=${2:?tanggal mulai, contoh 2026-10-01}
STORE=${3:-$APP/storage}
LOG="$APP/log/production.log"
TANDA=0; PERIKSA=0
tanda() { echo " TANDA: $1"; TANDA=$((TANDA + 1)); }
periksa() { echo " PERIKSA: $1"; PERIKSA=$((PERIKSA + 1)); }
echo "== 1. Berkas di folder storage yang bukan gambar, video, atau PDF"
if [ -d "$STORE" ]; then
while IFS= read -r f; do
m=$(file -b --mime-type "$f")
case "$m" in
image/svg+xml|text/*|application/postscript|application/xml) periksa "$m ${f#"$STORE"/}" ;;
esac
done < <(find "$STORE" -type f -newermt "$SEJAK" ! -name '*.sqlite3*' 2>/dev/null)
else echo " Folder $STORE tidak ada (bukan Disk service, cek bucket Anda dengan cara lain)"; fi
echo "== 2. Berkas baru atau berubah di folder aplikasi, di luar storage, tmp, dan log"
while IFS= read -r f; do
rel=${f#"$APP"/}
case "$rel" in
public/*.rb|public/*.erb|public/*.php|public/*.sh|public/*.html) tanda "berkas skrip atau halaman baru di $rel" ;;
app/*|config/*|lib/*|public/*|bin/*) periksa "berubah sejak $SEJAK: $rel" ;;
esac
done < <(find "$APP" \( -path "$APP/storage" -o -path "$APP/tmp" -o -path "$APP/log" -o -path "$APP/.git" -o -path "$APP/node_modules" -o -path "$APP/vendor" \) -prune -o -type f -newermt "$SEJAK" -print 2>/dev/null)
echo "== 3. Error ImageMagick dan analyzer di log"
if [ -f "$LOG" ]; then
n=$(grep -c -E 'not allowed by the security policy|MiniMagick::(Error|Invalid)|ActiveStorage::AnalyzeJob.*(Error|failed)' "$LOG")
if [ "$n" -gt 0 ]; then periksa "$n baris error ImageMagick atau AnalyzeJob di ${LOG#"$APP"/}"
grep -E 'not allowed by the security policy|MiniMagick::(Error|Invalid)|ActiveStorage::AnalyzeJob.*(Error|failed)' "$LOG" | tail -n 3 | cut -c1-110 | sed 's/^/ /'; fi
else echo " ${LOG#"$APP"/} tidak ada"; fi
echo "== Hasil: TANDA $TANDA, PERIKSA $PERIKSA"
echo "Tidak ada tanda belum berarti aman. Disk service: ganti secret_key_base dan kredensial sesudah update."
bash cek-tanda-rails.sh . 2026-10-01
# Disk service dengan folder di luar aplikasi
bash cek-tanda-rails.sh . 2026-10-01 /var/lib/app/storage


Upload PDF dan gambar normal tidak muncul di hasil. Berkas teks atau XML di storage bisa sah, misalnya CSV atau SVG, jadi hasilnya PERIKSA, bukan TANDA. Untuk bucket S3 atau GCS, cari blob dengan content_type gambar yang isinya bukan gambar.
Cek hasil: skrip menulis "TANDA 0", dan setiap PERIKSA punya penjelasan. Log bisa dihapus penyerang, jadi tidak ada tanda belum berarti aman.
Bila ada 1 tanda saja, simpan log dan folder storage sebagai bukti. Lalu ganti semua rahasia dengan langkah 3c, periksa setiap berkas di public/ dan app/ terhadap commit terakhir, dan deploy ulang dari repo yang bersih.
Bila aplikasi menyimpan data pelanggan, UU 27/2022 tentang Pelindungan Data Pribadi mewajibkan pemberitahuan tertulis paling lambat 3 kali 24 jam sesudah kebocoran data pribadi. Baca juga panduan security, privacy, dan UU PDP untuk perusahaan.
Contoh: 1 pagi respons untuk 3 aplikasi Rails
Simulasi ini memakai data dummy. Nama aplikasi, waktu, dan hasil bukan data pelanggan.
| Waktu (WIB) | Aplikasi dummy | Yang dicek | Hasil | Tindakan |
|---|---|---|---|---|
| 08.00 | toko-web (Rails 8.0.5.1, Disk service) | Langkah 1 dan 2 | RENTAN, :mini_magick, Disk | Update siang ini, lalu langkah 3c |
| 08.30 | portal-mitra (Rails 7.2.4, S3) | Langkah 1 dan 2 | TANPA PATCH, :mini_magick | Langkah 4a sekarang, rencanakan 8.1 |
| 09.00 | admin-internal (Rails 8.1.4, :vips) | Langkah 1 dan 2 | RENTAN, syarat 1 tidak terpenuhi | Update di jendela sore untuk 20 advisory lain |
| 09.30 | toko-web | Langkah 5 | TANDA 1: halaman baru di public/ | Simpan bukti, ganti rahasia, deploy ulang |
Pelajaran dari simulasi: versi aman tidak membuktikan aplikasi bersih. Langkah 5 tetap perlu di setiap aplikasi.
Siapa yang memasang patch
Patch ini ada di kode aplikasi Anda, jadi penyedia server tidak memasangnya untuk Anda.
| Jenis layanan | Pemegang patch | Yang Anda kerjakan |
|---|---|---|
| Aplikasi Rails di VPS atau server sendiri | Tim Anda | Langkah 1 sampai 5 |
| Aplikasi Rails di PaaS (Heroku, Render, Fly.io) | Tim Anda | Update Gemfile.lock dan deploy ulang. PaaS hanya mengelola server dan paket sistem |
| Aplikasi buatan agensi atau vendor | Vendor, sesuai kontrak | Minta bukti versi tertulis dan hasil langkah 5 |
| Aplikasi di Docker atau Kubernetes | Tim Anda | Build ulang image, ganti container web dan worker, lalu langkah 5 |
Rekomendasi Rama Digital: simpan upload di storage terpisah, jalankan analyzer di worker dengan hak akses kecil, dan update gem di pipeline yang sama dengan panel lain, misalnya untuk peringatan GitLab CVE-2026-97229.
Checklist hari ini
- Buat daftar semua aplikasi Rails yang menerima upload. Pemilik: tim engineering. Bukti: daftar nama dan versi.
- Cek versi dengan langkah 1. Pemilik: developer aplikasi. Bukti: output skrip.
- Cek paparan dengan langkah 2. Pemilik: developer aplikasi. Bukti: output skrip.
- Pasang langkah 4 di setiap aplikasi yang belum bisa update hari ini. Pemilik: tim ops. Bukti: output skrip paparan.
- Update Rails dan mini_magick, deploy, lalu restart. Pemilik: developer dan tim ops. Bukti: output skrip sesudah update.
- Ganti rahasia bila Anda memakai Disk service. Pemilik: tim ops. Bukti: catatan rotasi.
- Cari tanda dengan langkah 5. Pemilik: tim ops dan tim keamanan. Bukti: output skrip.
Tanya jawab
Apakah celah ini sudah dipakai menyerang?
Per 5 November 2026, kami tidak menemukan laporan serangan, dan CVE-2026-122006 belum masuk CISA KEV. Tetapi celah Active Storage sebelumnya diserang sekitar 1 bulan sesudah patch, jadi update hari ini.
Aplikasi saya memakai :vips. Apakah saya aman?
Syarat 1 tidak terpenuhi, jadi CVE-2026-122006 tidak berlaku. Tetap update, karena rilis yang sama menutup 20 advisory lain, termasuk GHSA-v924-7rp8-4mxh.
Saya memakai S3, bukan Disk service. Apakah saya tetap harus update?
Ya. Tanpa Disk service, celah membaca berkas lebih sempit, tetapi celah menulis berkas di server tetap ada.
Saya masih memakai Rails 7.2. Apa yang saya kerjakan?
Rails 7.2 tidak mendapat patch. Pasang langkah 4a dan 4b hari ini, lalu rencanakan naik ke 8.1.4.1.
Kenapa aplikasi saya gagal boot sesudah update?
Rilis aman butuh mini_magick 5.1 atau lebih baru bila processor Anda :mini_magick. Jalankan bundle update mini_magick --conservative, lalu cek boot lagi.
Apakah policy ImageMagick di server bisa menggantikan update?
Tidak. Policy menutup jalur coder di celah ini, tetapi tidak menutup 20 advisory lain di rilis yang sama.
Apakah skrip cek mengubah sesuatu di server saya?
Tidak. Ketiga skrip hanya membaca. Perintah yang mengubah sesuatu hanya ada di langkah 3 dan 4, dan setiap perintah ditulis terpisah.
Langkah berikutnya
Batas yang tetap berlaku: langkah 4 tidak menggantikan update, dan update tidak membatalkan rahasia yang sudah terbaca. Bila aplikasi Rails Anda menunjukkan tanda di langkah 5, atau Anda butuh bantuan update dan audit, pakai Vibe Code Rescue. Untuk 1 masalah mendesak hari ini, jadwalkan sesi 30 menit.
Sumber
- advisory Rails GHSA-f3w6-w445-fwh9: ringkasan, 3 syarat, CVSS 3.1 9.8, versi aman, workaround policy, dan rotasi rahasia.
- advisory Rails GHSA-v924-7rp8-4mxh: celah ekstensi berkas, syarat AviSynth, dan workaround analyzer video.
- daftar advisory keamanan Rails: 21 advisory pada 4 November 2026.
- catatan CVE-2026-122006: deskripsi resmi, CWE-1188, dan tanggal terbit 4 November 2026.
- rilis Rails 8.1.4.1 dan rilis Rails 8.0.5.2: tanggal rilis 4 November 2026.
- halaman maintenance Rails: akhir security support Rails 8.0 dan 8.1.
- laporan Help Net Security tentang CVE-2026-66066: serangan pada CVE-2026-66066.
- panduan security policy ImageMagick: cara kerja policy ImageMagick.
- CISA KEV: status per 5 November 2026.
- UU 27/2022 tentang Pelindungan Data Pribadi: kewajiban melapor kebocoran data pribadi.




