- 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à GitHub và Mastodon
- 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.com và kho 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ã
㊷
- Màu đỏ là
- 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
Ý 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
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ũ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
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
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 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ữ
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
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
Tôi nghĩ đến đoạn mã như
if someCondition(getFoo()) then doSomethingWith(getFoo()), hoặc gọidoAnotherThingWith(getFoo())saudoSomethingWith(getFoo()). Những kiểu này, khác với cách lấy giá trị một lần bằngfoo := 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
qrcoderồi chạy mã bên dưới là đượcThực sự sẽ tạo ra mã QR kép chứa
foovàbar, nhưng trên HN không dùng được Unicode, còn nếu thay bằng8hoặc0thì điện thoại của tôi không nhận ra, nên khó dán nguyên vào đóDùng cho trò truy tìm kho báu thì có vẻ rất hay
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