ทำความเข้าใจสถานะความปลอดภัยของอุปกรณ์

แอปของคุณจะปลอดภัยเทียบเท่ากับระบบปฏิบัติการพื้นฐานเท่านั้น เพื่อลดความเสี่ยง แอปของคุณ ควรกำหนดการดำเนินการที่เกี่ยวข้องกับความปลอดภัยด้วยการประเมินแบบเรียลไทม์เกี่ยวกับ ท่าทางด้านความปลอดภัยของอุปกรณ์ เพื่อพิจารณาว่าอุปกรณ์ โดยเฉพาะอย่างยิ่งคอมโพเนนต์ระบบหลัก ได้รับการอัปเดตอย่างเต็มรูปแบบและได้รับการปกป้องจากช่องโหว่ที่ เผยแพร่ในกระดานข่าวความปลอดภัยของ Android หรือไม่ การมองเห็นสถานะความปลอดภัยของอุปกรณ์ช่วยให้คุณสร้างการป้องกันก่อนที่แอปจะดำเนินการที่มีความเสี่ยงสูง

AndroidX Security State เป็นไลบรารี Jetpack ที่ให้การเข้าถึงแบบรวม สถานะความปลอดภัยของอุปกรณ์ที่ใช้ Android โดยจะรวม API ของ AOSP และฟีดช่องโหว่สาธารณะของ Android เพื่อให้สถานะความปลอดภัยของอุปกรณ์ที่ครอบคลุม แม่นยำ และนำไปใช้ได้จริง นอกเหนือจาก ระดับแพตช์ด้านความปลอดภัย (SPL) เพียงอย่างเดียว

ภาพรวมสถาปัตยกรรม

แผนภาพต่อไปนี้แสดงให้เห็นว่าไลบรารีสถานะความปลอดภัยของ AndroidX รวมคุณสมบัติของแพลตฟอร์มในอุปกรณ์, การสื่อสารระหว่างโปรเซส (IPC) ผู้ให้บริการอัปเดต และฟีดช่องโหว่สาธารณะไว้ในชุด API เดียวที่สอดคล้องกันได้อย่างไร

ไลบรารีสถานะความปลอดภัยของ AndroidX จะรวมพร็อพเพอร์ตี้แพลตฟอร์มในอุปกรณ์, ผู้ให้บริการอัปเดต IPC และฟีดช่องโหว่สาธารณะไว้ในชุด API แบบรวม

สถานะและคอมโพเนนต์ของแพตช์ความปลอดภัย

ข้อได้เปรียบหลักของการใช้ไลบรารีสถานะความปลอดภัยคือความสามารถในการ ระบุระดับแพตช์ด้านความปลอดภัย (SPL) ในระดับคอมโพเนนต์แบบละเอียด ในช่วงหลายปีที่ผ่านมา Android ได้เปิดตัวโมดูลเพิ่มเติมในการอัปเดตระบบ Google Play (โปรเจ็กต์เมนไลน์) ซึ่งอัปเดตโดยใช้ Google Play แยกต่างหากจากการอัปเดตระบบแบบ Over-The-Air (OTA) มาตรฐาน เพื่อให้การแก้ไขด้านความปลอดภัยที่สำคัญเป็นไปตามจังหวะที่แตกต่างกัน

ในทำนองเดียวกัน แม้ว่าระดับแพตช์ด้านความปลอดภัยมักจะกำหนดเวอร์ชันGeneric Kernel Image (GKI) ขั้นต่ำที่จำเป็น แต่การอัปเดตเคอร์เนลอาจเกิดขึ้นก่อนกำหนดการของระบบ การแก้ไขเฉพาะเคอร์เนลเหล่านี้อาจไม่ได้รับการบันทึกอย่างสมบูรณ์โดยสตริง SPL หลักของระบบ

ไลบรารีสถานะความปลอดภัยจะระบุระดับแพตช์ที่มีผลสำหรับคอมโพเนนต์ทั้ง 3 รายการแยกกันเพื่อเพิ่มความโปร่งใส

  • ระบบ (COMPONENT_SYSTEM): แสดงถึงสถานะความปลอดภัยของระบบปฏิบัติการ และระบบมาตรฐาน ที่ได้มาจากฟิลด์ระดับแพตช์ด้านความปลอดภัยมาตรฐาน
  • โมดูลเมนไลน์ของระบบ (COMPONENT_SYSTEM_MODULES): แสดงสถานะความปลอดภัยของคอมโพเนนต์ของระบบโมดูล (การอัปเดตระบบ Google Play) ซึ่งได้มาจากเวอร์ชันการเผยแพร่โมดูลที่เฉพาะเจาะจง
  • เคอร์เนล (COMPONENT_KERNEL): แสดงสถานะความปลอดภัย ของเคอร์เนลของอุปกรณ์ ซึ่งได้มาจากสตริงเวอร์ชันเคอร์เนลโดยตรง

