Quay lại Blog
Du lịchBảo mật

Khoe thẻ lên máy bay là mất tài khoản: chúng tôi đã đo việc che mã QR

Đăng ngày12 min read
Chia sẻ

Một cuống vé tiết lộ được tới đâu

Bắt đầu bằng một vụ có thật đã được ghi nhận, không phải giả định.

Nhà báo an ninh mạng Brian Krebs viết về chuyện này năm 2015. Một độc giả tên Cory thấy bạn mình đăng ảnh thẻ lên máy bay trên Facebook, anh chụp lại màn hình, phóng to phần mã vạch rồi đưa vào một trang giải mã miễn phí trên mạng. Vài giây sau, anh có trong tay thông tin tài khoản khách hàng thường xuyên của người bạn đó.

Chuyện xảy ra tiếp theo mới là điểm chính. Cory có thể xem toàn bộ các chuyến bay sắp tới trong tài khoản ấy, đổi chỗ ngồi của hành khách đã xuất vé, thậm chí hủy bất kỳ chuyến bay nào. Rắc rối hơn, lượng thông tin lộ ra đủ để vượt qua nửa đầu quy trình «quên mã PIN» của hãng hàng không.

Người bạn kia chỉ đơn giản là khoe một tấm ảnh du lịch.

Có một điều gần như ai cũng bỏ sót: mã vạch và mã QR không phải hình trang trí, chúng là vật chứa dữ liệu máy đọc được. Bạn nhìn thấy các ô đen trắng; máy quét nhìn thấy mã đặt chỗ, họ tên, chuyến bay, ngày, số ghế. Khoảng cách đó chính là toàn bộ rủi ro.

Che một nửa là vô ích, và tôi đã đo xem vô ích tới mức nào

Đây là phần tôi muốn viết nhất, vì cách che sai còn nguy hiểm hơn không che — bạn tưởng đã an toàn nên yên tâm đăng lên.

Mã QR được thiết kế kèm khả năng sửa lỗi rất mạnh. Đặc tả cho phép máy quét khôi phục dữ liệu đầy đủ ngay cả khi một phần đáng kể của mã bị hỏng, bẩn hoặc che khuất. Trong đời thực đây là tính năng hữu ích (vé bị gấp, in nhòe vẫn quét được), nhưng đặt vào tình huống «che một nửa chắc ổn» thì nó thành lỗ hổng.

Nên tôi tự đo.

Phải che bao nhiêu diện tích mới thật sự không quét được

Cách làm có thể tái lập. Tôi dùng thư viện qrcode của Python tạo mã QR voucher giả lập — nội dung là một đường dẫn đổi vé kèm mã đặt chỗ và mã xác thực — ở ba mức sửa lỗi M (15 %), Q (25 %) và H (30 %). Mỗi mã trải qua bốn cách che với bảy tỷ lệ diện tích, rồi giải mã bằng QRCodeDetector của OpenCV. Chỉ khi khôi phục nguyên vẹn đường dẫn gốc mới tính là «vẫn đọc được».

Kết quả tệ hơn tôi dự đoán.

Cách che Hỏng từ (M, 15 %) Hỏng từ (Q, 25 %) Hỏng từ (H, 30 %)
Ô đặc ở giữa 15 % diện tích 20 % diện tích 25 % diện tích
Ô đặc ở góc dưới phải 20 % diện tích 25 % diện tích 25 % diện tích
Gạch ngang 10 % diện tích 20 % diện tích 20 % diện tích
Mosaic ở giữa 15 % diện tích 20 % diện tích 25 % diện tích

Cách đọc bảng: tỷ lệ đó là ngưỡng bắt đầu hỏng, thấp hơn mức ấy đều vẫn quét được.

Ba phát hiện đáng ghi nhớ.

Thứ nhất, vé có mức sửa lỗi cao vẫn quét được dù bị che một phần năm diện tích. Ở mức H với 20 % bị che, cả ô đặc ở giữa, ô ở góc lẫn mosaic đều khôi phục thành công. Cái ô vuông trông khá to bạn tô lên mã thực ra chẳng chặn được gì.

Thứ hai, mosaic cho kết quả gần như trùng khớp với tô đặc. Điều này lật ngược cảm giác «làm mờ ít ra cũng hơn không làm gì». Nó không an toàn hơn, chỉ khiến bạn tưởng mình đã xử lý.

Thứ ba, gạch ngang lại là cách hiệu quả nhất trong bốn cách. Ở mức M chỉ cần một vạch chiếm 10 % chiều cao là không quét được nữa. Lý do là vạch ngang cắt qua toàn bộ chiều rộng của mã nên phá hỏng các khối dữ liệu phân tán ở nhiều vùng mã hóa, trong khi ô vuông tập trung một chỗ lại rơi đúng vào phạm vi mà cơ chế sửa lỗi mạnh nhất.

