Gerätekennungen

Android 10 ändert die Berechtigungen für sodass alle Gerätekennungen jetzt durch die Berechtigung READ_PRIVILEGED_PHONE_STATE. Vor Android 10, gleichbleibende Geräte-IDs (IMEI/MEID, IMSI, SIM und Build-Seriennummer) hinter der READ_PHONE_STATE-Laufzeitberechtigung. Die Berechtigung READ_PRIVILEGED_PHONE_STATE ist nur werden Apps gewährt, die mit dem Plattformschlüssel signiert sind, und privilegierten System-Apps.

Weitere Informationen zu den neuen Berechtigungsanforderungen finden Sie in der Javadoc-Seiten für TelephonyManager.java und Build.java.

Diese Änderung betrifft die folgenden APIs:

  • Telefonie-Manager#getDeviceId
  • Telefonie-Manager#getImei
  • Telefonie-Manager#getMeid
  • Telefonie-Manager#getSimSerialNumber
  • Telefonie-Manager#getSubscriberId
  • Build#getSerial

Zugriff für Mobilfunkanbieter-Apps ohne Berechtigung READ_PRIVILEGED_PHONE_STATE

Vorinstallierte Mobilfunkanbieter-Apps, die nicht für das READ_PRIVILEGED_PHONE_STATE Berechtigung kann eine der Optionen in der folgenden Tabelle implementieren.

Option Beschreibung Beschränkungen
UICC-Berechtigungen für Mobilfunkbetreiber Die Android-Plattform lädt in der UICC gespeicherte Zertifikate und gewährt Berechtigung für Apps, die von diesen Zertifikaten signiert wurden, . Bei herkömmlichen Mobilfunkanbietern gibt es viele SIM-Karten. die leicht aktualisierbar sind. Auch Mobilfunkanbieter, die keine Schreibrechte für SIMs (z. B. Mobilfunkdiscounter, deren SIM von MNOs ausgestellt wurde) können nicht hinzugefügt oder Zertifikate auf den SIMs aktualisieren.
OEM-Zulassungsliste OEMs können Geräte über OP_READ_DEVICE_IDENTIFIER bereitstellen Kennungen in Mobilfunkanbieter-Apps auf der Zulassungsliste hinzufügen. Diese Lösung ist nicht für alle Mobilfunkanbieter skalierbar.
Typzuweisungscode (TAC) Verwenden Sie die Methode getTypeAllocationCode die in den letzten Jahren Android 10, um die TAC offenzulegen, die den Hersteller und das Modell zurückgibt Informationen. Die Informationen im TAC reichen nicht aus, um ein bestimmtes Gerät zu identifizieren.
MSISDN Mobilfunkanbieter können die Telefonnummer (MSISDN) verwenden, die unter TelephonyManager mit der Berechtigung PHONE Gruppe, um die IMEI auf ihren Back-End-Systemen zu finden. Das erfordert erhebliche Investitionen für Mobilfunkanbieter. Mobilfunkanbieter, die eine Karte erstellen erfordern ihre Netzwerkschlüssel mit IMSI technische Ressourcen für den Wechsel zu MSISDN.

Alle Mobilfunkanbieter-Apps können auf Geräte-IDs zugreifen, indem sie: CarrierConfig.xml-Datei mit dem Hash des Signaturzertifikats über die Mobilfunkanbieter-App. Wenn die Mobilfunkanbieter-App eine Methode zum Lesen privilegierter Daten aufruft sucht die Plattform nach einer Übereinstimmung mit dem Signaturzertifikat der App. Hash (SHA-1- oder SHA-256-Signatur des Zertifikats) im CarrierConfig.xml-Datei. Wird eine Übereinstimmung gefunden, Informationen zurückgegeben. Wenn keine Übereinstimmung gefunden wird, ist eine Sicherheitsausnahme zurückgegeben.

Um diese Lösung zu implementieren, MÜSSEN Mobilfunkanbieter folgendermaßen vorgehen:

  1. Aktualisieren <ph type="x-smartling-placeholder"></ph> CarrierConfig.xml durch den Hash des Signaturzertifikats der Mobilfunkanbieter-App und Patch einreichen.
  2. OEMs bitten, ihren Build mit QPR1+ zu aktualisieren (empfohlen) ODER diese erforderliche Plattform-Patches sowie den Patch, der CarrierConfig.xml Datei gemäß Schritt 1 oben aktualisiert.

Implementierung

Aktualisieren Sie die Zulassungsliste für privilegierte Berechtigungen, um die READ_PRIVILEGED_PHONE_STATE Berechtigung für diese privilegierten Personen Apps, die Zugriff auf Geräte-IDs benötigen

Weitere Informationen zur Zulassungsliste finden Sie unter Privilegiert Berechtigungsliste.

Zum Aufrufen der betroffenen APIs muss eine Anwendung eine der folgenden Anforderungen erfüllen Anforderungen:

  • Wenn es sich bei der App um eine vorab geladene privilegierte App handelt, benötigt sie die READ_PRIVILEGED_PHONE_STATE Berechtigung erklärt in AndroidManifest.xml. Die App muss auch auf die Zulassungsliste gesetzt werden diese privilegierte Berechtigung haben.
  • Für Apps, die über Google Play bereitgestellt werden, sind Berechtigungen des Mobilfunkanbieters erforderlich. Weitere Informationen zum Gewähren von Mobilfunkanbieter-Berechtigungen UICC-Mobilfunkanbieter Berechtigungen.
  • Eine App des Geräte- oder Profilinhabers, der Folgendes gewährt wurde: Berechtigung „READ_PHONE_STATE“.