ไลบรารีจะให้ข้อมูลระดับแพตช์สูงสุด 3 มิติ ขึ้นอยู่กับคอมโพเนนต์

  • SPL ของอุปกรณ์ (DSPL): ระดับแพตช์ปัจจุบันของคอมโพเนนต์แต่ละรายการ ที่ทำงานในอุปกรณ์ ซึ่งจะค้นหาแบบพร้อมกันโดยไม่ต้องส่งคำขอเครือข่าย ระบบ และรายงาน Mainline จะแสดงวันที่ในปฏิทิน (DateBasedSecurityPatchLevel) ขณะที่เคอร์เนลจะรายงานเวอร์ชันที่เผยแพร่ (เช่น VersionedSecurityPatchLevel 5.15.148)
  • SPL ที่เผยแพร่ (PSPL): พื้นฐานที่เผยแพร่อย่างเป็นทางการในกระดานข่าวสารด้านความปลอดภัยของ Android และรายงานฐานข้อมูลช่องโหว่โอเพนซอร์ส (OSV) แอปของคุณสามารถประเมินการปฏิบัติตามข้อกำหนดได้โดยการเปรียบเทียบวันที่หรือสตริงเวอร์ชัน ที่ SPL ของอุปกรณ์ระบุ
  • SPL ที่พร้อมใช้งาน (ASPL): ระบุว่าอุปกรณ์มีการอัปเดตที่รอดำเนินการ จากผู้ให้บริการอัปเดตหรือไม่ โดยจะค้นหาแบบไม่พร้อมกันโดยใช้ IPC ฟีเจอร์การอัปเดตระบบ Google Play ของ Android จะแสดงความพร้อมใช้งานสำหรับโมดูล Mainline และไคลเอ็นต์ OTA ของ OEM จะแสดงความพร้อมใช้งานสำหรับการอัปเดตระบบ เนื่องจากมีการรวมการอัปเดตเคอร์เนล ไว้ในอิมเมจระบบปฏิบัติการ การประเมินความพร้อมใช้งานของการอัปเดตเคอร์เนล จึงใช้ COMPONENT_SYSTEM

ฟีเจอร์ที่ต้องมีการรักษาความปลอดภัย

คุณสามารถรวมข้อมูลจาก SPL ของอุปกรณ์ (DSPL), SPL ที่พร้อมใช้งาน (ASPL) และ SPL ที่เผยแพร่ (PSPL) เพื่อกำหนดบริบทสำหรับการจำกัดการเข้าถึงฟีเจอร์ที่มีความละเอียดอ่อนด้านความปลอดภัย เช่น คุณสามารถเปรียบเทียบ DSPL กับ ASPL เพื่อ ดูว่ามีแพตช์ความปลอดภัยใหม่กว่าที่ผู้ใช้ยังไม่ได้ ติดตั้งหรือไม่ แล้วแจ้งให้ผู้ใช้อัปเดตก่อนเริ่มการดำเนินการที่ละเอียดอ่อน เช่น การชำระเงินหรือการลงทะเบียนข้อมูลเข้าสู่ระบบ นอกจากนี้ คุณยังใช้ areCvesPatched() เพื่อ ตรวจสอบว่ามีการแก้ไขช่องโหว่ที่มีความเสี่ยงสูงที่เฉพาะเจาะจงใน อุปกรณ์ก่อนที่จะเรียกใช้ระบบย่อยที่มีช่องโหว่ เช่น การตรวจสอบช่องโหว่ที่สำคัญของ NFC หรือบลูทูธก่อนที่จะให้สิทธิ์การชำระเงินหรือการแชร์ข้อมูลตามระยะใกล้

ข้อควรพิจารณาเกี่ยวกับเวอร์ชันของแพลตฟอร์ม

ความสามารถบางอย่างของสถานะความปลอดภัยขึ้นอยู่กับสถาปัตยกรรมแพลตฟอร์มพื้นฐาน และไม่พร้อมใช้งานใน Android เวอร์ชันที่ต่ำกว่า

  • Android 11 (ระดับ API 30) ขึ้นไป: รองรับคอมโพเนนต์ทั้งหมดอย่างเต็มรูปแบบ รวมถึงเวอร์ชัน LTS ของเคอร์เนลที่เผยแพร่ในกระดานข่าวและความพร้อมใช้งานของการอัปเดต (ASPL)
  • Android 10 (API ระดับ 29): รองรับระดับแพตช์ของระบบและโมดูลระบบ แต่ไม่มีเวอร์ชันเคอร์เนลที่เผยแพร่ในกระดานข่าวเนื่องจาก การติดตาม Generic Kernel Image (GKI) และเป้าหมาย LTS ของเคอร์เนลในกระดานข่าวความปลอดภัยของ Android เริ่มขึ้นใน Android 11 โดยยังคงอ่านเวอร์ชันเคอร์เนลในอุปกรณ์ได้ ในเครื่อง
  • Android 9 (ระดับ API 28) และเก่ากว่า: นอกเหนือจากข้อจำกัดของ Android 10 แล้ว คอมโพเนนต์ระบบแบบแยกส่วน (Project Mainline) ยังไม่มีก่อน Android 10 การเรียกใช้ getDeviceSecurityPatchLevel(COMPONENT_SYSTEM_MODULES) จะกลับไปใช้ วันที่ Unix Epoch พื้นฐาน (1970-01-01) อย่างปลอดภัยเมื่อ SPL ของโมดูลระบบไม่พร้อมใช้งาน

