iOS和Android越狱检测总是被绕过怎么办?
最近在给一个金融类App加安全检测,需要判断设备是否越狱或Root。按照网上的方案写了检测已知目录的代码:
function checkJailbreak() {
return fs.existsSync('/Applications/Cydia.app') ||
fs.existsSync('/private/var/stash/cydia.deb');
}
但测试时发现很多用户通过安装”FakeAgent”这类工具就能绕过检测,甚至有些真机根本检测不到。尝试过检查系统证书和未加密存储,但Android端用su命令检测又老报Permission Denied。有没有更可靠的检测方法组合?
对于iOS,除了检查Cydia等应用的路径外,还可以检查一些系统文件和目录是否存在,比如
/bin/bash、/Library/MobileSubstrate/MobileSubstrate.dylib等。另外,检查沙盒完整性也是一种有效的方法,确保应用的文件系统没有被篡改。对于Android,检查su命令只是其中一种方法,还有其他方式可以尝试。可以检测
/system/xbin/su、/system/bin/su等路径是否存在,同时也可以通过执行命令的方式来检查是否能获取root权限。当然,这种方式可能会因为权限问题导致失败,这时可以考虑结合其他检测手段。还有一个相对隐蔽的方式是检查设备的属性,比如
ro.secure和ro.debuggable等系统属性,这些属性在root过的设备上可能会有不同的值。下面是一个改进后的检测示例,结合了上述提到的一些方法:
这样更清晰,检测的维度更多一些,绕过的难度也会增加。不过需要注意的是,这些方法都不是绝对可靠的,只能说是在一定程度上增加了安全性。毕竟,root过的设备总能找到办法绕过检测。
几个关键点说一下:第一,别只检测固定路径,要多检查一些常见的越狱特征。第二,尝试执行敏感操作,比如写系统目录,能写进去就说明有问题。第三,结合代码签名验证,fake环境通常过不了这关。
Android这边建议加个定时检测机制,有些工具启动时是正常的,运行一段时间才生效。另外记得混淆你的检测代码,不然很容易被hook掉。
最后提醒一句,安全检测不是万能的,该加密的数据还是要加密,该做风控的要做风控。防君子不防小人,但至少得把门槛提高点。