本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
在鸿蒙(HarmonyOS)中,Ability的合法性校验是确保应用间安全交互的核心机制,主要通过签名校验、权限控制、Want参数验证等多层防护实现。以下是详细的校验流程和具体实现方式:
一、合法性校验的核心机制
1. 签名校验(Bundle校验)
- 校验时机:当应用通过
startAbility
启动其他Ability时。 - 校验内容:
- Bundle证书链:验证目标应用的签名证书是否由华为官方或可信CA签发。
- 签名哈希匹配:检查目标Ability所属应用的签名与发布时一致。
const want: Want = {
bundleName: 'com.example.target', // 目标应用Bundle名称
abilityName: 'TargetAbility',
certificateFingerprint: 'SHA256:xxxx', // 可选:指定签名指纹
};
context.startAbility(want).catch((err: BusinessError) => {
if (err.code === 201) console.error('签名校验失败');
});
- 失败场景:若目标应用被篡改或签名不一致,系统返回错误码
201
。
2. 权限控制(Permission校验)
- 静态权限:在
module.json5
中声明所需权限:
{
"requestPermissions": [
{
"name": "ohos.permission.START_ABILITIES",
"reason": "需要启动其他Ability"
}
]
}
动态权限:敏感操作需运行时申请:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
const atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(['ohos.permission.START_ABILITIES'])
.then((result) => {
if (result.authResults[0] === 0) {
context.startAbility(want); // 权限通过后启动
}
});
3. Want参数过滤
- 显式启动:必须精确指定
bundleName
和abilityName
。 - 隐式启动:通过
actions
和entities
匹配时,系统会过滤不符合条件的Ability:
const want: Want = {
action: 'ohos.want.action.viewData',
entities: ['entity.system.browsable']
};
4. 进程隔离与沙箱校验
- 跨进程调用:通过Binder IPC通信时,内核层会验证调用方UID/GID是否合法。
- 沙箱限制:每个Ability运行在独立沙箱中,无法直接访问其他应用的数据目录。
二、校验流程的底层实现
1. 系统服务参与
- AbilityManagerService (AMS):负责校验Ability是否存在、权限是否满足。
- BundleManagerService (BMS):验证Bundle签名和证书链。
2. Native层校验逻辑
- 源码路径:
foundation/ability/ability_runtime/services/abilitymgr/
- 关键函数:
// 校验签名和权限
ErrCode AbilityManagerService::VerifyCallingPermission(const Want &want) {
if (CheckAppSignature(want.GetBundleName()) != SUCCESS) {
return ERR_PERMISSION_DENIED; // 签名不匹配
}
if (CheckCallerPermission() != SUCCESS) {
return ERR_PERMISSION_DENIED; // 权限不足
}
return SUCCESS;
}
3. 安全审计日志
- 校验失败时,系统会记录安全日志(可通过
hilog
查看):
hdc shell hilog | grep 'AbilityVerify'
# 输出示例:E 01-02 15:00:00.000 100 1000 AbilityVerify: Signature mismatch for com.example.target
三、调试与验证方法
1. 强制跳过校验(仅调试)
在config.json
中临时关闭校验(禁止上架时使用):
{
"app": {
"debug": true, // 调试模式下放宽部分校验
"bundleName": "com.example.debug"
}
}
2. 签名校验工具
使用命令行手动验证应用签名:
hdc app install --check-signature /path/to/app.hap
# 输出示例:Success: Signature valid
3. 权限检查命令
查看当前应用的权限授予状态:
hdc shell aa dump -a com.example.demo | grep 'grantedPermissions'
四、常见校验失败场景与解决
错误码 | 原因 | 解决方案 |
---|---|---|
201 | 签名不匹配或证书失效 | 检查目标应用的签名证书是否更新 |
202 | 权限未授予 | 动态申请权限或修改module.json5 |
203 | Want参数无法匹配到目标 | 确认abilityName 或action 是否正确 |
五、建议
- 发布前全面测试:
- 使用华为官方签名证书,并在真机上验证跨Ability调用。
- 最小权限原则:
- 仅申请必要的权限,降低安全风险。
- 敏感操作加密:
- 对跨Ability传递的数据使用
@ohos.security.crypto
加密。
- 对跨Ability传递的数据使用