BẢO MẬT TRONG PHÁT TRIỂN ỨNG DỤNG ANDROID

07/07/2020

Trong thời đại công nghệ số, bảo mật thông tin người dùng đang ngày một nâng cao hơn. Một ứng dụng hoàn hảo không chỉ bởi UI đẹp, UX thuận tiện, các tính năng hay mà cũng quan trọng không kém đó là tính bảo mật. Đây là vấn đề mà đôi khi chúng ta đã quên mất khi phát triển sản phẩm.


Bài viết sau đây sẽ giới thiệu một số nguyên tắc bảo mật cơ bản nhất trong lập trình ứng dụng Android do anh Nguyễn Tiến Hoàng và anh Bùi Quang Đức - Android Developer tại Extreme Việt Nam trình bày.

 

1. Khái niệm về phạm vi

- Private: Private component là component chỉ sử dụng trong nội bộ application.

- In-house: In-house application được hiểu là ứng dụng của 1 công ty hoặc tổ chức.

- Partner: Partner application được hiểu là các ứng dụng sử dụng với đối tác liên kết của 1 công ty hoặc tổ chức.

- Public: Không có giới hạn sử dụng đối với các application khác.



Phạm vi các component và ứng dụng.

 

2. Các nguyên tắc bảo mật chung

- Nguyên tắc data gửi đi: Đúng nơi, đúng mục đích. Hạn chế gửi đi các thông tin nhạy cảm.

- Nguyên tắc data nhận về: Xác thực an toàn và thận trọng.

  + Kiểm tra tính đúng đắn của dữ liệu.

  + Kiểm tra quyền truy cập, giới hạn của thông tin yêu cầu.

- Nguyên tắc chia sẻ tài nguyên (file, database...): Khi cung cấp tài nguyên cho các ứng dụng khác, cần đảm bảo ứng dụng được cung cấp có cùng permission truy cập tài nguyên.

 

3. Các component cơ bản trong Android

- Nguyên tắc chung: Android có 4 component cơ bản (Activity, Service, Contennt Provider, Broadcast Receiver). Intent là cách thức để giao tiếp các component này giao tiếp với nhau. Chúng có các nguyên tắc chung về phạm vi để đảm bảo tính bảo mật.

  + Private component: là nơi có thể trao đổi thông tin nhạy cảm. Cần cài đặt và sử dụng chính xác.

  + In-house application và Partner application: cần đảm bảo việc xác thực chữ kỹ khi trao đổi thông tin.

  + Public application: không được trao đổi thông tin nhạy cảm.

- Một số nguyên tắc riêng:

  + Khi dùng Intent để start Activity đã được xác định trước/biết chắc chắn target cần mở thì sử dụng Explicit Intent.

  + Đối với Sticky Broadcast không được gửi thông tin nhạy cảm.

  + Không gửi Ordered Broadcast mà không được bảo vệ bằng receiverPermission.

  + Thực hiện kiểm tra security & tính đúng đắn của request start service ở onStartCommand hoặc onBind. Không thực hiện ở onCreate.

  + Khi dùng Intent để start Service xác định rõ trước thì hãy dùng Explicit Intent vì nếu dùng Implicit Intent thì Intent sẽ gửi đến application nào installed trước.


4. SQLite

- Khi tạo database file đảm bảo rằng file đó được set quyền private (MODE_PRIVATE) và nằm trong application directory ở internal storage.

- Khi chia sẻ db data với ứng dụng khác thì đảm bảo: Sử dụng Content Provider securely. Không sử dụng database file với mode WORLD_WRITEABLE.

- Xử lý tham số đầu vào cho DB statement.

- Mã hóa SQLite Database: Được phát triển bởi Zetetic LLC, SQLCipher cung cấp mã hóa AES 256 bit cho cơ sở dữ liệu SQLite.

 

5. File

- File chỉ sử dụng trong app cần được tạo trong internal application directory và được set quyền ở chế độ MODE_PRIVATE.

- Trong trường hợp bắt buộc lưu trữ file ở External Storage thì:

  + Không lưu trữ thông tin nhạy cảm ở file đó.

  + Nếu có thông tin nhạy cảm thì file đó phải được mã hóa.

  + File được gắn electrical signature để đảm bảo tính toàn vẹn của dữ liệu.

  + Khi đọc thông tin từ file, kiểm tra sự an toàn, tính đúng đắn của dữ liệu.

 

6. Logging

- Không log ra những thông tin nhạy cảm.

- Sử dụng một cơ chế log duy nhất và disable log ở chế độ Release.

 

7. WebView

- Enable JavaScript chỉ khi web content được kiểm soát dưới dạng In-house.

- Sử dụng giao thức HTTPS để giao tiếp với Server được quản lý, kiểm soát dưới dạng In-house.

- Xử lý lỗi SSL hợp lý: hiển thị lỗi và ngắt kết nối để tránh hình thức khai thác/tấn công Man In Middle. Đảm bảo rằng:

  + Không bỏ qua lỗi và tiếp tục kết nối, giao tiếp.

  + Không retry với giao thức HTTP thay vì HTTPS.

 

8. Notification

Từ Android 5.0 (API 21), Notification có thể hiển thị ngay cả khi màn hình bị khóa, tùy thuộc vào cài đặt của người dùng và ứng dụng. Chức năng này phải được thực hiện với sự chú ý cẩn thận đến quyền riêng tư và bảo mật. Nguyên tắc:

- Public notification không được bao gồm các thông tin nhạy cảm vì chúng được hiển thị trên màn hình khóa.

- Khi notification thông tin nhạy cảm cần cài đặt chế độ hiển thị Private hoặc Secret.