Jawaban langsung: Keycloak 26.8.2 menutup 33 CVE. CVE-2026-117691 memberi login sebagai user federasi SAML mana pun, tanpa akun. Hari ini, cek versi, cek realm yang memakai SAML, lalu update ke 26.8.2.

Red Hat memberi CVSS 3.1 9.1 untuk CVE-2026-117691. Hanya 26.8.2 membawa patch. Cabang 26.7, 26.6, dan 26.4 tidak mendapat backport.

Kondisi utama: 1 realm atau lebih memakai SAML identity provider, atau SAML client di redirect binding. Batas: artikel ini tidak memuat payload, kode serangan, atau urutan serangan.

Kami membaca catatan CVE-2026-117691, advisory GitHub GHSA-c85j-3hq2-q6wj, catatan rilis Keycloak 26.8.2, rilis GitHub 26.8.2, panduan upgrade Keycloak, halaman CVE Red Hat, analisa rilis Phase Two, dan CISA KEV pada 6 November 2026, pukul 13.35 sampai 13.55 WIB. Kami menguji 3 skrip cek di pod podman dengan image resmi di quay.io 26.8.1 dan 26.8.2, plus aturan nginx 1.29. Kami tidak menguji tar.gz, Operator, Red Hat build, PostgreSQL, dan serangan.

Sesudah terbit, pukul 14.09 sampai 14.15 WIB, kami menguji ulang aturan nginx dengan awalan path /auth. Kami juga menguji login kcadm lewat env KC_CLI_PASSWORD, agar password tidak tampil di daftar proses.

Masalah: login SAML palsu bisa masuk sebagai user mana pun

Keycloak memegang login banyak aplikasi sekaligus, jadi 1 celah login membuka semua aplikasi di belakangnya.

Keycloak adalah server login open source. Bisnis memakai Keycloak untuk single sign-on ke portal, aplikasi internal, dan APIAPIPintu resmi yang dipakai 2 sistem untuk saling mengirim data, tanpa orang menyalin data secara manual.Buka glosarium. Banyak tim menghubungkan Keycloak ke IdP SAML kantor, misalnya Azure AD atau ADFS, lewat fitur identity brokering.

Catatan CVE terbit 5 November 2026 pukul 13.27 UTC. Rilis 26.8.2 terbit 5 November pukul 16.00 UTC, dan image quay.io terbit 4 menit kemudian.

Linimasa: CVE-2026-16443 Agustus, 26.8.1 menutup varian titik koma 13 Oktober, laporan 26 Oktober, CVE dan rilis 26.8.2 pada 5 November, belum KEV 6 November.
Titik merah: celah dan publikasi CVE. Titik teal: rilis patch. Titik abu-abu: laporan ke Red Hat. Titik amber: status hari ini. Sumber: catatan CVE, rilis GitHub Keycloak, quay.io, halaman CVE Red Hat, dan CISA KEV.

Ini celah SAML ketiga di jalur login Keycloak dalam 3 bulan. Varian dengan titik koma sudah ditutup di 26.8.1 pada 13 Oktober, jadi server di 26.8.0 punya 2 varian sekaligus.

Cara kerja: ringkasan advisory

Bagian ini memakai ringkasan resmi dari catatan CVE. Tujuannya membantu Anda memilih langkah yang tepat, bukan menjelaskan cara menyerang.

Ringkasan CVE-2026-117691

Menurut catatan CVE-2026-117691, endpoint SAML HTTP-Redirect binding di Keycloak memproses nama parameter yang ditulis dengan kode persen, misalnya %53AMLResponse. Cek tanda tangan hanya membaca nama parameter biasa. Akibatnya, pesan SAML tanpa tanda tangan yang sah bisa lolos, dan penyerang tanpa akun bisa mengambil alih akun user federasi.

Red Hat memberi rating Important dan menulis tidak ada mitigasi yang memenuhi kriteria Red Hat. Jadi update adalah satu-satunya perbaikan resmi.

6 CVE lain yang perlu Anda baca

CVERingkasanCVSS 3.1
CVE-2026-117691Cek tanda tangan SAML redirect binding dilewati, login broker sebagai user mana pun9.1
CVE-2026-97175Auto-link IdP dengan email yang belum diverifikasi memberi ambil alih akun8.8
CVE-2026-112208Ambil alih akun lewat login identity-first organization, 26.8.0 dan 26.8.18.1
CVE-2026-92857Mapper DCR bawaan bisa menulis klaim sub dan aud8.1
CVE-2026-114232Izin UMA bisa membuka resource milik user lain8.1
CVE-2026-19688Admin API tanpa cek audience. Perbaikannya menambah scope kc-admin-api6.8
Kartu merah CVE-2026-117691 skor 9.1 dan kartu amber CVE-2026-112208 skor 8.1. Grafik 33 CVE dalam 7 kelompok. Aman: Keycloak 26.8.2.
(1) Kartu merah: celah SAML tanpa login. (2) Batang merah: kelompok ambil alih akun dan cek SAML. (3) Batang amber: kelompok lain. (4) Kotak teal: versi aman. Sumber: catatan rilis Keycloak 26.8.2, catatan CVE, dan pengelompokan Rama Digital.

Kelompok di diagram berasal dari judul catatan rilis, disusun Rama Digital. 5 CVE DoS bernilai 7.5, dan 4 di antaranya jalan tanpa login. CVE-2026-111497 di decoder Brotli sudah kami bahas di peringatan Node2Shell CVE-2026-111497.