Eine App, die keine dieser Anforderungen erfüllt, hat Folgendes: Verhalten:

  • Ist die App auf die Vorab-Frage ausgerichtet und verfügt nicht über Berechtigung „READ_PHONE_STATE“ erteilt, SecurityException ausgelöst wird. ist das das aktuelle Verhalten vor der Q-Phase, da diese Berechtigung ist zum Aufrufen dieser APIs erforderlich.
  • Wenn die App vor dem Quartal ausgerichtet ist und über Berechtigung READ_PHONE_STATE erteilt, sie erhält eine Nullwert für alle TelephonyManager APIs und Build.UNKNOWN für die Methode Build#getSerial.
  • Wenn die App auf Android 10 oder höher ausgerichtet ist und keine der neuen erhalten Sie eine SecurityException.

Validierung und Tests

Die Kompatibilitäts- Die Test-Suite (CTS) enthält Tests zur Überprüfung der erwarteten Geräte-ID. Zugriffsverhalten für Apps mit Berechtigungen des Mobilfunkanbieters, Geräte- und Profilinhabern und den Apps, die voraussichtlich keinen Zugriff auf das Gerät haben sollen, Kennzeichnungen.

Die folgenden CTS-Tests beziehen sich speziell auf diese Funktion.

cts-tradefed run cts -m CtsCarrierApiTestCases -t
    android.carrierapi.cts.CarrierApiTest

cts-tradefed run cts -m CtsTelephonyTestCases -t
    android.telephony.cts.TelephonyManagerTest

cts-tradefed run cts -m CtsTelephony3TestCases

cts-tradefed run cts -m CtsPermissionTestCases -t
    android.permission.cts.TelephonyManagerPermissionTest

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCannotGetDeviceIdentifiersWithoutPermission

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCannotGetDeviceIdentifiersWithoutPermission

Häufig gestellte Fragen

Wie viele Apps können in CarrierConfig.xml für ein bestimmtes Verwaltungskonto (Kundencenter, MNC) auf die Zulassungsliste gesetzt werden?

Die Anzahl der im Array enthaltenen Zertifikats-Hashes ist nicht begrenzt.

Welche CarrierConfig-Parameter in CarrierConfig.xml muss ich verwenden, damit eine App auf die Zulassungsliste gesetzt werden kann?

Verwenden Sie das folgende übergeordnete Konfigurationselement innerhalb der spezifischen CarrierConfig.xml aus den AOSP-Optionen, die Sie konfigurieren:

<string-array name="carrier_certificate_string_array" num="2">
    <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
    <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>

Gibt es eine CarrierConfig-Basisvorlage, die ich verwenden kann?

Verwenden Sie die folgende Vorlage. Diese sollte im <ph type="x-smartling-placeholder"></ph> relevante Assets.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<carrier_config>
    <string-array name="carrier_certificate_string_array"
num="1">
        <item value="CERTIFICATE_HASH_HERE"/>
    </string-array>
</carrier_config>

Muss sich die SIM-Karte des Mobilfunkanbieters im Gerät befinden, um auf Geräte-IDs zugreifen zu können?

Die verwendete CarrierConfig.xml wird anhand der Aktuell eingelegte SIM-Karte. Wenn die App von Mobilfunkanbieter X versucht, Zugriffsberechtigungen zu erhalten, während die SIM von Mobilfunkanbieter Y eingelegt ist, findet eine Übereinstimmung für den Hash und gibt eine Sicherheitsausnahme zurück.

Auf Geräten mit mehreren SIM-Karten hat Mobilfunkanbieter 1 nur Zugriffsberechtigungen für SIM 1 und und umgekehrt.

Wie wandeln Mobilfunkanbieter das Signaturzertifikat einer App in einen Hash um?

Signaturzertifikate vor dem Hinzufügen in einen Hash konvertieren CarrierConfig.xml, gehen Sie so vor:

  1. Konvertieren Sie die Signatur des Signaturzertifikats mit <ph type="x-smartling-placeholder"></ph> toByteArray
  2. verwenden MessageDigest, um das Byte-Array in einen Hashwert zu konvertieren, byte[]-Typ.
  3. Wandeln Sie den Hash von byte[] in einen hexadezimalen String um. Ein Beispiel: Weitere Informationen finden Sie unter IccUtils.java.

    List<String> certHashes = new ArrayList<>();
    PackageInfo pInfo; // Carrier app PackageInfo
    MessageDigest md =
    MessageDigest.getInstance("SHA-256");
    for (Signature signature : pInfo.signatures) {
        certHashes.add(bytesToHexString(md.digest(signature.toByteArray()));
    }
    
  4. Wenn certHashes ein Array der Größe 2 mit einem Wert ist von 12345 und 54321 fügen Sie Folgendes hinzu: Konfigurationsdatei des Mobilfunkanbieters.

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>