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:
- Aktualisieren
<ph type="x-smartling-placeholder"></ph>
CarrierConfig.xml
durch den Hash des Signaturzertifikats der Mobilfunkanbieter-App und Patch einreichen. - 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 undBuild.UNKNOWN
für die MethodeBuild#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:
- Konvertieren Sie die Signatur des Signaturzertifikats mit
<ph type="x-smartling-placeholder"></ph>
toByteArray
- verwenden
MessageDigest
, um das Byte-Array in einen Hashwert zu konvertieren, byte[]-Typ. -
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())); }
Wenn
certHashes
ein Array der Größe2
mit einem Wert ist von12345
und54321
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>