Status eksploitasi per 6 November 2026

Kami tidak menemukan laporan serangan, kode serangan publik, atau entri CISA KEV untuk CVE-2026-117691. Analisa Rama Digital: perbaikan ada di repositori publik Keycloak, jadi penyerang bisa membaca perubahan kodenya. Anggap rilis ini mendesak bila Anda memakai SAML.

Siapa yang paling berisiko

Risiko bergantung pada cara realm dipakai, bukan hanya pada versi. Realm yang hanya memakai OIDC tidak terpapar oleh CVE-2026-117691.

Kondisi KeycloakRisikoAlasan
Realm dengan SAML identity provider (broker)TertinggiCVE-2026-117691: login broker sebagai user mana pun, tanpa akun
SAML client di redirect bindingTinggiPhase Two menulis jalur ini ikut terpapar
26.8.0 atau 26.8.1 dengan organizations aktifTinggiCVE-2026-112208, CVSS 8.1
Dynamic Client Registration terbukaPeriksa5 CVE klaim token palsu lewat mapper
Endpoint realm terbuka ke internetPeriksa5 CVE DoS, 4 tanpa login
Hanya OIDC dan sudah 26.8.2RendahTetap cari tanda dari waktu sebelum update
Enam kartu risiko: SAML IdP, SAML client, dan organizations di 26.8.x merah; DCR terbuka dan endpoint di internet amber; hanya OIDC di 26.8.2 abu-abu.
Kartu merah: risiko tertinggi. Kartu amber: periksa. Kartu abu-abu: risiko rendah. Kotak bawah: status eksploitasi per 6 November 2026. Sumber: catatan CVE, Phase Two, CISA KEV, dan analisa Rama Digital.

Urutan ini mengikuti analisa rilis Phase Two: update hari ini bila Anda memakai SAML broker atau organizations di 26.8.x. Update minggu ini bila endpoint realm terbuka ke internet atau DCR aktif.

Versi rentan dan versi aman

Yang menentukan adalah versi Keycloak yang berjalan, bukan versi Java atau sistem operasi.

VersiStatus per 6 November 2026Tindakan
26.8.0 dan 26.8.1Rentan, 33 CVE. 26.8.0 juga varian titik komaUpdate ke 26.8.2 hari ini
26.7.xRentan. Cabang berhenti di 26.7.5Naik ke 26.8.2
26.6.x, 26.4.x, dan lebih lamaRentan. Tidak ada backportNaik ke 26.8.2
Red Hat build of KeycloakAffected, patch belum adaLangkah 4, pantau RHSA
Red Hat SSO 7Tidak terdampak CVE-2026-117691Cek CVE lain
26.8.2Aman untuk 33 CVECek scope kc-admin-api, lalu langkah 5
Tabel 6 baris: 26.8.0 dan 26.8.1, 26.7, serta 26.6 dan lebih lama rentan, Red Hat build belum ada patch, Red Hat SSO 7 tidak terdampak, 26.8.2 aman.
Merah: rentan. Amber: belum ada patch. Abu-abu: tidak terdampak CVE utama. Teal: aman. Kotak bawah: 3 cara menjalankan skrip versi. Sumber: catatan rilis Keycloak, tag GitHub dan quay.io, halaman CVE Red Hat, dan uji Rama Digital.

Advisory tidak memuat daftar versi terdampak. Phase Two menyarankan anggap semua versi sebelum 26.8.2 rentan. Menurut halaman CVE Red Hat, Red Hat build of Keycloak berstatus Affected tanpa patch per 6 November 2026, dan Red Hat SSO 7 tidak terdampak.

Analisa Rama Digital: naik dari 26.4 atau 26.6 ke 26.8.2 melewati beberapa catatan migrasi. Baca panduan upgrade Keycloak untuk setiap versi yang Anda lewati, lalu uji di staging lebih dulu.

Prasyarat sebelum mulai

  • Akses SSH ke server Keycloak, atau akses ke host Docker atau cluster Kubernetes.
  • Akun admin realm master dan kcadm.sh dari folder bin/ Keycloak.
  • jq dan curl di mesin yang menjalankan skrip.
  • Backup database Keycloak, misalnya dump PostgreSQL, sebelum update.
  • Daftar client dan service account yang memanggil Admin API.
  • Jendela update 30 sampai 60 menit. Restart memutus login sebentar.

Langkah 1: Cek versi Keycloak

Simpan skrip ini sebagai cek-versi-keycloak.sh. Skrip membaca folder Keycloak, container Docker, atau versi yang Anda ketik, lalu menilai versi itu.

#!/usr/bin/env bash
# Cek versi Keycloak untuk CVE-2026-117691 (SAML HTTP-Redirect, tanda tangan dilewati) dan 32 CVE lain di rilis 26.8.2.
# Skrip hanya membaca. Butuh bash. Untuk nama container butuh docker atau podman (DOCKER=podman).
# Pakai: bash cek-versi-keycloak.sh /opt/keycloak
#   atau nama container: bash cek-versi-keycloak.sh keycloak
#   atau ketik versi manual: bash cek-versi-keycloak.sh 26.8.1
set -u
AMAN=26.8.2

