Asosiy matnga o'tish
Blog

Mobil

Android: allowBackup, cleartext trafik va network security config

AndroidManifest'dagi uchta sozlama mobil ekspertizada tez-tez topilma bo'ladi. Zaxira nusxa, shifrlanmagan trafik va sertifikat ishonchini qanday to'g'ri sozlash.

· 7 daq. o'qish

Foto: 嘉傑 & Google, CC BY 3.0 · Wikimedia Commons

Android ilovasining ko'p xavfsizlik xususiyatlari kodda emas, balki AndroidManifest.xml va bir nechta XML faylda belgilanadi. Ular kichik ko'rinadi, lekin mobil ekspertizada tez-tez alohida topilma sifatida chiqadi. O'z mahsulotimizning Android ilovasini ekspertizaga tayyorlashda biz shu uch sozlamani qayta ko'rib chiqdik: zaxira nusxa (allowBackup), shifrlanmagan HTTP trafik va tarmoq xavfsizligi konfiguratsiyasi.

Bu sozlamalar OWASP MASVS'ning MASVS-STORAGE va MASVS-NETWORK bo'limlariga to'g'ri keladi.

1. allowBackup: ma'lumot zaxira nusxaga chiqib ketmasin

Standart holatda Android ilova ma'lumotlarini (SharedPreferences, ma'lumotlar bazasi, ichki fayllar) zaxira nusxaga olishi mumkin — bulutga yoki adb backup orqali kompyuterga. Agar ilova ichida token, sessiya yoki shaxsiy ma'lumot saqlansa, ular qurilmadan tashqariga chiqadi va boshqa qurilmada tiklanishi mumkin.

Moliyaviy yoki shaxsiy ma'lumot bilan ishlaydigan ilova uchun eng xavfsiz yo'l — zaxirani o'chirish:

<application
    android:allowBackup="false"
    android:fullBackupContent="false"
    android:dataExtractionRules="@xml/data_extraction_rules"
    ... >

Android 12 (API 31) va undan yuqorida allowBackup bilan birga dataExtractionRules ham hisobga olinadi. Shuning uchun res/xml/data_extraction_rules.xml faylini yaratib, bulut zaxirasi va qurilmadan qurilmaga ko'chirishdan ham ma'lumotlarni chiqarib tashlang:

<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
    <cloud-backup>
        <exclude domain="root" path="." />
        <exclude domain="file" path="." />
        <exclude domain="database" path="." />
        <exclude domain="sharedpref" path="." />
        <exclude domain="external" path="." />
    </cloud-backup>
    <device-transfer>
        <exclude domain="root" path="." />
        <exclude domain="file" path="." />
        <exclude domain="database" path="." />
        <exclude domain="sharedpref" path="." />
        <exclude domain="external" path="." />
    </device-transfer>
</data-extraction-rules>

