root之后,小红书实名认证”设备不安全”

小红书实名认证”设备不安全”排查实录:Zygisk/LSPosed 痕迹检测与 Shamiko 黑名单模式

机型:OnePlus PJX110(OnePlus 13) · Android 16 · KernelSU v3.2.4
系列第二篇:上一篇《KernelSU 环境下隐藏 Root 检测实战》解决了大麦、淘宝,这篇解决更严格的小红书实名认证

一、前言

image

 

上一篇解决了大麦、淘宝的 Root 检测后,我以为 KernelSU 的隐藏已经天下无敌了。结果小红书(com.xingin.xhs)教做人:日常浏览一切正常,一提交实名认证就提示”当前设备不安全,更换设备后重试”。

实名认证走的是最严格的安全链路(通常集成支付宝/公安核查级别的风险控制 SDK),检测维度比普通 App 多得多。这次排查让我对”隐藏 Root”的认知又深了一层——内核卸载挂载只是第一层,SDK 的检测手段是分层的,你得知道它到底在看哪一层。

二、第一轮排查:基础项全绿

沿用上一篇的方法论,先启动小红书,从它的进程视角检查常规检测项:

# 启动小红书,拿到 pid
am start -n com.xingin.xhs/.index.v2.IndexActivityV2
PID=$(pidof com.xingin.xhs | awk '{print $1}')

# ① 模块挂载:已隐藏 ✅(mounts 里没有 modules)
cat /proc/$PID/mounts | grep -iE "modules|ksu|magisk"   # 空

# ② su 二进制:已隐藏 ✅
su 10379 -c 'ls /system/bin/su'   # No such file or directory

# ③ /data/adb:权限拒绝 ✅(700 root,普通 App 进不去)
su 10379 -c 'ls /data/adb'        # Permission denied

# ④ KernelSU 管理器包:已隐藏 ✅
ls /proc/$PID/root/data/app | grep -i weishu            # 空

# ⑤ SELinux:Enforcing ✅
getenforce                         # Enforcing

# ⑥ Bootloader 属性:干净 ✅
getprop ro.boot.verifiedbootstate  # green(不是 orange!)
getprop ro.boot.vbmeta.device_state  # locked

# ⑦ 系统属性:干净 ✅
getprop ro.debuggable              # 0
getprop ro.build.tags              # release-keys

全部绿。顺手把 USB 调试也关了(settings put global adb_enabled 0,实名认证 SDK 很爱查这个),重启小红书再试——依然报”设备不安全”。

排除法得出结论:问题不在这些常规项。

三、实锤:SDK 在扫 /proc/self/maps

既然常规项全绿还报错,那它一定在看别的东西。我直接检查小红书进程的内存映射表,看有没有不该出现的东西:

cat /proc/$PID/maps | grep -iE "lsposed|xposed|zygisk|lspd"

结果抓到现行:

/data/adb/modules/zygisk_lsposed/zygisk/arm64-v8a.so   ← LSPosed 注入库!
/data/adb/modules/zygisksu/lib64/libzygisk.so          ← ZygiskNext 注入库!

注意这两行的路径/data/adb/modules/...——它直接暴露了三件事:

  1. 进程里注入了 Zygisklibzygisk.so
  2. 进程里注入了 LSPosed(Xposed 框架)
  3. /data/adb/modules 目录存在(Root 模块目录)

而小红书的安全 SDK 只需要读一次自己的 /proc/self/maps 就能全部看到,然后果断判定”设备不安全”。

四、核心认知:内核 umount 与已映射内存的差距

这里就是上一篇认知的盲区,也是本篇最重要的知识点:

内核的 kernel_umount 隐藏的是”挂载表”(/proc/self/mounts),但隐藏不了”已映射进内存的库路径字符串”(/proc/self/maps)。

用大白话解释:

  • Zygisk 在 zygote fork 阶段就把 libzygisk.so、LSPosed 的 arm64-v8a.so 映射进每个 App 的进程了
  • 内核 umount 是在之后把模块的挂载点卸载掉——挂载没了,但已经映射的内存区域还在,maps 里记录的原始路径字符串也还在
  • SDK 扫 maps 看到的不是”当前是否挂载”,而是”这个进程映射过什么”——路径字符串本身就是铁证

所以就算你把挂载藏得再好,只要 Zygisk/LSPosed 还在往 App 进程里注入库,maps 就一定会露馅。

而这一切,正是 Shamiko 存在的意义——它本来就是干这个的:在目标 App 的进程内部过滤 /proc/self/maps 的读取,让 SDK 看到一份”干净”的映射表。

五、为什么 Shamiko 之前没起作用

我的 Shamiko v1.2.5 一直开着,但它处于白名单模式/data/adb/shamiko/whitelist 文件存在)。

Shamiko 两种模式的语义:

模式 处理对象
白名单模式 只处理”排除名单”里的 App
黑名单模式 处理所有 App,排除名单里的除外

问题来了:新版 KernelSU(v2/v3)已经没有”排除名单”功能了(上一篇讲过,它改成了”内核全局卸载 + 授权白名单”)。

