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

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

สถานะความปลอดภัยของ AndroidX เป็นไลบรารี 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 รุ่นก่อน Android 10 การเรียกใช้ getDeviceSecurityPatchLevel(COMPONENT_SYSTEM_MODULES) อย่างปลอดภัยจะกลับไปใช้ วันที่เริ่มต้นของยุค Unix (1970-01-01) เมื่อ SPL ของโมดูลระบบไม่พร้อมใช้งาน

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

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

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

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

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

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

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

หากต้องการเพิ่มทรัพยากร Dependency ในสถานะความปลอดภัยของ AndroidX คุณต้องรวมที่เก็บ Maven ของ Google ไว้ในโปรเจ็กต์ เพิ่มทรัพยากร 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 หรือเมื่อโหลดรายงานแบบไม่พร้อมกันหลังจากเริ่มต้น ให้เริ่มต้นด้วย บริบทและเรียกใช้ 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