- Salt Labs đã phát hiện khả năng chiếm đoạt tài khoản trên các dịch vụ siêu lớn được hàng trăm triệu người dùng sử dụng như Booking.com, Grammarly, Vidio, Bukalapak và framework di động Expo thông qua các lỗ hổng trong cách triển khai OAuth.
- OAuth về bản chất là một giao thức an toàn, nhưng cách triển khai có thể tạo ra những lỗ hổng nghiêm trọng.
- Booking.com
- Trong triển khai Facebook OAuth có vấn đề cho phép thay đổi
redirect_uri sang một đường dẫn khác trên cùng host.
- Bên trong booking.com có một endpoint sẽ chuyển hướng đến địa chỉ được cung cấp dưới dạng base64.
- Kết hợp hai điểm này có thể thao túng để token OAuth được chuyển tới một địa chỉ khác.
- Trên bản web, quá trình đăng nhập có kiểm tra
redirect_uri nên không bị lỗ hổng, nhưng trên bản di động lại có vấn đề cho phép thao túng cả redirect_uri, khiến việc chiếm đoạt tài khoản trở nên khả thi.
- Nói cách khác, đây là lỗ hổng mà người dùng chỉ cần nhấp vào một liên kết trông hoàn toàn hợp lệ và thực hiện OAuth bình thường thì tài khoản có thể bị chiếm đoạt.
- Expo
- Lỗ hổng được phát hiện trong triển khai OAuth tích hợp sẵn của framework di động Expo.
- Trong quá trình triển khai này,
returnUrl chứa liên kết riêng của ứng dụng Expo dạng exp://~~, nhưng có vấn đề cho phép chèn địa chỉ web như hTTps://~~ vào đó.
https:// vốn được chặn nhập, nhưng có thể vượt qua chỉ bằng cách đổi chữ hoa/thường.
- Khi đó, thông tin
returnUrl được lưu vào cookie tên RU, và sau khi OAuth hoàn tất thì máy chủ OAuth của Expo sẽ đọc cookie này để thực hiện chuyển hướng.
- Tuy nhiên, trước khi chuyển từ Expo sang Facebook sẽ hiện cảnh báo kiểu
https://~~ 를 신뢰하는 경우..., và người dùng phải chấp nhận nó.
- Để vượt qua, họ dùng cách tự động mở 2 liên kết.
- Mở liên kết thứ nhất rồi đóng ngay để chỉ thiết lập cookie RU.
- Liên kết thứ hai cung cấp trực tiếp liên kết Facebook OAuth để bỏ qua thông báo cảnh báo RU.
- Bằng cách này, họ đã thành công trong việc chiếm đoạt tài khoản trên Codecademy.com.
- Lỗ hổng được gán mã CVE-2023-28131, và đội ngũ Expo đã khắc phục vấn đề chỉ trong vài giờ sau báo cáo đầu tiên.
- Grammarly, Vidio, Bukalapak
- Cả 3 trang đều có thể bị chiếm đoạt tài khoản theo cùng một cách.
- Trước tiên, tạo một website hợp lệ để thu thập token đăng nhập Facebook.
- Sau đó, với Vidio và Bukalapak, nếu đưa vào token do Facebook cấp (được tạo cho một website khác) thì vẫn đăng nhập thành công.
- Đây là lỗ hổng xảy ra do không kiểm tra App ID của token Facebook. (tấn công tái sử dụng token)
- Grammarly hơi khác vì dùng code thay vì token, nên không có lỗ hổng trên theo cách đó.
- Tuy nhiên, họ xác nhận rằng nếu gửi token tới API truyền code với tên
"access_token" thay vì "code" thì vẫn đăng nhập được.
- Vì vậy, cả 3 trang đều có thể bị chiếm đoạt tài khoản ngay lập tức nếu người dùng thực hiện liên kết Facebook trên một website hợp lệ khác.
- Khi triển khai OAuth, cần xác định các điểm có thể phát sinh lỗ hổng bảo mật và thực hiện kiểm tra chặt chẽ, tỉ mỉ trong mọi bước xử lý để phòng ngừa.
3 bình luận
Thật đáng báo động. Chúng ta thực sự phải cẩn thận.
Hóa ra có khá nhiều trang web cực lớn cũng có rất nhiều lỗ hổng kiểu này hơn mình tưởng.
Đúng là đây có vẻ là một tính năng cần được xử lý hết sức cẩn thận.
Mình cũng nghĩ là nên dùng thư viện xác thực...,
nhưng nhìn vào trường hợp của Expo thì có vẻ ngay cả như vậy cũng vẫn cần tự kiểm chứng.