金丝雀安全采用内核级反作弊技术,不依赖Java层API,直接读取Linux内核接口获取进程真实状态。本文详解核心技术原理。
为什么需要内核级检测?
传统基于Java层API的检测方案可被Hook框架伪造。Frida/Xposed可Hook任何Java方法,修改返回值。例如Hook getPackageName()返回伪造的包名,Hook ApplicationInfo.uid返回伪造的UID。内核级检测直接读取/proc、/sys等内核接口,Hook框架无法伪造内核状态。
核心技术原理
/proc接口读取
/proc是Linux内核提供的进程信息接口,包含进程的真实状态信息。金丝雀安全读取/proc/self/下的status、maps、mountinfo、cgroup等文件,获取进程的真实UID、包名、内存映射、挂载信息等。
SELinux上下文分析
SELinux为每个进程分配安全上下文,格式为user:role:type:level。level中的MCS类别(cXXX)与UID存在映射关系。虚拟化环境伪装了UID但无法伪造MCS类别,通过验证MCS类别与UID的映射关系可识别伪装。
cgroup身份提取
cgroup记录进程的调度组和真实包名。虚拟化环境通过Namespace隔离了cgroup视图,但/proc/self/cgroup仍包含真实信息。从cgroup路径中可提取进程的真实包名和UID。
mountinfo挂载分析
mountinfo记录进程的文件系统挂载信息。虚拟化环境使用bind mount伪装文件系统,但mountinfo中仍保留bind mount的痕迹。分析mountinfo可发现虚拟化环境的文件系统伪装。
maps内存映射分析
/proc/self/maps记录进程的内存映射信息。虚拟化环境中,分身进程的maps会包含宿主APK和宿主SO库的加载记录,这是虚拟化环境无法隐藏的特征。
内核级检测需要Root权限吗?
不需要。/proc/self/下的信息是进程自身信息,普通应用即可读取,无需Root权限。