मोबाइल सिक्योरिटी टेस्टिंग
Mobile security testing यह जाँचती है कि app अपने users का data device पर, network पर, और operating system व दूसरे apps से मिलने वाली जगहों पर सुरक्षित रखता है। OWASP Mobile Application Security Verification Standard (MASVS) बताता है कि सुरक्षित app को क्या करना चाहिए; OWASP Mobile Application Security Testing Guide (MASTG) बताती है कि इसे कैसे verify करें।
उदाहरण: एक shopping app हर functional test pass करता है, फिर भी उसका refresh token एक preferences file में plain text में पड़ा है, और किसी भी web page का link दूसरे customer का order खोल देता है। यह सिर्फ़ storage और links को देखने पर दिखता है।
यह क्यों ज़रूरी है
Phone पर company का नियंत्रण नहीं होता। वह खो सकता है, root किया जा सकता है (यानी पूरे system का access खोल दिया जाए) या backup से restore हो सकता है; वह public Wi-Fi से जुड़ता है; और कोई भी app package को खोलकर देख सकता है। App जो कुछ store करता है, भेजता है या दूसरे apps से लेता है, वह सब exposed है, और एक leaked token का मतलब account takeover हो सकता है।
ज़्यादातर first-line checks के लिए hacking skills नहीं चाहिए, और platform के नियम जानना ग़लत bug reports से बचाता है: जो app आपके proxy से बात करने से मना करता है, वह अक्सर बिल्कुल सही काम कर रहा होता है।
MASVS के control groups
MASVS अपने controls को आठ control groups में बाँटता है, जिनके नाम MASVS- prefix से शुरू होते हैं; MASTG बताती है कि Android और iOS पर इन्हें कैसे टेस्ट करें।
यह lesson storage, network और platform groups को टेस्ट करता है, जहाँ tester के आम tools असली defects पकड़ते हैं। आठों groups:
MASVS-STORAGE: device पर sensitive data सुरक्षित रहता है और leak नहीं होता।MASVS-CRYPTO: मज़बूत algorithms, और app में कोई hard-coded key नहीं।MASVS-AUTH: login, sessions और authorization को back end लागू करता है; biometrics जैसे local checks सुरक्षित तरीके से होते हैं।MASVS-NETWORK: सही certificate validation के साथ TLS, और जहाँ risk माँगे वहाँ pinning।MASVS-PLATFORM: links, components, WebViews और screen का सुरक्षित इस्तेमाल।MASVS-CODE: untrusted input validate होता है; known vulnerabilities वाले components नहीं।MASVS-RESILIENCE: जहाँ risk माँगे, reverse engineering और tampering का विरोध।MASVS-PRIVACY: सिर्फ़ ज़रूरी data, जिसे user देख और नियंत्रित कर सके।
Local storage: device पर क्या बचा रहता है
App अपना data अपने sandbox में रखता है: Android पर shared_prefs की preference files, SQLite databases और files; iOS पर UserDefaults, files और databases। Sandbox दूसरे apps को बाहर रखता है, पर rooted phone, backup या debuggable build वाले व्यक्ति को नहीं (debuggable build यानी debug build, जिसमें run-as जैसे tools app की files तक पहुँच सकते हैं; release builds debuggable नहीं होते)। Data logs, clipboard और app-switcher screenshot में भी leak होता है।
MASVS-STORAGE को टेस्ट करना आसान है: sensitive data सिर्फ़ ज़रूरत पर store होता है, secrets iOS Keychain में रखे जाते हैं या Android Keystore में रखी key से encrypt होते हैं (ये दोनों platforms के protected stores हैं), logs में कुछ भी sensitive नहीं होता, और logout session का data हटा देता है। Encoding, encryption नहीं है: file में रखी Base64 string या signed JWT को file पाने वाला कोई भी पढ़ सकता है। Android QA build पर खुद देखें:
# Debuggable QA build, on a test phone or emulator you may use
adb shell run-as com.example.shop ls shared_prefs databases files
adb shell run-as com.example.shop cat shared_prefs/session.xml
# <string name="refresh_token">eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOi...</string>
# ^ a finding: a token in plain text
adb logcat -d | grep -i -E "password|token|bearer|otp"
# Release build: run-as must fail, because the build is not debuggable
adb shell run-as com.example.shop lsआज़माएँ: Base64 डिकोडर आज़माएँ: JWT डिकोडर आज़माएँ: JWT एक्सपायरेशन चेकर
Worked example: Android app का HTTPS traffic पढ़ना
आपके पास अपनी team के shopping app को api.staging.shop.example के साथ टेस्ट करने की written permission है। Intercepting proxy एक tool है जो app और server के बीच बैठता है और हर request और response दिखाता है; intercepting proxies वाला lesson इसका set-up विस्तार से दिखाता है। उसका scope उन hosts का समूह है जिन्हें टेस्ट करने की आपको अनुमति है, इसलिए आप scope में सिर्फ़ यही host रखते हैं। उसका history हर captured request की सूची रखता है, ताकि आप बाद में कोई request ढूँढ सकें, उसे evidence के रूप में लगा सकें या replay कर सकें (यानी server को दोबारा भेज सकें)। Proxy आपके laptop पर चलता है और laptop के Wi-Fi address पर listen करता है, जैसे 192.168.1.20:8080। HTTPS पढ़ने के लिए proxy app का TLS connection खुद ख़त्म करता है और host के नाम का ऐसा certificate पेश करता है जिस पर उसकी अपनी certificate authority (CA) का signature होता है। इसलिए एक dedicated test phone पर आप यही address Wi-Fi proxy के रूप में डालते हैं और proxy का CA certificate user certificate के रूप में install करते हैं।
अब app connect नहीं कर पाता और proxy TLS handshake errors दर्ज करता है। यह Android का designed व्यवहार है: Android 7.0 (API level 24) से, जो apps इस level या ऊपर को target करते हैं, वे default रूप से सिर्फ़ system CAs पर भरोसा करते हैं, user के जोड़े CAs पर नहीं। सुरक्षित opt-in, जो नीचे दिखाया गया है, network security configuration में debug-overrides block है: यह सिर्फ़ debuggable build पर लागू होता है, इसलिए QA build आपके proxy CA पर भरोसा करता है और release build default पर रहता है। Traffic पढ़ने लायक होने पर जाँचें:
- हर request HTTPS इस्तेमाल करती है, images और SDKs समेत। Android 9 (API level 28) या ऊपर को target करने वाले apps default रूप से plain HTTP block करते हैं, इसलिए काम करती
http://call का आम तौर पर मतलब है कि किसी ने उस host के लिए cleartext allow किया है: इसे report करें। - Tokens
Authorizationheader में जाते हैं, URL में कभी नहीं, जहाँ servers उन्हें log कर लेते हैं। - Logout के बाद पुराने token से request replay करने पर
401 Unauthorizedमिलता है।
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<debug-overrides> <!-- applies only when the app is debuggable -->
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
<!-- AndroidManifest.xml -->
<application android:networkSecurityConfig="@xml/network_security_config" ...>Certificate pinning अपेक्षित व्यवहार है
Certificate pinning, जिसे MASVS identity pinning कहता है, का मतलब है कि app अपने API hosts के लिए सिर्फ़ एक जाना-पहचाना certificate, public key या CA स्वीकार करता है। यह users को phone पर मौजूद malicious या अनचाहे CA से बचाता है, और आपके proxy को भी रोकता है: handshake fail होता है। Release build पर यह pass है, इसलिए "App मेरे proxy से नहीं चलता" एक ग़लत report है।
Pinning करनी है या नहीं, यह risk का फ़ैसला है जिसे team दर्ज करती है। जब app pinning करता है, तो bypass नहीं, व्यवहार टेस्ट करें:
- Proxy के ज़रिए pinned build साफ़ error के साथ connection refuse करता है, न crash होता है न plain HTTP पर retry करता है; proxy के बिना वह चलता है।
- Android release build user CA को वैसे भी reject करता है, इसलिए सिर्फ़ यह failure pinning साबित नहीं करता; ऐसा test build माँगें जो user CAs पर भरोसा करे पर pins रखे।
- Functional checks का traffic QA build से आता है: default रूप से Android, network security configuration की pins को
debug-overridesके CAs पर लागू नहीं करता। App के code में लिखी pinning के लिए अलग debug switch चाहिए; उसे developers के साथ तय करें। Release build में pinning bypass करना specialist का काम है। - पूछें कि pins कैसे rotate होते हैं: Android documentation हमेशा एक backup key रखने की सलाह देता है, वरना server पर key बदलते ही हर installed copy का connection तब तक कटा रहता है जब तक app update न आ जाए।
Platform interaction: links, components, WebViews और screen
MASVS-PLATFORM उस सब को cover करता है जिसका app operating system और दूसरे apps से लेन-देन करता है। हर उस entry point को, जिस तक कोई दूसरा app या web page पहुँच सकता है, untrusted input मानें; नीचे के commands deep link को वैसे खोलते हैं जैसे कोई दूसरा app खोलता।
- Deep links: कोई भी app
shop://orders/1043को किसी भी value के साथ खोल सकता है। Protected screen पहले login माँगती है, और फिर भी server दूसरे user का order refuse करता है। Android App Links और iOS Universal Links app के domain से verify होते हैं;shop://जैसी custom scheme नहीं, और कोई दूसरा app वही scheme register करके link पा सकता है, इसलिए उसमें token जैसा कोई secret कभी नहीं जाना चाहिए। - Exported components: Android की activities, services, receivers और content providers तभी exported होते हैं जब दूसरे apps को उनकी ज़रूरत हो, और तब वे जो मिलता है उसे जाँचते हैं।
- WebViews सिर्फ़ app के अपने या allow-listed pages load करते हैं, link parameter से लिया गया URL कभी नहीं।
- Screen: sensitive screens app-switcher preview में छिपी रहती हैं, और password fields masked रहते हैं।
# Android test device: open a deep link the way another app would
adb shell am start -W -a android.intent.action.VIEW \
-d "shop://orders/1043" com.example.shop
# iOS simulator
xcrun simctl openurl booted "shop://orders/1043"| Check · MASVS group | Build और तरीका | Expected result |
|---|---|---|
App की लिखी filesMASVS-STORAGE | QA build: run-as, logout से पहले और बाद | कोई password या token plain text में नहीं; logout के बाद session data हट जाता है |
LogsMASVS-STORAGE | Release build: adb logcat | कोई tokens, passwords या personal data नहीं |
Traffic का contentMASVS-NETWORK | Proxy के ज़रिए QA build; debug-overrides user CA पर भरोसा करता है | सिर्फ़ HTTPS; tokens headers में, URLs में कभी नहीं |
Release build पर user CAMASVS-NETWORK | Proxy CA user CA के रूप में installed, Android 7+ | साफ़ error के साथ connection refused, कोई crash नहीं |
Pinning, अगर team ने चुना होMASVS-NETWORK | ऐसा test build जो user CAs पर भरोसा करे पर pins रखे | Proxy से pinned hosts refused; उसके बिना app चलता है |
दूसरे user की id वाला deep linkMASVS-PLATFORM | adb shell am start या xcrun simctl openurl | पहले login; server दूसरे user का order refuse करता है |
App-switcher previewMASVS-PLATFORM | Sensitive screen खोलें, फिर app switcher | Content छिपा हुआ या blurred |
- Refused connection ही pass result है
हर check: dedicated test device, अपनी team के builds और back end के लिए written permission।
आम गलतियाँ
- "App मेरे proxy से नहीं चलता" report करना, जबकि Android 7+ का trust नियम या pinning अपना काम कर रहा है।
- Debug-only configuration की जगह release build में user-CA trust या pinning बंद करने की माँग करना।
- Sandbox को सुरक्षित storage, या Base64 या JWT value को protected मान लेना।
- Logs सिर्फ़ QA build पर जाँचना, release build पर कभी नहीं, या stored data logout से पहले जाँचना पर बाद में कभी नहीं।
- Deep links सिर्फ़ app की बनाई values से खोलना, दूसरे user की id से कभी नहीं।
- Personal phone पर proxy CA install करना, या written permission के बिना टेस्ट करना।
QA का नज़रिया
Mobile security checks हर test cycle का हिस्सा हैं, सिर्फ़ सालाना penetration test का नहीं। शुरुआत में ही दो builds तय करें: user CAs पर भरोसा करने वाला debuggable QA build, और release candidate ठीक वैसा जैसा वह ship होगा। Cryptography, resilience और rooted device या pinning bypass वाले हर काम के लिए specialist बुलाएँ।
हर report में build, device और OS version, MASVS group, और masked tokens के साथ file path या request दर्ज करें। Refinement में पूछें कि feature क्या store करता है, app pinning करता है या नहीं और logout क्या साफ़ करता है। सिर्फ़ वही टेस्ट करें जो आपका हो या जिसकी written permission आपके पास हो।
अभ्यास
Mobile security session की findings का triage करें
आपके पास अपनी team के shopping app को staging API के साथ दो test accounts से टेस्ट करने की written permission है। Material में debuggable QA build और release candidate से छह observations हैं।
हर observation के लिए MASVS group बताएँ, तय करें कि वह expected है, defect है या उसे एक और check चाहिए, और बताएँ कि आगे क्या करेंगे।
App: shopping app 4.2 (Android), staging API api.staging.shop.example
Test accounts: qa.buyer1, qa.buyer2। Written permission दोनों builds के लिए है।
1. QA build: shared_prefs/session.xml में refresh_token plain text में है।
2. QA build: logcat हर call पर "Authorization: Bearer eyJhbGciOi..." print करता है।
3. Release build, proxy CA user CA के रूप में installed: app "Can't connect
securely" दिखाता है, proxy में TLS handshake errors। Proxy बंद: app चलता है।
4. Product images http://img.shop.example/p/5531.jpg से load होती हैं।
5. qa.buyer1 से logged in, adb shop://orders/88231 खोलता है (qa.buyer2 का order):
order details दिखती हैं।
6. Card payment screen के app-switcher preview में पूरा card number दिखता है।- हर observation को एक MASVS group से जोड़ें।
- Expected platform behaviour को defects से अलग करें।
- हर defect के लिए expected secure behaviour और evidence लिखें।
- Developers के लिए अपने सवाल लिखें।
मॉडल उत्तर दिखाएँ
1 (STORAGE): defect, plain text में long-lived token। Expected: Android Keystore की key से encrypt, या store ही न हो। Value mask करके path लगाएँ, और जाँचें कि logout के बाद भी वह बचता है या नहीं।
2 (STORAGE, logs): एक और check चाहिए। QA build में verbose logging जानबूझकर हो सकती है; release build पर दोहराएँ, जहाँ token दिखना defect है।
3 (NETWORK): expected। Release build user CA reject करता है, जैसा Android 7+ apps default रूप से करते हैं, और सुरक्षित तरीके से fail होता है। यह pinning साबित नहीं करता; अगर app को pinning करनी है, तो पूछें कि वह कैसे verify हुई।
4 (NETWORK): defect, उस host के लिए plain HTTP allowed है, इसलिए images रास्ते में पढ़ी या बदली जा सकती हैं। Expected: सिर्फ़ HTTPS, कोई cleartext exception नहीं। Evidence: proxy history में वह request।
5 (AUTH, PLATFORM entry point के रास्ते): defect, शायद server पर। QA build के साथ दोहराएँ और proxy में order की request खोजें: qa.buyer2 के order के साथ 200 OK broken object level authorization (BOLA) है, यानी server यह जाँचे बिना record लौटा देता है कि वह caller का है या नहीं, इसलिए API का हर client प्रभावित है। Expected: 403 या 404, और app error दिखाता है।
6 (PLATFORM, screen): payment screen पर defect। Expected: preview छिपा या blurred हो। Evidence: app switcher का screenshot।
Developers के लिए सवाल: कौन-सा data store होना ही चाहिए, क्या release builds में HTTP logging बंद है, क्या team ने pinning तय की, और image host के लिए cleartext exception क्यों है।
अक्सर पूछे जाने वाले सवाल
क्या mobile security testing के लिए rooted phone चाहिए?
इस lesson के checks के लिए नहीं। Debuggable QA build पर run-as आम test phone या emulator पर app की अपनी files पढ़ लेता है, और debug network configuration आपके proxy को traffic पढ़ने देती है। Rooted या jailbroken devices specialist assessments में इस्तेमाल होते हैं, जैसे resilience controls के लिए, और सिर्फ़ dedicated test devices के रूप में।
मेरा proxy phone के browser का traffic दिखाता है, पर app का क्यों नहीं?
Android 7.0 से, API level 24 या ऊपर को target करने वाले apps सिर्फ़ system CAs पर भरोसा करते हैं, जब तक उनकी network security configuration user CAs के लिए opt in न करे। debug-overrides block वाला QA build माँगें। अगर app certificate pinning करता है, तो pins रखने वाला कोई भी build दोनों platforms पर यही लक्षण दिखाएगा।
iOS app का traffic proxy से कैसे पढ़ें?
Proxy CA को dedicated test iPhone पर profile के रूप में install करें, फिर Settings में "General > About > Certificate Trust Settings" पर उसके लिए full trust चालू करें। Apps fully trusted CA स्वीकार करते हैं, जब तक वे pinning न करें। अगर pinned build connection refuse करे, तो वही expected result है; developers से ऐसा test build माँगें जिसका traffic आप inspect कर सकें।
क्या MASVS certificate pinning को ज़रूरी बनाता है?
MASVS अपने network group में identity pinning cover करता है, पर किसी ख़ास app को pinning करनी चाहिए या नहीं, यह risk का फ़ैसला है; कई apps सिर्फ़ सही TLS certificate validation पर निर्भर रहते हैं। पता करें कि team ने क्या तय किया, और टेस्ट करें कि app उसी के अनुसार चलता है, safe failure और keys rotate करने की योजना समेत।
संदर्भ
- OWASP Mobile Application Security Verification Standard (MASVS)मोबाइल ऐप के लिए OWASP की सुरक्षा आवश्यकताएँ, storage, cryptography, authentication, network और platform interaction जैसे नियंत्रण समूहों में।
- OWASP Mobile Application Security Testing Guide (MASTG)MASVS के साथ चलने वाला टेस्टिंग मैनुअल: मोबाइल ऐप सुरक्षा जाँचने की तकनीकें और टेस्ट केस।
- About App LinksAndroid App Links: आपकी अपनी वेबसाइट के deep links जिन्हें सिस्टम Digital Asset Links फ़ाइल (assetlinks.json) से verify करता है, ताकि वे सीधे ऐप में खुलें।
- Certified Tester Mobile Application Testing (CT-MAT)मोबाइल टेस्टिंग पर ISTQB का specialist पाठ्यक्रम: ऐप के प्रकार, डिवाइस व प्लेटफ़ॉर्म की चुनौतियाँ, टेस्ट प्रकार और टूल।
Mutqan tools से अभ्यास करें
Base64 या Base64url स्ट्रिंग को टेक्स्ट में डिकोड करें, पैडिंग अपने आप ठीक होने के साथ।
JWT का हेडर और पेलोड डिकोड करें, क्लेम जाँचें और एक्सपायरी देखें — पूरी तरह आपके ब्राउज़र में।
जाँचें कि कोई JWT एक्सपायर हो चुका है, अभी वैध नहीं है, या एक्सपायरी में कितना समय बचा है।
कच्चे HTTP रिक्वेस्ट/रिस्पॉन्स हेडर को व्याख्या सहित एक संरचित तालिका में बदलें।
किसी endpoint पर Bearer, Basic, API-key और कस्टम-हेडर प्रमाणीकरण टेस्ट करें और अधिकृत बनाम अनधिकृत रिस्पॉन्स की तुलना करें।
और गहराई से
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।