2013-09-02 56 views
10

hiện nay Android Permission System causes the following issue:lập trình thay đổi Manifest - cho phép tùy chỉnh Android

App Một định nghĩa sự cho phép tùy chỉnh của:

com.package.permission.READ_APP_DATA 

Khi ứng dụng được cài đặt B tuyên bố sự cho phép tùy chỉnh, nó được cấp.

Tuy nhiên, nếu ứng dụng được cài đặt Một sau ứng dụng B, sau đó cho phép là không cấp cho app B.

Trong khi điều này có thể không phải là một lỗi thường xảy ra, do ứng dụng B thường là một plugin của ứng dụng A, tất nhiên nó có thể xảy ra và làm cho ứng dụng của tôi.

Với các ứng dụng SuperUser đồng ý giới thiệu quyền tùy chỉnh toàn cầu của android.permission.ACCESS_SUPERUSER, đây có thể là một vấn đề lớn nếu người dùng quyết định chuyển đổi ứng dụng SuperUser.

Để xử lý vấn đề này, tôi có ý định sử dụng đoạn mã sau vào ứng dụng của tôi cho phép tùy chỉnh Tôi về để bắt đầu tuyên bố:

checkPermissions(this, getCallingActivity().getPackageName()); // get the package name from the sender first 

private boolean checkPermissions(Context context, String callingPackage) { 

    final List<PackageInfo> apps = context.getPackageManager().getInstalledPackages(PackageManager.GET_PERMISSIONS); 

    for (PackageInfo pi : apps) { 

     if (pi.packageName.equals(callingPackage)) { 

      String[] permissions = pi.requestedPermissions; 

      if (permissions != null) { 
       for (String permission : permissions) { 
        if (permission.equals("com.package.permission.READ_APP_DATA")) { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 

Theo tiêu đề của câu hỏi này: Liệu phương pháp này 'an toàn'? Hoặc là có một cách/root-hack rằng một biểu hiện của ứng dụng có thể được thay đổi sau khi nó được cài đặt và cho phép lập trình 'thêm' vào ứng dụng B?

+1

"Tuy nhiên, nếu ứng dụng A được cài đặt sau ứng dụng B thì quyền sẽ không được cấp cho ứng dụng B." - có cùng một phần tử '' trong cả hai ứng dụng, đặc biệt nếu đây là quyền cấp 'signature'. – CommonsWare

+0

@CommonsWare - Cảm ơn. Có thể bạn có thể xây dựng mặc dù xin vui lòng? Tôi tin rằng đây là những gì tôi đang làm, nhưng quyền ứng dụng B vẫn không được phát hiện/cấp. Tôi nhận thấy báo cáo lỗi được liên kết cuối cùng được gán là lỗi. – brandall

+1

"Tôi tin rằng đây là những gì tôi đang làm" - câu hỏi của bạn chỉ ra rằng chỉ có một ứng dụng A có một phần tử '' và rằng ứng dụng B chỉ có phần tử ''. Tôi cũng đang nói thêm phần tử '' vào ứng dụng B, do đó thứ tự cài đặt không còn quan trọng nữa. – CommonsWare

Trả lời

9

Tôi không chắc liệu mình có nhận được câu hỏi đúng hay không, vì tôi không biết cách truy cập vào tệp kê khai sau khi cài đặt kết nối với mã bạn đã đăng ở trên. Nhưng để trả lời đoạn cuối cùng của bạn:

Không phải một cách dễ dàng. Người dùng phải cài đặt mod trên thiết bị của mình, có thể cấp quyền tùy ý khi đang di chuyển trong khi ứng dụng yêu cầu chúng. IIRC bản thân tệp kê khai được phân tích cú pháp chỉ trong thời gian cài đặt.

Vì vậy, những gì chúng tôi sử dụng trong một mod đang thay đổi phương pháp grantPermissionsLPw trong lớp com.android.server.pm.PackageManagerService.

Nó được sử dụng để cấp cho trình khởi chạy sự cho phép android.permission.EXPAND_STATUS_BAR mà nó không khai báo trong tệp kê khai của nó.

Tôi không chắc chắn, nếu điều này sẽ được sử dụng cho ứng dụng của bạn. Nhưng để tổng hợp lại: Nếu người dùng muốn cấp cho ứng dụng một trọng tài, quyền tùy chỉnh: Có, điều đó là có thể.

CẬP NHẬT

tôi có thể xây dựng nhiều hơn một chút, tất nhiên. Tôi có thể thấy hai kịch bản xảy ra

1. tĩnh mod

Lớp nêu trên nằm trong services.jar. Như chúng ta đã biết, các tệp như thế này có thể được biên dịch, thay đổi và biên dịch lại. Trên thực tế, đây là một chỉnh sửa khá dễ dàng trên tệp này. Tôi không biết cách nào để làm điều này trên điện thoại trực tiếp, nhưng tôi sẽ xem xét nó có thể. Nó chỉ là không khả thi, rằng các giải pháp phổ biến rộng rãi có sẵn, vì nó cần một số lượng tốt của sức mạnh xử lý. Kẻ tấn công không thể chỉ cung cấp một tập tin phổ thông. Các tệp này thay đổi từ thiết bị này sang thiết bị khác và giữa các phiên bản phần mềm.Hoặc là, kẻ tấn công sẽ cần phải cung cấp một lượng lớn các tập tin được vá, hoặc làm bản vá trực tiếp, bằng cách tải nó lên một máy chủ, vá nó, tải xuống lại và cài đặt nó. Kịch bản này không phải là rất có thể nếu bạn hỏi tôi.

2. động mod

Có nhiều hơn một khuôn khổ có sẵn, cho phép thay đổi các quy trình trong khi họ opertae. Phổ biến nhất trong số đó là Xposed Framework. Về cơ bản, nó là một bản vá lỗi app_process và API tương ứng sử dụng Reflection để thay đổi các quy trình đang chạy. Bây giờ kẻ tấn công có thể gửi ứng dụng của anh ấy với khung công tác này và có quyền truy cập root, cài đặt nó một cách im lặng. Với quyền truy cập root, anh ta thậm chí có thể tự kích hoạt mô-đun, thường yêu cầu sự tương tác của người dùng. Khi một mô-đun như vậy được kích hoạt, kẻ tấn công có thể móc vào phương pháp được đề cập ở trên và thay đổi các quyền được yêu cầu. Anh ta sẽ làm điều này bằng cách lấy trường đối tượng, giữ các quyền được yêu cầu, thêm một cái mà anh ta yêu cầu, THEN chạy phương thức ban đầu, bổ sung thêm các quyền ban đầu được định nghĩa.

Xin lưu ý rằng cả hai trường hợp đều yêu cầu người dùng tự cài đặt ứng dụng độc hại. Bạn đã không đề cập đến ứng dụng của bạn là gì, vì vậy tôi không thể giúp bạn nhiều hơn với việc đánh giá rủi ro. Tất cả những gì tôi có thể nói là, kẻ tấn công CÓ THỂ làm những việc như thế.

+0

Cảm ơn câu trả lời của bạn - Bạn có thể xây dựng được cách mod làm việc xin vui lòng? Nó sẽ giúp tôi hiểu được 'nguy cơ'. – brandall

+0

Vui lòng xem phần cập nhật ở trên. Đã sửa tên lớp quá. Nếu bạn có thêm bất kỳ câu hỏi nào, vui lòng hỏi. – langerhans

+1

Cảm ơn bạn đã cập nhật, nó thực sự hữu ích và một số đọc được liên kết tốt. Tôi sẽ trở lại để đánh dấu câu trả lời của bạn là chính xác và trao cho bạn tiền thưởng cho những nỗ lực của bạn. – brandall

0

Tôi thấy có vấn đề nếu ứng dụng A được cài đặt trước ứng dụng B và phần tử <permission> không được khai báo trong ứng dụng A, người dùng sẽ không bao giờ thấy yêu cầu cấp phép. Tuy nhiên, nếu bạn yêu cầu sử dụng phần tử <permission> trong ứng dụng A, một phương pháp tương tự có thể được sử dụng để xác minh rằng nhãn và mô tả được hiển thị cho người dùng là chính xác.