आपका ऐप्लिकेशन उतना ही सुरक्षित होता है जितना उसका ओएस. जोखिम को कम करने के लिए, आपके ऐप्लिकेशन को सुरक्षा से जुड़ी संवेदनशील कार्रवाइयों को डिवाइस की सुरक्षा की स्थिति के रीयल-टाइम आकलन के साथ गेट करना चाहिए. इससे यह तय किया जा सकेगा कि डिवाइस, खास तौर पर इसके मुख्य सिस्टम कॉम्पोनेंट, पूरी तरह से अपडेट हैं या नहीं. साथ ही, यह भी तय किया जा सकेगा कि Android Security Bulletin में पब्लिश की गई कमियों से डिवाइस सुरक्षित है या नहीं. डिवाइस की सुरक्षा की स्थिति के बारे में जानकारी मिलने से, आपको ज़्यादा जोखिम वाले ऑपरेशन करने से पहले सुरक्षा के इंतज़ाम करने में मदद मिलती है.
AndroidX Security State एक Jetpack लाइब्रेरी है. यह Android डिवाइस की सुरक्षा की स्थिति को एक साथ ऐक्सेस करने की सुविधा देती है. यह AOSP एपीआई और Android के सार्वजनिक तौर पर उपलब्ध सुरक्षा से जुड़ी कमियों की जानकारी देने वाले फ़ीड को मिलाकर, डिवाइस की सुरक्षा की स्थिति के बारे में पूरी, सटीक, और कार्रवाई करने लायक जानकारी देता है. यह जानकारी, सिर्फ़ सुरक्षा पैच लेवल (एसपीएल) से आगे की होती है.
आर्किटेक्चर की खास जानकारी
इस डायग्राम में दिखाया गया है कि AndroidX Security State लाइब्रेरी, उपयोगकर्ता के डिवाइस पर मौजूद प्लैटफ़ॉर्म प्रॉपर्टी, इंटरप्रोसेस कम्यूनिकेशन (आईपीसी) अपडेट करने वाले प्रोवाइडर, और सार्वजनिक रूप से उपलब्ध सुरक्षा से जुड़ी कमज़ोरियों की जानकारी देने वाले फ़ीड को एक ही एपीआई सेट में कैसे इकट्ठा करती है.

