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.

Linimasa: patch CVE-2026-66066 29 Juli, serangan 31 Agustus, rilis 24 September masih rentan, patch dan CVE 4 November, belum KEV 5 November, akhir dukungan 8.0 7 November.
Titik teal: rilis patch. Titik merah: serangan dan publikasi CVE. Titik abu-abu: rilis yang masih rentan. Titik amber: status dan batas waktu. Sumber: rilis GitHub Rails, advisory Rails, catatan CVE, halaman maintenance Rails, CISA KEV, dan Help Net Security.

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:

  1. Aplikasi memakai config.active_storage.variant_processor = :mini_magick. Ini bawaan untuk load_defaults 6.1 atau lebih lama.
  2. Policy ImageMagick di server tidak menolak coder itu. Policy paket Debian dan Ubuntu tidak menolaknya.
  3. Aplikasi menerima upload dari user yang tidak dipercaya.
Dua kartu: CVE-2026-122006 analisa gambar ImageMagick skor 9.8 dan GHSA-v924 ekstensi berkas skor 8.8. Panel 3 syarat. Aman: activestorage 8.1.4.1 atau 8.0.5.2.
(1) Kartu merah: celah critical. (2) Kartu amber: celah high di rilis yang sama. (3) Panel amber: 3 syarat CVE-2026-122006. (4) Kotak teal: versi aman. Sumber: advisory Rails GHSA-f3w6-w445-fwh9 dan GHSA-v924-7rp8-4mxh, dan catatan CVE-2026-122006.

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

IDAreaCVSS 3.1TingkatPintu masuk
GHSA-f3w6-w445-fwh9 (CVE-2026-122006)Active Storage: analisa gambar ImageMagick menulis dan membaca berkas server9.8CriticalUpload berkas, tanpa login
GHSA-v924-7rp8-4mxhActive Storage: ekstensi nama berkas memilih decoder video, audio, dan gambar8.8HighUpload berkas
GHSA-wm3x-v3qw-4jh3Action Pack: Strong Parameters bisa dilewati di Parameters#each_key7.5HighRequest HTTP
GHSA-8474-xrp6-wh69Active Support: DoS di safe_constantize7.5HighRequest HTTP
GHSA-2gff-2mmg-m73pAction Dispatch RemoteIp: IP palsu (hanya 8.1)7.4HighHeader 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 RailsRisikoAlasan
:mini_magick dan form upload publikTertinggi1 upload sudah memicu analyzer
Disk service (service: Disk di config/storage.yml)TinggiBerkas di server bisa terbaca, termasuk rahasia
ImageMagick dengan policy bawaan Debian atau UbuntuTinggiPolicy bawaan tidak menolak coder itu
Rails 7.2 atau lebih lamaTanpa patchTidak ada rilis perbaikan. Pakai langkah 4, lalu naik lini
Pindah dari :vips ke :mini_magick sesudah CVE-2026-66066PeriksaPilihan itu menghindari celah lama, tetapi membuka celah baru
:vips di versi aman CVE-2026-66066, atau tanpa upload dari luarRendahTetap update untuk 20 advisory lain
Enam kartu risiko: :mini_magick dengan upload publik, Disk service, dan policy bawaan Debian merah; Rails 7.2 dan pindah dari :vips amber; :vips di versi aman abu-abu.
Kartu merah: risiko tertinggi. Kartu amber: periksa atau rencanakan. Kartu abu-abu: risiko rendah. Kotak bawah: status eksploitasi per 5 November 2026. Sumber: advisory Rails, CISA KEV, Help Net Security, dan analisa Rama Digital.

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.

GemVersi rentanStatus per 5 November 2026Tindakan
activestorage 8.18.1.0 sampai 8.1.4RentanUpdate ke 8.1.4.1
activestorage 8.08.0.0 sampai 8.0.5.1RentanUpdate ke 8.0.5.2, lalu rencanakan 8.1
activestorage 7.2Semua, termasuk 7.2.4Tanpa patchNaik ke 8.1.4.1. Sementara, langkah 4
activestorage 7.1 dan lebih lamaSemuaTanpa patchNaik lini. Sementara, langkah 4
mini_magickDi bawah 5.1Aplikasi :mini_magick gagal boot sesudah updateUpdate ke 5.1 atau lebih baru (terbaru 5.4.0)
Tabel 5 baris: activestorage 8.1 dan 8.0 rentan dan punya patch, 7.2 dan lebih lama tanpa patch, mini_magick di bawah 5.1 membuat aplikasi gagal boot sesudah update.
Merah: rentan atau tanpa patch. Amber: periksa sebelum update. Kotak bawah: 3 perintah cek versi. Sumber: advisory Rails, rilis GitHub Rails 4 November 2026, halaman maintenance Rails, dan RubyGems.

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 sudo di 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
Terminal: skrip cek versi membaca activestorage 8.0.5.1 sebagai RENTAN dan mini_magick 5.0.1 sebagai PERIKSA. Mode manual: activestorage 7.2.4 TANPA PATCH.
Aplikasi uji memakai Rails 8.0.5.1 dan ImageMagick 6.9.11 dari image Ruby resmi. Baris kedua memakai versi yang diketik manual. Sumber: uji Rama Digital di container podman ruby:3.4-bookworm dengan aplikasi Rails 8.0.5.1 dummy, 5 November 2026.

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
Terminal: variant_processor :mini_magick dari load_defaults 6.1 TERBUKA, policy sistem tidak menolak MSL dan gs, service local memakai Disk, 1 model menerima lampiran.
Policy bawaan Debian di image uji menolak PS dan PDF, tetapi tidak menolak MSL dan delegate gs. Model pelanggan adalah data dummy. Sumber: uji Rama Digital di container podman ruby:3.4-bookworm dengan aplikasi Rails 8.0.5.1 dummy, 5 November 2026.

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
Terminal: bundle update menaikkan activestorage ke 8.0.5.2, tetapi aplikasi gagal boot karena mini_magick 5.0.1. Sesudah update mini_magick ke 5.4.0, Gemfile.lock benar.
Pesan error baris ketiga muncul saat Rails boot. Update mini_magick menutup masalah itu. Sumber: uji Rama Digital di container podman ruby:3.4-bookworm dengan aplikasi Rails 8.0.5.1 dummy, 5 November 2026.

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.

