问题场景
新出的手机太贵了,用户想买却苦于资金有限,去二手市场逛一逛,发现价格比市场正价便宜很多,旋即买了,没想到手机是被root过的,这可怎么办?买了一款被root过的手机,并不是root行为本身有什么风险,而是给应用运行的环境增加了很高的风险,比如,被root的设备安装的特定应用容易被安装恶意刷评病毒,这些恶意评价容易造成应用在应用商店的评分降低,最后导致用户流失。另一方面,被root的设备应用面临被非法入侵的风险,一旦被非法入侵,应用内的广告被删除,应用免广告版本被破解,就容易给应用带来直接的利益损失。
开发者不可能直接绿化用户购买手机的渠道,又不可能禁止用户逛二手市场,或者从不良代理商手里买手机的行为,没法从根源制止,一旦手机被root造成了利益损失,就会造成意料之外的后果。
什么是手机被root?
简单的来说,“您的手机被root”,就意味着,手机已被第三方取得了最高权限,他/她可以任意访问和修改手机操作系统里几乎所有的文件。
什么意思呢?Root相当于手机的神经中枢,它可以访问和修改手机几乎所有的文件,这些东西可能是制作手机的公司不愿意修改和触碰的东西,因为他们有可能影响到手机的稳定,还容易被一些黑客入侵。
手机被Root有什么危害?
从被root的定义来看,手机一旦被root,相当于神经中枢遭到攻击,危害可想而知,具体的表现是:
- 病毒木马易侵入
- 手机系统不稳定
- 获取了root权限之后手机制造商不给予保修
- 若操作失误, 可能导致手机系统损坏
那么被root的手机,对于开发者有什么危害呢?
如开篇问题场景中的描述,一旦手机被root,就可能造成应用被安装恶意刷评病毒,不良评价造成应用在应用商店的评分降低,最后导致用户流失;另一方面,被root的设备应用一旦被非法入侵,应用内的广告会遭到删除,或是免广告版本被破解,开发者的直接利益将受到不可控的危险。
如何防止手机被root产生的风险?
解决这个问题,就需要调用华为Safety Detect的系统完整性检测能力。系统完整性检测能力,可提供系统完整性检测API,方便用户通过该API评估其App所运行的设备环境是否安全(是否被root)。这方面的能力可以做到检测结果TEE级保存,且不可修改,可在最大程度上保证应用安全,而且集成简单,1人/天开发工作量即可完成接入。具体如何操作呢?
主要分为三个步骤:
1. 获取nonce
在调用Safety Detect SysIntegrity API时,必须传入一个nonce值。在检测结果中会包含这个nonce值,可以通过校验这个nonce值来确定返回结果能够对应你的请求,并且没有被重放攻击。如果nonce值长度超出16-66字节范围,将导致调用失败。
2. 请求Safety Detect SysIntegrity
Safety Detect SysIntegrity提供两个接口,调用只有参数上的不同,都需要传入的参数是nonce和APP ID。sysIntegrity(SysIntegrityRequest sysIntegrityRequest)接口还需要在SysIntegrityRequest中传入签名的验证方式,这个将和您获取的JWS的Header中alg一致。
nonce:上一步我们获取的nonce值。
APP ID:可以通过以下方式获取APP ID。
登录AppGallery Connect网站,点击“我的项目”。在项目列表中找到您的项目,在项目中点击需要配置签名证书指纹的应用。在“项目设置 > 常规”页面的“应用”区域,可以查看应用的APP ID。
private void invokeSysIntegrity() {
SafetyDetectClient mClient = SafetyDetect.getClient(getActivity());
// TODO(developer): Change the nonce generation to include your own, used once value,
// ideally from your remote server.
byte[] nonce = ("Sample" + System.currentTimeMillis()).getBytes();
SysIntegrityRequest sysintegrityrequest = new SysIntegrityRequest();
sysintegrityrequest.setAppId("3*******");
sysintegrityrequest.setNonce(nonce);
sysintegrityrequest.setAlg(alg);
Task task = mClient.sysIntegrity(sysintegrityrequest);
task.addOnSuccessListener(new OnSuccessListener<SysIntegrityResp>() {
@Override
public void onSuccess(SysIntegrityResp response) {
// Indicates communication with the service was successful.
// Use response.getResult() to get the result data.
String jwsStr = response.getResult();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// An error occurred while communicating with the service.
if (e instanceof ApiException) {
// An error with the HMS API contains some
// additional details.
ApiException apiException = (ApiException) e;
// You can retrieve the status code using
// the apiException.getStatusCode() method.
Log.e(TAG, "Error: " + SafetyDetectStatusCodes.getStatusCodeString(apiException.getStatusCode()) + ": " + apiException.getMessage());
} else {
// A different, unknown type of error occurred.
Log.e(TAG, "ERROR:" + e.getMessage());
}
}
});
}
3. 在服务器中验证检测结果。
将验证结果发送到华为服务器校验证书的准确性并将完成校验的结果通过SysIntegrityResp返回,使用此对象的getResult方法获取响应,格式为JSON WEB签名(JWS)。
a. 解析JWS,获取header、payload、signature。
b. 从header中获取证书链,使用Huawei CBG Root CA证书对其进行验证。
c. 校验证书链中的叶证书域名,域名:sysintegrity.platform.hicloud.com。
d. 从signature中获取签名,校验其签名。
e. 从payload中获取完整性验证结果,格式和样例摘录如下:
{
"advice": "RESTORE_TO_FACTORY_ROM",
"apkCertificateDigestSha256": ["gwpz0q/WtjtJZZK5lTXl74fI/8QAKGLAhdhlznKkLhQ="],
"apkDigestSha256": "nBrInk2DLVQrgcQ1DXYnIUIMnjJ+mVo0lwUicF7OzJM=",
"apkPackageName": "com.huawei.hms.safetydetectsample",
"appId": "1*******",
"basicIntegrity": false,
"detail": ["root", "unlocked"],
"nonce": "UjJScmEyNGZWbTV4YTJNZw==",
"timestampMs": 1612683290520
}
当检测结果中basicIntegrity为false,您可以根据自身功能对安全的要求决定是否提醒用户。
三位一体保障应用运行安全,高效预防客流损失
App如何避免手动输入密码造成的安全风险?
App如何防止恶意网址入侵的风险?
>>访问华为安全检测服务官网,了解更多相关内容
>>获取华为安全检测服务开发指导文档
>>华为HMS Core官方论坛
>>华为安全检测服务开源仓库地址:GitHub、Gitee
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~
{{m.name}}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/70486.html