2 điểm bởi GN⁺ 2025-01-24 | 1 bình luận | Chia sẻ qua WhatsApp
  • Xuất phát từ thí nghiệm mã QR theo từng góc nhìn của Guy Dupont, Christian Walther đã triển khai một mã QR có thể được đọc thành các đích khác nhau tùy theo điều kiện quét, ngay cả khi không dùng thấu kính
  • Cấu trúc cốt lõi là mặt nạ bàn cờ, trong đó 2 mã QR cùng kích thước được chồng lên nhau rồi từng pixel được chia ra để bố trí
  • Nếu trình đọc QR lấy mẫu tại tâm pixel dự kiến, khi hình ảnh dịch chuyển một chút, các điểm lấy mẫu có thể dồn về phía một mã, tạo ra kết quả khác
  • Trong thí nghiệm, mặt nạ bàn cờ hoạt động tốt hơn các sọc dọc hoặc sọc chéo; mức sửa lỗi cao có lợi hơn, nhưng vẫn có khác biệt kết quả giữa các decoder
  • Cho thấy ngay cả một ảnh QR duy nhất cũng có thể được diễn giải thành nhiều kết quả tùy theo góc, độ dịch chuyển, cách triển khai decoder, cũng như cách xử lý màu và kênh alpha

Mã QR kép được tạo không cần thấu kính

  • Guy Dupont đã thử nghiệm mã QR đưa người dùng đến nguồn khác nhau tùy theo góc nhìn, dựa trên ý tưởng “những góc nhìn khác nhau của cùng một câu chuyện”
  • Christian Walther thử xem ý tưởng này “có thể làm được mà không cần thấu kính không” và cho biết đã tạo được một ảnh QR thực sự hoạt động
  • Dupont phản hồi rằng từ kết quả của Walther, ông đọc được hai đích là GitHubMastodon
  • Matt Lacey cũng cho biết trên điện thoại của mình, URL Mastodon bắt dễ hơn, nhưng URL GitHub cũng đọc được

Cấu trúc chia đôi từng pixel

  • Cách cơ bản là tạo 2 mã QR cùng kích thước rồi chồng chúng thành một ảnh
    • Một nửa của mỗi pixel lấy từ một mã QR
    • Nửa còn lại lấy từ mã QR kia
  • Trong phần giải thích sau đó, một mã được hiển thị ở góc phần tư trên-trái và dưới-phải của từng pixel, còn mã kia hiển thị ở các vùng còn lại
  • Có nhắc đến khả năng cách tạo là dùng Photoshop để tô một layer mask dạng họa tiết bàn cờ

Vì sao kết quả quét bị phân tách

  • Walther giả định rằng trình đọc QR lấy mẫu phần trung tâm của vị trí pixel dự kiến dựa trên các khối căn chỉnh
  • Nếu dùng cùng một mặt nạ cho mọi pixel và tâm pixel nằm trên ranh giới mặt nạ, chỉ cần một dịch chuyển nhỏ cũng có thể khiến các điểm lấy mẫu đồng loạt lệch sang vùng của một mã
  • Kết quả là cùng một ảnh có thể được đọc thành các mã QR khác nhau tùy theo lượng dịch chuyển
  • Walther cũng nói rõ rằng lời giải thích về lấy mẫu này là suy đoán, không phải kết quả nghiên cứu hoạt động thực tế của decoder
  • Một người dùng cho biết khi đưa trực tiếp PNG vào decoder zbar-tools, nó không phát hiện được mã

Khác biệt do mặt nạ và decoder tạo ra

  • Trong thí nghiệm của Walther, mặt nạ bàn cờ cho kết quả tốt hơn sọc dọc hoặc sọc chéo
  • Khi dùng mức sửa lỗi cao nhất thì hoạt động tốt hơn, nhưng ông nói cần thí nghiệm thêm
  • Chia theo đường chéo trông đẹp hơn, nhưng xét về hoạt động thực tế thì bàn cờ vượt trội
  • Cũng có báo cáo về khác biệt tần suất kết quả giữa ứng dụng quét và ứng dụng camera mặc định
    • Một người dùng cho biết trong ứng dụng quét mã QR, liên kết Mastodon xuất hiện thường xuyên hơn, còn trong ứng dụng camera mặc định thì có vẻ cả hai đều khả thi
    • Attie Grande nói dường như cũng có biến động giữa các decoder phần mềm
  • Hadley cho biết khi giữ yên điện thoại thì không quét được, nhưng khi bắt đầu di chuyển sang góc khác, mã được quét ổn định trong lúc đang di chuyển