Terminal: skrip versi menulis AMAN, MiniMagick.cli_env menunjuk folder policy di gem activestorage 8.0.5.2, dan policy gabungan menolak MSL, gs, PS, dan PDF.
Policy sistem tetap sama. Rails menambah policy dari gem hanya untuk perintah ImageMagick yang MiniMagick jalankan. Sumber: uji Rama Digital di container podman ruby:3.4-bookworm dengan aplikasi Rails 8.0.5.1 dummy, 5 November 2026.

3a. Rails 8.1, 8.0, dan aplikasi di container

  1. Rails 8.1: pakai perintah yang sama. Hasil yang benar: activestorage 8.1.4.1.
  2. 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.
  3. Image Docker: commit Gemfile.lock, build ulang image, lalu ganti semua container web dan worker.
  4. 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.

Tangga 8 baris: cek versi, cek paparan, update Rails dan mini_magick, restart, ganti rahasia, 2 langkah sementara (policy sistem, lepas analyzer video), lalu cari tanda.
(1) sampai (3c): urutan perbaikan. (4a) dan (4b): langkah sementara. Label merah mengingatkan bahwa langkah 4 tidak menggantikan update. Sumber: advisory Rails GHSA-f3w6-w445-fwh9 dan GHSA-v924-7rp8-4mxh, dan analisa Rama Digital.

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
Terminal: 33 aturan dari policy gem activestorage 8.1.4.1 masuk ke policy sistem. Skrip paparan lalu menulis MSL, gs, PS, dan PDF ditolak, dan identify tetap membaca PNG.
Uji ini memakai aplikasi 8.0.5.1 yang masih rentan, jadi hanya policy sistem yang menolak coder itu. Sumber: uji Rama Digital di container podman ruby:3.4-bookworm dengan aplikasi Rails 8.0.5.1 dummy, 5 November 2026.

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
Terminal: skrip tanda menemukan 1 TANDA (halaman baru di public) dan 4 PERIKSA: 2 berkas teks di storage, 1 model berubah, dan 2 baris error MiniMagick di log.
Berkas di storage, halaman di public, perubahan model, dan baris log adalah data dummy. Tidak ada serangan di uji ini. Sumber: uji Rama Digital di container podman ruby:3.4-bookworm dengan aplikasi Rails 8.0.5.1 dummy, 5 November 2026.
Dua kolom tanda: di storage dan database (blob berisi XML atau PostScript, upload massal, error analisa) dan di server (berkas baru di public, berkas .rb berubah, koneksi keluar).
Kolom amber: tanda di data upload. Kolom merah: tanda di server. Kotak bawah: langkah bila Anda menemukan 1 tanda saja. Sumber: advisory Rails, uji Rama Digital, dan analisa Rama Digital.

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 dummyYang dicekHasilTindakan
08.00toko-web (Rails 8.0.5.1, Disk service)Langkah 1 dan 2RENTAN, :mini_magick, DiskUpdate siang ini, lalu langkah 3c
08.30portal-mitra (Rails 7.2.4, S3)Langkah 1 dan 2TANPA PATCH, :mini_magickLangkah 4a sekarang, rencanakan 8.1
09.00admin-internal (Rails 8.1.4, :vips)Langkah 1 dan 2RENTAN, syarat 1 tidak terpenuhiUpdate di jendela sore untuk 20 advisory lain
09.30toko-webLangkah 5TANDA 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 layananPemegang patchYang Anda kerjakan
Aplikasi Rails di VPS atau server sendiriTim AndaLangkah 1 sampai 5
Aplikasi Rails di PaaS (Heroku, Render, Fly.io)Tim AndaUpdate Gemfile.lock dan deploy ulang. PaaS hanya mengelola server dan paket sistem
Aplikasi buatan agensi atau vendorVendor, sesuai kontrakMinta bukti versi tertulis dan hasil langkah 5
Aplikasi di Docker atau KubernetesTim AndaBuild 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

  1. Buat daftar semua aplikasi Rails yang menerima upload. Pemilik: tim engineering. Bukti: daftar nama dan versi.
  2. Cek versi dengan langkah 1. Pemilik: developer aplikasi. Bukti: output skrip.
  3. Cek paparan dengan langkah 2. Pemilik: developer aplikasi. Bukti: output skrip.
  4. Pasang langkah 4 di setiap aplikasi yang belum bisa update hari ini. Pemilik: tim ops. Bukti: output skrip paparan.
  5. Update Rails dan mini_magick, deploy, lalu restart. Pemilik: developer dan tim ops. Bukti: output skrip sesudah update.
  6. Ganti rahasia bila Anda memakai Disk service. Pemilik: tim ops. Bukti: catatan rotasi.
  7. 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