[EX008] Chuỗi khai thác cho phép chiếm quyền kiểm soát tài khoản người dùng Zalo

 

Trong quá trình sử dụng ứng dụng Zalo, một trong những ứng dụng chat phổ biến tại Việt Nam hiện nay (theo thống kê từ Wikipedia, từ tháng 5/2018, Zalo đã đạt mốc 100 triệu người dùng), nhóm Săn mối nguy của VinCSS đã phát hiện một số điểm yếu bảo mật cho phép kẻ xấu có thể hình thành một chuỗi khai thác để chiếm quyền kiểm soát tài khoản Zalo của người dùng.

Ngoài ra, trong chuỗi khai thác này, nhóm cũng đã phát hiện có thể khai thác tiếp ZaloPay, một nền tảng ví điện tử và thanh toán trực tuyến cũng rất thành công tại Việt Nam.

Điểm đặc biệt của chuỗi khai thác đã được phát hiện là kẻ xấu hoàn toàn có thể chiếm quyền kiểm soát một tài khoản người dùng Zalo bất kỳ thông qua việc dẫn dụ nạn nhân nhấp vào một đường link được che đậy tinh vi. Khi truy cập thành công vào tài khoản của người dùng, ứng dụng Zalo trên điện thoại của nạn nhân sẽ không xuất hiện bất kỳ cảnh báo phiên đăng nhập mới nào.

Ngày 10/8/2021, VinCSS đã thông báo tới bộ phận an ninh bảo mật của Zalo và ngay lập tức nhận được các phản hồi tích cực từ Zalo. Đến 15/8/2021, Zalo thông báo đã khắc phục phần lớn các lỗ hổng. Timeline chi tiết sẽ có ở cuối bài.

Bài viết này sẽ tóm tắt thông tin kỹ thuật về các lỗ hổng mà VinCSS đã phát hiện, từ đó giúp các doanh nghiệp có thể tránh được các lỗ hổng tương tự trong tương lai.

I. Lỗ hổng trong tính năng đăng nhập qua ứng dụng Zalo

Trong quá trình sử dụng ứng dụng Zalo, VinCSS đã phát hiện tính năng Đăng nhập qua ứng dụng Zalo tồn tại lỗ hổng Open Redirection cho phép thay đổi địa chỉ nhận token từ ứng dụng.

Cụ thể, khi sử dụng ứng dụng Zalo nền tảng Web, hoặc một số ứng dụng khác trong hệ sinh thái của VNG, người dùng được cung cấp tuỳ chọn “Đăng nhập qua ứng dụng Zalo”:

Khi sử dụng tính năng này, Zalo xử lý theo luồng sau:

  • Xác thực với API ở địa chỉ sau để lấy mã token:

f'https://id.zalo.me/account/login/native/check-login-status' \

f'?browser={redirect_url}&continue=https%3A%2F%2Fchat.zalo.me%2F'

  • Sử dụng mã token có được ở bước 1 để để gửi đến ứng dụng Zalo trên điện thoại thông qua một deeplink dùng chung đối với cả 2 nền tảng iOS và Android:

f'zalo://login/?browser=chrome&token={token}'

  • Lúc này, điện thoại sẽ chuyển sang ứng dụng Zalo, đồng thời Zalo sẽ hiển thị một thông báo Yêu cầu đăng nhập vào ứng dụng Zalo Web.

  • Khi người nhấn nút Cho phép, ứng dụng sẽ mở trình duyệt mặc định trên điện thoại với đường link đến địa chỉ redirect_url kèm theo một token dùng để đăng nhập (Nếu nhấn nút Từ chối, sẽ không gửi kèm token).
    Qua việc có thể thay đổi tùy ý địa chỉ redirect_url ở bước 1, kẻ xấu có thể chuyển hướng người dùng sau xác thực tới một trang web mà thuộc quyền sở hữu hoặc chúng đã chiếm quyền kiểm soát, từ đó lấy có được mã token để đăng nhập tài khoản của người dùng.
  • Để sử dụng được mã token đã lấy được ở bước 4, cần tiếp tục tương tác với API dưới đây để chuyển đổi thành cookies:

url = f'https://id.zalo.me/account/login/native/verify?token={verify_token}'

resp = requests.get(

    url,

    headers={'User-Agent': user_agent},

    cookies={'zvid': check_login_cookie},

    allow_redirects=False)

Để tương tác với API này, cần phải lưu lại giá trị của cookie tên zvid (được cấp chung với token ở bước 2). Ngoài ra cần lưu ý, giá trị tham số user_agent sẽ là giá trị được Zalo sử dụng để hiển thị trong mục Settings ® Account and Security ® Login history của người dùng.

Sau khi khai thác lỗ hổng này, kẻ xấu đã có được Cookies cho phép truy cập vào tài khoản của nạn nhân. Tuy nhiên, chúng ta dễ dàng nhận ra 03 hạn chế nếu kẻ xấu chỉ khai thác lỗ hổng này:

  • Khó dẫn dụ người dùng nhấp vào link vì đường link sẽ trông rất “lạ”.
  • Có tin nhắn thông báo đăng nhập khi sử dụng mã token và tuân thủ theo luồng xử lý của ứng dụng Zalo Web.
  • Sau một thời gian sử dụng, cookie bị hết hạn sẽ không thể đăng nhập trở lại.

Vì vậy, để có thể thực hiện hiệu quả hơn, cần khai thác lỗ hổng này với một chuỗi các lỗ hổng tiếp sau đây.

II. Lỗ hổng trong tính năng xem trước nội dung liên kết

