关于 exploiting-insecure-data-storage-in-mobile
面向移动应用渗透测试人员的安全技能,用于检查 Android 和 iOS 设备上的敏感数据存储。涵盖文件、数据库、密钥链、备份及运行时内存分析。
主要功能
- 01定位 Android 与 iOS 应用数据
- 02检查 SharedPreferences 和 SQLite
- 03评估 iOS Keychain 访问控制
- 04检查备份与外部存储暴露
- 05搜索运行时内存及日志中的敏感数据
适用场景
- 01审计移动应用凭据的本地存储
- 02检查数据库是否未加密
- 03评估密钥链保护属性
- 04排查备份或内存中的敏感数据
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-insecure-data-storage-in-mobile安装后在 Claude Code 中输入/exploiting-insecure-data-storage-in-mobile确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
利用移动端不安全的数据存储
何时使用
在以下情况下使用本技能:
- 评估移动应用是否在设备文件系统上安全地存储敏感数据
- 测试通过 SharedPreferences、SQLite 数据库或 plist 造成的凭据泄露
- 评估 keychain/keystore 实现是否具备正确的访问控制属性
- 在移动端渗透测试期间执行静态数据安全评估
请勿在未经授权的情况下在生产用户设备上使用本技能——数据提取技术需要物理访问权限或 root/越狱权限。
前置条件
- 已 root 的 Android 设备或模拟器,并具备 ADB 访问权限
- 已越狱的 iOS 设备,并具备 SSH 访问权限或经过 Objection 补丁的 IPA
- ADB(Android Debug Bridge),用于访问 Android 文件系统
- SQLite3 命令行工具,用于检查数据库
- Frida/Objection,用于运行时数据提取
- 目标应用已安装并经过使用(已登录、数据已缓存)
法律声明: 本技能仅用于经授权的安全测试和教育目的。未经授权对您不拥有或未获得书面测试许可的系统使用本技能属于违法行为,可能违反计算机欺诈相关法律。
工作流
第 1 步:梳理应用数据存储位置
Android 存储路径:
# Internal storage (app-private, requires root)
/data/data/<package_name>/
├── shared_prefs/ # SharedPreferences XML files
├── databases/ # SQLite databases
├── files/ # General files
├── cache/ # Cached data
├── lib/ # Native libraries
└── app_webview/ # WebView data
# External storage (world-readable on older Android)
/sdcard/Android/data/<package_name>/
# Check for world-readable files
adb shell run-as <package_name> ls -la /data/data/<package_name>/
iOS 存储路径:
# App sandbox (accessible via SSH on jailbroken device)
/var/mobile/Containers/Data/Application/<UUID>/
├── Documents/ # User data, backed up by default
├── Library/
│ ├── Preferences/ # NSUserDefaults plists
│ ├── Caches/ # Cache data
│ └── Application Support/
└── tmp/ # Temporary files
第 2 步:提取并分析 SharedPreferences(Android)
# Pull SharedPreferences files
adb shell run-as <package_name> cat shared_prefs/*.xml
# Or on rooted device
adb pull /data/data/<package_name>/shared_prefs/ ./shared_prefs/
# Search for sensitive data
grep -ri "password\|token\|secret\|key\|session\|auth\|cookie" shared_prefs/
常见的不安全存储模式:
<string name="user_password">mysecretpass123</string>
<string name="auth_token">eyJhbGciOiJIUzI1NiIs...</string>
<string name="api_key">sk-live-abc123def456</string>
<string name="user_ssn">123-45-6789</string>
<string name="credit_card">4111111111111111</string>
第 3 步:分析 SQLite 数据库
# Pull databases
adb pull /data/data/<package_name>/databases/ ./databases/
# Open and inspect
sqlite3 databases/app.db
.tables
.schema users
SELECT * FROM users;
SELECT * FROM sessions;
SELECT * FROM tokens;
# Search all tables for sensitive columns
sqlite3 databases/app.db ".dump" | grep -i "password\|token\|secret\|credit"
检查是否存在未加密的 SQLCipher 数据库:
# If database opens without password, it's unencrypted
sqlite3 databases/app.db "SELECT count(*) FROM sqlite_master;"
# Success = unencrypted (vulnerability)
第 4 步:检查 iOS Keychain 存储
# Using Objection
objection --gadget com.target.app explore
ios keychain dump
# Check protection class attributes
# kSecAttrAccessibleWhenUnlocked - OK for most data
# kSecAttrAccessibleAlways - VULNERABLE: accessible even when locked
# kSecAttrAccessibleAfterFirstUnlock - acceptable for background apps
第 5 步:评估外部存储与备份暴露情况
Android:
# Check if backup is enabled
aapt dump badging target.apk | grep -i "allowBackup"
# android:allowBackup="true" = vulnerability
# Extract backup data
adb backup -f backup.ab -apk <package_name>
java -jar abe.jar unpack backup.ab backup.tar
tar xvf backup.tar
# Inspect extracted data for sensitive information
# Check external storage
adb shell ls -la /sdcard/Android/data/<package_name>/
iOS:
# Check backup exclusion
# Files in Documents/ are backed up by default
# Check NSURLIsExcludedFromBackupKey attribute
objection --gadget com.target.app explore
ios plist cat Info.plist
第 6 步:运行时内存分析
# Dump process memory for sensitive data
objection --gadget com.target.app explore
memory search "password" --string
memory search "BEGIN RSA PRIVATE KEY" --string
memory dump all /tmp/memdump/
# Android: Check for sensitive data in logs
adb logcat -d | grep -i "password\|token\|key\|secret"
关键概念
| 术语 | 定义 |
|---|---|
| SharedPreferences | Android 中 XML 格式的键值存储;常被误用于以明文存储凭据 |
| Keychain Services | iOS 的安全凭据存储,在现代设备上由 Secure Enclave 硬件提供支持 |
| Android Keystore | Android 上由硬件支持的加密密钥存储;密钥无法从设备中提取 |
| SQLCipher | SQLite 数据库的透明加密扩展;没有密码就无法提取数据 |
| Data Protection API | iOS 的、与设备密码绑定的文件级加密;通过保护类属性进行控制 |
工具与系统
- ADB (Android Debug Bridge):用于与 Android 设备交互及访问文件系统的命令行工具
- Objection:基于 Frida 的运行时探索工具,用于导出 keychain 和检查内存
- SQLite3:用于检查未加密 SQLite 数据库的命令行界面
- Android Backup Extractor (ABE):用于解包 ADB 备份文件以检查所存储数据的工具
- iExplorer:用于浏览 iOS 应用沙盒文件系统的 GUI 工具
常见陷阱
- 已加密但密钥在代码中:一些应用会加密数据库,但将加密密钥存储在 SharedPreferences 中或硬编码在二进制文件里。务必在检查加密的同时检查密钥存储。
- MODE_WORLD_READABLE 已弃用:该标志在 API 17 中已被弃用,但旧版应用可能仍在使用,从而使 SharedPreferences 可被其他应用读取。
- iOS 备份范围:默认情况下,Documents 目录中的所有文件都会包含在 iTunes/iCloud 备份中。请确认敏感文件已设置备份排除属性。
- 剪贴板暴露:复制到剪贴板的数据可被所有应用访问。检查应用是否将敏感数据(密码、令牌)复制到剪贴板。
评论
支持 Markdown