सुरक्षा पैच की स्थितियां और कॉम्पोनेंट
Security State लाइब्रेरी का मुख्य फ़ायदा यह है कि यह कॉम्पोनेंट लेवल पर, सुरक्षा पैच का लेवल (एसपीएल) विस्तृत रूप से दिखाती है. पिछले कुछ सालों में, Android ने Google Play के सिस्टम अपडेट (प्रोजेक्ट मेनलाइन) के लिए ज़्यादा मॉड्यूल लॉन्च किए हैं. इन्हें Google Play की मदद से अपडेट किया जाता है. ये सिस्टम के स्टैंडर्ड ओवर-द-एयर (ओटीए) अपडेट से अलग होते हैं. इनसे सुरक्षा से जुड़ी ज़रूरी समस्याओं को अलग-अलग समय पर ठीक किया जाता है.
इसी तरह, सुरक्षा पैच का लेवल आम तौर पर, सामान्य कर्नेल इमेज (जीकेआई) के ज़रूरी वर्शन की ज़रूरत होती है. हालांकि, कर्नेल अपडेट, सिस्टम के शेड्यूल से पहले भी किए जा सकते हैं. ऐसा हो सकता है कि कर्नल से जुड़ी इन समस्याओं को सिस्टम के मुख्य एसपीएल स्ट्रिंग में पूरी तरह से शामिल न किया गया हो.
पारदर्शिता बढ़ाने के लिए, Security State Library, तीनों कॉम्पोनेंट के लिए अलग-अलग इफ़ेक्टिव पैच लेवल उपलब्ध कराती है:
- सिस्टम (
COMPONENT_SYSTEM): यह स्टैंडर्ड ओएस और सिस्टम की सुरक्षा की स्थिति को दिखाता है. यह स्टैंडर्ड सिक्योरिटी पैच लेवल फ़ील्ड से मिलता है. - सिस्टम मेनलाइन मॉड्यूल (
COMPONENT_SYSTEM_MODULES): यह मॉड्यूलर सिस्टम कॉम्पोनेंट (Google Play के सिस्टम अपडेट) की सुरक्षा की स्थिति को दिखाता है. यह जानकारी, मॉड्यूल के रिलीज़ किए गए वर्शन से मिलती है. - कर्नेल (
COMPONENT_KERNEL): यह डिवाइस के कर्नेल की सुरक्षा की स्थिति को दिखाता है. यह कर्नेल वर्शन स्ट्रिंग से सीधे तौर पर मिलता है.
लाइब्रेरी, कॉम्पोनेंट के आधार पर पैच लेवल की जानकारी के ज़्यादा से ज़्यादा तीन डाइमेंशन उपलब्ध कराती है:
- डिवाइस एसपीएल (डीएसपीएल): डिवाइस पर चल रहे अलग-अलग कॉम्पोनेंट का मौजूदा पैच लेवल. इसके लिए, नेटवर्क अनुरोधों के बिना सिंक्रोनस तरीके से क्वेरी की जाती है. सिस्टम और मेनलाइन, कैलेंडर की तारीखों (
DateBasedSecurityPatchLevel) की रिपोर्ट करते हैं. वहीं, कर्नेल अपने रिलीज़ के लिए तैयार वर्शन (VersionedSecurityPatchLevel, उदाहरण के लिए,5.15.148) की रिपोर्ट करता है. - पब्लिश किया गया एसपीएल (पीएसपीएल): यह Android सुरक्षा बुलेटिन और ओपन सोर्स की कमियों (ओएसवी) के डेटाबेस की रिपोर्ट में आधिकारिक तौर पर पब्लिश किया गया बेसलाइन है. आपका ऐप्लिकेशन, डिवाइस के एसपीएल से मिली तारीखों या वर्शन स्ट्रिंग की तुलना करके, यह पता लगा सकता है कि ज़रूरी शर्तों का पालन किया गया है या नहीं.
- उपलब्ध एसपीएल (एएसपीएल): इससे पता चलता है कि डिवाइस पर अपडेट उपलब्ध हैं या नहीं. ये अपडेट, अपडेट देने वाली कंपनियों से मिलते हैं. इन्हें आईपीसी का इस्तेमाल करके एसिंक्रोनस तरीके से क्वेरी किया जाता है. Android और Google Play के सिस्टम अपडेट की सुविधा, Mainline मॉड्यूल के लिए उपलब्ध होती है. साथ ही, ओईएम के ओटीए क्लाइंट, सिस्टम अपडेट के लिए उपलब्ध होते हैं. कर्नल अपडेट, ऑपरेटिंग सिस्टम की इमेज में बंडल किए जाते हैं. इसलिए, कर्नल अपडेट की उपलब्धता का आकलन करने के लिए
COMPONENT_SYSTEMका इस्तेमाल किया जाता है.
सुरक्षा से जुड़ी सुविधाओं को कंट्रोल करना
सुरक्षा से जुड़ी संवेदनशील सुविधाओं को गेट करने के लिए, डिवाइस एसपीएल (डीएसपीएल), उपलब्ध एसपीएल (एएसपीएल), और पब्लिश किया गया एसपीएल (पीएसपीएल) से मिली जानकारी को एक साथ इस्तेमाल किया जा सकता है. उदाहरण के लिए, DSPL की तुलना ASPL से की जा सकती है. इससे यह पता लगाया जा सकता है कि कोई नया सुरक्षा पैच उपलब्ध है या नहीं. अगर उपलब्ध है, तो यह भी पता लगाया जा सकता है कि उपयोगकर्ता ने उसे अब तक इंस्टॉल किया है या नहीं. अगर उपयोगकर्ता ने उसे इंस्टॉल नहीं किया है, तो उसे संवेदनशील कार्रवाइयां शुरू करने से पहले अपडेट करने के लिए कहा जा सकता है. जैसे, पेमेंट करना या क्रेडेंशियल रजिस्टर करना. areCvesPatched() का इस्तेमाल करके, यह भी पुष्टि की जा सकती है कि डिवाइस पर मौजूद जोखिम वाली कुछ खास कमियों को ठीक कर दिया गया है या नहीं. ऐसा, जोखिम वाले सबसिस्टम को चालू करने से पहले किया जाता है. जैसे, आस-पास मौजूद डिवाइसों से पेमेंट करने या डेटा शेयर करने की अनुमति देने से पहले, एनएफ़सी या ब्लूटूथ से जुड़ी गंभीर कमियों की जांच करना.
प्लैटफ़ॉर्म के वर्शन से जुड़ी बातें
सुरक्षा की स्थिति से जुड़ी कुछ सुविधाएं, प्लैटफ़ॉर्म के आर्किटेक्चर पर निर्भर करती हैं. ये Android के पुराने वर्शन पर उपलब्ध नहीं हैं:
- Android 11 (एपीआई लेवल 30) और इसके बाद के वर्शन: सभी कॉम्पोनेंट के साथ पूरी तरह से काम करता है. इनमें बुलेटिन में पब्लिश किए गए कर्नेल के एलटीएस वर्शन और अपडेट की उपलब्धता (एएसपीएल) क्वेरी शामिल हैं.
- Android 10 (एपीआई लेवल 29): यह सिस्टम और सिस्टम मॉड्यूल के पैच लेवल के साथ काम करता है. हालांकि, बुलेटिन में पब्लिश किए गए कर्नल वर्शन उपलब्ध नहीं हैं, क्योंकि Android सुरक्षा बुलेटिन में सामान्य कर्नेल इमेज (जीकेआई) ट्रैकिंग और कर्नल एलटीएस टारगेट, Android 11 से शुरू हुए थे. डिवाइस पर मौजूद कर्नल वर्शन को अब भी स्थानीय तौर पर पढ़ा जा सकता है.
- Android 9 (एपीआई लेवल 28) और इससे पहले के वर्शन: Android 10 की सीमाओं के अलावा, मॉड्यूलर सिस्टम कॉम्पोनेंट (प्रोजेक्ट मेनलाइन) Android 10 से पहले मौजूद नहीं थे.
सिस्टम मॉड्यूल के एसपीएल उपलब्ध न होने पर,
getDeviceSecurityPatchLevel(COMPONENT_SYSTEM_MODULES)को सुरक्षित तरीके से कॉल करने पर, Unix epoch की बेसलाइन तारीख (1970-01-01) पर वापस आ जाता है.
अपडेट की उपलब्धता और उपलब्ध एसपीएल (एएसपीएल) के बारे में जानकारी
किसी डिवाइस की सुरक्षा की स्थिति का पता लगाने के लिए, यह जानना ज़रूरी है कि अलग-अलग कॉम्पोनेंट के लिए सुरक्षा से जुड़े अपडेट उपलब्ध हैं या नहीं. Android डिवाइसों को सुरक्षा से जुड़े अपडेट, अलग-अलग तरीकों से मिलते हैं. जैसे, मॉड्यूलर कॉम्पोनेंट के लिए सिस्टम के ओवर-द-एयर (OTA) अपडेट और Google Play के सिस्टम अपडेट.
आपका ऐप्लिकेशन किसी कॉम्पोनेंट के लिए एएसपीएल तब ही पा सकता है, जब अपडेट देने वाली कंपनी उस जानकारी को पब्लिश कर दे. अपडेट के इन अलग-अलग सोर्स के बीच तालमेल बिठाने के लिए, क्लाइंट ऐप्लिकेशन AndroidX Security State लाइब्रेरी का इस्तेमाल करके सुरक्षा की स्थिति के बारे में क्वेरी करते हैं. वहीं, डिवाइस पर अपडेट करने वाले क्लाइंट, AndroidX Security State Provider लाइब्रेरी का इस्तेमाल करके, उपलब्ध सुरक्षा पैच लेवल (एएसपीएल) पब्लिश करते हैं.
Google, GMS Android डिवाइसों के लिए Mainline मॉड्यूल के अपडेट की जानकारी देता है. साथ ही, Google OTA क्लाइंट (GOTA) का इस्तेमाल करने वाले डिवाइसों के लिए, सिस्टम के ओटीए अपडेट की जानकारी देता है.
यहां दिए गए डायग्राम में बताया गया है कि क्लाइंट ऐप्लिकेशन, AndroidX Security State लाइब्रेरी का इस्तेमाल करके, Google Play सिस्टम अपडेट और सिस्टम ओटीए अपडेट, दोनों के लिए सुरक्षा की स्थिति के बारे में कैसे क्वेरी करते हैं:

डिपेंडेंसी जोड़ें
AndroidX Security State पर डिपेंडेंसी जोड़ने के लिए, आपको अपने प्रोजेक्ट में Google Maven रिपॉज़िटरी शामिल करनी होगी. अपने ऐप्लिकेशन की build.gradle.kts या build.gradle फ़ाइल में, यह डिपेंडेंसी जोड़ें:
Kotlin
// Kotlin DSL (build.gradle.kts)
dependencies {
implementation("androidx.security:security-state:1.1.0")
}
Groovy
// Groovy DSL (build.gradle)
dependencies {
implementation "androidx.security:security-state:1.1.0"
}
अनुमतियों की जानकारी देने वाली मैट्रिक्स
| टारगेट एपीआई | AndroidManifest.xml में ज़रूरी अनुमतियां |
ऑपरेशनल नोट |
|---|---|---|
getDeviceSecurityPatchLevel() |
कोई नहीं | यह कुकी, लोकल नेटिव सिस्टम प्रॉपर्टी और पैकेज मेटाडेटा को एक साथ पढ़ती है. |
fetchAvailableSecurityPatchLevel()queryAllAvailableUpdates() |
कोई नहीं | यह डिवाइस पर मौजूद आईपीसी का इस्तेमाल करके कम्यूनिकेट करता है. यह लाइब्रेरी, डिवाइस पर सिर्फ़ भरोसेमंद कॉम्पोनेंट से क्वेरी करती है. इसके लिए, अपडेट देने वाली कंपनियों के पास READ_PRIVILEGED_PHONE_STATE अनुमति होनी चाहिए. इसलिए, आपका ऐप्लिकेशन इस बात पर भरोसा कर सकता है कि उसे जो जानकारी मिल रही है वह सही है. |
createVulnerabilityReportUrl()loadVulnerabilityReport()getPublishedSecurityPatchLevel()areCvesPatched()isDeviceFullyUpdated() |
android.permission.INTERNET |
सार्वजनिक ओएसवी रिपोर्ट फ़ेच करने के लिए ज़रूरी है. loadVulnerabilityReport() का इस्तेमाल करके मेमोरी में लोड होने के बाद, क्वेरी करने के तरीके लोकल तौर पर लागू होते हैं. इसके लिए, नेटवर्क ऐक्सेस की ज़रूरत नहीं होती. |
लाइब्रेरी शुरू करना
Android Context का इस्तेमाल करके, SecurityPatchState को शुरू करें:
Kotlin
import androidx.security.state.SecurityPatchState
val securityPatchState = SecurityPatchState(context)
Java
import androidx.security.state.SecurityPatchState;
SecurityPatchState securityPatchState = new SecurityPatchState(context);
सिर्फ़ context के साथ शुरू करने पर, नेटवर्क पर निर्भरता के बिना ही ऑफ़लाइन डिवाइस के पैच लेवल का तुरंत ऐक्सेस मिल जाता है. उपलब्धता के बारे में क्वेरी अपडेट करें
उपयोगकर्ता के डिवाइस पर मौजूद सेवा देने वाली कंपनियों के साथ एसिंक्रोनस तरीके से कम्यूनिकेट करें).
अगर आपका ऐप्लिकेशन, CVE के नियमों का पालन करने की जांच करता है और उसने पहले ही OSV की जोखिम वाली रिपोर्ट को मेमोरी में लोड कर लिया है, तो Kotlin कॉलर, JSON स्ट्रिंग को सीधे Kotlin में कंस्ट्रक्टर को पास कर सकते हैं:
val securityPatchState = SecurityPatchState(context, vulnerabilityReportJsonString = jsonString)
Java में या स्टार्टअप के बाद रिपोर्ट को एसिंक्रोनस तरीके से लोड करते समय, कॉन्टेक्स्ट के साथ शुरू करें और securityPatchState.loadVulnerabilityReport(jsonString) को कॉल करें.
डिवाइस के पैच लेवल देखना
उपयोगकर्ता के डिवाइस पर पैच लेवल के बारे में एक साथ क्वेरी करना:
Kotlin
val deviceSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM)
val mainlineSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM_MODULES)
val kernelVersion = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_KERNEL)
// Gatekeeping check: compare against a required baseline patch date
val requiredSpl = SecurityPatchState.DateBasedSecurityPatchLevel.fromString("2026-01-01")
if (deviceSpl < requiredSpl) {
// Restrict access to sensitive features or guide user to update
}
Java
SecurityPatchState.SecurityPatchLevel deviceSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM);
SecurityPatchState.SecurityPatchLevel mainlineSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM_MODULES);
SecurityPatchState.SecurityPatchLevel kernelVersion = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_KERNEL);
// Gatekeeping check: compare against a required baseline patch date
SecurityPatchState.SecurityPatchLevel requiredSpl = SecurityPatchState.DateBasedSecurityPatchLevel.fromString("2026-01-01");
if (deviceSpl.compareTo(requiredSpl) < 0) {
// Restrict access to sensitive features or guide user to update
}
देखें कि सिस्टम के लिए कोई अपडेट बाकी है या नहीं
ऐप्लिकेशन, उपयोगकर्ता के डिवाइस पर अपडेट की सुविधा देने वाली भरोसेमंद कंपनियों के साथ एसिंक्रोनस तरीके से कम्यूनिकेट करके, अपडेट के उपलब्ध होने का आकलन कर सकते हैं. इनमें आम तौर पर, Google Play के सिस्टम अपडेट और ओईएम के ओटीए क्लाइंट शामिल होते हैं:
fetchAvailableSecurityPatchLevel(): यह किसी कॉम्पोनेंट के लिए, उपलब्ध SPL का असर दिखाता है. अगर कोई नया अपडेट उपलब्ध नहीं है, तो यह डिवाइस के मौजूदा SPL पर वापस आ जाता है. इसका इस्तेमाल, डिवाइस के SPL और पब्लिश किए गए SPL से तुलना करने के लिए किया जा सकता है.queryAllAvailableUpdates(): यह डिवाइस पर अपडेट देने वाली सभी भरोसेमंद कंपनियों का पता लगाता है. साथ ही, सोर्स और डेटा के अपडेट होने की तारीख के बारे में मेटाडेटा के साथ-साथ,UpdateCheckResultकी विस्तृत जानकारी देता है.
पहला उदाहरण: उपयोगकर्ताओं को लंबित अपडेट के लिए सूचना देना
सुरक्षा से जुड़े अपडेट उपलब्ध होने पर, उपयोगकर्ताओं को सूचना देने के लिए fetchAvailableSecurityPatchLevel() का इस्तेमाल करें. उदाहरण के लिए, Settings.ACTION_SYSTEM_UPDATE_SETTINGS लॉन्च करके:
Kotlin
import androidx.lifecycle.lifecycleScope
import androidx.security.state.SecurityPatchState
import kotlinx.coroutines.launch
// Pattern A: Prompt users for pending updates (with automatic offline fallback)
lifecycleScope.launch {
val currentSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM)
val availableSpl = securityPatchState.fetchAvailableSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM)
if (availableSpl > currentSpl) {
// Prompt the user to install pending updates in system settings
}
}
Java
Java में, एसिंक्रोनस तरीके ListenableFuture दिखाते हैं और ContextCompat.getMainExecutor() का इस्तेमाल करके कॉल बैक को रूट करते हैं:
import androidx.core.content.ContextCompat;
import androidx.security.state.SecurityPatchState;
import androidx.security.state.SecurityPatchState.SecurityPatchLevel;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
// Pattern A: Prompt users for pending updates (with automatic offline fallback)
SecurityPatchLevel currentSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM);
ListenableFuture<SecurityPatchLevel> availableSpl = securityPatchState.fetchAvailableSecurityPatchLevelAsync(
SecurityPatchState.COMPONENT_SYSTEM,
SecurityPatchState.UPDATE_INFO_SERVICE_BINDING_TIMEOUT_MS
);
Futures.addCallback(availableSpl, new FutureCallback<SecurityPatchLevel>() {
@Override
public void onSuccess(SecurityPatchLevel available) {
if (available.compareTo(currentSpl) > 0) {
// Prompt the user to install pending updates in system settings
}
}
@Override
public void onFailure(Throwable t) {
// Handle timeout or IPC communication error
}
}, ContextCompat.getMainExecutor(context));
दूसरा उदाहरण: सेवा देने वाली कंपनी की स्थिति के बारे में ज़्यादा जानकारी देखना
अलग-अलग प्रोवाइडर, टाइमस्टैंप, और UpdateInfo रिकॉर्ड की जांच करने के लिए, queryAllAvailableUpdates() का इस्तेमाल करें:
Kotlin
import androidx.lifecycle.lifecycleScope
import androidx.security.state.SecurityPatchState
import kotlinx.coroutines.launch
// Pattern B: Inspect detailed provider status
lifecycleScope.launch {
val updateResults = securityPatchState.queryAllAvailableUpdates()
for (result in updateResults) {
val provider = result.providerPackageName
val lastCheck = result.lastCheckTimeMillis
val updates = result.updates // List<UpdateInfo>
}
}
Java
import androidx.core.content.ContextCompat;
import androidx.security.state.SecurityPatchState;
import androidx.security.state.UpdateCheckResult;
import androidx.security.state.UpdateInfo;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.List;
// Pattern B: Inspect detailed provider status
ListenableFuture<List<UpdateCheckResult>> updateResults = securityPatchState.queryAllAvailableUpdatesAsync(
SecurityPatchState.UPDATE_INFO_SERVICE_BINDING_TIMEOUT_MS
);
Futures.addCallback(updateResults, new FutureCallback<List<UpdateCheckResult>>() {
@Override
public void onSuccess(List<UpdateCheckResult> results) {
for (UpdateCheckResult result : results) {
String provider = result.getProviderPackageName();
long lastCheck = result.getLastCheckTimeMillis();
List<UpdateInfo> updates = result.getUpdates();
}
}
@Override
public void onFailure(Throwable t) {
// Handle error
}
}, ContextCompat.getMainExecutor(context));
कमज़ोरी को ठीक किए जाने की पुष्टि करना और CVE की जांच करना
CVE से जुड़ी समस्याओं को कम करने के तरीकों का आकलन करने, अपडेट से जुड़ी सभी ज़रूरी शर्तों का पालन करने की जांच करने या पब्लिश किए गए सुरक्षा पैच के लेवल (पीएसपीएल) की जांच करने के लिए, आपके ऐप्लिकेशन को सबसे पहले ओएसवी की जोखिम की आशंका वाली रिपोर्ट हासिल करनी होगी और उसे लोड करना होगा. इसके बारे में SecurityPatchState के लिए एपीआई का संदर्भ में बताया गया है.
Kotlin
// Load vulnerability report
val reportUrl = SecurityPatchState.createVulnerabilityReportUrl()
// ... download JSON string from reportUrl ...
securityPatchState.loadVulnerabilityReport(jsonString)
// Check overall update compliance against published bulletin
val isFullyUpdated = securityPatchState.isDeviceFullyUpdated()
val cves = listOf("CVE-2019-9501", "CVE-2020-3699", "CVE-2024-0016")
val isPatched = securityPatchState.areCvesPatched(cves)
// Get a list of all patched CVEs for a specific component and SPL
val deviceSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM)
val patchedSystemCVEs = securityPatchState.getPatchedCves(SecurityPatchState.COMPONENT_SYSTEM, deviceSpl)
// Inspect published SPL and kernel LTS target versions from the bulletin
val publishedSystemSpl = securityPatchState.getPublishedSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM)
val kernelLtsTargets = securityPatchState.getPublishedSecurityPatchLevel(SecurityPatchState.COMPONENT_KERNEL)
Java
// Load vulnerability report
Uri reportUrl = SecurityPatchState.createVulnerabilityReportUrl();
// ... download JSON string from reportUrl ...
securityPatchState.loadVulnerabilityReport(jsonString);
// Check overall update compliance against published bulletin
boolean isFullyUpdated = securityPatchState.isDeviceFullyUpdated();
List<String> cves = Arrays.asList("CVE-2019-9501", "CVE-2020-3699", "CVE-2024-0016");
boolean isPatched = securityPatchState.areCvesPatched(cves);
// Get a list of all patched CVEs for a specific component and SPL
SecurityPatchState.SecurityPatchLevel deviceSpl = securityPatchState.getDeviceSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM);
Map<SecurityPatchState.Severity, Set<String>> patchedSystemCVEs =
securityPatchState.getPatchedCves(SecurityPatchState.COMPONENT_SYSTEM, deviceSpl);
// Inspect published SPL and kernel LTS target versions from the bulletin
List<SecurityPatchState.SecurityPatchLevel> publishedSystemSpl =
securityPatchState.getPublishedSecurityPatchLevel(SecurityPatchState.COMPONENT_SYSTEM);
List<SecurityPatchState.SecurityPatchLevel> kernelLtsTargets =
securityPatchState.getPublishedSecurityPatchLevel(SecurityPatchState.COMPONENT_KERNEL);
सुरक्षा से जुड़ी कमियों की रिपोर्ट लोड करना
- लोकल कैश मेमोरी और WorkManager रीफ़्रेश: Android सुरक्षा बुलेटिन हर महीने पब्लिश किए जाते हैं. इसलिए, डाउनलोड किए गए JSON को डिवाइस के स्टोरेज (
context.filesDir) में कैश मेमोरी के तौर पर सेव करें. साथ ही,WorkManagerका इस्तेमाल करके, समय-समय पर बैकग्राउंड टास्क शेड्यूल करें. टास्क को हर 24 से 48 घंटे में शेड्यूल करना बेहतर होता है, ताकि रिपोर्ट रीफ़्रेश हो सके. इसके अलावा, ऐप्लिकेशन लॉन्च होने पर, लोकल कैश मेमोरी से डेटा को सिंक्रोनस तरीके से पढ़ा जा सके. - बैकग्राउंड थ्रेडिंग: CVE रिकॉर्ड पार्स करते समय, मुख्य यूज़र इंटरफ़ेस (यूआई) थ्रेड को ब्लॉक करने से बचने के लिए, बैकग्राउंड थ्रेड (Kotlin में
Dispatchers.IOया Java मेंExecutor) परloadVulnerabilityReport()को लागू करें. - Kernel LTS Evaluation: Calling
getPatchedCves(COMPONENT_KERNEL, ...)throws anIllegalArgumentException, andareCvesPatched()does not evaluate kernel CVEs. इसके बजाय, कर्नल की सुरक्षा का आकलन करने के लिए, डिवाइस के कर्नल वर्शन की तुलना Android Common Kernel LTS के टारगेट से करें. यह टारगेट,getPublishedSecurityPatchLevel(COMPONENT_KERNEL)के ज़रिए मिलता है. यह टारगेट, डिवाइस के कर्नल वर्शन की मुख्य और माइनर ब्रांच से मेल खाता है. उदाहरण के लिए,5.15.140कर्नल की तुलना5.15.159टारगेट से करें.
अन्य संसाधन
डिवाइस की सुरक्षा की स्थिति के बारे में ज़्यादा जानने के लिए, यहां दिए गए संसाधन देखें:
दस्तावेज़
- डिवाइस की सुरक्षा की स्थिति पब्लिश करना
- Android सुरक्षा बुलेटिन
- मॉड्यूलर सिस्टम कॉम्पोनेंट
- जेनेरिक कर्नेल इमेज (GKI)
- अतिरिक्त सुरक्षा पैच
- Play Integrity API
- Open Source Vulnerabilities (OSV) डेटाबेस
- Security State 1.1.0 की जानकारी