于是 Shamiko 白名单模式拿着一个不存在的名单,一个 App 都不处理——等于挂机。小红书自然得不到任何保护。

六、解决方案:三步走

第 1 步:确认 LSPosed 有没有在用

find /data/adb/lspd/modules/ -type f   # 结果:空 = 没有任何启用模块

我的 LSPosed 一个模块都没启用,纯摆设还白给检测,果断处理。

第 2 步:切换 Shamiko 为黑名单模式

# 删除 whitelist 文件 = 黑名单模式(处理所有普通 App)
rm /data/adb/shamiko/whitelist

# 确认模块状态
ksud module list | grep -E '"id"|"enabled"'
# zygisk_shamiko: enabled=true ✅

第 3 步:重启手机

Zygisk 模块的注入行为在 zygote 阶段决定,必须重启才能生效。

重启后的实际结果:

  • ✅ 小红书实名认证正常提交,不再提示”设备不安全”
  • ✅ Termux 的 root 照常可用(黑名单模式没有误伤已授权 Root 的 App)
  • ✅ 大麦、淘宝依然正常

一个有意思的验证细节:重启后我用 root 身份读小红书的 maps,依然能看到 libzygisk.so 和 LSPosed 的库——但小红书本身已经检测不到了。原因:Shamiko 是在 App 进程内部过滤它自己对 /proc/self/maps 的读取,而我用 root 从外部读到的才是未经过滤的原始内容。这恰好证明了 Shamiko 确实在工作——它骗的是 App,不是 root。

七、方法论升级:检测的层级

两篇排查下来,安全 SDK 的检测手段可以归纳为四个层级,每一层都要单独应对

层级 检测内容 应对手段
L1 文件系统 su 二进制、/data/adb、模块目录 KernelSU kernel_umount 内核卸载
L2 进程注入 /proc/self/maps 里的 zygisk/xposed 库路径 Shamiko(黑名单模式)进程内过滤
L3 系统状态 Bootloader 属性、SELinux、USB 调试、系统属性 保持干净(绿色属性)+ 关调试
L4 硬件认证 Key Attestation / Play Integrity Tricky Store(keybox)

大麦、淘宝只查 L1;小红书实名认证查到了 L2。银行级 App 会查到 L4。你的隐藏配置得按最严格的场景来配,而不是按最宽松的。

八、注意事项

  1. 黑名单模式的副作用:Shamiko 黑名单会处理所有普通 App。实测对已授权 Root 的 App(如 Termux)不误伤,但保险起见,改完配置后记得验证 su 是否正常。
  2. 回滚方法:如果黑名单模式引起问题,重新创建白名单文件即可回滚:
    bash
    touch /data/adb/shamiko/whitelist # 回到白名单模式
    # 然后重启
  3. LSPosed 的去留:如果确实在用 LSPosed 模块,可以保留,但要知道它是最强的检测信号之一。禁用模块的命令:ksud module disable zygisk_lsposed(重启生效),恢复用 enable
  4. 验证视角:用 root 读 /proc/<pid>/maps 看到注入库不代表失败——Shamiko 过滤的是 App 自己的读取。判断标准只有一个:App 的实际行为(能不能正常打开/提交认证)。
  5. USB 调试:实名认证/支付类场景建议保持关闭(settings put global adb_enabled 0)。

九、命令速查表

# 检查进程映射中的注入痕迹(root 视角,原始数据)
cat /proc/$PID/maps | grep -iE "lsposed|xposed|zygisk|lspd"

# Shamiko 模式切换
rm /data/adb/shamiko/whitelist     # → 黑名单模式(处理所有 App)
touch /data/adb/shamiko/whitelist  # → 白名单模式(处理排除名单)

# 模块管理
ksud module list                    # 模块及启用状态
ksud module disable zygisk_lsposed  # 禁用 LSPosed
ksud module enable zygisk_lsposed   # 重新启用

# 关闭 USB 调试
settings put global adb_enabled 0
settings put global development_settings_enabled 0

# 基础项复查(见上一篇)
cat /proc/$PID/mounts | grep -iE "modules|ksu|magisk"
su <app_uid> -c 'ls /system/bin/su'
su <app_uid> -c 'ls /data/adb'

十、结语

这篇的核心收获一句话:

挂载藏得再好,也藏不住已经映射进内存的库——进程注入痕迹要靠 Shamiko 这类专门工具在 App 内部过滤。

两篇连起来看,就是一套完整的”隐藏 Root”排查方法论:

  1. 先搞懂你的 Root 方案的隐藏机制(新版 KernelSU = 内核全局卸载)
  2. 按层级排查:文件系统 → 进程注入 → 系统状态 → 硬件认证
  3. 用 App 自己的身份验证(su <uid>),别用 root 自嗨
  4. 改完配置必须重启,重启是最有效的状态重置

系列第一篇:《KernelSU 环境下隐藏 Root 检测实战:大麦、淘宝全部正常打开》

(本文所有命令均在 OnePlus PJX110 / Android 16 / KernelSU v3.2.4 上实测通过)

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容