3 poin oleh GN⁺ 2023-07-14 | 1 komentar | Bagikan ke WhatsApp
  • Nama host lokal bawaan macOS dapat memuat nama pengguna, sehingga situs web bisa mempersempit kandidat nama tanpa izin melalui perbedaan waktu resolusi nama mDNS
  • Penyerang mengombinasikan 50 nama populer menurut negara dan gender dengan kandidat nama perangkat; dalam eksperimen, nama pengguna macOS berhasil ditebak rata-rata pada 65% kasus
  • JavaScript di browser tidak bisa membuka soket UDP sembarang, tetapi dapat membandingkan latensi respons alamat .local melalui permintaan fetch, iframe, Image, dan WebRTC
  • Informasi seperti zona waktu, bahasa, lokasi IP, navigator.language di Safari, resolusi layar, dan screen.isExtended digunakan untuk mempersempit kandidat lokal dan model perangkat
  • Praktikalitasnya rendah dan mudah terlihat di tab Network pada developer tools, tetapi metode eksplorasi mDNS yang sama juga dapat digunakan untuk mendeteksi printer, smart TV, smart speaker, dan perangkat IoT

Struktur kebocoran nama dari nama host lokal macOS

  • Nama asli pengguna macOS dapat diperkirakan dari browser tanpa permintaan izin; kuncinya adalah protokol mDNS dan format nama host lokal bawaan
  • Bahkan hanya dengan daftar 50 nama populer menurut gender dari negara tertentu, nama pengguna macOS dapat dideteksi dengan benar rata-rata pada 65% kasus
  • Fingerprint tidak menggunakan teknik ini dalam produknya dan juga tidak menyediakan layanan pelacakan lintas situs
  • Tujuan diskusi publik ini adalah membantu penyedia browser memperbaiki teknik semacam ini dengan cepat

Cara kerja mDNS dan Apple Bonjour

  • multicast DNS adalah protokol untuk mendaftarkan, menemukan, dan menyiarkan nama perangkat di jaringan lokal
  • Perangkat seperti printer mengirim paket pendaftaran UDP ke IP internal khusus 224.0.0.251, dan dapat menyertakan nama host seperti HP_LaserJet_Printer.local
  • Domain tingkat atas .local menunjukkan bahwa nama host tersebut harus diresolusikan melalui mDNS
  • Router secara otomatis menyiarkan paket seperti ini ke perangkat lain di jaringan lokal agar nama host dapat di-cache
  • Perangkat mengirim paket kueri ke IP khusus yang sama untuk mencari perangkat dengan nama tertentu yang mungkin ada di jaringan
  • Contoh nama host adalah sebagai berikut
    • johns-mac-mini.local
    • david-ZenBook-UX431DA-UM431DA.local
    • james-iphone.local
    • canon-mf644c.local
    • bedroom-appletv.local
    • dlinkrouter.local
  • Di perangkat Apple, mDNS banyak digunakan sebagai bagian dari fitur Apple Bonjour
  • Nama pengguna dapat terekspos dalam nama host lokal bawaan, dan di macOS nama host lokal dapat dilihat atau diubah melalui System Settings > Sharing

Cara tidak langsung memeriksa nama host mDNS dari browser

  • Karena mDNS berbasis paket UDP, lingkungan JavaScript browser tidak dapat menggunakannya secara langsung lewat soket UDP sembarang
  • Sebagai gantinya, serangan timing attack dilakukan dengan memanfaatkan sifat browser yang mencoba meresolusikan nama host dalam URL
  • Proof of concept-nya mengirim permintaan GET fetch biasa ke device-1.local yang ada dan device-2.local yang tidak ada
  • Jika alamat berhasil diresolusikan, browser mengirim paket TCP ke port 80, yang biasanya kemungkinan besar tertutup
  • Pada level jaringan, muncul error yang berbeda
    • device-1.local yang ada: ERR_CONNECTION_REFUSED
    • device-2.local yang tidak ada: ERR_NAME_NOT_RESOLVED
  • Di JavaScript, kedua error dipetakan menjadi error Failed to fetch yang sama, sehingga jenis error itu sendiri tidak bisa dijadikan acuan
  • Karena jaringan lokal cepat, nama host mDNS yang valid diresolusikan jauh lebih cepat daripada timeout koneksi bawaan
  • Dalam contoh, alamat valid selesai dalam 4ms, sedangkan alamat tidak valid membutuhkan 5 detik
  • Pendekatan ini cukup konsisten untuk proof of concept dan berperilaku serupa di browser utama
  • Dalam praktiknya, selain fetch, timing attack resolusi DNS juga dapat dilakukan dengan API JavaScript jaringan seperti iframe, Image, dan WebRTC

