- Guy Dupont’un açıya göre değişen QR kodu deneyinden yola çıkarak Christian Walther, tarama koşullarına bağlı olarak lens olmadan da farklı hedefler olarak okunan bir QR kodu gerçekleştirdi
- Temel yapı, aynı boyutta 2 QR kodunu üst üste koyup her pikseli bölerek yerleştiren bir dama tahtası maskesi
- QR okuyucu beklenen piksel merkezini örnekliyorsa, görüntü biraz kaydığında örnek noktaları bir kodun tarafına yığılıp farklı bir sonuç üretebilir
- Deneylerde dama tahtası, dikey ve çapraz çizgilerden daha iyi çalıştı; yüksek hata düzeltme seviyesi avantaj sağladı, ancak dekoderler arasında sonuç farklılıkları sürüyor
- Tek bir QR görüntüsünün bile açı, kayma, dekoder uygulaması, renk ve alfa kanalı işleme biçimine göre birden fazla sonuç olarak yorumlanabileceğini gösteriyor
Lens olmadan yapılan çift QR kodu
- Guy Dupont, “aynı hikâyeye farklı bir bakış açısı” fikriyle açıya göre farklı kaynaklara gönderen QR kodlarını denedi
- Christian Walther bu fikirden hareketle “lens olmadan da mümkün mü?” sorusunu denediğini ve gerçekten çalışan bir QR görüntüsü oluşturduğunu açıkladı
- Dupont, Walther’in sonucunda GitHub ve Mastodon olmak üzere iki hedefi okuduğunu söyledi
- Matt Lacey de kendi telefonunda Mastodon URL’sinin daha iyi yakalandığını, ancak GitHub URL’sinin de okunduğunu söyledi
Pikselleri yarı yarıya bölen yapı
- Temel yöntem, aynı boyutta 2 QR kodu oluşturup bunları tek bir görüntüde üst üste bindirmek
- Her pikselin yarısı bir QR kodundan alınıyor
- Kalan yarısı diğer QR kodundan alınıyor
- Sonraki açıklamada, bir kodun her pikselin sol üst ve sağ alt çeyreğinde, diğer kodun ise kalan alanlarda görünecek şekilde yapıldığı belirtiliyor
- Üretim yöntemi olarak Photoshop’ta dama tahtası desenli katman maskesi doldurulmuş olabileceği dile getiriliyor
Tarama sonuçlarının ayrışma nedeni
- Walther, QR okuyucunun hizalama bloklarını temel alarak beklenen piksel konumlarının merkezini örneklediğini varsayıyor
- Tüm piksellerde aynı maske kullanıldığında ve piksel merkezi maske sınırının üzerine denk geldiğinde, küçük bir kaymada bile örnek noktaları birlikte bir kod alanına doğru kayabilir
- Bunun sonucunda aynı görüntü, kayma miktarına bağlı olarak farklı QR kodları şeklinde okunabilir
- Walther, bu örnekleme açıklamasının gerçek dekoder davranışını araştırmasının sonucu değil, tahmin olduğunu kendisi de belirtiyor
- Bir kullanıcı, PNG’yi doğrudan
zbar-toolsdekoderine verdiğinde kodu algılayamadığını söyledi
Maske ve dekoderin yarattığı farklar
- Walther’in deneylerinde dama tahtası maskesi, dikey çizgilerden veya çapraz çizgilerden daha iyi sonuç verdi
- En yüksek düzeyde hata düzeltme kullanıldığında daha iyi çalıştı, ancak ek deneyler gerektiği belirtiliyor
- Çapraz bölme görsel olarak daha hoş olsa da fiilî çalışma açısından dama tahtası önde
- Tarama uygulamaları ile varsayılan kamera uygulaması arasında da sonuç sıklığı farkları bildirildi
- Bir kullanıcı, QR kodu tarayıcı uygulamasında Mastodon bağlantısının daha sık çıktığını, varsayılan kamera uygulamasında ise ikisinin de mümkün göründüğünü söyledi
- Attie Grande, yazılım dekoderleri arasında da değişkenlik var gibi göründüğünü söyledi
- Hadley, telefonu sabit tuttuğunda tarama olmadığını; farklı bir açıya hareket ettirmeye başlayınca hareket sırasında kararlı biçimde tarandığını söyledi
Varyasyon deneyleri ve açık araçlar
- Walther, sohbet sırasında etkileşimli sürüm olarak dualqrcode.com ve DualQRCode GitHub deposu’nu tanıttı
- xssfox, yakın çakışmalar bularak farklı bit sayısını azaltan bir yaklaşımdan söz etti ve 30 bitlik farkı brute force ile bulmanın oldukça basit göründüğünü söyledi
- Walther, farkı azaltmak için iki QR kodunun maske desenlerini farklı seçmeyi denediğini, ancak iki kodda aynı maskeyi kullanmanın farkı en aza indirdiğini söyledi
- Orijinal proof of concept’te de üretici otomatik olarak seçtiği mask 6’yı iki kodun ikisinde de kullandığı için, bu durumda ek bir kazanç olmadığını belirtti
- Walther, iOS Kamera uygulaması gerçek zamanlı önizlemede yalnızca alan adını gösterip tüm içeriği görmek için dokunmayı gerektirdiğinden, özellikle farklı alan adları seçtiğini söyledi
Renk, alfa kanalı ve 4 kod deneyi
- Nemo Thorx,
42’nin üç farklı gösterimini ayrı ayrı QR kodu yapıp bunları RGB kanallarında birleştirdiği bir deneyi paylaştı- Kırmızı
6x9 - Yeşil
XLII - Mavi
Forty-two - Sonraki konuşmada alfa kanalında
㊷kodu olduğu doğrulandı
- Kırmızı
- Walther, ilgili görüntüde alfa kanalını yok sayınca nasıl çalıştığını anladığını söyledi
- Pixel Dunn renk karıştırma ile birden fazla kod eklemeye çalışınca Walther, bu tür renk harmanlamasıyla dekoderin 4 ayrı kodu ayıramayacağı için bunun çalışmayacağını düşündü
- Walther, hareket ettirilebilir hizalama blokları ve piksel çeyreklerini kullanarak 4 kod yerleştirdiği olmuş olduğunu söyledi
- Hizalama hedefini çok az hareket ettirince pikselin farklı bir çeyreğine odaklanıldığını söyledi
- Şeffaf arka plan ve temaya göre iki kod setinin değiştiği bir yöntem mümkün olabilir; ancak Walther’in iPhone’u hem beyaz hem siyah arka planda bunu tanımadı ve yalnızca manuel eşikleme uygulandığında çalıştı
1 yorum
Hacker News yorumları
Kamusal alanlardaki bir ekranın, mevcut kullanıcı hakkındaki bilgilere dayanarak QR kodunu hafifçe değiştirip dışarıdan bakıldığında çok farklı görünmemesini sağlayan bir saldırı mümkün görünüyor
Örneğin yarı yarıya karıştırılmış bir QR kodu oluşturup, kamera tabanlı özellik değerlendirmesi gibi harici girdilerle hedef kişiyi belirledikten sonra, kodun rengini çok küçük ayarlamalarla istenen taraf olarak algılanma olasılığını artırmak gibi
Kötüye kullanım alanları olarak, farklı demografik gruplara farklı geri bildirim formları gösterip sonuçları çarpıtmak; çekiliş kazanma olasılığını ırk, yaş, görünüş gibi tanımlayıcı özelliklere göre kaydırmak; ya da yalnızca belirli kişileri farklı bir Wi‑Fi ağına veya ödeme sayfasına yönlendirmek sayılabilir
Statik ortamlarda etkisi daha az olur; yalnızca bazı kullanıcıları ayıklayıp bundan fayda sağlayan statik bir saldırı da hemen akla gelmiyor. Kamusal aydınlatma altında QR kodunun dinamik olarak değiştiğini çoğu kişinin fark etmesi zor olur gibi
Orijinal saldırı tekniğinin gerçekten işe yarayabileceği yer, saldırganın meşru QR kodunun üzerine kendi kodunu yapıştırdığı durum gibi görünüyor. Hangi kodun okunacağı biraz rastgele olacağından bazı kullanıcıları orijinal hedefe gönderip tespiti geciktirebilir; ama kendi bağlantısına gelen trafiğin azalmasını telafi eder mi, emin değilim
Bunun bu ikili QR kod kadar sofistike olmasına da gerek yok. Bir otoparktaki “telefonla öde” tabelasına gidip “tarayıp öde” QR kodunun üzerine kendi QR kodunuzu yapıştırır, kredi kartı bilgilerinin gelmesini beklersiniz
Bir başka yöntem de tamamen düz olmayan bir poster. Farklı pikselleri hafif piramit biçiminde kabartıp her yüzeyi farklı boyarsanız, bakış yönüne göre QR kodu farklı taranabilir
Tiflis’teki büyük bankalardan biri IBAN numarasını QR koduyla paylaşmaya izin veriyor. Teorik olarak böyle bir teknikle para çalınabilir; ama pratikte banka uygulamasının transfer tamamlanmadan önce alıcı adını göstermesi gibi çeşitli güvenlik önlemleri var
Benim kafamda bu tür bir kontrol, belirli bir kartı zorla seçtirmek gibi çalışabileceğinden önce sihirbazlık numaraları aklıma geldi
Doğrudan deneyebilmeniz için bir web sitesi yaptım: https://dualqrcode.com/
Christian’ın kullandığı tam metodoloji elimde olmadığından, burada iki QR kodunu diyagonal bölme deseniyle tek bir görüntüde birleştirdim. Aynı konumdaki desenler farklıysa hücreyi çapraz ikiye bölüp bir tarafı ilk QR kodunu, diğer tarafı ikinci QR kodunu temsil edecek şekilde ayarlıyor; ikisi de siyah ya da beyazsa düz renkle dolduruyor
QR kodlarının yüksek hata düzeltme kapasitesi, özellikle de hata düzeltme seviyesi ‘H’ sayesinde, tarama açısına göre iki URL’den herhangi biri okunabiliyor. Ancak arayüzde yazdığım gibi ikinci URL tarafına daha sık kayma eğiliminde
iOS’ta görüntüye uzun basınca github.com’a gideceğini göstermesi, ama önizlemenin kendisinin Mastodon olarak çıkması en ilginç kısımdı
QR kodunu iki kez ayrıştırıp farklı sonuçlar aldığı anlamına geliyor gibi. Bazı kullanıcıları yanıltmak için kullanılabilir görünüyor; ama uzun basınca açılan menüdeki URL’ye kaç kişinin baktığını bilmiyorum
Bu yüzden ekran görüntüsünü dizüstü bilgisayarıma AirDrop ile gönderip telefon kamerasıyla taramak ya da bir arkadaşımın veya aileden birinin telefonuyla benim telefonumdaki kodu taratmak gibi aptalca şeyler yaptım
Ama bugün, kamera rulosundaki ekran görüntüsünde QR koduna uzun basınca kodu doğrudan ayrıştırıp bağlantıyı açabildiğini öğrendim. Daha önce görüntüye uzun bastığımı sanıyorum; belki özellik sonradan eklendi, belki gerçekten denememiştim ya da QR kodunun yanlış bir yerine basmıştım. Her hâlükârda bunun mümkün olduğunu öğrenmek çok iyi oldu
Kasıtlı hatalar eklenmiş standart bir QR koduyla da aynı şey yapılabilir gibi. Tek gereken, hataları birbirlerinden nasıl farklı düzelttiklerini bulmak
Birinin almasını bekleyen bir bug bounty açığı bulmuşsunuz gibi
if someCondition(getFoo()) then doSomethingWith(getFoo())gibi kodlar ya dadoSomethingWith(getFoo())çağrısından sonradoAnotherThingWith(getFoo())çağıran kodlar aklıma geliyor. Bunlar, değeri bir kezfoo := getFoo()ile alıp kullanmaktan farklı olarak her zaman kod kokusu bırakırBaşlangıç konumundan yukarı kaydırırsanız lentiküler sürümü görebilirsiniz
Oldukça çarpıcı. Benim iPhone’um ikisinden birine kilitlenme eğilimindeydi; telefonu döndürmek bir tarafa ya da diğer tarafa gitmesine yardımcı oldu
Birkaç kez Mastodon bağlantısı ile GitHub bağlantısı arasında dönüşümlü olarak yanıp söndüğü de oldu
Kendiniz denemek isterseniz hızlıca yazılmış şu kodu kullanabilirsiniz.
qrcodePython paketini kurup aşağıdaki kodu çalıştırmanız yeterlifoovebariçeren ikili QR kodu gerçekten üretiyor; ama HN Unicode’u desteklemiyor ve8ya da0ile değiştirince telefonum tanımadığı için buraya aynen yapıştırmak zorHazine avında kullanılsa harika olur gibi
QR kodları, kısaltılmış URL’ler gibi kötüye kullanılmaya çok uygun
Özünde okunamayan URL’ler oldukları için nereye göndereceklerini, kaç kez yönlendirme yapacaklarını hiç bilemezsiniz. Bu yüzden ben kullanmıyorum
Gerçekten harika bir konsept. Nihai hedefe odaklanırsak, URL hedefinde bir anahtar koymak gibi başka bir yaklaşım da mümkün
Rastgeleleştirme, kullanıcı verisi veya başka ölçütlere göre farklı sayfalara yönlendirme yapmak. Böyle bir işlevi deneyip gerçek çıkartma testleri de yapmak isterseniz, ben birkaç SaaS şirketiyle değişken etiketler üzerinde çalışıyorum; içgörü paylaşabilir, örnek basabilir veya işbirliği yapabilirim