Bảo mật các tuỳ chọn cho nhà phát triển

Theo Tài liệu định nghĩa về khả năng tương thích của Android, các OEM phải cung cấp một cách để bật tính năng phát triển ứng dụng. Tuy nhiên, việc cung cấp các lựa chọn dành cho nhà phát triển tương tự như trên thiết bị di động trong ô tô sẽ khiến những chiếc ô tô đó dễ bị tấn công. Giờ đây, OEM có thể kiểm soát quyền truy cập vào các lựa chọn cho nhà phát triển bằng cơ chế mã thông báo mật mã đã xác thực. Cụ thể, OEM có thể:

  • Chỉ định các chế độ hạn chế mặc định trước lần khởi động đầu tiên.
  • Uỷ quyền cho nhà phát triển một cách an toàn bằng mã thông báo mã hoá nếu muốn.
  • Áp dụng các thay đổi về hạn chế sau khi nhà phát triển được xác thực và uỷ quyền.

Trang này mô tả một quy trình triển khai tham chiếu bao gồm một ứng dụng trình điều khiển hạn chế gỡ lỗi và một điểm cuối của trình phát hành mã thông báo từ xa.

Thuật ngữ

Ngoài phần Thuật ngữ, các thuật ngữ sau đây cũng được dùng trên trang này:

  • Chữ ký web JSON (JWS), được xác định trong RFC 7515
  • Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST)

Thiết kế

OEM có thể uỷ quyền cho nhà phát triển bằng mã thông báo Chữ ký web JSON (JWS) (RFC7515). Trong quá trình triển khai tham chiếu, mã truy cập do OEM phát hành và được ứng dụng bộ điều khiển hạn chế sử dụng. Mã truy cập được thiết kế để chống lại các cuộc tấn công phát lại và mã giả mạo.

Hình 1. Thiết kế

Tích hợp và định cấu hình

Các OEM phải chỉ định các hạn chế mặc định khi khởi động lần đầu. Các OEM thực hiện việc này bằng một số lớp phủ tài nguyên tĩnh để ghi đè các giá trị mặc định trong khung AOSP.

Bạn có thể định cấu hình các hạn chế mặc định cho người dùng hệ thống không có giao diện người dùng bằng chuỗi config_defaultFirstUserRestrictions trong frameworks/base/core/res/res/values/config.xml, ví dụ:

<!-- User restrictions set when the first user is created.
         Note: Also update appropriate overlay files. -->
    <string-array translatable="false" name="config_defaultFirstUserRestrictions">
        <item>no_debugging_features</item>
        <item>no_install_unknown_sources</item>
        <item>no_install_unknown_sources_globally</item>
    </string-array>

Bạn có thể định cấu hình các quy định hạn chế mặc định đối với người lái xe, hành khách và khách trong frameworks/base/core/res/res/xml/config_user_types.xml. OEM có thể phủ các chuỗi này để đặt các hạn chế mặc định cho từng loại người dùng tương ứng, ví dụ:

<user-types>
    <full-type name="android.os.usertype.full.SECONDARY" >
        <default-restrictions
            no_debugging_features="true"
            no_install_unknown_sources="true"/>
    </full-type>
    <full-type name="android.os.usertype.full.GUEST" >
        <default-restrictions
            no_debugging_features="true"
            no_install_unknown_sources="true"/>
    </full-type>
</user-types>

Bộ điều khiển lựa chọn ưu tiên về số bản dựng

Trong AAOS, lượt tương tác của người dùng với hàng lựa chọn ưu tiên Số bản dựng trong phần Cài đặt được xử lý bằng BuildNumberPreferenceController.java nằm trong packages/apps/Car/Settings/src/com/android/car/settings/system/BuildNumberPreferenceController.java.

Khi chế độ hạn chế người dùng no_debugging_features (UserManager.DISALLOW_DEBUGGING_FEATURES) được đặt, BuildNumberPreferenceController sẽ ngăn chặn đồng hồ đếm ngược của nhà phát triển trên các bản dựng phát hành công khai (user) khi được nhấn:

@Override
protected boolean handlePreferenceClicked(Preference preference) {
    if (DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext())) {
        return true;
    }

    // Enforce restriction on production (user) builds
    if (Build.IS_USER && mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
        showToast(R.string.dev_access_blocked_toast);
        return true;
    }

    mDevHitCountdown--;
    if (mDevHitCountdown == 0) {
        DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true);
        showToast(R.string.show_dev_on);
    }
    return true;
}

Việc sử dụng Build.IS_USER đảm bảo rằng các bản dựng phát hành sẽ thực thi nghiêm ngặt chế độ khoá bảo mật, trong khi các nhóm kỹ thuật nội bộ trên bản dựng userdebug vẫn có thể truy cập vào các lựa chọn dành cho nhà phát triển bằng cử chỉ chạm 7 lần để kiểm thử mà không cần ghi đè giao diện dòng lệnh (CLI) theo cách thủ công.

Gỡ lỗi Bộ điều khiển hạn chế

Một cách triển khai tham chiếu của Trình kiểm soát hạn chế gỡ lỗi (DRC) được cung cấp trong AOSP tại packages/apps/Car/DebuggingRestrictionController.

DRC cho phép các OEM tạm thời và linh hoạt gỡ bỏ hạn chế no_debugging_features đối với xe sản xuất cho các kỹ thuật viên dịch vụ và nhà phát triển được uỷ quyền. Thay vì để các công cụ gỡ lỗi luôn mở hoặc yêu cầu nạp lại phần sụn, ứng dụng DRC trong xe sẽ nhắc người dùng xác thực bằng phụ trợ OEM và gửi mã truy cập được ký bằng mật mã để bật adb và Chế độ nhà phát triển cho một phiên chẩn đoán hữu hạn.

Việc triển khai tham chiếu DRC bao gồm 2 thành phần cốt lõi:

  • Ứng dụng ứng dụng khách DRC trên xe (app/): Một ứng dụng hệ thống đặc quyền (giữ quyền MANAGE_USERS) trên Đầu phát trung tâm, xác thực nhà phát triển, xác thực chữ ký chứng chỉ X.509, tên máy chủ, số chỉ dùng một lần và thời gian hết hạn của mã thông báo JWS đến, đồng thời chuyển đổi chế độ hạn chế no_debugging_features một cách linh hoạt bằng cách sử dụng UserManager.
  • Cloud Token Issuer (server/): Một dịch vụ web phụ trợ (có thể triển khai dưới dạng Firebase Cloud Functions) xác thực thông tin đăng nhập của nhà phát triển và phát hành mã thông báo truy cập JWS RS256 được ký bằng mật mã với một khoảng thời gian hết hạn hữu hạn.

Để biết hướng dẫn đầy đủ về cách thiết lập, công cụ tạo chứng chỉ và các bước triển khai, hãy xem Hướng dẫn gỡ lỗi về việc tích hợp Restriction Controller.

Thử nghiệm

Google khuyên các OEM nên bắt đầu bằng việc triển khai tham chiếu và xây dựng từ đó.

  1. Sau khi định cấu hình các hạn chế trong tệp lớp phủ, hãy biên dịch AAOS và xác thực các luồng đã xác định. Sử dụng ứng dụng tham chiếu và dịch vụ cục bộ có hỗ trợ JWS để xác minh chế độ cài đặt quyền truy cập.
  2. Không bắt buộc: Định cấu hình hệ thống để sử dụng dịch vụ đám mây có hỗ trợ JWS. Xác minh rằng bạn đang quan sát luồng dự kiến trên dịch vụ phụ trợ của mình.