# lebih_kecil A B: benar bila A < B
lebih_kecil() { [ "$1" != "$2" ] && [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n 1)" = "$1" ]; }

nilai() {
  local raw=$1 v
  case "$raw" in *[Rr]ed[Hh]at*|*RHBK*) echo "RED HAT BUILD: Red Hat menulis Affected tanpa patch per 6 November 2026. Pakai langkah 4 dan pantau RHSA."; return ;; esac
  v=$(printf '%s' "$raw" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n 1)
  [ -z "$v" ] && { echo "PERIKSA: versi ${raw:-kosong} tidak dikenal"; return; }
  if ! lebih_kecil "$v" $AMAN; then echo "AMAN untuk 33 CVE rilis $AMAN"; return; fi
  case "$v" in
    26.8.*) if lebih_kecil "$v" 26.8.1; then echo "RENTAN: update ke $AMAN (juga varian ';' yang ditutup 26.8.1)"; else echo "RENTAN: update ke $AMAN"; fi ;;
    26.7.*) echo "RENTAN: cabang 26.7 berhenti di 26.7.5, naik ke $AMAN" ;;
    *) if lebih_kecil "$v" 26.7.0; then echo "RENTAN: tidak ada patch di cabang ini, naik ke $AMAN"; else echo "PERIKSA: versi $v tidak dikenal"; fi ;;
  esac
}

ARG=${1:-/opt/keycloak}
if printf '%s' "$ARG" | grep -qE '^[0-9]+\.[0-9]+'; then
  echo "Keycloak $ARG: $(nilai "$ARG")"; exit 0
fi