Thử nghiệm biến thể và công cụ công khai

  • Trong cuộc trao đổi, Walther giới thiệu dualqrcode.comkho GitHub DualQRCode như một phiên bản tương tác
  • xssfox nhắc đến cách tìm các va chạm gần nhau để giảm số bit khác nhau, và nói việc tìm khác biệt 30 bit bằng brute force trông khá đơn giản
  • Walther đã thử chọn các mẫu mặt nạ khác nhau cho hai mã QR để giảm khác biệt, nhưng cho biết trường hợp dùng cùng một mặt nạ cho cả hai mã có khác biệt nhỏ nhất
    • Proof of concept ban đầu cũng dùng mask 6 do bộ tạo tự động chọn cho cả hai mã, nên trong trường hợp này không có thêm lợi ích
  • Walther nói ứng dụng Camera của iOS trong phần xem trước thời gian thực chỉ hiển thị domain và phải chạm mới xem toàn bộ nội dung, nên ông cố ý chọn các domain khác nhau

Kênh màu, alpha và thử nghiệm 4 mã

  • Nemo Thorx chia sẻ một thí nghiệm tạo mã QR cho 42 được biểu diễn theo ba cách và gộp chúng vào các kênh RGB
    • Màu đỏ là 6x9
    • Màu xanh lá là XLII
    • Màu xanh dương là Forty-two
    • Trong cuộc trao đổi sau đó, xác nhận rằng kênh alpha có mã
  • Walther nói ông hiểu cách ảnh đó hoạt động sau khi bỏ qua kênh alpha
  • Khi Pixel Dunn cố đưa nhiều mã vào bằng cách pha màu, Walther cho rằng kiểu blending màu như vậy sẽ không hoạt động vì decoder không thể tách ra 4 mã riêng lẻ
  • Walther cho biết ông từng đưa 4 mã vào bằng khối căn chỉnh có thể di chuyển và các góc phần tư của pixel
    • Nếu di chuyển mục tiêu căn chỉnh đi một chút, tiêu điểm sẽ rơi vào một góc phần tư khác của pixel
  • Cách dùng nền trong suốt và thay đổi hai bộ mã tùy theo theme có thể khả thi, nhưng iPhone của Walther không nhận diện được trên cả nền trắng lẫn nền đen, và chỉ hoạt động khi áp dụng xử lý ngưỡng thủ công