Zaxirani o'chirish — faqat birinchi qadam. Ekspertizada bizda alohida yuqori darajali topilma bor edi: maxfiy ma'lumot ichki xotirada shifrlanmagan holda saqlanardi. Buni flutter_secure_storage (Android'da Keystore asosida shifrlash) ga o'tish bilan yopdik. Ya'ni zaxira o'chirilgan bo'lsa ham, qurilmadagi ma'lumot baribir shifrlangan bo'lishi kerak.

2. Cleartext trafik: faqat HTTPS

Android 9 (API 28) dan boshlab, targetSdkVersion 28 yoki undan yuqori bo'lsa, shifrlanmagan HTTP trafik standart holatda bloklanadi. Lekin amalda u ko'pincha qayta yoqib qo'yiladi: ishlab chiqish paytida lokal serverga ulanish uchun usesCleartextTraffic="true" qo'shiladi va release'da unutib qoldiriladi.

Manifest'da buni aniq yozing:

<application
    android:usesCleartextTraffic="false"
    android:networkSecurityConfig="@xml/network_security_config"
    ... >

Kodning o'zini ham tekshiring. Bizning hisobotda past darajali "xavfsiz bo'lmagan (http) havolalar" topilmasi bor edi: kod ichida http:// bilan boshlanadigan bir nechta manzil qolgan edi. Ular ishlatilmasa ham, statik tahlil ularni topadi. Butun loyiha bo'yicha qidiring:

grep -rn "http://" lib/ android/app/src/main/ --include=*.dart --include=*.kt --include=*.java --include=*.xml

XML nomlar fazosi (http://schemas.android.com/...) normal holat — ularni tarmoq manzili bilan adashtirmang.

3. Network security config: kimga ishonamiz

network_security_config.xml — ilova qaysi sertifikatlarga ishonishi, qaysi domenlar uchun qanday qoida ishlashini belgilaydigan fayl. Ekspertizada "sertifikatni xavfsiz bo'lmagan tekshirish" topilmasi bizda yuqori darajada edi. Uni yopish uchun quyidagi sozlamani qo'lladik:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>

    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">api.example.uz</domain>
        <pin-set expiration="2027-06-30">
            <pin digest="SHA-256">BASE64_ROOT_CA_PIN_1=</pin>
            <pin digest="SHA-256">BASE64_ROOT_CA_PIN_2=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

Bu yerda nima muhim:

  • Faqat system sertifikatlar. <certificates src="user" /> qo'shilsa, foydalanuvchi o'rnatgan har qanday sertifikatga ishoniladi — bu esa trafikni proxy orqali ushlashni osonlashtiradi.
  • Pin-set. Biz pin'ni server sertifikatiga emas, balki aniq root CA'larga qo'ydik. Server sertifikati har yangilanganda ilovani qayta chiqarish shart bo'lmaydi. Kamida ikkita pin (asosiy va zaxira) qo'ying.
  • expiration. Muddat o'tgach pin tekshiruvi o'chadi va ilova ishlashda davom etadi. Bu yangilanmay qolgan eski versiyalarni "qulflab qo'yish"dan saqlaydi. Sanani reliz rejangizga mos tanlang.
  • debug-overrides. Agar ishlab chiqishda proxy kerak bo'lsa, uni faqat <debug-overrides> ichida ruxsat bering — u release build'da ishlamaydi.

Flutter ilovasida bitta nozik joy bor: Dart'ning HTTP klienti Android tarmoq konfiguratsiyasini to'liq ishlatmaydi. Shuning uchun biz pinning'ni ikki qatlamda qildik: Android'da pin-set, Dart'da esa faqat ishonchli root sertifikatlar yuklangan SecurityContext.

Yana ikki kichik, lekin foydali tekshiruv

  • android:debuggable — manifest'da qo'lda true yozilmaganiga ishonch hosil qiling. Release build uni avtomatik false qiladi, lekin qo'lda yozilgan qiymat buni buzishi mumkin.
  • android:exported — har bir activity, service, receiver uchun aniq ko'rsating. Tashqi ilovalar chaqirishi kerak bo'lmagan komponentlar exported="false" bo'lsin.

Sozlamani amalda qanday tekshirish

Konfiguratsiyani yozish yetarli emas — uning ishlashini ham ko'ring. Test qurilmaga foydalanuvchi sertifikatini o'rnatib, trafikni proxy orqali o'tkazing: release build ulanishni rad etishi kerak. Keyin adb backup yoki qurilma zaxirasi orqali ilova ma'lumotlari chiqmasligini tekshiring. Ekspertiza ham xuddi shunday amaliy sinov o'tkazadi, shuning uchun natijani oldindan bilish foydali.

Qisqa tekshirish ro'yxati

  1. allowBackup="false" va data_extraction_rules.xml sozlangan.
  2. Maxfiy ma'lumot Keystore asosidagi shifrlangan xotirada.
  3. usesCleartextTraffic="false", kodda http:// manzillar qolmagan.
  4. network_security_config.xml: faqat system sertifikatlar, pin-set va expiration bor.
  5. Debug sozlamalari faqat debug-overrides ichida.
  6. debuggable va exported qiymatlari tekshirilgan.

Skanerlash

Manifest va tarmoq sozlamalaringizni ekspertizadan oldin tekshirib olmoqchimisiz? Skanerlashga APK faylingizni yuboring. Claude AI agenti konfiguratsiyani ko'rib chiqadi, mutaxassisimiz natijani tasdiqlab, qaysi qatorlarni o'zgartirish kerakligini aniq ko'rsatib beradi.