if [ -d "$ARG" ]; then
  DIR=$ARG
  echo "== Folder: $(cd "$DIR" && pwd)"
  if [ -f "$DIR/version.txt" ]; then
    RAW=$(head -n 1 "$DIR/version.txt"); echo "version.txt: $RAW"
  else
    RAW=$(ls "$DIR"/lib/lib/main/ 2>/dev/null | grep -E 'keycloak-services-' | head -n 1)
    [ -n "$RAW" ] && echo "jar: $RAW"
  fi
  [ -z "${RAW:-}" ] && { echo "Folder $DIR bukan folder Keycloak (tidak ada version.txt atau keycloak-services-*.jar)"; exit 1; }
  RAW=${RAW#Keycloak - Version }
  echo "Keycloak ${RAW#*keycloak-services-}: $(nilai "${RAW#*keycloak-services-}")"
  exit 0
fi

# Bukan versi dan bukan folder: anggap nama container.
D=${DOCKER:-docker}
RAW=$($D exec "$ARG" cat /opt/keycloak/version.txt 2>/dev/null | head -n 1)
[ -z "$RAW" ] && RAW=$($D exec "$ARG" ls /opt/keycloak/lib/lib/main 2>/dev/null | grep -E 'keycloak-services-' | head -n 1)
[ -z "$RAW" ] && { echo "Tidak ada folder, versi, atau container bernama $ARG"; exit 1; }
echo "Container $ARG: $RAW"
RAW=${RAW#Keycloak - Version }
echo "Keycloak ${RAW#*keycloak-services-}: $(nilai "${RAW#*keycloak-services-}")"
# Instalasi zip atau tar.gz
bash cek-versi-keycloak.sh /opt/keycloak
# Container Docker bernama keycloak (Podman: DOCKER=podman di depan perintah)
bash cek-versi-keycloak.sh keycloak
# Versi yang Anda salin dari server lain
bash cek-versi-keycloak.sh 26.7.5
Terminal: skrip cek versi menilai 26.8.1, 26.7.5, dan 26.4.16 sebagai RENTAN, dan 26.8.2 sebagai AMAN untuk 33 CVE.
Skrip membaca version.txt di folder Keycloak 26.8.1, lalu menilai 3 versi yang diketik. Hanya 26.8.2 mendapat AMAN. Sumber: uji Rama Digital di pod podman dengan image resmi quay.io/keycloak/keycloak 26.8.1 dan 26.8.2, 6 November 2026.

Cek hasil: "RENTAN" berarti lanjut ke langkah 2 dan 3 hari ini. "RED HAT BUILD" berarti pakai langkah 4 dan pantau RHSA. "AMAN" tetap berarti jalankan langkah 5, karena celah ada sebelum Anda update.

Langkah 2: Cek realm yang memakai SAML

Langkah ini menjawab 3 pertanyaan: realm mana yang punya SAML identity provider aktif, realm mana yang punya SAML client, dan realm mana yang menyimpan event login.

Simpan skrip ini sebagai cek-paparan-keycloak.sh. Skrip hanya membaca konfigurasi lewat kcadm.sh dan tidak menyimpan token login.

#!/usr/bin/env bash
# Cek realm Keycloak yang memakai SAML (CVE-2026-117691). Skrip hanya membaca. Butuh bash, jq, dan curl.
# Pakai: bash cek-paparan-keycloak.sh [URL publik]
# Env: KCADM (default /opt/keycloak/bin/kcadm.sh), KC_URL (default http://localhost:8080),
#      KC_USER (default admin), KC_PASSWORD (bila kosong, skrip bertanya di terminal tanpa menampilkan password).
# Argumen URL publik (opsional): skrip kirim satu GET tanpa parameter ke endpoint broker tiap SAML IdP dan cetak kode HTTP.
set -u
KCADM=${KCADM:-/opt/keycloak/bin/kcadm.sh}
KC_URL=${KC_URL:-http://localhost:8080}
KC_USER=${KC_USER:-admin}
PUB=${1:-}
if [ -z "${KC_PASSWORD:-}" ]; then read -rs -p "Password $KC_USER: " KC_PASSWORD < /dev/tty; echo; fi
CFG=$(mktemp); trap 'rm -f "$CFG"' EXIT
kc() { "$KCADM" "$@" --config "$CFG"; }
# Kirim password lewat env KC_CLI_PASSWORD, bukan argumen --password. Argumen tampil di daftar proses (ps).
KC_CLI_PASSWORD="$KC_PASSWORD" "$KCADM" config credentials --server "$KC_URL" --realm master --user "$KC_USER" --config "$CFG" >/dev/null 2>&1 \
  || { echo "Login ke $KC_URL gagal"; exit 1; }
unset KC_PASSWORD

NREALM=0; NIDP=0; NCLI=0
echo "== 1. Realm di $KC_URL"
for R in $(kc get realms --fields realm 2>/dev/null | jq -r '.[].realm'); do
  INFO=$(kc get "realms/$R" --fields eventsEnabled,organizationsEnabled 2>/dev/null)
  IDPS=$(kc get identity-provider/instances -r "$R" 2>/dev/null | jq -c '[.[] | select(.providerId=="saml")]')
  CLI=$(kc get clients -r "$R" --fields clientId,protocol 2>/dev/null | jq -r '.[] | select(.protocol=="saml") | .clientId')
  NI=$(echo "$IDPS" | jq 'length'); NC=$(printf '%s' "$CLI" | grep -c .)
  echo "Realm $R: SAML IdP $NI, SAML client $NC, organizations $(echo "$INFO" | jq -r '.organizationsEnabled'), event $(echo "$INFO" | jq -r '.eventsEnabled')"
  [ "$NI" -gt 0 ] || [ "$NC" -gt 0 ] && NREALM=$((NREALM + 1))
  while IFS=$'\t' read -r A EN VS PB; do
    [ -z "$A" ] && continue
    echo "  IdP $A: enabled=$EN validateSignature=$VS postBindingResponse=$PB"
    if [ "$EN" = true ]; then echo "  TERDAMPAK: SAML IdP aktif $A"; NIDP=$((NIDP + 1)); fi
    if [ -n "$PUB" ]; then
      K=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 "${PUB%/}/realms/$R/broker/$A/endpoint")
      case "$K" in 000|403|404) echo "  Endpoint broker dari mesin ini: HTTP $K" ;; *) echo "  TERBUKA dari mesin ini: HTTP $K ${PUB%/}/realms/$R/broker/$A/endpoint" ;; esac
    fi
  done < <(echo "$IDPS" | jq -r '.[] | [.alias, .enabled, (.config.validateSignature // "-"), (.config.postBindingResponse // "-")] | @tsv')
  for C in $CLI; do echo "  PERIKSA: SAML client $C"; NCLI=$((NCLI + 1)); done
  [ "$(echo "$INFO" | jq -r '.organizationsEnabled')" = true ] && echo "  PERIKSA: organizations aktif (CVE-2026-112208 di 26.8.0 dan 26.8.1)"
  [ "$(echo "$INFO" | jq -r '.eventsEnabled')" != true ] && echo "  PERIKSA: event login tidak disimpan"
done
echo "== 2. Ringkasan"
echo "Realm dengan SAML: $NREALM. SAML IdP aktif: $NIDP. SAML client: $NCLI."
exit 0
# Jalankan di server Keycloak. Skrip meminta password admin realm master.
KC_URL=http://localhost:8080 bash cek-paparan-keycloak.sh
# Tambah URL publik untuk mengecek endpoint broker SAML dari mesin ini
KC_URL=http://localhost:8080 bash cek-paparan-keycloak.sh https://sso.contoh.id
Terminal: skrip paparan menemukan 1 SAML IdP aktif dan 1 SAML client di realm toko. Event login mati di realm master dan internal.
Realm toko punya SAML IdP saml-kantor yang aktif, jadi skrip menulis TERDAMPAK. Endpoint broker menjawab HTTP 400, artinya endpoint itu terbuka dari mesin ini. Sumber: uji Rama Digital di pod podman dengan image resmi quay.io/keycloak/keycloak 26.8.1 dan 26.8.2, 6 November 2026.

Cek hasil: catat setiap baris "TERDAMPAK" dan "PERIKSA". Realm dengan "TERDAMPAK: SAML IdP aktif" butuh langkah 3 hari ini. Bila update belum bisa jalan, pasang langkah 4 sekarang.

Langkah 3: Update ke 26.8.2

Update adalah satu-satunya langkah yang menutup 33 CVE ini. Rilis ini juga mengubah beberapa perilaku, jadi baca panduan upgrade Keycloak sebelum update.

3a. Image resmi

# 3a. Image resmi (diuji dengan podman, perintah docker sama)
docker pull quay.io/keycloak/keycloak:26.8.2
docker stop keycloak && docker rm keycloak
# Pakai volume, env, port, dan perintah start yang sama dengan container lama
docker run -d --name keycloak -p 127.0.0.1:8080:8080 \
  --env-file keycloak.env -v keycloak-data:/opt/keycloak/data \
  quay.io/keycloak/keycloak:26.8.2 start
# Image buatan sendiri: ganti baris FROM ke quay.io/keycloak/keycloak:26.8.2, lalu build ulang
Terminal: podman pull image quay.io/keycloak/keycloak:26.8.2, stop dan hapus container lama, lalu jalankan container baru dengan volume kc-data yang sama.
Container baru memakai volume data yang sama dengan container lama. Sumber: uji Rama Digital di pod podman dengan image resmi quay.io/keycloak/keycloak 26.8.1 dan 26.8.2, 6 November 2026.

Di uji kami, Keycloak 26.8.2 siap dalam 15 detik, dan realm master, toko, serta internal tetap ada. Uji kami memakai start-dev dengan database H2 di volume. Di produksi, pakai perintah start dan database yang sama dengan container lama.

3b. Instalasi tar.gz atau Keycloak Operator

# 3b. Instalasi tar.gz dari rilis GitHub: unduh dan cek SHA-1
curl -LO https://github.com/keycloak/keycloak/releases/download/26.8.2/keycloak-26.8.2.tar.gz
curl -LO https://github.com/keycloak/keycloak/releases/download/26.8.2/keycloak-26.8.2.tar.gz.sha1
[ "$(sha1sum keycloak-26.8.2.tar.gz | cut -d ' ' -f 1)" = "$(cat keycloak-26.8.2.tar.gz.sha1)" ] && echo SHA1 COCOK
# Salin conf/, providers/, dan themes/ Anda ke folder baru, lalu build dan start (tidak diuji)
tar xzf keycloak-26.8.2.tar.gz && cd keycloak-26.8.2
bin/kc.sh build && bin/kc.sh start --optimized
# Keycloak Operator: pasang manifest operator 26.8.2 (tidak diuji)
kubectl -n keycloak apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/26.8.2/kubernetes/kubernetes.yml

File .sha1 di rilis GitHub 26.8.2 hanya memuat hash, jadi perintah di atas membandingkan isi berkas itu secara langsung. Kami tidak menguji build dari tar.gz dan upgrade Operator, karena langkah itu bergantung pada provider dan tema Anda.

3c. Tambah scope kc-admin-api ke service account Anda

26.8.2 menutup CVE-2026-19688 dengan cek audience di Admin API. Client bawaan admin-cli dan security-admin-console mendapat scope kc-admin-api otomatis. Client dan service account buatan Anda sendiri tidak.

# 3c. Login kcadm.sh ke realm master. kcadm.sh meminta password admin.
kcadm.sh config credentials --server http://localhost:8080 --realm master --user admin
# Tambah scope kc-admin-api ke client buatan Anda (contoh: ci-bot di realm toko)
CID=$(kcadm.sh get clients -r toko -q clientId=ci-bot --fields id --format csv --noquotes)
SID=$(kcadm.sh get client-scopes -r toko --fields id,name --format csv --noquotes | grep kc-admin-api | cut -d, -f1)
kcadm.sh update clients/$CID/default-client-scopes/$SID -r toko -n
# Cek: token ci-bot ke Admin API. Hasil yang benar: 200. CI_SECRET berisi secret client ci-bot.
T=$(curl -s -d grant_type=client_credentials -d client_id=ci-bot -d client_secret="$CI_SECRET" \
  http://localhost:8080/realms/toko/protocol/openid-connect/token | jq -r .access_token)
curl -s -o /dev/null -w '%{http_code}\n' -H "Authorization: Bearer $T" 'http://localhost:8080/admin/realms/toko/users?max=1'
Terminal: skrip versi menulis AMAN di 26.8.2. Service account ci-bot mendapat 401 dari Admin API, lalu 200 sesudah scope kc-admin-api masuk.
Sesudah update, ci-bot mendapat 401 sampai scope kc-admin-api masuk. Realm toko dan IdP saml-kantor tetap aktif. Sumber: uji Rama Digital di pod podman dengan image resmi quay.io/keycloak/keycloak 26.8.1 dan 26.8.2, 6 November 2026.

Di uji kami, service account ci-bot mendapat 200 dari Admin API di 26.8.1, lalu 401 di 26.8.2. Sesudah scope kc-admin-api masuk, kode kembali 200. Ulangi perintah ini untuk setiap client yang memanggil Admin API.

3d. Baca perubahan perilaku lain

  • Pengelolaan protocol mapper hanya untuk realm admin.
  • Mapper DCR yang diizinkan sekarang mengikuti opsi realm baru. Opsi itu kosong secara bawaan.
  • SAML broker meminta SubjectConfirmation bearer yang sah. Parsing SAML 1.1 mati secara bawaan.
  • Auto-link IdP meminta email terverifikasi. Token hasil token exchange tidak hidup lebih lama dari token asal.
  • Endpoint SOAP menolak request di atas 120000 byte.
Tangga 8 baris: cek versi, cek realm SAML, ganti image, zip atau operator, scope kc-admin-api, 2 langkah sementara dengan label merah, lalu cari tanda.
(1) sampai (3c): urutan perbaikan. (4a) dan (4b): langkah sementara. Label merah mengingatkan bahwa langkah 4 tidak membuat server aman. Sumber: catatan rilis dan panduan upgrade Keycloak 26.8.2, uji Rama Digital, dan analisa Rama Digital.

Cek hasil: skrip versi menulis "AMAN untuk 33 CVE", realm dan IdP Anda masih ada, dan setiap service account mendapat 200 dari Admin API.

Langkah 4: Kurangi dampak sampai update selesai

Langkah ini mengurangi dampak, tetapi tidak membuat server aman. 32 CVE lain tetap terbuka sampai Anda update.

Analisa Rama Digital: Red Hat menulis tidak ada mitigasi yang memenuhi kriteria Red Hat. Kami memilih 2 langkah sementara. Kondisi: update belum bisa jalan hari ini, atau Anda memakai Red Hat build. Batas: aturan proxy bisa terlewat oleh bentuk request yang kami tidak uji.

4a. Tolak nama parameter ber-kode persen di reverse proxy

# Langkah 4a: tolak parameter SAML ber-kode persen atau berpemisah ';' di nginx, sebelum request sampai ke Keycloak.
# Ini langkah sementara bila update ke 26.8.2 belum bisa. Aturan tidak mengganti update.
# Uji: nginx 1.29 di depan Keycloak (port 8080) pada port 8081. Di server Anda, taruh blok location di server 443 yang sudah ada.
server {
    listen 8081;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
    }
    # Endpoint SAML broker dan SAML client. Jawab 403 bila nama parameter memuat %XX atau query memuat ';'.
    # Regex tanpa ^ juga cocok dengan awalan path, misalnya /auth dari KC_HTTP_RELATIVE_PATH.
    # Taruh blok ini di atas location regex lain. Location ^~ atau = untuk path Keycloak membuat aturan ini terlewat.
    location ~ /realms/[^/]+/(broker/[^/]+/endpoint|protocol/saml) {
        if ($args ~ "(^|&)[^=&]*%[0-9A-Fa-f]{2}[^=&]*=") { return 403; }
        if ($args ~ ";") { return 403; }
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
    }
}
Terminal: nginx -t berhasil. Request dengan nama parameter ber-kode persen atau titik koma mendapat 403. Request SAML biasa 400, OIDC discovery 200.
3 request uji dengan nama ber-kode persen atau titik koma berhenti di nginx dengan 403. Request biasa tetap sampai ke Keycloak. Sumber: uji Rama Digital dengan image resmi nginx 1.29 di depan Keycloak 26.8.1, 6 November 2026.

Di uji kami, nginx menjawab 403 untuk 3 request uji dengan nama ber-kode persen atau titik koma. Request SAML biasa tetap sampai ke Keycloak dan mendapat 400 dari Keycloak. OIDC discovery mendapat 200.

Kami juga menguji aturan ini dengan Keycloak di awalan path /auth. Hasilnya sama: 403 untuk request uji, 400 dan 200 untuk request biasa.

Taruh blok ini di atas location regex lain di server Anda. Location ^~ atau = untuk path Keycloak membuat nginx melewati aturan ini.

Sesudah memasang aturan, uji dari luar lewat URL publik Anda. Hasil yang benar adalah 403.

# 4a. Uji aturan dari luar lewat URL publik. Ganti realm toko dan alias saml-kantor.
# Bila Keycloak memakai awalan path (contoh /auth), tulis awalan itu sebelum /realms.
# Hasil yang benar: 403 dari proxy.
curl -s -o /dev/null -w '%{http_code}\n' 'https://sso.contoh.id/realms/toko/broker/saml-kantor/endpoint?%53AMLResponse=x'

Uji juga 1 login SAML asli dari IdP Anda. Kami tidak menguji aturan ini dengan IdP asli.

Tutup juga port 8080 dan 8443 di firewall, agar Keycloak hanya bisa dicapai lewat proxy.

4b. Nonaktifkan SAML IdP yang tidak dipakai

# 4b. Login kcadm.sh dulu seperti di langkah 3c
# Nonaktifkan SAML IdP yang tidak dipakai (alias dari langkah 2)
kcadm.sh update identity-provider/instances/saml-kantor -r toko -s enabled=false
# Aktifkan lagi sesudah update ke 26.8.2
kcadm.sh update identity-provider/instances/saml-kantor -r toko -s enabled=true
Terminal: kcadm.sh menonaktifkan IdP saml-kantor di realm toko. Skrip paparan menulis enabled=false, dan baris TERDAMPAK hilang.
Baris TERDAMPAK hilang. SAML client di realm toko tetap muncul sebagai PERIKSA, karena langkah 4b tidak menyentuh SAML client. Sumber: uji Rama Digital di pod podman dengan image resmi quay.io/keycloak/keycloak 26.8.1 dan 26.8.2, 6 November 2026.

User yang login lewat IdP itu tidak bisa login sampai Anda mengaktifkannya lagi. Pakai langkah ini hanya untuk IdP yang tidak dipakai, atau bila tim bisnis setuju dengan jeda login.

Cek hasil: skrip paparan menulis IdP itu nonaktif, dan perintah uji URL publik di langkah 4a mendapat 403 dari proxy.

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-keycloak.sh. Skrip mencari request SAML yang aneh di log akses, event login lewat IdP, dan user baru sejak tanggal yang Anda pilih.

#!/usr/bin/env bash
# Cari tanda penyalahgunaan CVE-2026-117691 di log akses dan di Keycloak. Skrip hanya membaca. Butuh bash, jq, dan zgrep.
# Pakai: bash cek-tanda-keycloak.sh <tanggal YYYY-MM-DD> [folder log akses]
# Log akses: berkas access.log* (termasuk .gz) dari nginx atau proxy lain di depan Keycloak.
# Env: KCADM (default /opt/keycloak/bin/kcadm.sh), KC_URL (default http://localhost:8080),
#      KC_USER (default admin), KC_PASSWORD (bila kosong, skrip bertanya di terminal tanpa menampilkan password).
set -u
SINCE=${1:?tanggal mulai, contoh 2026-10-01}
LOGDIR=${2:-}
KCADM=${KCADM:-/opt/keycloak/bin/kcadm.sh}
KC_URL=${KC_URL:-http://localhost:8080}
KC_USER=${KC_USER:-admin}
TANDA=0; PERIKSA=0
tanda() { echo "  TANDA: $1"; TANDA=$((TANDA + 1)); }
periksa() { echo "  PERIKSA: $1"; PERIKSA=$((PERIKSA + 1)); }
SAML='"GET /realms/[^/ ]+/(broker/[^/ ]+/endpoint|protocol/saml)'
akses() { find "$LOGDIR" -type f -name 'access.log*' 2>/dev/null | sort; }
cari() { akses | xargs -r zgrep -hE "$1" 2>/dev/null; }

echo "== 1. Log akses (${LOGDIR:-tidak diberi folder}, mulai $SINCE)"
if [ -n "$LOGDIR" ]; then
  echo "  $(akses | wc -l) berkas access.log"
  while IFS= read -r l; do tanda "nama parameter ber-kode persen atau ';': ${l:0:150}"; done \
    < <(cari "$SAML"'\?([^ ]*&)?[^=& ]*%[0-9A-Fa-f]{2}[^=& ]*=|'"$SAML"'\?[^ ]*;' | head -n 5)
  echo "  GET SAML per IP (5 teratas):"
  cari "$SAML" | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 5 | sed 's/^ */  INFO: /'
fi

if [ -z "${KC_PASSWORD:-}" ]; then read -rs -p "Password $KC_USER: " KC_PASSWORD < /dev/tty; echo; fi
CFG=$(mktemp); trap 'rm -f "$CFG"' EXIT
kc() { "$KCADM" "$@" --config "$CFG"; }
# Kirim password lewat env KC_CLI_PASSWORD, bukan argumen --password. Argumen tampil di daftar proses (ps).
KC_CLI_PASSWORD="$KC_PASSWORD" "$KCADM" config credentials --server "$KC_URL" --realm master --user "$KC_USER" --config "$CFG" >/dev/null 2>&1 \
  || { echo "Login ke $KC_URL gagal"; exit 1; }
unset KC_PASSWORD

echo "== 2. Event realm sejak $SINCE"
for R in $(kc get realms --fields realm 2>/dev/null | jq -r '.[].realm'); do
  if [ "$(kc get "realms/$R" --fields eventsEnabled 2>/dev/null | jq -r '.eventsEnabled')" != true ]; then
    periksa "realm $R: event tidak aktif"; continue
  fi
  while IFS= read -r l; do periksa "realm $R: $l"; done < <(kc get events -r "$R" -q "dateFrom=$SINCE" -q max=1000 2>/dev/null \
    | jq -r '.[] | select(.type=="IDENTITY_PROVIDER_LOGIN" or .type=="IDENTITY_PROVIDER_FIRST_LOGIN" or .type=="FEDERATED_IDENTITY_LINK") | "\((.time/1000)|todate) \(.type) user \(.userId // "-")"' | head -n 20)
done

echo "== 3. User yang dibuat sejak $SINCE"
LIMIT=$(date -d "$SINCE" +%s)000
for R in $(kc get realms --fields realm 2>/dev/null | jq -r '.[].realm'); do
  while IFS= read -r u; do periksa "realm $R: user baru $u"; done < <(kc get users -r "$R" --fields username,createdTimestamp -q max=1000 2>/dev/null \
    | jq -r --argjson t "$LIMIT" '.[] | select(.createdTimestamp >= $t) | .username')
done

echo "== Hasil: TANDA $TANDA, PERIKSA $PERIKSA"
[ "$TANDA" -gt 0 ] && echo "Simpan log sebagai bukti, tutup akses dari internet, lalu ikuti langkah 5 di artikel."
exit 0
# Log akses nginx di depan Keycloak, mulai 1 Oktober 2026
bash cek-tanda-keycloak.sh 2026-10-01 /var/log/nginx
Terminal: skrip tanda menemukan 3 TANDA dari 1 IP dummy di 2 berkas access.log, event mati di 2 realm, dan 2 user baru. Hasil: TANDA 3, PERIKSA 4.
Log akses di uji ini adalah data dummy dengan IP contoh dokumentasi. Skrip juga membaca berkas .gz, jadi log lama ikut dicek. Sumber: uji Rama Digital di pod podman dengan image resmi quay.io/keycloak/keycloak 26.8.1 dan 26.8.2, 6 November 2026.

Di uji ini, skrip menemukan 3 TANDA dari 1 IP dummy di 2 berkas log, termasuk 1 berkas .gz. Skrip juga menulis 4 PERIKSA: event mati di realm master dan internal, serta 2 user baru. User admin adalah admin bawaan uji, jadi baris itu punya penjelasan.

Dua kolom tanda: di log akses (nama parameter ber-kode persen, titik koma, IP asing) dan di Keycloak (event login IdP, link identitas baru, role admin baru).
Kolom amber: tanda di log akses. Kolom merah: tanda di Keycloak. Kotak bawah: langkah bila Anda menemukan 1 tanda saja. Sumber: catatan CVE-2026-117691, dokumentasi event Keycloak, uji Rama Digital, dan analisa Rama Digital.

Keycloak menyimpan event login hanya bila "Save events" aktif di realm. Bila event mati, Anda hanya punya log akses proxy. Aktifkan event hari ini, agar insiden berikutnya meninggalkan jejak.

Cek hasil: skrip menulis "TANDA 0", dan setiap PERIKSA punya penjelasan dari tim Anda. Log bisa dihapus penyerang, jadi 0 tanda belum berarti aman.

Bila ada 1 tanda saja, simpan log sebagai bukti. Lalu keluarkan semua sesi realm itu, ganti password admin dan secret client, cek role admin, dan update ke 26.8.2.

Bila Keycloak memegang akun pelanggan atau karyawan, 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 siang respons untuk 3 server Keycloak

Simulasi ini memakai data dummy. Nama server, waktu, dan hasil bukan data pelanggan.

Waktu (WIB)Server dummyYang dicekHasilTindakan
13.00sso-portal (Docker 26.8.1)Langkah 1 dan 2RENTAN, 1 SAML IdP aktifLangkah 4a sekarang, update sore ini
13.30sso-mitra (zip 26.6.7, hanya OIDC)Langkah 1 dan 2RENTAN, 0 realm SAMLRencanakan naik ke 26.8.2 minggu ini
14.00sso-internal (Red Hat build)Langkah 1 dan 2RED HAT BUILD, 1 SAML clientLangkah 4a, pantau RHSA
16.00sso-portalLangkah 3 dan 5AMAN, 1 service account 401Tambah scope kc-admin-api

Pelajaran dari simulasi: server yang hanya OIDC tetap perlu update, karena 32 CVE lain tidak bergantung pada SAML.

Siapa yang memasang patch

Keycloak sering berjalan di server Anda sendiri, jadi penyedia hosting tidak memasang patch ini untuk Anda.

Jenis layananPemegang patchYang Anda kerjakan
Keycloak di VPS, Docker, atau KubernetesTim AndaLangkah 1 sampai 5
Red Hat build of KeycloakRed Hat, lewat RHSALangkah 2, 4, dan 5 sampai RHSA terbit
Keycloak terkelola dari vendorVendor, sesuai kontrakMinta tanggal update dan hasil langkah 5
Aplikasi yang membawa Keycloak di dalamnyaVendor aplikasiMinta versi Keycloak tertulis dan jadwal patch

Rekomendasi Rama Digital: pantau rilis keamanan semua sistem login dan aplikasi web Anda dengan jadwal tetap. Minggu ini kami juga menulis peringatan Apache OFBiz CVE-2026-83542 dan peringatan Rails Active Storage CVE-2026-122006.

Checklist hari ini

  1. Buat daftar semua server Keycloak, termasuk staging. Pemilik: tim IT. Bukti: daftar nama dan versi.
  2. Cek versi dengan langkah 1. Pemilik: tim IT. Bukti: output skrip.
  3. Cek realm SAML dengan langkah 2. Pemilik: tim IT. Bukti: output skrip.
  4. Pasang langkah 4 di setiap server dengan SAML yang belum bisa update hari ini. Pemilik: tim IT. Bukti: kode 403 dari proxy.
  5. Update ke 26.8.2 dan tambah scope kc-admin-api. Pemilik: tim IT. Bukti: output skrip sesudah update dan kode 200 dari Admin API.
  6. Aktifkan event login di setiap realm. Pemilik: tim IT. Bukti: output skrip paparan.
  7. Cari tanda dengan langkah 5. Pemilik: tim IT dan tim keamanan. Bukti: output skrip.

Tanya jawab

Apakah celah ini sudah dipakai menyerang?

Per 6 November 2026, kami tidak menemukan laporan serangan, dan CVE-2026-117691 belum masuk CISA KEV. Tetapi perbaikannya ada di kode publik, jadi update hari ini bila Anda memakai SAML.

Realm saya hanya memakai OIDC. Apakah saya aman?

Menurut Phase Two, realm yang hanya OIDC tidak terpapar oleh CVE-2026-117691. Tetap update minggu ini, karena 32 CVE lain, termasuk 5 DoS, tidak bergantung pada SAML.

Saya memakai Red Hat build of Keycloak. Apa yang saya kerjakan?

Per 6 November 2026, Red Hat menulis status Affected tanpa patch. Pasang langkah 4, jalankan langkah 5, dan pantau RHSA di halaman CVE Red Hat.

Saya masih di 26.4 atau 26.6. Kenapa tidak ada patch?

Keycloak hanya merilis perbaikan ini di 26.8.2. Naik ke 26.8.2, dan baca catatan migrasi untuk setiap versi yang Anda lewati.

Kenapa service account saya mendapat 401 sesudah update?

26.8.2 mengecek audience di Admin API. Tambah client scope kc-admin-api ke client itu seperti di langkah 3c. Di uji kami, kode berubah dari 401 ke 200.

Apakah update image menghapus realm saya?

Tidak, bila Anda memakai database atau volume yang sama. Di uji kami, realm dan SAML IdP tetap ada sesudah ganti image. Tetap backup sebelum update.

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 akses yang sudah terjadi. Bila Keycloak 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