Giới thiệu

Trong bài viết này tôi sẽ hướng dẫn cách kiểm tra bảo mật ứng dụng Android dùng kỹ thuật vượt cơ chế xác thực (bypass login form) thông qua ứng dụng bị lỗi “InsecureBank v2”. Đây là một lỗ hổng có mức độ nguy hiểm cao và các lập trình viên thường mắc phải trong quá trình phát triển các ứng dụng Android.

Để tiến hành phân tích, người dùng có thể tải ứng dụng mẫu tại liên kết: https://github.com/dineshshetty/Android-InsecureBankv2

Sau  khi tải thành công, ta giải nén và cài đặt ứng dụng “InsecureBankv2.apk” này lên máy ảo giả lập Android Genymotion.

bypass login form 1

Hình 1: Giao diện InsecureBankv2

Một số thành phần trong ứng dụng Android

Trong Android, tập tin AndroidManifest.xml dùng để định ra hành vi tương tác giữa các thành phần của một ứng dụng. Chủ yếu có 4 thành phần chính (component) được liệt kê sau đây:

  • Activities

Chỉ định ra giao diện người dùng và cách xử lý tương tác từ phía người dùng . Ví dụ: ứng dụng email sử dụng activity để đọc email mới, soạn email, xuất danh bạ v.v. Nếu một ứng dụng có nhiều Activity nó sẽ hiển thị theo từng activity được đề ra trong Android Manifest.

Public class MainActivity extends Activity{

}
  • Services

Là các dịch vụ chạy ngầm của ứng dụng. Ví dụ: 1 services nghe nhạc sẽ chạy ngầm khi người dùng bật một ứng dụng khác – và service này không hiển thi ra màn hình người dùng.

Public class MySerice extends Service{

}
  • Broadcast Receivers

Dùng để phản hồi lại thông tin từ một ứng dụng hoặc từ hệ điều hành. Lấy ví dụ là ứng dụng downloader sử dụng broadcast để nhận thông báo từ thiết bị – kiểm ta xem dung lượng máy có đủ để tải hay không.

Public class MyReceiver extends BroadcastReceiver{

}
  • Content Providers

Cung cấp dữ liệu từ ứng dụng này sang ứng dụng khác.

Public class MyContentProvider extends ContentProvider{

}
  • Ngoài ra ứng dụng còn có những component khác như: Fragments, Views, Layouts, Intents, Resources, Manifest

Một trong những điều cần lưu ý khi viết ứng dụng là chỉ ra thuộc tính của “component” Android:exported

      • Nếu người lập trình sử dụng Android:exported=”true”. Activity có thể được gọi ra từ một ứng dụng khác
      • Nếu người lập trình sử dụng Android:exported=”false”. Activity chỉ có thể được gọi ra bởi chính ứng dụng được viết.

Như vậy quay lại vấn đề ban đầu. Nếu activity từ trang login là exported true thì có khả năng ta có thể gọi activity một cách trực tiếp – từ đó bypass trang login. Để có thể xem được file AndroidManifest, ta sử dụng công cụ apktool để decompile ứng dụng InsecureBankv2.apk

bypass login form 2

Sau đó ta mở file AndroidManifest.xml để kiểm tra.

bypass login form 3

Kết quả

Sau khi thu thập được các thông tin như hình trên, ta có các dữ liệu như sau:

<activity Android:exported=”true” Android:label=”@string/title_activity_post_login” Android:name=”com.Android.insecurebankv2.PostLogin”/>

Ta có thể gọi activity này để bypass quá trình login. Việc tiếp theo là sử dụng adb shell để gọi đến nó.  Với cú pháp adb shell am start -n com.package.name/com.package.name.ActivityName

$ adb shell am start -n com.Android.insecurebankv2/com.Android.insecurebankv2.PostLogin

bypass login form 4

bypass login form 5

Như vậy ta đã vượt thành công cơ chế đăng nhập của ứng dụng. Để khắc phục được lỗi này ta có 2 hướng giải quyết đối với người lập trình

  • Thuộc tính Android:exported nên thiết lập là FALSE.
  • Nếu ứng dụng cần gọi tới 1 ứng dụng khác, người lập trình cần tùy chỉnh custom permission để chỉ rõ activity này dùng cho ứng dụng nào.