Sử dụng API không an toàn

Danh mục OWASP: MASVS-PLATFORM: Tương tác với nền tảng

Tổng quan

Nhiều ứng dụng di động sử dụng một API bên ngoài để cung cấp các tính năng. Theo truyền thống, một mã thông báo hoặc khoá tĩnh được dùng để xác thực ứng dụng kết nối với dịch vụ.

Tuy nhiên, trong bối cảnh chế độ cài đặt máy chủ-máy khách (hoặc ứng dụng di động và API) – việc sử dụng khoá tĩnh thường không được coi là một phương thức xác thực an toàn để truy cập vào dữ liệu hoặc dịch vụ nhạy cảm. Không giống như cơ sở hạ tầng nội bộ, bất kỳ ai cũng có thể truy cập vào một API bên ngoài và sử dụng sai mục đích dịch vụ nếu họ có quyền truy cập vào khoá này.

Ví dụ: khoá tĩnh có thể bị đảo ngược từ ứng dụng hoặc bị chặn khi ứng dụng di động giao tiếp với API bên ngoài. Khoá tĩnh này cũng có nhiều khả năng được mã hoá cứng trong ứng dụng.

Rủi ro đối với dữ liệu và dịch vụ API xảy ra khi bạn không sử dụng các biện pháp kiểm soát quyền truy cập và xác thực đủ an toàn.

Khi sử dụng khoá tĩnh, API có thể bị khai thác bằng cách phát lại các yêu cầu hoặc tạo các yêu cầu mới bằng khoá (bị chặn hoặc được thiết kế ngược) mà không có bất kỳ hạn chế nào về thời gian.

Tác động

Nếu một nhà phát triển đang trả tiền cho dịch vụ API AI hoặc ML, thì kẻ tấn công sẽ tương đối dễ dàng đánh cắp khoá này và nợ dịch vụ của họ hoặc sử dụng khoá này để tạo nội dung giả mạo.

Mọi dữ liệu người dùng, tệp hoặc PII được lưu trữ trên API đều có thể truy cập tự do, dẫn đến các vụ rò rỉ gây tổn hại.

Kẻ tấn công cũng có thể sử dụng quyền truy cập này để thực hiện hành vi gian lận, chuyển hướng dịch vụ và trong một số ít trường hợp, giành được quyền kiểm soát hoàn toàn các máy chủ.

Giải pháp giảm thiểu

API có trạng thái

Nếu ứng dụng cung cấp tính năng đăng nhập cho người dùng hoặc có khả năng theo dõi phiên người dùng, thì nhà phát triển nên sử dụng một dịch vụ API như Google Cloud để tích hợp có trạng thái với ứng dụng của họ.

Ngoài ra, hãy sử dụng phương thức xác thực an toàn, xác thực ứng dụng và các chế độ kiểm soát phiên do dịch vụ API cung cấp, đồng thời cân nhắc sử dụng mã thông báo động thay vì khoá tĩnh. Đảm bảo mã thông báo hết hạn trong một khoảng thời gian ngắn hợp lý (thường là 1 giờ).

Sau đó, bạn nên dùng mã thông báo động để xác thực nhằm cấp quyền truy cập vào API. Các nguyên tắc này cho biết cách thực hiện việc này bằng OAuth 2.0. Ngoài những nguyên tắc đó, bạn có thể tăng cường hơn nữa OAuth 2.0 để giảm các lỗ hổng trong ứng dụng Android bằng cách triển khai các tính năng sau.

Triển khai tính năng ghi nhật ký và xử lý lỗi thích hợp:

  • Xử lý lỗi OAuth một cách linh hoạt, rõ ràng và ghi nhật ký các lỗi đó cho mục đích gỡ lỗi.
    • Bề mặt tấn công bị thu hẹp cũng sẽ giúp bạn xác định và khắc phục mọi vấn đề có thể phát sinh.
    • Đảm bảo mọi thông báo được ghi lại hoặc trình bày cho người dùng đều rõ ràng nhưng không chứa thông tin hữu ích cho đối phương.

Định cấu hình OAuth một cách an toàn trong ứng dụng:

  • Gửi tham số redirect_uri đến cả điểm cuối uỷ quyền và mã thông báo.
  • Nếu ứng dụng của bạn sử dụng OAuth với một dịch vụ bên thứ ba, hãy định cấu hình tính năng Chia sẻ tài nguyên trên nhiều nguồn (CORS) để hạn chế quyền truy cập vào các tài nguyên của ứng dụng.
    • Điều này sẽ giúp ngăn chặn các cuộc tấn công trái phép bằng tập lệnh trên nhiều trang web (XSS).
  • Sử dụng tham số trạng thái để ngăn chặn các cuộc tấn công CSRF.

Sử dụng thư viện bảo mật:

  • Hãy cân nhắc sử dụng một thư viện bảo mật như AppAuth để đơn giản hoá việc triển khai luồng OAuth an toàn.
    • Các thư viện Android này có thể giúp tự động hoá nhiều phương pháp bảo mật hay nhất đã đề cập trước đó.

Các phương thức xác thực khác, bao gồm cả mã thông báo Firebase và mã thông báo nhận dạng Google, được mô tả trong tài liệu OpenAPI.

API không trạng thái

Nếu dịch vụ API không cung cấp bất kỳ biện pháp bảo vệ nào được đề xuất trước đó và có yêu cầu về các phiên không trạng thái mà không cần người dùng đăng nhập, thì nhà phát triển có thể cần cung cấp các giải pháp phần mềm trung gian của riêng họ.

Việc này sẽ liên quan đến việc "uỷ quyền" các yêu cầu giữa ứng dụng và điểm cuối API. Một phương thức để thực hiện việc này là sử dụng Mã thông báo web JSON (JWT) và Chữ ký web JSON (JWS), hoặc cung cấp một dịch vụ được xác thực đầy đủ như đã đề xuất trước đó. Điều này cung cấp một cách lưu trữ khoá tĩnh dễ bị tấn công phía máy chủ thay vì trong ứng dụng (máy khách).

Việc cung cấp một giải pháp không trạng thái từ đầu đến cuối trong các ứng dụng di động có những vấn đề vốn có. Một số thách thức quan trọng nhất là xác thực máy khách (ứng dụng) và lưu trữ khoá riêng tư hoặc bí mật một cách an toàn trên thiết bị.

API Tính toàn vẹn của Play xác thực tính toàn vẹn của ứng dụng và các yêu cầu. Điều này có thể giảm thiểu một số trường hợp mà quyền truy cập này có thể bị lạm dụng. Đối với việc quản lý khoá, trong nhiều trường hợp, kho khoá là vị trí tốt nhất để lưu trữ khoá riêng tư một cách an toàn.

Một số ứng dụng di động sử dụng giai đoạn đăng ký để kiểm tra tính toàn vẹn của ứng dụng và cung cấp khoá bằng cách trao đổi an toàn. Các phương thức này phức tạp và nằm ngoài phạm vi của tài liệu này. Tuy nhiên, dịch vụ quản lý khoá trên đám mây là một giải pháp tiềm năng.

Tài nguyên