Thành thật mà nói, điểm thứ ba trái ngược với kết luận tôi định viết. Cảnh báo rằng «gạch xóa lên vé không làm vé mất hiệu lực» là đúng — câu đó nói về hiệu lực của vé và khả năng đọc dữ liệu. Nhưng nếu câu hỏi là «cách bôi nào chặn máy quét tốt hơn» thì dữ liệu này trả lời: gạch ngang thắng ô vuông. Khác biệt kiểu này chỉ đo mới biết.

Che ở đâu quan trọng hơn che bao nhiêu

Phát hiện hữu ích nhất đến từ nhóm thử nghiệm cuối cùng.

Ba ô vuông lớn ở các góc mã QR là hoa tiêu định vị (finder pattern), máy quét dựa vào đó để xác định hướng và biên. Tôi che ô góc trên bên trái, kết quả là cả ba mức sửa lỗi đều không giải mã được — trong khi phần đó chỉ chiếm 2,0–3,6 % diện tích toàn ảnh.

Nói cách khác: che 2 % đúng chỗ hơn hẳn che 20 % sai chỗ.

Cũng cần nêu rõ giới hạn của phép đo này. Tôi dùng bộ giải mã của OpenCV, một nội dung duy nhất, một phiên bản mã QR duy nhất. Máy quét thương mại hay camera điện thoại triển khai khác nhau, khả năng khôi phục có thể mạnh hơn. Vì vậy hãy coi các ngưỡng trên là giới hạn dưới, không phải mức bảo đảm — bộ giải mã của kẻ tấn công ngoài đời nhiều khả năng dễ tính hơn môi trường thử của tôi.

Thực tế chỉ còn một chuẩn: che kín toàn bộ mã bằng khối màu đặc, che tràn ra ngoài mép. Không phải che một góc, không phải kẻ vài vạch, không phải mosaic. Nếu công cụ không cho phép (chẳng hạn chỉ có bút vẽ sẵn trên điện thoại), ít nhất hãy che kín trọn một trong ba ô định vị.

Che không sạch thì coi như chưa che.

Ba lớp rò rỉ trong ảnh chụp khi du lịch

Ảnh chụp màn hình khi đi du lịch chia thành ba lớp, tính chất rủi ro khác hẳn nhau.

Lớp Nguồn thường gặp Rò rỉ cái gì Trường hợp xấu nhất
Lớp 1: chứng từ quét được Voucher Klook/KKday, vé sự kiện, thẻ lên máy bay Chính chứng từ, mã đặt chỗ, manh mối tài khoản tích điểm Bị người khác dùng trước, mất tài khoản
Lớp 2: thông tin định danh dạng chữ Xác nhận Booking.com/Agoda, mã đơn, số phòng Họ tên, ngày lưu trú, địa chỉ chỗ nghỉ Mạo danh gọi cho khách sạn, tấn công phi kỹ thuật
Lớp 3: dữ liệu nhúng trong ảnh Chụp lại màn hình bằng máy khác Tọa độ GPS trong EXIF, giờ chụp, thiết bị Suy ra vị trí hiện tại hoặc nơi ở

Lớp 1 gấp nhất. Giá trị của voucher điện tử nằm ở chính mã đó; bị quét trước thì tới nơi mới biết vé đã dùng. Đã có vụ kẻ gian lấy ảnh vé sự kiện đăng trên mạng, chỉnh sửa rồi lừa người muốn mua — nạn nhân không chỉ là người đăng ảnh.

Lớp 2 trông vô hại nhưng là nhiên liệu cho tấn công phi kỹ thuật. Họ tên cộng ngày lưu trú cộng tên cơ sở là đủ để gọi tới lễ tân mạo danh bạn đổi đặt phòng, hoặc ngược lại giả danh khách sạn gọi cho bạn yêu cầu «xác nhận lại thẻ». Loại lừa đảo này tăng mạnh vào mùa cao điểm.

Lớp 3 hay bị bỏ sót nhất. Ảnh chụp màn hình điện thoại thường không có GPS, nhưng nếu bạn dùng một máy khác chụp lại màn hình thì tấm ảnh đó mang tọa độ nơi bạn đứng lúc chụp. Chuyện này xảy ra nhiều hơn ta tưởng khi cần gửi màn hình máy tính cho ai đó.

Vậy muốn cho bạn đồng hành xem lịch trình thì làm sao

Đây là câu hỏi thực tế nhất. Thông tin hành trình vốn cần chia sẻ: bạn đồng hành phải biết giờ tập trung, nội dung vé, địa chỉ chỗ ở.

Thứ tự ưu tiên như sau:

