2010-12-11 25 views
6

Tôi đang lưu vào bộ nhớ cache xác thực của người dùng bất cứ khi nào máy chủ ping cấp phép Android Market trả về một GRANT_ACCESS pong.Lỗ hổng trong bộ nhớ đệm của khóa bị xáo trộn? Cấp phép Android

Có ai thấy bất kỳ lỗ hổng nào với chiến lược này không? Tôi tin rằng nó rất mạnh mẽ, vì tôi đang làm xáo trộn một chìa khóa, và cách duy nhất để unobfuscate là biết muối. Bây giờ, ai đó có thể tưởng tượng mở apk và tìm muối, nhưng đây không thực sự là mức độ nứt tôi nghĩ là quá quan trọng để lo lắng.

Như bạn có thể thấy, thông tin cụ thể của thiết bị đang được thêm vào kỹ thuật che khuất.

// Try to use more data here. ANDROID_ID is a single point of attack. 
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
obfuscator = new AESObfuscator(SALT, getPackageName(), deviceId); 
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, obfuscator), BASE64_PUBLIC_KEY); 

Tiếp theo việc tạo ra các dữ liệu tiếp tục tồn tại:

public void allow() { 
    SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    String uid = UUID.randomUUID().toString(); 
    if(!settings.contains(ACCESS_KEY)) { 
    editor.putString(ACCESS_KEY,uid);  
    editor.commit(); 
    } 
    if(!settings.contains(OBFU_ACCESS_KEY)) { 
    String obfu = obfuscator.obfuscate(uid); 
    editor.putString(OBFU_ACCESS_KEY,obfu); 
    editor.commit(); 
    } 

Sau đó, tôi đã sử dụng một phương pháp khác để kiểm tra tình trạng của nội dung cache:

boolean isCachedLicense() { 
    SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0); 
    if(settings.contains(ACCESS_KEY) && settings.contains(OBFU_ACCESS_KEY)) { 
    String accessKey = settings.getString(ACCESS_KEY, ""); 
    String obAccessKey = settings.getString(OBFU_ACCESS_KEY, ""); 
    try { 
     if(accessKey.equals(obfuscator.unobfuscate(obAccessKey))) { 
       return true; 
     } else { 
       return false; 
     } 
    } catch (ValidationException e) { 
     e.printStackTrace(); 
     return false; 
    } 
    } else { 
     return false; 
    } 
} 

Cuối cùng, tôi đã kiểm tra nếu isCachedLicens e tại các vị trí sau đây của LicenseCheckerCallback: @Override dontAllow@override applicationError. Nếu isCachedLicense là đúng, thì tôi cho phép người dùng chuyển tiếp.

Ngoài ra, mã nguồn đầy đủ được đặt tại here.

Trả lời

1

Sự xáo trộn bằng muối nói chung là một chiến lược yếu. Kẻ tấn công chỉ cần tìm ra muối, khá thẳng về phía trước để làm một khi bạn biết những gì bạn đang tìm kiếm, và có thể được thực hiện mà không cần truy cập trực tiếp vào ứng dụng của bạn. Khi muối được phát hiện (bởi bất kỳ ai), tất cả cơ sở cài đặt của chúng tôi đã bị xâm phạm.

Đặt cược tốt nhất của bạn là thay vì sử dụng thuật toán obfuscation bằng khóa cố định, sử dụng thuật toán mã hóa đã được chứng minh bằng khóa duy nhất cho người dùng hoặc thiết bị bạn đang chạy.

+0

Tôi sử dụng thư viện mã hóa đã được chứng minh, hãy xem mã đầy đủ để tham khảo. – hunterp

+1

Đó là một bước tốt hơn - thư viện dường như làm một công việc đủ phong nha. Kẻ tấn công sẽ phải giải mã riêng từng dữ liệu của thiết bị và có đủ quyền truy cập vào thiết bị để có thể chạy bộ giải mã cụ thể của thiết bị. Tuy nhiên, muối toàn cầu vẫn là một điểm yếu. Và, vì có vẻ như bạn đang phân phối nó như một thư viện, nó có thêm mối nguy hiểm của người dùng cuối không điền vào các giá trị muối của riêng họ. Tỷ lệ cược là quá nhiều người phát triển sẽ để nó ở giá trị bạn đã nhập - tôi sẽ thay đổi điều đó thành giá trị được tạo riêng cho từng thiết bị. – blueberryfields

+0

nếu bạn xem qua tham chiếu, tôi đã có thông tin cụ thể về thiết bị đi vào kết hợp mã hóa (Tôi cũng đã chỉnh sửa lại câu hỏi của mình để bao gồm thông tin này ở trên cùng) – hunterp