Cara melakukan brute force nama pengguna macOS

  • Nama host lokal macOS bawaan memuat nama pengguna dan nama perangkat, dengan format yang berbeda menurut lokal bahasa sistem
    • English: <name>s-macbook-pro.local
    • French: macbook-air-de-<name>.local
    • Russian: mac-mini-<name>.local
  • Dengan pendekatan sederhana yang mengombinasikan 1.000 nama teratas, 10 lokal teratas, dan 5 nama perangkat macOS umum, harus diperiksa 50.000 nama host
  • Dalam kasus ini, pemeriksaan penuh bisa memakan waktu lebih dari 1 jam
  • Strategi yang lebih efisien adalah membatasi ruang pencarian ke satu lokal, satu perangkat, dan 50 nama umum untuk lokal tersebut
  • Memperkecil ruang pencarian menurunkan akurasi, tetapi mengurangi waktu serangan sehingga menjadi skenario yang lebih realistis
  • Zona waktu browser, bahasa, dan lokasi alamat IP dapat digunakan untuk memilih lokal
  • Safari mengekspos lokal sistem melalui properti navigator.language, dan nilai ini biasanya cocok dengan lokal nama host target
  • Cara tidak langsung lain untuk menemukan negara asal pengguna adalah metode Apple ID region detection yang pernah dibahas sebelumnya
  • Kandidat perangkat dapat dipersempit dengan resolusi layar
    • Misalnya, resolusi 1728x1117 kemungkinan besar adalah MacBook Pro 16 inci
    • Layar tambahan dapat dideteksi dengan properti screen.isExtended
    • Jika layar tambahan terdeteksi, kandidat perangkat dapat dikembalikan ke 3–5 perangkat Apple macOS yang paling umum

Keterbatasan dan kemungkinan penerapan lain

  • Serangan ini tidak praktis karena kelemahan inheren dan berbagai keterbatasan
  • Kecuali operator situs web sengaja ingin menghilangkan anonimitas pengunjung, serangan ini mudah dideteksi dari tab Network di developer tools browser
  • Jika metode ini digabungkan dengan installed applications detection, ada kemungkinan membuat situs web berbahaya yang menampilkan nama asli pengguna dan jabatan berdasarkan daftar aplikasi profesional yang digunakan, tanpa izin
  • Perangkat Apple yang menjalankan macOS adalah contoh utama, tetapi teknik eksplorasi mDNS dapat diperluas dalam berbagai cara
  • Pemindaian jaringan lokal juga dapat digunakan untuk mendeteksi printer, smart TV, smart speaker, dan perangkat IoT rumah tangga lainnya
  • Teknik ini juga dapat diterapkan ke iPhone dan iPad, dengan syarat sinkronisasi Wi-Fi atau fitur remote debug Safari diaktifkan

