FlawOpen

flawopen.com/Teardowns/cve-2026-76504-cisco-sdwan-api-authentication-bypass

● CVE-2026-76504 · CVSS 9.8[1] · Kritis
Riset Keamanan · FlawOpen

CVE-2026-76504: bypass autentikasi pada Cisco SD-WAN Manager

CVE-2026-76504 memungkinkan penyerang jarak jauh tanpa autentikasi melewati aturan autentikasi API pada Cisco Catalyst SD-WAN Manager dan memperoleh akses API sebagai administrator. Cisco mengonfirmasi eksploitasi aktif; tingkatkan ke versi perbaikan untuk cabang Anda dan selidiki Manager sebelum menyatakan sistem aman.[1], [5]

Vektor CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H[1]
💡 Penjelasan Sederhana (ELI5)

Bayangkan pintu dengan pemeriksaan keamanan yang hanya mengenali satu cara penulisan alamat. Penyerang mengubah penulisannya dengan URI encoding; satu bagian sistem tetap mengenali pintu yang sama, tetapi aturan keamanan tidak. Cisco menyatakan perbedaan ini memungkinkan permintaan melewati autentikasi dan mengakses API sebagai administrator. Perbaikannya harus menangani alamat secara konsisten dan menerapkan aturan akses yang sama; bagi operator, solusi yang didukung Cisco adalah peningkatan perangkat lunak.[1]

Konsep Kunci & Istilah

URI encoding
Cara merepresentasikan karakter dalam jalur URL dengan byte berkode persen. Semua lapisan harus mendekode dan membandingkan jalur secara konsisten.[1], [7]
Bypass autentikasi
Permintaan mencapai fungsi yang dilindungi tanpa sistem menetapkan identitas pemanggil sebagaimana diwajibkan.[1]
Aturan sesi API
Aturan Manager untuk memastikan permintaan API memiliki sesi terautentikasi yang valid sebelum mencapai endpoint.[1]
CWE-177
Penanganan URL encoding yang tidak tepat: pemrosesan data URL berkode secara tidak konsisten dapat merusak keputusan keamanan. Cisco menetapkan kelemahan ini pada CVE tersebut.[1], [7]

Pemetaan kerangka kerja

Analisis Akar Masalah (Root Cause)

Cisco mengaitkan CVE-2026-76504 dengan penanganan URI encoding yang tidak tepat pada permintaan HTTP di autentikasi sesi API Catalyst SD-WAN Manager. Permintaan yang dibuat khusus dapat melewati aturan autentikasi untuk membatasi endpoint API tertentu dan memperoleh akses sebagai administrator. Cisco memberi skor CVSS 3.1 9,8 Critical, menyatakan produk terdampak apa pun konfigurasi sistemnya, dan melaporkan bahwa PSIRT mengetahui eksploitasi aktif pada September 2026. Advisory menampilkan permintaan URI-encoded j_security_check sebagai contoh IOC dan secara tegas memperingatkan bahwa satu karakter URI yang dikodekan saja dapat digunakan; jangan anggap contoh itu sebagai signature deteksi lengkap. Cisco tidak menerbitkan kode sumber rentan atau diff patch, sehingga pasangan kode di bawah ini hanya ilustrasi desain otorisasi, bukan kode Cisco atau reproduksi. Cisco mencantumkan versi perbaikan per cabang dan menyatakan tidak ada workaround yang sepenuhnya mengatasi kerentanan. Pembatasan jaringan dan shield Live Protect adalah mitigasi sementara; shield dapat mengganggu login yang sah dan tidak menggantikan peningkatan versi.[1], [5]

Rilis perbaikan CVE-2026-76504 berdasarkan deployment