Lựa chọn đầu tiên là dùng tính năng chia sẻ có sẵn của nền tảng. Klook, KKday, Traveloka và phần lớn nền tảng đều hỗ trợ chia sẻ hoặc chuyển đơn cho người đi cùng. Đi đường chính thức thì hiệu lực chứng từ do nền tảng quản lý, không sinh ra tấm ảnh trôi nổi khắp nơi.

Lựa chọn thứ hai là gửi chữ, không gửi ảnh. «26/9, 9 giờ sáng, cổng chính, vé mình cầm» — câu này chứa đủ mọi thông tin cần thiết, rủi ro bằng không.

Lựa chọn thứ ba mới là chia sẻ ảnh, và phải có bảo vệ. Nếu thật sự cần gửi hình (bảng lịch trình phức tạp, ảnh bản đồ), hãy dùng cách có kiểm soát truy cập, đừng dán vào bài đăng công khai.

Với lpic.cc, bạn có thể đặt mật khẩu xem ngay khi tải lên, liên kết rút gọn dù bị chuyển tiếp thì người không có mật khẩu cũng không mở được. Mật khẩu được lưu dưới dạng băm bcrypt chứ không so sánh văn bản thuần. Với ảnh lịch trình «chỉ muốn cho năm người này xem», cách này kiểm soát tốt hơn nhiều so với ném vào nhóm để nó tự do lan truyền.

Giới hạn vẫn phải nói trước: ảnh tối đa 8 MB, tệp giữ 30 ngày kể từ lần xem cuối, và tệp tải lên được tối ưu tự động nên bản gốc không được giữ lại. Ngoài ra — mật khẩu chặn được người không nên xem, nhưng không chặn được người có quyền xem chụp màn hình rồi chuyển tiếp. Mọi cơ chế chia sẻ đều có trần này. Đừng coi nó là vạn năng.

Tuyến phòng thủ cuối cùng vẫn là câu cũ: chứng từ thật sự nhạy cảm thì ngay từ đầu đừng biến nó thành tệp ảnh.

Câu hỏi thường gặp

Q1: Tôi đăng ảnh thẻ lên máy bay từ lâu rồi, giờ xóa có tác dụng không?

Xóa giúp giảm phơi bày về sau, nhưng không thể giả định là chưa ai lưu lại. Quan trọng hơn là hai việc khác: đổi ngay mật khẩu và câu hỏi bảo mật của tài khoản hãng hàng không đó, đồng thời kiểm tra các đặt chỗ sắp tới xem có bị thay đổi không. Trong vụ của Krebs, việc đầu tiên kẻ tấn công làm được chính là đổi ghế và hủy chuyến.

Q2: Voucher Klook của tôi bị người khác quét mất thì tới nơi còn vào được không?

Tùy loại vé. Voucher dùng một lần đã bị dùng trước thì tới nơi sẽ hiện trạng thái đã sử dụng. Trường hợp này phải liên hệ ngay bộ phận hỗ trợ của nền tảng, nhưng kết quả không được bảo đảm và mùa cao điểm thì phản hồi rất chậm. Đây là lĩnh vực mà phòng ngừa vượt xa khắc phục.

Q3: Làm mờ mosaic mã QR có đủ không?

Không đủ, và tôi đã đo. Ở cả ba mức sửa lỗi, ngưỡng hỏng của mosaic và tô đặc trùng nhau — vé mức sửa lỗi cao phải che tới 25 % diện tích mới không quét được. Hãy dùng khối màu đặc phủ trọn vùng mã, hoặc tốt hơn là che vật lý ngay lúc chụp.

Q4: Xác nhận đặt phòng chỉ có mã đơn và tên thì có rủi ro không?

Có. Tên cộng mã đơn ở một số nền tảng là đủ để tra trạng thái đặt chỗ, thêm ngày lưu trú nữa thì thành bộ nguyên liệu hoàn chỉnh cho tấn công phi kỹ thuật. Khuôn mẫu lặp lại trong các vụ thật là: kẻ tấn công không cần mật khẩu của bạn, chỉ cần gom đủ mảnh thông tin để thuyết phục nhân viên hỗ trợ.

Q5: Còn bản thân ảnh du lịch thì sao?

Rủi ro khác về bản chất. Với ảnh, vấn đề chính là tọa độ GPS trong EXIF. Phần lớn mạng xã hội xóa EXIF khi tải lên, nhưng chia sẻ qua ổ đám mây hoặc gửi «tệp gốc» thì thường giữ nguyên vẹn. Cách xử lý của từng dịch vụ nằm trong báo cáo kiểm tra EXIF theo từng trường trên 8 dịch vụ.

Nguồn tham khảo

#mã QR#thẻ lên máy bay#riêng tư khi du lịch#voucher điện tử#chiếm tài khoản#rò rỉ thông tin#kiểm thử bảo mật
K

Tác giả

Kevin Wu

Chuyên gia bảo mật

Chuyên gia về quyền riêng tư và bảo mật dữ liệu