ทำความเข้าใจความพร้อมใช้งานของการอัปเดตและ SPL ที่พร้อมใช้งาน (ASPL)

การพิจารณาท่าทางด้านความปลอดภัยของอุปกรณ์ต้องทราบว่ามีการอัปเดตความปลอดภัยที่รอดำเนินการสำหรับคอมโพเนนต์แต่ละรายการหรือไม่ อุปกรณ์ Android จะได้รับการอัปเดตความปลอดภัยผ่านกลไกการนำส่งที่แตกต่างกันหลายอย่าง เช่น การอัปเดตระบบแบบ Over-The-Air (OTA) และการอัปเดตระบบ Google Play สำหรับคอมโพเนนต์แบบโมดูล

ก่อนที่แอปจะดึง ASPL สำหรับคอมโพเนนต์ที่ต้องการได้ ผู้ให้บริการอัปเดตที่เกี่ยวข้องต้องเผยแพร่ข้อมูลดังกล่าว หากต้องการประสานงาน ในแหล่งที่มาของการอัปเดตที่แตกต่างกันเหล่านี้ แอปพลิเคชันไคลเอ็นต์จะใช้ไลบรารี AndroidX Security State เพื่อค้นหาสถานะความปลอดภัย ขณะที่ไคลเอ็นต์การอัปเดตในอุปกรณ์จะใช้ไลบรารี AndroidX Security State Provider ที่เกี่ยวข้องเพื่อเผยแพร่ระดับแพตช์ด้านความปลอดภัยที่พร้อมใช้งาน (ASPL)

Google จะให้ข้อมูลการอัปเดตสำหรับโมดูล Mainline แก่อุปกรณ์ Android ทั้งหมดที่ใช้ GMS รวมถึงข้อมูล OTA ของระบบสำหรับอุปกรณ์ที่ใช้ไคลเอ็นต์ Google OTA (GOTA)

แผนภาพต่อไปนี้แสดงวิธีที่แอปพลิเคชันไคลเอ็นต์ใช้ไลบรารีสถานะความปลอดภัยของ AndroidX เพื่อค้นหาสถานะความปลอดภัยในการอัปเดตระบบ Google Play และการอัปเดต OTA ของระบบ

แอปพลิเคชันไคลเอ็นต์ใช้ไลบรารีสถานะความปลอดภัยของ AndroidX เพื่อค้นหาสถานะความปลอดภัยในการอัปเดตระบบ Google Play และการอัปเดต OTA ของระบบ

เพิ่มทรัพยากร Dependency

หากต้องการเพิ่มการอ้างอิงในสถานะความปลอดภัยของ AndroidX คุณต้องรวมที่เก็บ Google Maven ไว้ในโปรเจ็กต์ เพิ่มทรัพยากร Dependency ลงในไฟล์ build.gradle.kts หรือ build.gradle ของแอป

Kotlin

// Kotlin DSL (build.gradle.kts)
dependencies {
    implementation("androidx.security:security-state:1.1.0")
}

ดึงดูด

// Groovy DSL (build.gradle)
dependencies {
    implementation "androidx.security:security-state:1.1.0"
}

เมทริกซ์สิทธิ์ที่ประกาศแล้ว

