امنیت برنامه شما به امنیت سیستمعامل زیربنایی آن بستگی دارد. برای کاهش خطر، برنامهتان باید عملکردهای حساس به امنیت را با ارزیابی بیدرنگ وضعیت امنیتی دستگاه کنترل کند و تعیین کند که آیا دستگاه، بهویژه اجزای سیستم اصلی آن، کاملاً بهروز است و دربرابر آسیبپذیریهای منتشرشده در Android Security Bulletin (بولتن امنیتی Android) محافظت میشود یا نه. رؤیتپذیری وضعیت امنیتی دستگاه به شما کمک میکند قبلاز اینکه برنامهتان عملیاتهای پرخطر را اجرا کند، اقدامات حفاظتی انجام دهید.
AndroidX Security State کتابخانه Jetpack است که دسترسی یکپارچه به وضعیت امنیتی دستگاه Android فراهم میکند. این ویژگی با ترکیب کردن «میاناهای برنامهسازی کاربردی AOSP» و فیدهای آسیبپذیری عمومی Android، وضعیت امنیتی جامع، دقیق، و کنشپذیری برای دستگاه ارائه میدهد که فراتر از «سطح وصله امنیتی» (SPL) است.
نمای کلی معماری
نمودار زیر نشان میدهد که چگونه کتابخانه AndroidX Security State ویژگیهای پلاتفرم دروندستگاهی، ارائهدهندگان بهروزرسانی ارتباط بینفرایندی (IPC)، و فیدهای آسیبپذیری عمومی را در یک مجموعه منسجم از میاناهای برنامه کاربردی یکپارچه میکند.

