แอปของคุณจะปลอดภัยเทียบเท่ากับระบบปฏิบัติการพื้นฐานเท่านั้น เพื่อลดความเสี่ยง แอปของคุณ ควรควบคุมการดำเนินการที่ละเอียดอ่อนด้านความปลอดภัยด้วยการประเมินแบบเรียลไทม์เกี่ยวกับ ท่าทางด้านความปลอดภัยของอุปกรณ์ เพื่อพิจารณาว่าอุปกรณ์ โดยเฉพาะอย่างยิ่งคอมโพเนนต์ระบบหลัก ได้รับการอัปเดตอย่างเต็มรูปแบบและได้รับการปกป้องจากช่องโหว่ที่ เผยแพร่ในกระดานข่าวความปลอดภัยของ Android หรือไม่ การมองเห็นสถานะความปลอดภัยของอุปกรณ์ช่วยให้คุณสร้างการป้องกันก่อนที่แอปจะดำเนินการที่มีความเสี่ยงสูง
สถานะความปลอดภัยของ AndroidX เป็นไลบรารี Jetpack ที่ให้การเข้าถึงแบบรวม ไปยังสถานะความปลอดภัยของอุปกรณ์ที่ใช้ Android โดยจะรวม API ของ AOSP และฟีดช่องโหว่สาธารณะของ Android เพื่อให้สถานะความปลอดภัยของอุปกรณ์ที่ครอบคลุม แม่นยำ และนำไปใช้ได้จริง นอกเหนือจากระดับแพตช์ด้านความปลอดภัย (SPL)
ภาพรวมสถาปัตยกรรม
แผนภาพต่อไปนี้แสดงให้เห็นว่าไลบรารีสถานะความปลอดภัยของ 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 ของระบบ

เพิ่มทรัพยากร 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);
โหลดรายงานช่องโหว่
- การแคชในเครื่องและการรีเฟรช WorkManager: เนื่องจาก Android Security Bulletin
เผยแพร่ทุกเดือน ให้แคช JSON ที่ดาวน์โหลดไว้ในที่เก็บข้อมูลภายใน
(
context.filesDir) และกำหนดเวลางานในเบื้องหลังเป็นระยะๆ ด้วยWorkManager(ควรเป็นทุกๆ 24-48 ชั่วโมง) เพื่อรีเฟรชรายงาน โดยอ่านจากแคชในเครื่องแบบพร้อมกันเมื่อเปิดแอป - การทำงานแบบเธรดในเบื้องหลัง: เรียกใช้
loadVulnerabilityReport()ในเธรดเบื้องหลัง (Dispatchers.IOใน Kotlin หรือExecutorใน Java) เพื่อหลีกเลี่ยงการบล็อกเธรด UI หลักขณะแยกวิเคราะห์ระเบียน CVE - การประเมิน LTS ของเคอร์เนล: การเรียกใช้
getPatchedCves(COMPONENT_KERNEL, ...)จะทำให้เกิดIllegalArgumentExceptionและareCvesPatched()จะไม่ ประเมิน CVE ของเคอร์เนล แต่ให้ประเมินความปลอดภัยของเคอร์เนลโดยเปรียบเทียบเวอร์ชันเคอร์เนลของอุปกรณ์กับเป้าหมาย LTS ของเคอร์เนลทั่วไปของ Android ที่getPublishedSecurityPatchLevel(COMPONENT_KERNEL)ส่งคืนโดยการจับคู่กับ สาขาหลักและสาขาย่อย (เช่น การเปรียบเทียบเคอร์เนล5.15.140กับเป้าหมาย5.15.159)
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับสถานะความปลอดภัยของอุปกรณ์ได้ที่แหล่งข้อมูลต่อไปนี้
เอกสารประกอบ
- ประกาศข่าวสารด้านความปลอดภัยของ Android
- คอมโพเนนต์ของระบบแบบแยกส่วน
- Generic Kernel Image (GKI)
- แพตช์ด้านความปลอดภัยเพิ่มเติม
- Play Integrity API
- ฐานข้อมูลช่องโหว่แบบโอเพนซอร์ส (OSV)
- บันทึกประจำรุ่นของ Security State 1.1.0