1 bình luận

 
GN⁺ 2025-01-24
Ý kiến trên Hacker News
  • Có vẻ có thể có một kiểu tấn công trong đó màn hình ở nơi công cộng thay đổi nhẹ mã QR dựa trên thông tin của người dùng hiện tại, nhưng nhìn bề ngoài thì không khác biệt đáng kể
    Ví dụ, tạo một mã QR trộn nửa này nửa kia, xác định mục tiêu bằng đầu vào bên ngoài như đánh giá đặc tính dựa trên camera, rồi tinh chỉnh màu của mã để tăng xác suất nó được nhận dạng theo hướng mong muốn
    Các cách lạm dụng có thể là hiển thị biểu mẫu phản hồi khác nhau cho từng nhóm dân số để bóp méo kết quả, làm lệch xác suất trúng thưởng theo các đặc điểm nhận dạng như chủng tộc, tuổi tác, ngoại hình, hoặc chỉ gửi một số người nhất định đến mạng Wi-Fi hay trang thanh toán khác
    Trong môi trường tĩnh thì hiệu quả kém hơn, và tôi chưa nghĩ ngay ra một cuộc tấn công tĩnh nào có thể tách riêng một số người dùng để thu lợi. Dưới ánh sáng công cộng, có lẽ đa số sẽ khó nhận ra mã QR đang thay đổi động

    • Những việc như vậy có thể xử lý kín đáo hơn nhiều ở phía máy chủ, nên tôi không rõ việc chỉnh sửa mã QR bổ sung được gì
      Kỹ thuật hack trong bài gốc có vẻ hữu dụng trong trường hợp kẻ tấn công dán mã của mình lên trên mã QR hợp lệ. Việc mã nào được đọc có phần ngẫu nhiên, nên một số người dùng vẫn được đưa đến đích ban đầu, làm chậm quá trình phát hiện; nhưng không chắc điều đó có bù được thiệt hại do lưu lượng vào liên kết của kẻ tấn công giảm hay không
    • Các cuộc tấn công thay mã QR công khai vốn đã có thật rồi
      Cũng chẳng cần tinh vi như kiểu mã QR kép này. Chỉ cần đến biển “thanh toán bằng điện thoại” ở bãi đỗ xe, dán mã QR của mình lên trên mã QR “quét để thanh toán”, rồi chờ thông tin thẻ tín dụng đi vào là được
    • Tương tự, có thể dán một poster có mã QR lên tường trong phòng có hai bóng đèn LED. Nếu nhiệt độ màu của hai bóng khác nhau, kết quả giải mã có thể thay đổi tùy theo bóng nào đang bật
      Một cách khác là dùng poster không hoàn toàn phẳng. Làm các pixel khác nhau hơi nhô lên dạng kim tự tháp và tô màu khác nhau cho từng mặt, thì tùy góc nhìn, mã QR có thể được quét thành mã khác nhau
      Một trong các ngân hàng lớn ở Tbilisi cho phép chia sẻ số IBAN bằng mã QR. Về lý thuyết, có thể dùng kỹ thuật này để đánh cắp tiền, nhưng trên thực tế ứng dụng ngân hàng có nhiều lớp an toàn, như hiển thị tên người nhận trước khi hoàn tất chuyển khoản
    • Tôi nghĩ người bình thường sẽ không nhận ra ngay cả khi một mã QR trung bình bị thay đổi khá nhiều. Hầu hết các định dạng đọc bằng máy trông với mắt người chỉ như nhiễu trắng không phân biệt được
    • Thích việc họ giải thích cả các trường hợp lạm dụng. Nếu chỉ nhìn phần thiết lập thì có lẽ tôi đã không dễ nghĩ ra các cách dùng như vậy
      Trong đầu tôi, kiểu điều khiển này có thể hoạt động như ép người ta chọn một lá bài cụ thể, nên tôi nghĩ đến trò ảo thuật trước tiên
  • Tôi đã làm một website để mọi người tự thử: https://dualqrcode.com/
    Không có phương pháp chính xác mà Christian dùng, nên ở đây tôi ghép hai mã QR thành một ảnh bằng mẫu chia theo đường chéo. Nếu mẫu ở cùng vị trí khác nhau, ô được chia chéo: một bên biểu thị mã QR thứ nhất, bên kia biểu thị mã QR thứ hai; nếu cả hai đều đen hoặc trắng thì tô một màu
    Nhờ khả năng sửa lỗi cao của mã QR, đặc biệt là mức sửa lỗi ‘H’, tùy góc quét mà một trong hai URL đều có thể được đọc. Tuy vậy, như đã ghi trong UI, nó thường nghiêng về URL thứ hai hơn

    • Trên môi trường của tôi thì không hoạt động. Tôi tạo hai liên kết BBC và CNN, thử bằng ứng dụng “QR & Barcode Scanner” v2.2.47 trên Android và camera mặc định của iPhone 13, nhưng cả hai đều không đọc được
  • Trên iOS, khi nhấn giữ ảnh thì nó hiển thị sẽ đi đến github.com, nhưng bản xem trước lại hiện Mastodon; đó là điểm tôi thấy thú vị nhất
    Có vẻ nghĩa là mã QR được phân tích hai lần và cho ra hai kết quả khác nhau. Có thể dùng để đánh lừa một số người dùng, nhưng tôi không biết có bao nhiêu người thực sự nhìn URL trong menu thả xuống khi nhấn giữ

    • Đôi khi tôi gặp tình huống khó xử là mã QR đang hiện ngay trên màn hình điện thoại mình đang xem
      Vì vậy tôi đã làm những việc ngớ ngẩn như AirDrop ảnh chụp màn hình sang laptop rồi dùng camera điện thoại để quét, hoặc nhờ điện thoại của bạn bè/người nhà quét mã trên màn hình điện thoại của tôi
      Nhưng hôm nay tôi mới biết rằng nếu nhấn giữ mã QR trong ảnh chụp màn hình ở camera roll, nó sẽ phân tích ngay và mở liên kết. Hình như trước đây tôi từng thử nhấn giữ ảnh rồi, nhưng có thể tính năng này được thêm sau đó, hoặc tôi chưa thực sự thử, hoặc tôi đã nhấn nhầm vào phần không đúng của mã QR. Dù sao thì biết là làm được như vậy thật tuyệt
    • Hoàn toàn có thể tưởng tượng hai phần của hệ điều hành dùng hai trình phân tích QR khác nhau. SmartText dùng một cái, hệ thống ảnh dùng một cái khác. Có vẻ mỗi bên triển khai sửa lỗi hơi khác nhau
      Có lẽ chỉ với mã QR tiêu chuẩn có chèn lỗi có chủ ý cũng tạo được chuyện tương tự. Chỉ cần tìm ra chúng sửa lỗi khác nhau thế nào
      Có vẻ đã phát hiện một lỗi bug bounty đang chờ ai đó nhặt lấy
    • Mã QR nên hiển thị cả URL đích dưới dạng văn bản để người dùng biết mình sẽ đi đâu. Nó nên hoạt động như một dạng đồng ý rõ ràng
    • Trên iOS, khi nhấn giữ, liên kết “Open” mặc định hiện là Mastodon, còn trong menu ngữ cảnh cũng hiển thị liên kết ứng dụng “Open in Github”
    • Đây có vẻ là ví dụ điển hình của tình huống gọi cùng một hàm hoặc getter hai lần, trong khi hai lần gọi bắt buộc phải trả về cùng một kết quả
      Tôi nghĩ đến đoạn mã như if someCondition(getFoo()) then doSomethingWith(getFoo()), hoặc gọi doAnotherThingWith(getFoo()) sau doSomethingWith(getFoo()). Những kiểu này, khác với cách lấy giá trị một lần bằng foo := getFoo(), luôn để lại mùi mã
  • Nếu cuộn lên từ vị trí bắt đầu, bạn có thể xem phiên bản lenticular

  • Rất ấn tượng. iPhone của tôi có xu hướng khóa vào một trong hai, và xoay điện thoại giúp nó đi về phía này hoặc phía kia
    Có vài lần liên kết Mastodon và GitHub còn nhấp nháy luân phiên

  • Nếu muốn tự thử, bạn có thể dùng đoạn mã viết nhanh này. Cài gói Python qrcode rồi chạy mã bên dưới là được
    Thực sự sẽ tạo ra mã QR kép chứa foobar, nhưng trên HN không dùng được Unicode, còn nếu thay bằng 8 hoặc 0 thì điện thoại của tôi không nhận ra, nên khó dán nguyên vào đó

    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)  
    
  • Dùng cho trò truy tìm kho báu thì có vẻ rất hay

    • Cũng có thể thiết kế sao cho phải có kết quả của hai mã, hoặc tất cả mã QR, mới lấy được mã cuối cùng/liên kết/khóa
  • Mã QR rất dễ bị lạm dụng giống như URL rút gọn
    Về bản chất, đó là một URL không đọc được, nên bạn hoàn toàn không biết nó sẽ đưa mình đến đâu hay sẽ bị chuyển hướng bao nhiêu lần. Vì vậy tôi không dùng

  • Một ý tưởng thật sự thú vị. Nếu tập trung vào mục tiêu cuối cùng, cũng có một cách tiếp cận khác là đặt công tắc ở đích URL
    Tức là chuyển hướng đến các trang khác nhau dựa trên ngẫu nhiên hóa, dữ liệu người dùng hoặc các tiêu chí khác. Nếu muốn thử nghiệm tính năng này và cả kiểm thử sticker thực tế, tôi đang làm việc về nhãn biến đổi với nhiều công ty SaaS, nên có thể chia sẻ insight, in mẫu hoặc hợp tác