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.

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
| CVE | Ringkasan | CVSS 3.1 |
|---|---|---|
| CVE-2026-117691 | Cek tanda tangan SAML redirect binding dilewati, login broker sebagai user mana pun | 9.1 |
| CVE-2026-97175 | Auto-link IdP dengan email yang belum diverifikasi memberi ambil alih akun | 8.8 |
| CVE-2026-112208 | Ambil alih akun lewat login identity-first organization, 26.8.0 dan 26.8.1 | 8.1 |
| CVE-2026-92857 | Mapper DCR bawaan bisa menulis klaim sub dan aud | 8.1 |
| CVE-2026-114232 | Izin UMA bisa membuka resource milik user lain | 8.1 |
| CVE-2026-19688 | Admin API tanpa cek audience. Perbaikannya menambah scope kc-admin-api | 6.8 |

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 Keycloak | Risiko | Alasan |
|---|---|---|
| Realm dengan SAML identity provider (broker) | Tertinggi | CVE-2026-117691: login broker sebagai user mana pun, tanpa akun |
| SAML client di redirect binding | Tinggi | Phase Two menulis jalur ini ikut terpapar |
| 26.8.0 atau 26.8.1 dengan organizations aktif | Tinggi | CVE-2026-112208, CVSS 8.1 |
| Dynamic Client Registration terbuka | Periksa | 5 CVE klaim token palsu lewat mapper |
| Endpoint realm terbuka ke internet | Periksa | 5 CVE DoS, 4 tanpa login |
| Hanya OIDC dan sudah 26.8.2 | Rendah | Tetap cari tanda dari waktu sebelum update |

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.
| Versi | Status per 6 November 2026 | Tindakan |
|---|---|---|
| 26.8.0 dan 26.8.1 | Rentan, 33 CVE. 26.8.0 juga varian titik koma | Update ke 26.8.2 hari ini |
| 26.7.x | Rentan. Cabang berhenti di 26.7.5 | Naik ke 26.8.2 |
| 26.6.x, 26.4.x, dan lebih lama | Rentan. Tidak ada backport | Naik ke 26.8.2 |
| Red Hat build of Keycloak | Affected, patch belum ada | Langkah 4, pantau RHSA |
| Red Hat SSO 7 | Tidak terdampak CVE-2026-117691 | Cek CVE lain |
| 26.8.2 | Aman untuk 33 CVE | Cek scope kc-admin-api, lalu langkah 5 |

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.shdari folderbin/Keycloak. jqdancurldi 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

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

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

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'

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.

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;
}
}

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

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

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.

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 dummy | Yang dicek | Hasil | Tindakan |
|---|---|---|---|---|
| 13.00 | sso-portal (Docker 26.8.1) | Langkah 1 dan 2 | RENTAN, 1 SAML IdP aktif | Langkah 4a sekarang, update sore ini |
| 13.30 | sso-mitra (zip 26.6.7, hanya OIDC) | Langkah 1 dan 2 | RENTAN, 0 realm SAML | Rencanakan naik ke 26.8.2 minggu ini |
| 14.00 | sso-internal (Red Hat build) | Langkah 1 dan 2 | RED HAT BUILD, 1 SAML client | Langkah 4a, pantau RHSA |
| 16.00 | sso-portal | Langkah 3 dan 5 | AMAN, 1 service account 401 | Tambah 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 layanan | Pemegang patch | Yang Anda kerjakan |
|---|---|---|
| Keycloak di VPS, Docker, atau Kubernetes | Tim Anda | Langkah 1 sampai 5 |
| Red Hat build of Keycloak | Red Hat, lewat RHSA | Langkah 2, 4, dan 5 sampai RHSA terbit |
| Keycloak terkelola dari vendor | Vendor, sesuai kontrak | Minta tanggal update dan hasil langkah 5 |
| Aplikasi yang membawa Keycloak di dalamnya | Vendor aplikasi | Minta 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
- Buat daftar semua server Keycloak, termasuk staging. Pemilik: tim IT. Bukti: daftar nama dan versi.
- Cek versi dengan langkah 1. Pemilik: tim IT. Bukti: output skrip.
- Cek realm SAML dengan langkah 2. Pemilik: tim IT. Bukti: output skrip.
- Pasang langkah 4 di setiap server dengan SAML yang belum bisa update hari ini. Pemilik: tim IT. Bukti: kode 403 dari proxy.
- 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.
- Aktifkan event login di setiap realm. Pemilik: tim IT. Bukti: output skrip paparan.
- 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
- catatan CVE-2026-117691: deskripsi resmi, CWE-347, dan CVSS 3.1 9.1, 5 November 2026.
- advisory GitHub GHSA-c85j-3hq2-q6wj: advisory Keycloak untuk CVE-2026-117691.
- catatan rilis Keycloak 26.8.2: daftar 33 CVE di 26.8.2.
- rilis GitHub 26.8.2: berkas rilis, hash, dan waktu rilis.
- panduan upgrade Keycloak: scope kc-admin-api dan perubahan perilaku 26.8.2.
- halaman CVE Red Hat: rating, status paket, dan catatan mitigasi.
- analisa rilis Phase Two: konfigurasi yang terpapar, cabang tanpa backport, dan urutan update.
- image resmi di quay.io: tag 26.8.1 dan 26.8.2.
- CISA KEV: status per 6 November 2026.
- UU 27/2022 tentang Pelindungan Data Pribadi: kewajiban melapor kebocoran data pribadi.