Khi phát hiện ra lỗ hổng I ở trên, VinCSS cũng chú ý tới việc khi paste một đường link vào Zalo chat, Zalo bot sẽ tiến hành kiểm tra đường link bằng cách crawl trang đích với một user_agent đặc biệt. Cơ chế này cũng cho phép Zalo có thể hiển thị nội dung trang đích cho người dùng xem trước. Nếu Zalo bot kiểm tra và nhận được phản hồi mã trạng thái chuyển hướng 302 Moved Temporarily thì ứng dụng Zalo sẽ chỉ hiển thị nội dung của website được chuyển đến, và không hiển thị địa chỉ đường link. Điều này giúp cho kẻ xấu có thể lợi dụng để ẩn đi đường link phishing, dễ dàng dẫn dụ người dùng nhấp vào link vì khi đó chỉ còn hiển thị nội dung trang web giống như thật. Hãy xem đoạn chat phishing dưới đây, bạn sẽ nhấp vào hay sẽ tìm cách kiểm tra trang đích trước khi nhấp?

Khi lỗ hổng này được khai thác kết hợp với lỗ hổng đầu tiên, tin tặc sẽ dẫn dụ người dùng như hình trên. Khi người dùng nhấp vào và bị chuyển hướng đến server của kẻ xấu, thì sẽ bị tự động ghi lại token và chuyển hướng người dùng đến trang đích thật sự. Vì quá trình chuyển hướng diễn ra rất nhanh, người dùng sau khi nhấp vào link phishing sẽ chỉ nhìn thấy rằng họ thực sự được chuyển hướng tới một trang đích hợp pháp và hoàn toàn bình thường.

III. Lỗ hổng trong cơ chế Relogin

VinCSS cũng phát hiện ra rằng, Zalo đang sử dụng một cơ chế relogin, cho phép người dùng đăng nhập lại phiên sử dụng Zalo Web với cookie của session đã đăng nhập. Tuy nhiên, cơ chế relogin vẫn hoạt động với session chưa từng đăng nhập, ẩn đi tin nhắn thông báo đã đăng nhập trên thiết bị mới.

Cụ thể, ứng dụng Zalo Web sẽ tương tác đến một API như sau:

url = 'https://id.zalo.me/account/checksession?type=ajax&login_type=relogin' \

      '&continue=https%3A%2F%2Fchat.zalo.me'

response = requests.get(url, headers={'Referer''https://chat.zalo.me/login'}, cookies={'zpsid': cookie_value})

continueUrl = response.json()['data']['continueUrl']

Sử dụng đường dẫn continueUrl trong một trình duyệt hoàn toàn mới, Zalo sẽ tự động thiết lập các cookie cần thiết và cho phép truy cập vào Zalo Web. Đồng thời không hiển thị cảnh báo phiên đăng nhập mới cho người dùng.

IV. Lỗ hổng liên quan đến thời hạn của Session

Trong quá trình sử dụng ứng dụng Zalo, VinCSS phát hiện khi khai thác cơ chế relogin theo mô tả ở lỗi bảo mật trên, session tương ứng với giá trị zpsid sẽ tồn tại thời gian rất dài. Kẻ xấu có thể lợi dụng lỗi này để truy cập tài khoản người dùng và chiếm quyền kiểm soát tài khoản lâu dài.

V. Đăng nhập vào ZaloPay với token thu được

Khi sử dụng cơ chế relogin được mô tả ở lỗi III, ngoài đường dẫn truy cập session mới của Zalo Web, API cũng trả về nhiều đường dẫn để đăng nhập đến các ứng dụng khác của Zalo, trong đó có ZaloPay. Khi thay đổi user_agent của trình duyệt thành định dạng của thiết bị di động, có thể truy cập vào ứng dụng ZaloPay qua đường dẫn https://social.zalopay.vn/spa.


Demo:


Tóm tắt

Kết hợp 05 lỗ hổng đã được trình bày, có thể hình thành một chuỗi khai thác nhằm vào người dùng Zalo. Rất may mắn khi các vấn đề đã được xử lý một cách nhanh chóng. Không chỉ Zalo, bất kỳ một hệ thống ứng dụng nào cũng có thể tồn tại các vấn đề an ninh, bảo mật nghiêm trọng cho dù được bảo mật nghiêm ngặt. Vì vậy, bên cạnh các chương trình Bug bounty để thu hút các “thợ săn lỗi”, thì vai trò của các đội Red team cũng không kém phần quan trọng. 

Tại VinCSS, các nhóm Săn mối nguy luôn luôn theo dõi các tài nguyên CNTT của khách hàng một cách liên tục dưới góc nhìn như kẻ xấu, liên tục nghiên cứu mục tiêu và mô phỏng các mối nguy có thể xảy đến đối với khách hàng. Từ đó, VinCSS có thể đưa ra các cảnh báo sớm và chân thực cho khách hàng để kịp thời phát hiện và khắc phục các mối đe doạ phức tạp.

Timeline

  • 10/8/2021: Báo cáo cho Zalo Security team về lỗ hổng.
  • 10/8/2021: Zalo Security team trả lời đã nhận được báo cáo và đang tiến hành xử lý.
  • 15/8/2021: Zalo Security team thông báo đã khắc phục 4/5 lỗ hổng.
  • 15/8/2021: VinCSS xác nhận 4 lỗ hổng đã được xử lý.
  • 06/11/2021: VinCSS gửi email cho Zalo để hỏi về tình trạng của lỗ hổng còn lại. Đồng thời đề nghị được công bố thông tin về lỗ hổng cho cộng đồng, khi đã gần hết 90 ngày kể từ ngày báo cáo.
  • 09/11/2021: Zalo Security team xác nhận đã khắc phục hết và VinCSS đã xuất bản bài nghiên cứu.




No comments:

Post a Comment