如何防止手机被root产生的风险?
问题场景
新出的手机太贵了,用户想买却苦于资金有限,去二手市场逛一逛,发现价格比市场正价便宜很多,旋即买了,没想到手机是被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
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
悖论:安全解决方案的承诺与现实
卖家秀与买家秀视频想必大多数人都已经领教过了。“我想象中我的样子 vs. 我实际上的样子”也有宠物版、成熟老公版,甚至是个人版可供打破幻想认清现实。 安全行业也不能免俗,多年来一直存在类似的现象:新产品或新技术总是伴随着天花乱坠的大堆承诺;然而,实际运营的结果往往十分打脸。回想一下早期的入侵预防系统(IPSes)。安全公司推出的IPSes承诺客户可以在网络上即插即用,插上就能阻止设备认为的所有不良事件。听起来简直太棒了,对吧?但运营现实却是不该阻止的也被阻止了,误报多到令人无法接受。而当安全团队被问到“为什么连这个都被阻止?”时,他们甚至都得不到任何答案,因为这种IPS设备是个“黑箱”。 显然,安全技术的美好承诺和实际运营现实之间存在巨大的鸿沟。我们不妨来看看更近期的例子:安全编排、自动化与响应(SOAR)平台,以及扩展检测与响应(XDR)解决方案。 SOAR在过去几年间可谓风头无两,然而,就是这种备受推崇的安全技术,其承诺与运营现实之间也脱节了。SOAR承诺,自动化过程可以帮助用户节省时间和资源,还能加速响应。但运营现实却是你还得定义适合自身环境的各种过程。即插即用?不存在的。而且,...
-
下一篇
前端 JavaScript 中 JSON.stringify() 的基本用法
前言 在开发工作中,我们可能会碰到这样的需求:需要将某个对象内容弹窗显示或者保存在文件中,这时候如果你直接弹窗的话,很可能就是下面这样的: 因为很多接口它对参数有要求,比如只能是字符串之类的。 这时候,就需要我们将对象转换为字符串进行输出,JSON.stringify() 方法就可以帮我们实现将对象转为字符串的过程。 方法描述 JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串,如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性。 语法 JSON.stringify(value[, replacer [, space]]) 参数说明: value 将要序列化成 一个 JSON 字符串的值。 replacer(可选) 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理; 如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中; 如果该参数为 null 或者未提供,则对象所有的属性都会...
相关文章
文章评论
共有0条评论来说两句吧...