وضعیتها و عناصر وصله امنیتی
مزیت اصلی استفاده از کتابخانه وضعیت امنیتی توانایی آن در ارائه «سطح وصله امنیتی» (SPL) در سطح جزئی و مؤلفه است. طی سالها، Android واحدهای بیشتری به بهروزرسانیهای سیستم Google Play (پروژه Mainline) اضافه کرده است که بااستفاده از Google Play بهطور مستقل از بهروزرسانیهای استاندارد سیستم ازطریق هوا (OTA) بهروزرسانی میشوند و اصلاحات امنیتی مهم را با آهنگ متفاوتی ارائه میدهند.
بههمین ترتیب، درحالیکه سطح وصله امنیتی معمولاً حداقل نسخه موردنیاز تصویر هسته عمومی (GKI) را تعیین میکند، بهروزرسانیهای هسته درواقع میتوانند از برنامه زمانی سیستم جلوتر بروند. این اصلاحات ویژه هسته ممکن است بهطور کامل توسط رشته SPL اصلی سیستم ثبت نشود.
برای بهبود شفافیت، کتابخانه وضعیت امنیتی سطح وصله مؤثر را برای هر سه مؤلفه بهصورت جداگانه ارائه میدهد:
- سیستم (
COMPONENT_SYSTEM): نشاندهنده سیستمعامل استاندارد و وضعیت امنیت سیستم مشتقشده از فیلد سطح وصله امنیتی استاندارد است. - واحدهای اصلی سیستم (
COMPONENT_SYSTEM_MODULES): نشاندهنده وضعیت امنیتی اجزای سیستم واحد (بهروزرسانیهای سیستم Google Play) است که از نسخههای انتشار واحد خاصی استخراج میشود. - هسته (
COMPONENT_KERNEL): نشاندهنده وضعیت امنیتی هسته دستگاه است که مستقیماً از رشته نسخه هسته استخراج میشود.
بسته به مؤلفه، کتابخانه حداکثر ۳ بُعد از اطلاعات سطح وصله ارائه میدهد:
- سطح وصله دستگاه (DSPL): سطح وصله فعلی اجزای جداگانه
که در دستگاه اجرا میشود و بهصورت همزمان بدون درخواست شبکه پُرسمان میشود. «سیستم»
و «خط اصلی» تاریخهای تقویم گزارش را (
DateBasedSecurityPatchLevel)، گزارش میکنند، درحالیکه «هسته» نسخه انتشار خود را گزارش میکند (VersionedSecurityPatchLevel، برای مثال،5.15.148). - سطح پچ امنیتی منتشرشده (PSPL): خط پایه بهطور رسمی در گزارشهای بولتن امنیتی Android و پایگاه داده آسیبپذیریهای متنباز (OSV) منتشر شده است. برنامه شما میتواند با مقایسه تاریخها یا رشتههای نسخه ارائهشده توسط «کد امنیتی سطح دستگاه» (Device SPL)، انطباق را ارزیابی کند.
- SPL دردسترس (ASPL): نشان میدهد که آیا دستگاه بهروزرسانی معلقی دارد که از ارائهدهندگان بهروزرسانی دردسترس باشد و بهصورت ناهمزمان بااستفاده از IPC پُرسمان شده باشد. ویژگی بهروزرسانی سیستم Android
Google Play دردسترس بودن واحدهای Mainline را فراهم میکند،
و مشتریان OEM OTA دردسترس بودن «بهروزرسانیهای سیستم» را فراهم میکنند. ازآنجاییکه بهروزرسانیهای
هسته در تصویر سیستمعامل دستهبندی میشوند، دردسترس بودن بهروزرسانی هسته
بااستفاده از
COMPONENT_SYSTEMارزیابی میشود.
ویژگیهای حساس به امنیت دروازه
میتوانید اطلاعات «سطح وصله امنیتی دستگاه» (DSPL)، «سطح وصله امنیتی دردسترس» (ASPL)، و «سطح وصله امنیتی منتشرشده» (PSPL) را باهم ترکیب کنید تا برای دروازهبندی ویژگیهای حساس به امنیت، تعیینهای زمینهای انجام دهید. برای مثال، میتوانید DSPL را درکنار ASPL مقایسه کنید تا
مشخص کنید آیا وصله امنیتی جدیدتری دردسترس است که کاربر هنوز
نصب نکرده است یا نه، و از او بخواهید قبلاز شروع عملیات حساس مثل
پرداخت یا ثبت اطلاعات اعتباری، آن را بهروزرسانی کند. همچنین میتوانید از areCvesPatched() برای درستیسنجی کردن اینکه آیا آسیبپذیریهای خاص و پرخطر در دستگاه قبلاز فراخواندن زیرسیستمهای آسیبپذیر برطرف شدهاند یا نه استفاده کنید، برای مثال، بررسی آسیبپذیریهای مهم NFC یا بلوتوث قبلاز مجاز کردن پرداختهای مبتنی بر مجاورت یا همرسانی داده.
ملاحظات نسخه پلاتفرم
برخیاز قابلیتهای وضعیت امنیتی به معماری پلاتفرم زیرین بستگی دارد و در نسخههای پایینتر Android دردسترس نیست:
- Android 11 (میانای برنامه کاربردی سطح ۳۰) و بالاتر: پشتیبانی کامل از همه عناصر، ازجمله نسخههای LTS هسته منتشرشده در بولتن و دردسترس بودن بهروزرسانی (ASPL) پرسمانها.
- Android 10 (سطح میانای برنامهسازی کاربردی ۲۹): از سطوح وصله سیستم و واحد سیستم پشتیبانی میکند؛ بااینحال، نسخههای هسته منتشرشده در بولتن دردسترس نیستند زیرا ردیابی «تصویر هسته عمومی» (GKI) و اهداف LTS هسته در «بولتن امنیتی Android» از Android 11 شروع شد—نسخه هسته دروندستگاهی همچنان میتواند بهصورت محلی خوانده شود.
- Android 9 (سطح API 28) و قدیمیتر: علاوهبر محدودیتهای Android 10،
اجزای سیستم واحد (Project Mainline) قبلاز Android 10 وجود نداشتند.
وقتی «سطح وصله امنیتی» واحد سیستم دردسترس نباشد، فراخوانی
getDeviceSecurityPatchLevel(COMPONENT_SYSTEM_MODULES)بهطور ایمن به تاریخ مبنای دوره یونیکس (۱۹۷۰-۰۱-۰۱) برمیگردد.
آشنایی با دردسترس بودن بهروزرسانی و «سطح امنیتی دردسترس» (ASPL)
برای تعیین وضعیت امنیتی دستگاه، باید بدانیم آیا بهروزرسانیهای امنیتی معلقه برای اجزای مختلف دردسترس است یا نه. دستگاههای Android بهروزرسانیهای امنیتی را ازطریق چندین سازوکار متمایز دریافت میکنند، ازجمله بهروزرسانیهای سیستم ازطریق هوا (OTA) و بهروزرسانیهای سیستم Google Play برای اجزای واحدی.
قبلاز اینکه برنامهتان بتواند ASPL را برای یک عنصر معین بازیابی کند، ارائهدهنده بهروزرسانی مربوطه باید آن اطلاعات را منتشر کند. برای هماهنگی بین این منابع بهروزرسانی مختلف، برنامههای کارخواه از کتابخانه وضعیت امنیت AndroidX برای پُرسمان وضعیت امنیت استفاده میکنند، درحالیکه کارخواههای بهروزرسانی دروندستگاهی از کتابخانه همراه ارائهدهنده وضعیت امنیت AndroidX برای انتشار «سطح وصله امنیتی دردسترس» (ASPL) استفاده میکنند.
Google اطلاعات بهروزرسانی را برای واحدهای Mainline به همه دستگاههای GMS Android و همچنین اطلاعات OTA سیستم را برای دستگاههایی که از کارخواه Google OTA (GOTA) استفاده میکنند ارائه میدهد.
نمودار زیر نشان میدهد که برنامههای مشتری چگونه از کتابخانه AndroidX Security State برای پُرسمان وضعیت امنیتی در بهروزرسانیهای سیستم Google Play و بهروزرسانیهای OTA سیستم استفاده میکنند:

افزودن وابستگیها
برای افزودن وابستگی به AndroidX Security State، باید مخزن Google Maven را در پروژهتان بگنجانید. وابستگی را به فایل build.gradle.kts یا build.gradle برنامه خود اضافه کنید:
کاتلین
// 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"
}
ماتریس اجازههای اعلامشده
| میاناهای برنامهسازی کاربردی هدف | اجازههای لازم در AndroidManifest.xml |
یادداشتهای عملیاتی |
|---|---|---|
getDeviceSecurityPatchLevel() |
هیچکدام | ویژگیهای سیستم بومی محلی و فراداده بسته را بهصورت همزمان میخواند. |
fetchAvailableSecurityPatchLevel()queryAllAvailableUpdates() |
هیچکدام | بااستفاده از IPC دروندستگاهی ارتباط برقرار میکند. کتابخانه فقط از عناصر مطمئن در دستگاه پُرسمان میکند (ارائهدهندگان بهروزرسانی باید اجازه ممتاز READ_PRIVILEGED_PHONE_STATE را داشته باشند)، بنابراین برنامه شما میتواند به اصالت اطلاعاتی که دریافت میکند اطمینان داشته باشد. |
createVulnerabilityReportUrl()loadVulnerabilityReport()getPublishedSecurityPatchLevel()areCvesPatched()isDeviceFullyUpdated() |
android.permission.INTERNET |
برای واکشی گزارشهای عمومی OSV لازم است. پساز بار شدن در حافظه بااستفاده از loadVulnerabilityReport()، روشهای پُرسمان بهصورت محلی و بدون دسترسی به شبکه اجرا میشوند. |
کتابخانه را مقداردهی اولیه کنید
SecurityPatchState را با Android Context مقداردهی اولیه کنید:
کاتلین
import androidx.security.state.SecurityPatchState
val securityPatchState = SecurityPatchState(context)
جاوا
import androidx.security.state.SecurityPatchState;
SecurityPatchState securityPatchState = new SecurityPatchState(context);
راهاندازی اولیه با context بهتنهایی دسترسی فوری به سطوح وصله دستگاه آفلاین بدون وابستگی به شبکه را فراهم میکند. (پُرسمانهای دردسترس بودن بهروزرسانی
بهصورت ناهمزمان با ارائهدهندگان دروندستگاهی ارتباط برقرار میکند).
اگر برنامه شما انطباق با «آسیبپذیریهای مشترک و افشا» را ارزیابی میکند و قبلاً گزارش آسیبپذیری OSV را در حافظه بار کرده است، فراخوانندگان Kotlin میتوانند رشته JSON را مستقیماً به سازنده در Kotlin ارسال کنند:
val securityPatchState = SecurityPatchState(context, vulnerabilityReportJsonString = jsonString)
در Java، یا هنگام بار کردن ناهمزمان گزارشها پساز راهاندازی، با بافت مقداردهی اولیه کنید و securityPatchState.loadVulnerabilityReport(jsonString) را فراخوانی کنید.
بررسی سطوح وصله دستگاه
سطوح وصله دروندستگاهی را بهصورت همزمان پُرسمان کنید:
کاتلین
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
}
جاوا
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 و مشتریان OEM OTA هستند:
fetchAvailableSecurityPatchLevel(): «سطح امنیتی وصله» (SPL) مؤثر «دسترسیپذیر» را برای جزء مشخصی برمیگرداند (اگر بهروزرسانی جدیدتری دردسترس نباشد، به «سطح امنیتی وصله» فعلی «دستگاه» برمیگردد) که میتوان از آن برای مقایسه با «سطح امنیتی وصله» «دستگاه» و «سطح امنیتی وصله» «منتشرشده» استفاده کرد.queryAllAvailableUpdates(): همه ارائهدهندگان بهروزرسانی مطمئن را در دستگاه پیدا میکند وUpdateCheckResultرا بههمراه فراداده درباره منبع و جدید بودن دادهها برمیگرداند.
مثال ۱: پیامواره به کاربران برای بهروزرسانیهای معلقه
از fetchAvailableSecurityPatchLevel() برای پیامواره دادن به کاربران هنگام دردسترس بودن بهروزرسانیهای امنیتی استفاده کنید (برای مثال، با راهاندازی Settings.ACTION_SYSTEM_UPDATE_SETTINGS):
کاتلین
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
}
}
جاوا
در جاوا، روشهای ناهمزمان 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));
مثال ۲: بررسی وضعیت دقیق ارائهدهنده
از queryAllAvailableUpdates() برای بازرسی ارائهدهندگان، مُهر زمان،
و سوابق UpdateInfo استفاده کنید:
کاتلین
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>
}
}
جاوا
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)، بررسی رعایت استانداردها در بهروزرسانی کلی، یا بازرسی سطوح وصله امنیتی منتشرشده (PSPL)، برنامه شما ابتدا باید گزارش آسیبپذیری OSV را دریافت و بار کند، همانطور که در مرجع API برای SecurityPatchState بهتفصیل توضیح داده شده است.
کاتلین
// 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)
جاوا
// 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(ترجیحاً هر ۲۴ تا ۴۸ ساعت) زمانبندی کنید تا گزارش را بازآوری کند و با راهاندازی برنامه، بهصورت همزمان از حافظه نهان محلی بخواند. - رشتهبندی پسزمینه: برای جلوگیری از مسدود شدن رشته اصلی واسط کاربر درحین تجزیه کردن گزارشهای «آسیبپذیریها و تهدیدات رایج»،
loadVulnerabilityReport()را در رشته پسزمینه (Dispatchers.IOدر Kotlin یاExecutorدر Java) فراخوانی کنید. - ارزیابی «هسته LTS»: فراخوانی
getPatchedCves(COMPONENT_KERNEL, ...)باعث ایجادIllegalArgumentExceptionمیشود وareCvesPatched()«آسیبپذیریهای رایج و آسیبپذیریهای افشا شده» هسته را ارزیابی نمیکند. درعوض، امنیت هسته را با مقایسه نسخه هسته دستگاه با اهداف Android Common Kernel LTS کهgetPublishedSecurityPatchLevel(COMPONENT_KERNEL)برگردانده است ارزیابی کنید و شاخه اصلی و فرعی آن را مطابقت دهید (برای نمونه، مقایسه هسته5.15.140با هدف5.15.159).
منابع بیشتر
برای اطلاعات بیشتر درباره وضعیت امنیت دستگاه، منابع زیر را ببینید:
اسناد
- انتشار وضعیت امنیت دستگاه
- اعلامیههای امنیتی Android
- اجزای سیستم مدولار
- تصویر هسته عمومی (GKI)
- وصلههای امنیتی تکمیلی
- Play Integrity API
- پایگاه داده آسیبپذیریهای متنباز (OSV)
- یادداشتهای انتشار «وضعیت امنیت» نسخه ۱.۱.۰