1 komentar

 
GN⁺ 2023-07-14
Komentar Hacker News
  • Saya memakai Little Snitch di macOS, dan UI-nya cukup bagus karena bisa diatur agar secara eksplisit meminta izin ke pengguna lokal sebelum mengizinkan permintaan jaringan
    https://www.obdev.at/products/littlesnitch/index.html
    Kadang ini mengganggu saat login jarak jauh, biasanya ketika sesi SSH mencoba mengunduh sesuatu yang baru, misalnya komponen NodeJS dari NPM. Unduhan SSH di terminal teks akan berhenti, lalu setelah menyadari penyebabnya adalah Little Snitch, saya harus turun ke meja di lantai bawah, menggerakkan mouse untuk menyalakan monitor, membuka screen saver, lalu menekan “Allow” pada dialog Little Snitch
    Bisa dibilang ini bekerja sesuai tujuan. Hanya saja, alat seperti ini sering kali secara default diatur untuk diam-diam mengizinkan permintaan jaringan lokal, jadi saya tidak yakin lelucon di tulisan utama akan berhasil di lingkungan saya

    • Dalam kasus saya, sulit membayangkan mengatur LittleSnitch agar hanya mengizinkan hostname tertentu dari browser. Saya punya aturan “izinkan semua trafik ke 53/80/443”, kalau tidak, sebagian besar situs web akan memunculkan ratusan pop-up LittleSnitch
    • Saya memakai NetFence di iPhone yang sudah di-jailbreak
      Cukup mengejutkan melihat koneksi soket apa saja yang diam-diam dibuka aplikasi, termasuk aplikasi perbankan
      https://havoc.app/package/netfence
    • Tapi Little Snitch tetap membocorkan IP bahkan saat memblokir :(
      https://news.ycombinator.com/item?id=35363343
    • Saya pernah memakai OpenSnitch, software serupa di Linux. Memang tidak menemukan hal aneh, tetapi cukup sering mengganggu pekerjaan sehari-hari
    • Sebagai catatan, resolusi DNS terjadi sebelum pop-up izinkan/tolak koneksi. Misalnya www.example.com akan di-resolve menjadi 1.1.1.1, tetapi koneksi nyata ke 1.1.1.1 tidak akan dibuat sampai Anda menekan Confirm
      Menambahkan Pi-hole ke jaringan Anda kemungkinan tidak akan membuat Anda menyesali waktu/uang/investasi yang dikeluarkan
  • Adakah cara mencegah situs web di internet yang lebih luas agar tidak bisa membuat permintaan jaringan ke jaringan lokal saya? Sulit membayangkan kenapa ini harus diizinkan secara default
    Saya tidak bermaksud menghidupkan lagi model izin Local Intranet Zone milik IE

    • Secara umum tidak bisa, karena CORS. Satu-satunya alasan “hack” ini bekerja adalah karena timing penolakan berbeda antara permintaan ke domain yang tidak ter-resolve dan permintaan yang berhasil di-resolve tetapi ditolak
      Namun meskipun ada sesuatu yang berjalan di https://192.168.2.1, aplikasi web yang berjalan dari https://my-own-domain.com tidak akan bisa mengaksesnya kecuali layanan di 192.168.2.1 mengizinkan my-own-domain.com sebagai Origin
    • Brave baru-baru ini menambahkan fitur yang meminta izin untuk akses jaringan lokal
      https://brave.com/privacy-updates/27-localhost-permission/
      Postingan HN: https://news.ycombinator.com/item?id=36574775
    • Aplikasi yang sering menyalahgunakan cara seperti ini adalah aplikasi desktop Discord, yang membuka port lokal dan mendengarkan di sana
      Saat browser membuka halaman undangan channel Discord, ia mengirim permintaan ke localhost lewat port ini dan meneruskan ID channel ke klien. Lalu aplikasi bisa menampilkan pengalaman native “Join Channel”
      Saya tahu ini karena perilaku itu tetap terjadi bahkan dalam mode incognito dan saat browser dalam keadaan logout dari Discord. Tidak bagus. Sandboxing semua aplikasi di dunia desktop perlu banyak ditingkatkan
    • Bisa diblokir dengan filter statis uBlock Origin:
      ||local^$all
      Ini akan memblokir semua permintaan ke .local, termasuk permintaan yang berasal dari .local itu sendiri. Jika Anda ingin mengizinkan foo.local berkomunikasi dengan dirinya sendiri, misalnya karena menjalankan web server, Anda perlu menambahkan pengecualian per domain:
      @@||foo.local^$domain=foo.local,all
      Atau jika Anda mempercayai seluruh .local dan ingin mengizinkan foo.local mana pun berkomunikasi dengan bar.local mana pun, Anda bisa menambahkan satu pengecualian untuk seluruh .local:
      @@||local^$domain=local,all
    • Untuk menghindari kebingungan, masalahnya bukan server internet yang mengirim permintaan ke jaringan lokal, melainkan browser web lokal yang mengirim permintaan itu. Tentu saja JavaScript yang berjalan di browser bisa dimuat dari server internet
  • Seiring waktu, rasanya jauh lebih tenang menggunakan internet terutama dari kotak Qubes, lewat VM Whonix/Tor sekali pakai, dengan JavaScript dimatikan
    Ini benar-benar menjijikkan. Tidak mengejutkan, tetapi kenyataan bahwa ini mungkin dilakukan tetap mengerikan dalam banyak hal
    Jika Anda belum tahu fingerprint.com, mereka melakukan “profiling pengguna yang mendalam”. Anggap saja mereka bisa mempertahankan ID pengguna yang sama meskipun komputer, browser, dan sistem operasinya berbeda. Ada demo di halaman utama mereka, dan hasilnya agak bikin merinding

    • Bahkan dengan IP VPN yang berbeda, tetap dikenali sepenuhnya sebagai perangkat yang sama. Benar-benar menyeramkan
    • Ini menjijikkan. Cukup mengesankan bahwa mereka bisa melakukannya di mode incognito iPhone bawaan sambil mengganti dua IP, padahal seharusnya terlihat sama seperti iPhone lain
      Filter uBlock Origin untuk merusak demo mereka:
      ||fpjscdn.net
  • Jenis serangan timing yang mirip juga bisa dipakai untuk memindai port pada mesin lokal dan perangkat lain di jaringan lokal dari browser
    https://github.com/Flu1dTeam/PortScanner
    Dulu eBay pernah ketahuan melakukan ini
    https://blog.nem.ec/2020/05/24/ebay-port-scanning/

    • Apa ini, serem banget, kok selama ini aku belum pernah dengar?
  • Syukurlah nama perangkatku selalu diganti
    Penamaan bawaan Apple adalah kesalahan privasi. Dulu aku pernah kencan pertama dengan seseorang yang bekerja di penegak hukum; dia datang sendirian, perempuan, dan jelas sangat peduli melindungi dirinya, jadi dia bilang dia sudah mengecek latar belakangku dan memberi tahu beberapa orang di komunitas sekitarnya soal lokasi kami
    Sementara itu aku bahkan tidak tahu nama belakangnya, dan menjadikannya bahan bercanda. Setelah makan malam, saat kami masuk ke mobil, layar dashboard menampilkan bahwa iPhone-nya ter-pairing otomatis, dan nama iPhone itu memakai nama depan dan nama belakangnya, jadi aku langsung tertarik. Aku tidak menyinggung hal itu, lalu sampai perjalanan selesai aku menyuruhnya menebak bagaimana aku bisa tahu namanya

    • Sering sekali ada belasan profil ponsel yang pernah dipairing tertinggal di mobil sewaan, lengkap dengan buku telepon, lokasi peta tersimpan, sampai riwayatnya. Tentu tidak terlalu berguna, tapi informasi bocor begitu saja tanpa dipikirkan
      Masalah terbesarnya justru mengingatkan diri sendiri untuk menghapus profilku sebelum mengembalikan mobil
  • Pada contoh di atas, alamat yang valid butuh 4 milidetik, sedangkan alamat yang tidak valid butuh 5 detik
    Ini tidak terduga. Aku mengira kegagalan pencarian DNS akan jauh lebih cepat daripada timeout koneksi bawaan yang datang setelah pencarian DNS berhasil
    Tetap saja, menurutku s-mac-xxxx selalu pilihan yang agak aneh. Terutama kalau mengingat ini perusahaan yang sangat menjual privasi sebagai poin utama. Mungkin diasumsikan tidak akan memakai nama asli di sini, atau mungkin dalam kasus ini “kemudahan bagi pengguna” yang diprioritaskan. Dari sudut pandang privasi, hostname acak yang dibuat Windows lebih baik

    • DNS biasa menanyakan satu server pada satu IP untuk jawaban ya/tidak, tetapi mDNS itu multicast, jadi tidak ada satu server pun yang bisa secara otoritatif menjawab “tidak”†. Baru ketika kueri timeout karena server tidak merespons, kita bisa mendeteksi bahwa record itu tidak ada
      † Secara ketat ini tidak sepenuhnya benar. Jika ada perangkat yang tahu bahwa nama itu dimiliki olehnya, perangkat itu bisa menjawab tidak
    • Alasan nama asli pengguna masuk ke hostname mungkin karena AirDrop. Sistem tampaknya memakai hostname untuk fitur seperti Personal Hotspot atau AirDrop, dan jenis nama lain kemungkinan besar akan menimbulkan kebingungan luas saat berbagi file
    • Selain soal timeout koneksi bawaan, di sini yang terjadi juga connection refused, yaitu menerima RST, bukan timeout koneksi
  • Tulisannya bagus dan menarik. Aku terutama suka nada yang tidak berlebihan seperti “dengan mempertimbangkan kelemahan yang melekat dan banyak keterbatasannya, serangan ini tidak praktis”

    • Di semesta lain, ini pasti akan diberi nama “FINGERBleed”, lengkap dengan situs web dan logo keren
    • Tidak yakin juga
      Cara ini memungkinkan pengujian apakah hostname tertentu ada di jaringan
      Kalau cuma satu hostname unik mungkin bukan masalah besar, tapi bagaimana dengan hostname tetap atau hostname bawaan yang umum di dunia IoT
      Situs web jadi bisa diam-diam menebak apakah pengguna memiliki perangkat tertentu. Kalau dipakai untuk serangan tertarget malah lebih buruk. Jika beberapa perangkat di jaringan sudah diketahui, kita bisa menebak apakah pengguna yang terhubung sedang berada di jaringan target
  • Andai saja mematikan JavaScript tidak ikut mematikan pengalaman pengguna akhir

    • Ini satu-satunya alasan aku tidak bisa menonaktifkan JavaScript secara global
      Meski begitu, ke depannya sepertinya aku tetap harus membiarkannya nonaktif secara default karena kekhawatiran privasi
    • Tidak adakah cara untuk membatasi dengan keras apa yang bisa dilakukan engine JavaScript?
  • Untungnya nama perangkatku biasanya seperti “xxxs's MacBook Pro (34)”. Bukan bug, tapi fitur

    • Atur username laptop menjadi user, dan hostname menjadi hostname. Semakin banyak orang yang melakukan ini, semakin baik
  • Menarik, tulisannya bagus, dan ada proof of concept yang layak juga. Bagus sekali
    Sebagai langkah balasan yang lucu, hostname perangkat bisa diubah menjadi sesuatu seperti atemptingurl.local agar penyerang tergoda mengunjungi situs itu. Halaman tersebut lalu dirancang dengan cermat untuk menjalankan teknik yang sama terhadap penyerang, sambil menampilkan pesan seperti ini:
    “Halo [nama perangkat si peretas]! Informasi mesin Anda, alamat IP, lokasi geografis, dan data sidik jari lainnya telah dikumpulkan dan dilaporkan ke [masukkan nama lembaga siber yang terdengar menyeramkan].” Bahkan kalau mereka veteran berpengalaman dan bukan script kiddie, setidaknya itu bisa bikin mereka tertawa
    Orang-orang butuh lebih banyak alasan untuk tertawa :-)

    • Untuk melakukan itu, Anda harus menjalankan server HTTP dengan CORS terbuka penuh. Itu berarti Anda juga mengekspos diri pada semua bug di server HTTP yang dipilih, jadi keamanan Anda sendiri ikut menurun