name: mobile-security description: 移动应用安全技能,用于实现OWASP MASVS合规性、安全存储、证书绑定、生物识别认证以及跨iOS和Android平台的安全加固。 allowed-tools: Read, Grep, Write, Bash, Edit, Glob, WebFetch
移动安全技能
为iOS和Android平台提供全面的移动应用安全实现,涵盖OWASP移动安全指南、安全存储、认证机制和安全加固。
概述
本技能提供实施移动安全最佳实践的能力,包括安全数据存储、网络安全、认证机制以及符合OWASP移动应用安全验证标准(MASVS)的合规性。
能力
安全存储实现
- 为敏感数据配置iOS钥匙串服务
- 为加密操作设置Android密钥库
- 实现加密的SharedPreferences/UserDefaults
- 管理安全密钥生成和存储
- 处理安全凭据管理
证书绑定
- 为iOS证书绑定实现TrustKit
- 为Android配置OkHttp CertificatePinner
- 设置网络安全配置(Android)
- 配置应用传输安全(iOS)
- 验证和轮换绑定的证书
生物识别认证
- 为iOS实现Face ID和Touch ID
- 为Android配置指纹/生物识别提示
- 处理备用认证机制
- 管理生物识别注册状态
- 保护受生物识别保护的钥匙串/密钥库项目
安全加固
- 实现越狱/root检测
- 配置代码混淆(ProGuard/R8, Swiftshield)
- 设置防篡改机制
- 实现运行时完整性检查
- 配置安全调试设置
OWASP MASVS合规性
- 针对MASVS级别1和级别2进行审计
- 生成合规性检查清单
- 识别安全漏洞
- 推荐修复策略
- 记录安全控制措施
先决条件
iOS开发
# 用于证书绑定的TrustKit
pod 'TrustKit'
# 钥匙串包装器
pod 'KeychainAccess'
Android开发
// build.gradle
dependencies {
implementation 'androidx.security:security-crypto:1.1.0-alpha06'
implementation 'androidx.biometric:biometric:1.1.0'
}
安全工具
# OWASP移动安全测试指南工具
pip install objection
brew install frida-tools
使用模式
iOS钥匙串存储
import Security
class KeychainManager {
static func save(key: String, data: Data) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
let status = SecItemAdd(query as CFDictionary, nil)
return status == errSecSuccess
}
static func load(key: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]
var result: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &result)
return status == errSecSuccess ? result as? Data : nil
}
}
Android EncryptedSharedPreferences
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
class SecureStorage(context: Context) {
private val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
private val sharedPreferences = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
fun saveToken(token: String) {
sharedPreferences.edit().putString("auth_token", token).apply()
}
fun getToken(): String? {
return sharedPreferences.getString("auth_token", null)
}
}
证书绑定(iOS - TrustKit)
import TrustKit
class NetworkSecurityManager {
static func configurePinning() {
let trustKitConfig: [String: Any] = [
kTSKSwizzleNetworkDelegates: false,
kTSKPinnedDomains: [
"api.example.com": [
kTSKEnforcePinning: true,
kTSKIncludeSubdomains: true,
kTSKExpirationDate: "2027-01-01",
kTSKPublicKeyHashes: [
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
]
]
]
]
TrustKit.initSharedInstance(withConfiguration: trustKitConfig)
}
}
证书绑定(Android - OkHttp)
import okhttp3.CertificatePinner
import okhttp3.OkHttpClient
val certificatePinner = CertificatePinner.Builder()
.add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.add("api.example.com", "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=")
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
生物识别认证(iOS)
import LocalAuthentication
class BiometricAuth {
func authenticate(completion: @escaping (Bool, Error?) -> Void) {
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
context.evaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "验证身份以访问安全数据"
) { success, error in
DispatchQueue.main.async {
completion(success, error)
}
}
} else {
completion(false, error)
}
}
}
生物识别认证(Android)
import androidx.biometric.BiometricPrompt
import androidx.fragment.app.FragmentActivity
class BiometricAuth(private val activity: FragmentActivity) {
fun authenticate(onSuccess: () -> Unit, onError: (String) -> Unit) {
val executor = ContextCompat.getMainExecutor(activity)
val biometricPrompt = BiometricPrompt(activity, executor,
object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
onSuccess()
}
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
onError(errString.toString())
}
})
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("生物识别认证")
.setSubtitle("验证身份以访问安全数据")
.setNegativeButtonText("取消")
.build()
biometricPrompt.authenticate(promptInfo)
}
}
与Babysitter SDK集成
任务定义示例
const mobileSecurityTask = defineTask({
name: 'mobile-security-implementation',
description: '实施移动安全控制',
inputs: {
platform: { type: 'string', required: true, enum: ['ios', 'android', 'both'] },
securityLevel: { type: 'string', required: true, enum: ['L1', 'L2'] },
features: { type: 'array', items: { type: 'string' } },
projectPath: { type: 'string', required: true }
},
outputs: {
implementedControls: { type: 'array' },
complianceReport: { type: 'object' },
securityAuditPath: { type: 'string' }
},
async run(inputs, taskCtx) {
return {
kind: 'skill',
title: `为${inputs.platform}实施${inputs.securityLevel}安全级别`, // 翻译了标题
skill: {
name: 'mobile-security',
context: {
operation: 'implement_security',
platform: inputs.platform,
securityLevel: inputs.securityLevel,
features: inputs.features,
projectPath: inputs.projectPath
}
},
io: {
inputJsonPath: `tasks/${taskCtx.effectId}/input.json`,
outputJsonPath: `tasks/${taskCtx.effectId}/result.json`
}
};
}
});
MCP服务器集成
使用owasp-mobile-security-checker
{
"mcpServers": {
"owasp-mobile": {
"command": "npx",
"args": ["owasp-mobile-security-checker"],
"env": {
"PROJECT_PATH": "/path/to/mobile/project"
}
}
}
}
可用的MCP工具
owasp_scan_ios- 扫描iOS项目的OWASP漏洞owasp_scan_android- 扫描Android项目的OWASP漏洞check_keychain_usage- 验证iOS钥匙串实现check_keystore_usage- 验证Android密钥库实现validate_certificate_pinning- 检查证书绑定配置audit_biometric_auth- 审计生物识别认证实现
OWASP MASVS检查清单
存储(MASVS-STORAGE)
- [ ] 敏感数据不以明文存储
- [ ] 敏感数据不在应用日志中
- [ ] 敏感数据不与第三方共享
- [ ] 敏感输入的键盘缓存已禁用
- [ ] 敏感数据的剪贴板已禁用
- [ ] 敏感数据已从备份中排除
加密(MASVS-CRYPTO)
- [ ] 使用强加密算法
- [ ] 加密密钥得到妥善管理
- [ ] 随机数生成安全
- [ ] 没有使用已弃用的加密函数
认证(MASVS-AUTH)
- [ ] 生物识别认证正确实现
- [ ] 会话管理安全
- [ ] 密码策略得到执行
- [ ] 提供多因素认证
网络(MASVS-NETWORK)
- [ ] 所有连接使用TLS
- [ ] 实现证书绑定
- [ ] 证书验证未被绕过
- [ ] ATS/网络安全配置正确配置
平台(MASVS-PLATFORM)
- [ ] WebView正确配置
- [ ] 深度链接经过验证
- [ ] IPC机制得到保护
- [ ] 敏感屏幕防止截图
代码质量(MASVS-CODE)
- [ ] 启用代码混淆
- [ ] 发布版本中禁用调试
- [ ] 实现Root/越狱检测
- [ ] 实施防篡改措施
最佳实践
- 纵深防御:分层实施多种安全控制
- 默认安全:默认采用最安全的配置
- 最小权限:仅请求必要的权限
- 数据最小化:仅存储必要的敏感数据
- 定期审计:持续评估安全状况
- 密钥轮换:实施证书和密钥轮换计划