2 poin oleh GN⁺ 2025-01-24 | 1 komentar | Bagikan ke WhatsApp
  • Berangkat dari eksperimen kode QR bersudut milik Guy Dupont, Christian Walther mengimplementasikan kode QR yang bahkan tanpa lensa dapat terbaca sebagai tujuan berbeda tergantung kondisi pemindaian
  • Struktur intinya adalah masker papan catur yang menumpuk 2 kode QR berukuran sama lalu membagi dan menempatkan tiap piksel
  • Jika pembaca QR mengambil sampel pada pusat piksel yang diperkirakan, saat gambar sedikit bergeser titik sampel bisa lebih banyak jatuh ke salah satu kode sehingga menghasilkan hasil berbeda
  • Dalam eksperimen, pola papan catur bekerja lebih baik daripada garis vertikal atau diagonal, dan tingkat koreksi kesalahan yang tinggi lebih menguntungkan, tetapi hasilnya tetap berbeda antar decoder
  • Ini menunjukkan bahwa satu gambar QR pun bisa ditafsirkan menjadi beberapa hasil tergantung sudut, pergeseran, implementasi decoder, serta cara penanganan warna dan kanal alfa

Kode QR ganda yang dibuat tanpa lensa

  • Guy Dupont bereksperimen dengan kode QR yang mengarah ke sumber berbeda tergantung sudut, dengan ide “sudut pandang berbeda dari cerita yang sama”
  • Christian Walther mencoba pertanyaan “apakah ini bisa dilakukan tanpa lensa” dari ide tersebut, dan mengatakan bahwa ia berhasil membuat gambar QR yang benar-benar berfungsi
  • Dupont menanggapi bahwa dari hasil Walther, ia membaca dua tujuan: GitHub dan Mastodon
  • Matt Lacey juga mengatakan bahwa di ponselnya URL Mastodon lebih mudah terbaca, tetapi URL GitHub juga bisa dibaca

Susunan yang membagi piksel menjadi dua bagian

  • Metode dasarnya adalah membuat 2 kode QR berukuran sama lalu menumpuknya menjadi satu gambar
    • Setengah dari tiap piksel diambil dari satu kode QR
    • Setengah sisanya diambil dari kode QR lain
  • Dalam penjelasan berikutnya, satu kode dibuat terlihat pada kuadran kiri atas dan kanan bawah tiap piksel, sedangkan kode lain terlihat di area sisanya
  • Disebutkan bahwa cara pembuatannya kemungkinan dengan mengisi masker layer pola papan catur di Photoshop

Mengapa hasil pemindaian bisa terbelah

  • Walther berasumsi bahwa pembaca QR melakukan sampling di bagian tengah dari posisi piksel yang diperkirakan berdasarkan blok penyelarasan
  • Jika semua piksel memakai masker yang sama dan pusat piksel berada tepat di atas batas masker, bahkan pergeseran kecil pun dapat membuat titik sampel bersama-sama condong ke area salah satu kode
  • Akibatnya, gambar yang sama bisa terbaca sebagai kode QR yang berbeda tergantung besar pergeserannya
  • Walther sendiri menegaskan bahwa penjelasan sampling ini adalah dugaan, bukan hasil penelitian atas cara kerja decoder yang sebenarnya
  • Seorang pengguna mengatakan bahwa ketika PNG dimasukkan langsung ke decoder zbar-tools, kodenya tidak terdeteksi

Perbedaan yang ditimbulkan masker dan decoder

  • Dalam eksperimen Walther, masker papan catur memberi hasil lebih baik daripada garis vertikal atau diagonal
  • Penggunaan koreksi kesalahan tingkat tertinggi bekerja lebih baik, tetapi ia mengatakan eksperimen tambahan masih diperlukan
  • Pembagian diagonal terlihat lebih bagus, tetapi dari sisi kerja nyata papan catur lebih unggul
  • Perbedaan frekuensi hasil juga dilaporkan antara aplikasi pemindai dan aplikasi kamera bawaan
    • Seorang pengguna mengatakan bahwa di aplikasi pemindai QR tautan Mastodon lebih sering muncul, sedangkan di aplikasi kamera bawaan keduanya tampak sama-sama mungkin
    • Attie Grande mengatakan tampaknya juga ada variabilitas antar decoder perangkat lunak
  • Hadley mengatakan bahwa saat ponsel dipegang diam, kode tidak terpindai, tetapi ketika mulai digerakkan ke sudut lain, kode justru terpindai dengan stabil selama bergerak

