- 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
42dalam 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
㊷
- Merah adalah
- 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
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
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
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
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
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 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
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
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
Saya teringat kode seperti
if someCondition(getFoo()) then doSomethingWith(getFoo()), atau kode yang memanggildoSomethingWith(getFoo())laludoAnotherThingWith(getFoo()). Dibanding pendekatanfoo := getFoo()yang mengambil nilainya sekali lalu dipakai, pola seperti ini selalu terasa seperti code smellJika 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
qrcodelalu jalankan kode di bawah iniHasilnya memang benar-benar kode QR ganda berisi
foodanbar, tetapi sulit ditempel langsung ke HN karena Unicode tidak didukung, dan jika diganti dengan8atau0, ponsel saya tidak bisa mengenalinyaSepertinya keren dipakai untuk perburuan harta karun
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