iOS和Android越狱检测总是被绕过怎么办?

UE丶光纬 阅读 22

最近在给一个金融类App加安全检测,需要判断设备是否越狱或Root。按照网上的方案写了检测已知目录的代码:


function checkJailbreak() {
  return fs.existsSync('/Applications/Cydia.app') || 
         fs.existsSync('/private/var/stash/cydia.deb');
}

但测试时发现很多用户通过安装”FakeAgent”这类工具就能绕过检测,甚至有些真机根本检测不到。尝试过检查系统证书和未加密存储,但Android端用su命令检测又老报Permission Denied。有没有更可靠的检测方法组合?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
♫小青
♫小青 Lv1
检测越狱和Root这事确实挺头疼,尤其是现在这些工具越来越花哨。直接用这个组合方法,效果会好很多。

function isDeviceCompromised() {
const suspiciousPaths = [
'/Applications/Cydia.app',
'/private/var/stash/cydia.deb',
'/private/var/lib/apt/',
'/private/var/tmp/cydia.log',
'/bin/bash',
'/usr/sbin/sshd',
'/etc/apt'
];

// 检测可疑路径
for (let path of suspiciousPaths) {
if (fs.existsSync(path)) {
return true;
}
}

try {
// 检测系统命令执行权限
child_process.execSync('which su');
return true;
} catch (e) {
// Permission Denied也是异常情况
if (e.status !== 127) {
return true;
}
}

// 检测是否能修改系统文件
try {
fs.writeFileSync('/private/jailbreak.txt', 'test');
fs.unlinkSync('/private/jailbreak.txt');
return true;
} catch (e) {
// 写入失败是正常情况
}

// 检测代码签名
try {
const codesignCheck = child_process.execSync('codesign -dv --verbose=4 $APP_BUNDLE_PATH 2>&1');
if (codesignCheck.includes('not signed')) {
return true;
}
} catch (e) {
return true;
}

return false;
}


几个关键点说一下:第一,别只检测固定路径,要多检查一些常见的越狱特征。第二,尝试执行敏感操作,比如写系统目录,能写进去就说明有问题。第三,结合代码签名验证,fake环境通常过不了这关。

Android这边建议加个定时检测机制,有些工具启动时是正常的,运行一段时间才生效。另外记得混淆你的检测代码,不然很容易被hook掉。

最后提醒一句,安全检测不是万能的,该加密的数据还是要加密,该做风控的要做风控。防君子不防小人,但至少得把门槛提高点。
点赞 2
2026-02-17 11:06