Eksperimen turunan dan alat yang dipublikasikan

  • Dalam percakapan tersebut, Walther memperkenalkan dualqrcode.com dan repositori GitHub DualQRCode sebagai versi interaktif
  • xssfox menyebut pendekatan mencari tabrakan yang berdekatan untuk mengurangi jumlah bit yang berbeda, dan mengatakan bahwa mencari perbedaan 30 bit dengan brute force tampak cukup sederhana
  • Walther bereksperimen memilih pola mask yang berbeda untuk dua kode QR agar perbedaannya berkurang, tetapi ketika kedua kode memakai mask yang sama justru selisihnya paling kecil
    • Karena proof of concept awal juga memakai mask 6 yang dipilih otomatis oleh generator untuk kedua kode, dalam kasus itu tidak ada keuntungan tambahan
  • Walther mengatakan bahwa aplikasi kamera iOS di pratinjau real-time hanya menampilkan domain dan baru menunjukkan isi penuh setelah diketuk, sehingga ia sengaja memilih domain yang berbeda

Eksperimen warna, kanal alfa, dan 4 kode

  • Nemo Thorx membagikan eksperimen yang membuat kode QR untuk 42 dalam tiga representasi berbeda lalu menggabungkannya ke kanal RGB
    • Merah adalah 6x9
    • Hijau adalah XLII
    • Biru adalah Forty-two
    • Dalam percakapan lanjutan, dikonfirmasi bahwa kanal alfa berisi kode
  • Walther mengatakan bahwa setelah mengabaikan kanal alfa pada gambar tersebut, ia memahami cara kerjanya
  • Ketika Pixel Dunn mencoba memasukkan beberapa kode lewat pencampuran warna, Walther menilai pendekatan blending warna seperti itu tidak akan berhasil karena decoder tidak bisa memisahkan 4 kode individual
  • Walther mengatakan bahwa ia pernah memasukkan 4 kode dengan memakai blok penyelarasan yang dapat digeser dan kuadran piksel
    • Ia mengatakan bahwa dengan sedikit sekali menggeser target penyelarasan, fokus bisa berpindah ke kuadran piksel yang berbeda
  • Pendekatan dengan latar transparan dan dua set kode yang berubah sesuai tema mungkin saja memungkinkan, tetapi iPhone milik Walther tidak dapat mengenalinya baik pada latar putih maupun hitam, dan baru berfungsi ketika pemrosesan ambang manual diterapkan