API เป้าหมาย สิทธิ์ที่จำเป็นใน AndroidManifest.xml หมายเหตุการปฏิบัติงาน
getDeviceSecurityPatchLevel() ไม่มี อ่านพร็อพเพอร์ตี้ของระบบดั้งเดิมและข้อมูลเมตาของแพ็กเกจในเครื่องแบบซิงโครนัส
fetchAvailableSecurityPatchLevel()
queryAllAvailableUpdates()
ไม่มี สื่อสารโดยใช้ IPC ในอุปกรณ์ ไลบรารีจะค้นหาเฉพาะคอมโพเนนต์ที่เชื่อถือได้ในอุปกรณ์ (กำหนดให้ผู้ให้บริการอัปเดตต้องมีสิทธิ์ READ_PRIVILEGED_PHONE_STATE ที่มีสิทธิ์) เพื่อให้แอปมั่นใจได้ว่าข้อมูลที่ได้รับนั้นเป็นของแท้
createVulnerabilityReportUrl()
loadVulnerabilityReport()
getPublishedSecurityPatchLevel()
areCvesPatched()
isDeviceFullyUpdated()
android.permission.INTERNET ต้องระบุเพื่อดึงรายงาน OSV สาธารณะ เมื่อโหลดลงในหน่วยความจำโดยใช้ loadVulnerabilityReport() แล้ว วิธีการค้นหาจะทำงานในเครื่องโดยไม่ต้องเข้าถึงเครือข่าย

เริ่มต้นไลบรารี

เริ่มต้น SecurityPatchState ด้วย Context Android

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 หรือเมื่อโหลดรายงานแบบไม่พร้อมกันหลังจากเริ่มต้น ให้เริ่มต้นด้วย context และเรียกใช้ 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 และไคลเอ็นต์ OTA ของ OEM

  • fetchAvailableSecurityPatchLevel(): แสดง SPL ที่มีผลซึ่งพร้อมใช้งาน สำหรับคอมโพเนนต์ที่ระบุ (เปลี่ยนกลับไปใช้ SPL ของอุปกรณ์ปัจจุบัน หากไม่มีการอัปเดตใหม่กว่า) ซึ่งใช้เพื่อเปรียบเทียบ กับ SPL ของอุปกรณ์และ SPL ที่เผยแพร่ได้
  • queryAllAvailableUpdates(): ค้นหาผู้ให้บริการอัปเดตที่เชื่อถือได้ทั้งหมด ในอุปกรณ์และแสดงUpdateCheckResultแบบละเอียดพร้อมกับข้อมูลเมตาเกี่ยวกับแหล่งที่มาและความใหม่ของข้อมูล

ตัวอย่างที่ 1: แจ้งให้ผู้ใช้ทราบเกี่ยวกับการอัปเดตที่รอดำเนินการ

ใช้ 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));

ตัวอย่างที่ 2: ตรวจสอบสถานะผู้ให้บริการโดยละเอียด

ใช้ queryAllAvailableUpdates() เพื่อตรวจสอบผู้ให้บริการแต่ละราย การประทับเวลา และบันทึก UpdateInfo

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 ให้ตรวจสอบการปฏิบัติตามข้อกำหนดในการอัปเดตโดยรวม หรือตรวจสอบระดับแพตช์ด้านความปลอดภัยที่เผยแพร่ (PSPL) ก่อนอื่นแอปของคุณต้องรับและโหลดรายงานช่องโหว่ OSV ตามที่ระบุไว้ในเอกสารอ้างอิง API สำหรับ 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);

โหลดรายงานช่องโหว่

  1. การแคชในเครื่องและการรีเฟรช WorkManager: เนื่องจาก Android Security Bulletin เผยแพร่ทุกเดือน ให้แคช JSON ที่ดาวน์โหลดไว้ในที่เก็บข้อมูลภายใน (context.filesDir) และกำหนดเวลางานพื้นหลังเป็นระยะด้วย WorkManager (ควรเป็นทุกๆ 24-48 ชั่วโมง) เพื่อรีเฟรชรายงาน โดยอ่านจากแคชในเครื่องแบบพร้อมกันเมื่อเปิดแอป
  2. การทำงานแบบเธรดในเบื้องหลัง: เรียกใช้ loadVulnerabilityReport() ในเธรดเบื้องหลัง (Dispatchers.IO ใน Kotlin หรือ Executor ใน Java) เพื่อหลีกเลี่ยง การบล็อกเธรด UI หลักขณะแยกวิเคราะห์ระเบียน CVE
  3. การประเมิน LTS ของเคอร์เนล: การเรียก getPatchedCves(COMPONENT_KERNEL, ...) จะทำให้เกิด IllegalArgumentException และ areCvesPatched() จะไม่ ประเมิน CVE ของเคอร์เนล แต่ให้ประเมินความปลอดภัยของเคอร์เนลโดยเปรียบเทียบเวอร์ชันเคอร์เนลของอุปกรณ์กับเป้าหมาย LTS ของเคอร์เนลทั่วไปของ Android ที่ getPublishedSecurityPatchLevel(COMPONENT_KERNEL) ส่งคืนโดยการจับคู่กับ สาขาหลักและสาขาย่อย (เช่น การเปรียบเทียบเคอร์เนล 5.15.140 กับเป้าหมาย 5.15.159)

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับสถานะความปลอดภัยของอุปกรณ์ได้ที่แหล่งข้อมูลต่อไปนี้

เอกสารประกอบ

การอ้างอิง API