Deployment / liniRilis yang diperbaikiTindakan yang diperlukan
Rilis on-prem sebelum 20.9Pindah ke lini yang didukung dengan rilis perbaikan yang tersedia.Migrasikan; jangan tetap memakai lini lama yang tidak didukung.
Lini on-prem 20.920.9.10.1Tingkatkan setiap Manager ke versi ini atau versi lebih baru dalam lini yang didukung.
Lini on-prem 20.1220.12.8.2Tingkatkan setiap Manager ke versi ini atau versi lebih baru dalam lini yang didukung.
Lini on-prem 20.1520.15.6.1Tingkatkan setiap Manager ke versi ini atau versi lebih baru dalam lini yang didukung.
Lini on-prem 20.1820.18.4.1Tingkatkan setiap Manager ke versi ini atau versi lebih baru dalam lini yang didukung.
Lini on-prem 26.126.1.2.1Tingkatkan setiap Manager ke versi ini atau versi lebih baru dalam lini yang didukung.
Lini on-prem 26.226.2.1Tingkatkan setiap Manager ke versi ini atau versi lebih baru dalam lini yang didukung.
Cisco SD-WAN Cloud (Cisco Managed)20.15.605 atau lebih baru; Cisco menyatakan layanan hosting sudah diperbaiki.Pastikan deployment adalah layanan terkelola; pelanggan tidak perlu bertindak untuk rollout layanan hosting ini.

Alur Serangan Langkah demi Langkah

Langkah 1

Permintaan jarak jauh mencapai API Manager

Akun atau interaksi pengguna tidak diperlukan. Paparan internet meningkatkan risiko; vendor menyatakan konfigurasi tidak memengaruhi status terdampak.[1]

Langkah 2

Jalur berkode URI melewati aturan autentikasi

Cisco mengidentifikasi penanganan URI encoding yang tidak konsisten dalam autentikasi sesi API. Materi publik tidak mengungkap implementasi rentan.[1]

Langkah 3

API memperlakukan permintaan sebagai admin

Eksploitasi yang berhasil memberikan hak administrator. Cisco mengonfirmasi eksploitasi aktif, tetapi tidak menerbitkan rantai lengkap setelah akses diperoleh.[1], [5]

Langkah 4

Tingkatkan versi dan selidiki

Kumpulkan file admin-tech, tingkatkan semua Manager ke versi perbaikan yang sesuai, lalu minta Cisco TAC memeriksa bukti. Jangan menunggu TAC sebelum meningkatkan versi.[1], [2]

Kode Sumber: Rentan vs Aman

Cisco tidak menerbitkan source code rentan atau diff patch. Contoh Python ini menunjukkan aturan desain umum, bukan kode Cisco: routing dan otorisasi harus memakai target permintaan kanonis yang sama dan tervalidasi, serta endpoint terlindungi harus mensyaratkan identitas terautentikasi. Gunakan semantik normalisasi router/framework yang terdokumentasi; jangan menambahkan decoding ad hoc atau decoding ganda. Perbaikan yang didukung untuk CVE-2026-76504 adalah peningkatan ke versi perbaikan cabang yang ditentukan Cisco.[1], [7]

Cuplikan sumber: Contoh ilustratif Python untuk kanonisasi URI dan batas otorisasi; bukan source code Cisco

IMPLEMENTASI RENTAN
from urllib.parse import unquote, urlsplit


def dispatch(raw_target, session, routes):
    # Satu lapisan memeriksa jalur yang masih terenkode.
    path_for_auth = urlsplit(raw_target).path
    if path_for_auth.startswith("/api/") and session is None:
        raise PermissionError("authentication required")

    # Lapisan berikutnya mendekode sebelum pencarian rute. Kedua keputusan dapat berbeda.
    route_path = unquote(path_for_auth)
    return routes[route_path]()
PERBAIKAN AMAN & KUAT
import re
from urllib.parse import unquote, urlsplit


def canonical_path(raw_target):
    raw_path = urlsplit(raw_target).path
    if re.search(r"%(?![0-9A-Fa-f]{2})", raw_path):
        raise ValueError("malformed URI encoding")

    path = unquote(raw_path, errors="strict")
    if "%" in path or "\\" in path:
        raise ValueError("ambiguous path encoding")
    if any(part in {".", ".."} for part in path.split("/")):
        raise ValueError("path traversal segment")
    return path


def dispatch(raw_target, session, routes):
    path = canonical_path(raw_target)  # Decode and validate exactly once.
    route = routes.get(path)
    if route is None:
        raise LookupError("route not found")

    requires_authentication, handler = route
    if requires_authentication and session is None:
        raise PermissionError("authentication required")
    return handler()

Daftar Periksa Penguatan Sistem Rekayasa

Sumber