1 komentar

 
GN⁺ 2025-01-24
Komentar Hacker News
  • Tampaknya mungkin untuk melakukan serangan di mana layar di tempat umum sedikit mengubah kode QR berdasarkan informasi pengguna saat ini, tetapi dari luar tidak terlihat sangat berbeda
    Misalnya, membuat kode QR yang dicampur setengah-setengah, menentukan target dengan masukan eksternal seperti evaluasi karakteristik berbasis kamera, lalu menyesuaikan warna kode secara halus untuk meningkatkan kemungkinan dikenali ke sisi yang diinginkan
    Penyalahgunaannya bisa berupa menampilkan formulir umpan balik yang berbeda per kelompok populasi untuk memelintir hasil, memiringkan peluang menang hadiah berdasarkan karakteristik identitas seperti ras, usia, atau penampilan, atau mengarahkan hanya orang tertentu ke jaringan Wi‑Fi atau halaman pembayaran yang berbeda
    Dalam lingkungan statis efeknya tampaknya lebih kecil, dan saya tidak langsung terpikir serangan statis yang hanya mengekstrak sebagian pengguna untuk mendapat keuntungan. Kebanyakan orang kemungkinan juga sulit menyadari bahwa kode QR berubah secara dinamis di bawah pencahayaan publik

    • Hal seperti ini bisa diproses jauh lebih diam-diam di sisi server, jadi saya kurang paham apa nilai tambah dari memodifikasi kode QR
      Tempat yang tampaknya realistis untuk teknik peretasan di artikel asli adalah ketika penyerang menempelkan kodenya sendiri di atas kode QR yang sah. Karena kode mana yang terbaca agak acak, sebagian pengguna bisa tetap diarahkan ke tujuan asli sehingga deteksi tertunda, tetapi belum jelas apakah itu akan menutupi kerugian dari berkurangnya trafik ke tautan si penyerang
    • Serangan yang mengubah kode QR publik memang sudah ada di dunia nyata
      Bahkan tidak perlu serumit kode QR ganda seperti ini. Cukup datangi papan petunjuk parkir “bayar lewat ponsel”, tempelkan kode QR sendiri di atas kode “scan untuk bayar”, lalu tunggu informasi kartu kredit masuk
    • Mirip juga, poster dengan kode QR bisa ditempel di dinding ruangan yang memiliki dua bohlam LED. Jika suhu warna kedua bohlam berbeda, hasil decoding bisa berubah tergantung bohlam mana yang menyala
      Cara lain adalah poster yang tidak sepenuhnya datar. Piksel berbeda dibuat sedikit menonjol seperti piramida dan setiap sisinya dicat berbeda, sehingga tergantung sudut pandang, kode QR yang dipindai bisa berbeda
      Salah satu bank besar di Tbilisi memungkinkan nomor IBAN dibagikan lewat kode QR. Secara teori, uang bisa dicuri dengan teknik seperti ini, tetapi dalam praktiknya ada berbagai pengaman seperti aplikasi bank yang menampilkan nama penerima sebelum transfer selesai
    • Saya rasa orang biasa tidak akan sadar meskipun rata-rata kode QR berubah cukup besar. Sebagian besar format yang dapat dibaca mesin terlihat seperti white noise yang tak bisa dibedakan oleh mata manusia
    • Senang penulis juga menjabarkan contoh penyalahgunaannya. Kalau hanya melihat setup-nya, saya mungkin tidak akan memikirkan kegunaan seperti itu
      Di kepala saya, kontrol seperti ini lebih dulu terasa cocok untuk trik sulap, seperti memaksa seseorang memilih kartu tertentu
  • Saya membuat situs web supaya orang bisa mencobanya langsung: https://dualqrcode.com/
    Karena tidak ada metodologi persis dari Christian, di sini dua kode QR digabungkan dengan pola pembagian diagonal ke dalam satu gambar. Jika pola pada posisi yang sama berbeda, sel dibagi diagonal sehingga satu sisi mewakili kode QR pertama dan sisi lainnya mewakili kode QR kedua; jika keduanya hitam atau putih, sel diisi warna solid
    Berkat kemampuan koreksi kesalahan QR code yang tinggi, khususnya level koreksi kesalahan 'H', salah satu URL bisa terbaca tergantung sudut pemindaian. Namun seperti tertulis di UI, hasilnya memang lebih sering condong ke URL kedua

    • Di lingkungan saya ini tidak berhasil. Saya membuat dua tautan BBC dan CNN lalu mencoba dengan aplikasi Android “QR & Barcode Scanner” v2.2.47 dan kamera bawaan iPhone 13, tetapi keduanya tidak bisa membacanya
  • Di iOS, saat gambar ditekan lama tertulis bahwa itu menuju github.com, tetapi pratinjaunya sendiri muncul sebagai Mastodon, dan itu yang paling menarik
    Sepertinya ini berarti kode QR diparse dua kali dan menghasilkan dua hasil berbeda. Tampaknya bisa dipakai untuk menyesatkan sebagian pengguna, meski saya tidak tahu berapa banyak orang yang benar-benar melihat URL di menu dropdown saat menekan lama

    • Kadang saya kerepotan ketika kode QR muncul di layar ponsel yang sedang saya pakai sendiri
      Jadi saya pernah melakukan hal konyol seperti meng-AirDrop screenshot ke laptop lalu memindainya dengan kamera ponsel, atau meminta teman atau keluarga memindai kode di layar ponsel saya dengan ponsel mereka
      Tetapi hari ini saya baru tahu bahwa kalau menekan lama kode QR di screenshot dalam camera roll, iOS langsung mem-parse dan membuka tautannya. Mungkin dulu saya pernah mencoba menekan lama gambar, lalu fiturnya ditambahkan kemudian, atau saya sebenarnya belum pernah mencobanya, atau saya menekan bagian QR code yang aneh. Bagaimanapun, saya senang sekali sekarang tahu bahwa itu bisa dilakukan
    • Sangat mudah membayangkan dua bagian sistem operasi memakai parser QR yang berbeda. Misalnya SmartText memakai satu, sistem gambar memakai yang lain. Sepertinya implementasi koreksi kesalahan masing-masing sedikit berbeda
      Saya rasa hal yang sama juga bisa dibuat dengan kode QR standar yang diberi kesalahan sengaja. Tinggal cari tahu bagaimana masing-masing memperbaiki kesalahan secara berbeda
      Rasanya seperti menemukan bug bug bounty yang tinggal menunggu seseorang mengambilnya
    • Kode QR seharusnya juga menampilkan URL tujuan dalam bentuk teks agar pengguna tahu ke mana mereka pergi. Itu seharusnya berfungsi seperti semacam persetujuan eksplisit
    • Di iOS, saat ditekan lama, tautan default “Open” muncul sebagai Mastodon, dan di menu konteks juga tampil tautan aplikasi “Open in Github”
    • Ini terasa seperti contoh khas situasi ketika fungsi atau metode getter yang sama dipanggil dua kali, padahal kedua panggilan itu semestinya selalu mengembalikan hasil yang sama
      Saya teringat kode seperti if someCondition(getFoo()) then doSomethingWith(getFoo()), atau kode yang memanggil doSomethingWith(getFoo()) lalu doAnotherThingWith(getFoo()). Dibanding pendekatan foo := getFoo() yang mengambil nilainya sekali lalu dipakai, pola seperti ini selalu terasa seperti code smell
  • Jika menggulir ke atas dari posisi awal, Anda bisa melihat versi lentikular

  • Sangat mencolok. iPhone saya cenderung terkunci ke salah satu dari dua hasil itu, dan memutar ponsel membantu mengarahkannya ke satu sisi atau sisi lainnya
    Beberapa kali tautan Mastodon dan tautan GitHub bahkan berkedip bergantian

  • Jika ingin mencobanya sendiri, Anda bisa memakai kode cepat yang saya buat. Instal paket Python qrcode lalu jalankan kode di bawah ini
    Hasilnya memang benar-benar kode QR ganda berisi foo dan bar, tetapi sulit ditempel langsung ke HN karena Unicode tidak didukung, dan jika diganti dengan 8 atau 0, ponsel saya tidak bisa mengenalinya

    import qrcode
    
    bar = qrcode.QRCode(border=0)  
    bar.add_data('bar')  
    bar.make()  
    bar_mat = bar.get_matrix()
    
    foo = qrcode.QRCode(border=0)  
    foo.add_data('foo')  
    foo.make()  
    foo_mat = foo.get_matrix()
    
    for l, r in zip(foo_mat, bar_mat):  
        line = ''  
        for lc, rc in zip(l, r):  
            line = line + (lc and '\u2588' or ' ')  
            line = line + (rc and '\u2588' or ' ')  
        print(line)  
        print(line)  
    
  • Sepertinya keren dipakai untuk perburuan harta karun

    • Bisa juga dibuat agar kode, tautan, atau kunci final hanya didapat jika memiliki hasil dari dua, atau bahkan semua, kode QR
  • Kode QR sangat cocok disalahgunakan seperti URL pendek
    Pada dasarnya itu URL yang tidak bisa dibaca, jadi kita sama sekali tidak tahu akan dibawa ke mana atau berapa kali akan di-redirect. Karena itu saya tidak memakainya

  • Konsep yang sangat keren. Jika fokus pada tujuan akhirnya, ada pendekatan lain juga dengan menaruh switch di tujuan URL
    Caranya dengan me-redirect ke halaman berbeda berdasarkan pengacakan, data pengguna, atau kriteria lain. Jika ingin bereksperimen dengan fitur seperti ini sambil benar-benar mencoba uji stiker di dunia nyata, saya bekerja dengan beberapa perusahaan SaaS dan pekerjaan label variabel, jadi saya bisa berbagi insight, mencetak sampel, atau berkolaborasi