Review Keamanan iOS Universal Links
Universal Links mengikat domain HTTPS ke aplikasi iOS lewat entitlement Associated Domains bertanda tangan dan data Apple App Site Association (AASA). Mekanisme ini membuat iOS memilih aplikasi atau browser untuk URL yang cocok. Mekanisme ini tidak mengautentikasi pengguna, mengotorisasi record, memvalidasi query parameter, atau menyetujui transaksi. Review kontrol domain, entitlement signed, cakupan AASA, handler runtime, dan otorisasi server sebagai batas terpisah.
Periksa association yang signed
Baca .entitlements release, konfigurasi provisioning, bundle identifier, application identifier prefix, dan setiap entri applinks:. Entitlement normal hanya berisi domain: applinks:shop.example.test. Jangan memasukkan scheme, path, query, atau trailing slash. Setiap host berbeda: example.test, www.example.test, dan support.example.test memerlukan entitlement benar serta delivery AASA masing-masing. Wildcard subdomain harus memiliki scope yang disengaja.
AASA harus bernama apple-app-site-association, tanpa extension, disajikan melalui HTTPS valid pada https://shop.example.test/.well-known/apple-app-site-association, dan tidak boleh redirect. Application ID memadukan application identifier prefix dengan bundle identifier. Periksa header respons live, body, TLS, path respons, perilaku cache, dan identitas release; jangan bergantung pada JSON staging hasil salin.
{
"applinks": {
"details": [{
"appIDs": ["ABCDE12345.com.example.shop"],
"components": [
{ "/": "/orders/*" },
{ "/": "/admin/*", "exclude": true }
]
}]
}
}
components dapat mencocokkan path lewat "/", query item lewat "?", fragment lewat "#", dan exclusion. /orders/* menentukan scope routing; ini bukan otorisasi. Tambahkan exclusion eksplisit untuk rute yang harus tetap web-only. Buat path cukup sempit agar rute web baru tidak diam-diam menjadi entry point aplikasi.
Uji aplikasi release terpasang
Pasang build release signed, buka URL HTTPS cocok dan tidak cocok dari Safari serta Messages, lalu catat versi iOS, build aplikasi, URL tepat, hasil handler, entitlement signed, respons AASA, state akun, dan hasil server. Uji fresh install serta update karena pengambilan dan cache associated domain asinkron; jangan menyimpulkan association perangkat saat ini dari source repository saja.
Uji path malformed, subdomain tak diharapkan, query key ganda, slash terenkode, ID hilang, redirect eksternal, sesi kedaluwarsa, dan objek milik pengguna lain. Handler wajib mem-parsing URL dengan allowlist, menolak state tak didukung, membuat sesi normal, lalu meminta server mengotorisasi objek atau aksi. Universal Link hanya boleh membuka layar terautentikasi setelah pemeriksaan normal.
Catatan review
| Artefak | Bukti | Pemilik | Hasil | Pengecualian | Remediasi |
|---|---|---|---|---|---|
| Entitlement | nilai release signed | pemilik iOS | lulus/gagal | host disetujui | hapus domain luas |
| Delivery AASA | HTTPS, tanpa redirect, app ID | pemilik web | lulus/gagal | domain staging | publikasikan file valid |
| Components | uji rute dan exclusion | pemilik produk | lulus/gagal | rute web-only | persempit matcher |
| Handler URL | kasus URL hostile | pemilik aplikasi | lulus/gagal | link lama terdokumentasi | parse allowlist |
| Tujuan | uji server objek asing | pemilik API | lulus/gagal | tidak ada | tegakkan otorisasi |
Aturan keputusan: association Universal Link memilih routing aplikasi. Association tidak boleh melewati autentikasi, otorisasi, pemeriksaan state, konfirmasi, atau validasi input.
Remediasi dan uji ulang
Hapus associated domain tak digunakan, publikasikan komponen AASA presisi, tetap exclude rute administratif dan irreversible kecuali alur aplikasi memerlukannya, lalu validasi parameter masuk sebelum navigasi. Pantau kepemilikan domain serta perubahan deployment karena kontrol website mengendalikan data association. Hapus setting alternate mode development sebelum release. Pengujian mobile dapat memvalidasi entitlement, delivery AASA, routing perangkat, dan otorisasi endpoint.
Bukti dan pemilik release
Simpan bukti release berisi nomor build, extract entitlement, application identifier, URL AASA dan digest body, observasi TLS, URL uji, versi iOS, state akun, hasil handler, hasil otorisasi API, pemilik, dan tanggal retest. Tandai lulus hanya bila aplikasi membuka rute yang dituju dan kasus hostile gagal aman. Pengecualian memerlukan pemilik rute, alasan terdokumentasi, kontrol kompensasi, tanggal kedaluwarsa, dan persetujuan release. Pemilik deployment web wajib memvalidasi ulang AASA setelah perubahan CDN, sertifikat, hostname, atau routing.
Pemeriksaan operasi
Jangan memakai perubahan AASA sebagai kontrol otorisasi darurat. Roll back rute tidak aman pada aplikasi dan API, selain data website. Koordinasikan pemilik iOS, web, dan API sebelum menambah host atau wildcard. Verifikasi file produksi setelah deployment dari jalur jaringan independen, lalu simpan hasil uji pada change record. Langkah ini menangkap konten CDN stale, redirect tak disengaja, dan identitas release salah sebelum pengguna menerima rute.
Verifikasi AASA dan penutupan
Ambil https://shop.example.test/.well-known/apple-app-site-association tanpa redirect lalu simpan header dan hash body. Hasil diharapkan respons HTTPS tanpa autentikasi, association JSON atau format signed yang diterima deployment, dan app identifier cocok dengan Team ID serta bundle ID. Pada perangkat bersih dengan entitlement Associated Domains, ketuk URL disetujui; aplikasi hanya membuka rute dalam path terdaftar. Ketuk path dikecualikan dan pastikan web normal atau fallback aman.
Uji input hostile: query duplikat, pemisah path terenkode, ID objek asing, sesi kedaluwarsa, dan URL dari aplikasi lain. Perilaku aplikasi yang diharapkan ialah validasi sebelum navigasi, login normal bila perlu, dan otorisasi backend sebelum data terlihat. AASA mengendalikan handoff rute, bukan kepercayaan pada identifier atau caller. Kasus tepi: CDN cache dapat menyimpan AASA lama saat bundle atau Team ID berubah; periksa cache header dan uji fresh install, bukan hanya fetch browser.
Tutup dengan extract entitlement, hash respons AASA, output perangkat/iOS, capture URL diterima dan ditolak, trace otorisasi server, pemilik, serta event retest. Buka ulang setelah domain, team, bundle, aturan path, CDN, atau signing berubah.