Skip to content

feat(anti-vrko): 接入完整反 vr.ko 流程 + 恢复 1.3 载荷功能 + 调整执行顺序(仅作建议,未做实际验证) - #267

Open
hmascs wants to merge 1 commit into
YuKongA:mainfrom
hmascs:feat/anti-vrko-full-chain
Open

hmascs wants to merge 1 commit into
YuKongA:mainfrom
hmascs:feat/anti-vrko-full-chain

Conversation

@hmascs

@hmascs hmascs commented Oct 3, 2026

Copy link
Copy Markdown

完整适配反 vr.ko 逻辑 + 恢复 1.3 载荷功能 + 调整执行顺序

⚠️ 免责声明(请先读这一段)

本 PR 仅作建议,未做实际验证。

  • 已完成的是静态适配与编译验证(aarch64 交叉编译通过、符号与字符串核对、APK 打包通过)。
  • 未完成真机运行验证:neutralize_vr_probes 的 ok=1、vr.ko 探针槽位定位、逐任务 tag 清除的实际效果,
    均没有在本机跑通确认。
  • 因此本 PR 的所有改动都应视为待验证的提案,合并前请自行在目标设备上完整验证。
  • 尤其:CFI 阶段涉及改写 &ashmem_misc.fops 与 sys_exit tracepoint 的 funcs 数组,
    属高危内核数据写;一旦地址推导有偏差,可能造成设备无法启动。不要未经真机验证就分发。

本 PR 做了什么

1. 接入参考仓库的完整反 vr.ko 流程

把 CVE-2026-43499-Neo11Plus 的反
vr.ko 两层机制完整接进本工程:

层 参考仓库位置 本工程落点
常驻内核读写(configfs fops 伪造 + pipe 物理读写) exploit/src/* src/core/session/backend/cfi_stage.cpp
逐任务去 tag(thread_info.flags bit 0x400 + task+0x06 / task+0x2c) root.c: patch_task_vr_tag w2b 阶段
探针外科手术式中和(读 probestub,按模块内 delta 定位 sys_exit 槽位,只改那一个槽) root.c: neutralize_vr cfi_stage.cpp: neutralize_vr_probes

新增文件:

  • src/core/session/backend/cfi_layout.hpp
  • src/core/session/backend/cfi_stage.hpp
  • src/core/session/backend/cfi_stage.cpp
  • src/core/tests/cfi_stage_test.cpp

2. 恢复被 overlay 覆盖掉的 1.3 原载荷功能

cve_2026_43499_backend.cpp 在接入 overlay 时被整体替换(45 KB → 30 KB),
导致下列功能丢失,本 PR 全部补回:

  • bootimg::detect_device_brand_runtime(品牌检测:属性优先,boot 字节回落)
  • bootimg::load_boot_image(boot / vendor_boot / kcore 三路加载)
  • bootimg::probe_vrko_from_vendor_boot(运行时解析 vr.ko 的 tag A/B 偏移)
  • bootimg::recover_sys_exit_tp_funcs(profile 缺失时从内核内嵌 kallsyms/BTF 恢复)

一处刻意的取舍:把 sys_exit.funcs 指针整体清零的老式粗粒度写,用编译期开关
GHOSTLOCK_LEGACY_SYSEXIT_KILLSWITCH 默认关闭。原因是它与第 1 项的细粒度中和硬冲突:
neutralize_vr_probes 必须读 sys_exit_tp.funcs[] 才能定位 vr.ko 的模块内探针槽,
若先被整体清零,CFI 扫描会落空。解析/恢复逻辑全部保留并启用,只门住那一笔冲突的内核写。

3. 调整执行顺序:反 vr.ko 移到 KSU 移交之后

原顺序(会软重启):

Backend(W1→W2→W3) → 【CFI + vr.ko 中和】 → Frontend handoff(ksud late-load 拿 root)

改后:

Backend(W1→W2→W3) → Frontend handoff(拿 root) → 【CFI + vr.ko 中和】

理由:CFI 阶段会替换 &ashmem_misc.fops 并改写 sys_exit 探针数组,
在 framework 尚未稳定、KernelSU 尚未接管时做这些,正是把设备带进软重启的时序。

改动位置:

  • src/core/session/backend/cve_2026_43499_backend.cpp:移除 run_cfi_stage<M> 调用(留注释说明去向)
  • src/core/route/pipeline.hpp:在 Frontend::run() 之后派发
    session::backend::run_cfi_stage<Middleware>(exploit_session)
  • 顺带修正:KernelSU 本来就已 root 时(Backend 返 Done),现在也会执行反 vr.ko,
    不再直接 DiagnosticStop 返回

Termux / aarch64 构建适配(3 处必须改)

overlay 的 Makefile 是按桌面 NDK 写的,在 Termux aarch64 上需要:

问题 修法
去掉了 Termux 回落,NDK_ROOT 为空 → 编译器路径变成 /toolchains/... 提供 NDK_ROOT 指向一个假 NDK 目录;aarch64-linux-android35-clang{,++} 必须是转发脚本(不能做符号链接:Termux 包装器按自身目录找 clang++)
硬编码 -static-libstdc++,Termux clang 会翻成 -lc++_shared → 链接失败 命令行覆盖 LDFLAGS="-fPIE -pie -pthread -flto"
CXX_SRCS 完全没列 core/bootimg/* → detect_device_brand_runtime 未定义 把 5 个 bootimg 源补进 CXX_SRCS

编译验证结果(非真机运行验证)

  • aarch64 交叉编译:通过,build/native/ghostlock = 259,768 B
  • APK 打包:BUILD SUCCESSFUL,APK 内 libghostlock.so 与源码构建产物
    sha256 逐字节一致(f912bc3f27096891)
  • 二进制标志串核对:vr neutralize ×12、neutralized ×2、ghostlock_guard ×5、
    vendor_boot ×16、recovered tag_A ×1

合并前建议补充的验证

  1. 真机跑一次,确认出现:
    VR: recovered tag_A=0x.. tag_B=0x2c from ...
    vr neutralized: sys_exit probe slot=... func ...->... probestub=... ok=1
    
  2. 确认 dmesg 不再出现 scheduling while atomic
  3. 确认软重启后 vr 无法加载、su / KernelSU 不再被杀
  4. cmp_disasm 对比攻击路径地址未漂移

⚠️ 本 PR 仅作建议,未做实际验证(编译验证通过,真机运行未验证)。

1) 接入参考仓库完整反 vr.ko 流程
   - cfi_stage: 常驻内核读写(configfs fops 伪造 + pipe 物理读写)
   - cfi_stage: neutralize_vr_probes 探针外科手术式中和
     (读 probestub,按模块内 delta 定位 sys_exit 槽位,只改那一个槽)
   - w2b: 逐任务去 tag(thread_info.flags bit 0x400 + task+0x06 / +0x2c)

2) 恢复被 overlay 覆盖掉的 1.3 原载荷功能
   - detect_device_brand_runtime / load_boot_image
   - probe_vrko_from_vendor_boot(运行时解析 tag A/B)
   - recover_sys_exit_tp_funcs(从内核内嵌 kallsyms/BTF 恢复)
   - 老式粗粒度 sys_exit 指针清零改用 GHOSTLOCK_LEGACY_SYSEXIT_KILLSWITCH 门住(默认关)
     原因:它必须读 sys_exit_tp.funcs[],与细粒度中和硬冲突

3) 执行顺序调整:反 vr.ko 移到 KSU 移交之后
   改前 Backend → 【CFI+中和】 → Frontend handoff
   改后 Backend → Frontend handoff → 【CFI+中和】
   原因:在 framework 未稳、KSU 未接管时改写 ashmem_misc.fops 与 sys_exit
         探针数组,正是导致软重启的时序

新增文件:
  src/core/session/backend/{cfi_layout.hpp,cfi_stage.hpp,cfi_stage.cpp}
  src/core/tests/cfi_stage_test.cpp
  app/src/main/assets/kernel_profiles/6.6.89-android15-8-g1f71897ac249-abogki467805059-4k.conf

编译验证(非真机运行验证):
  aarch64 交叉编译通过 build/native/ghostlock = 259,768 B
  APK BUILD SUCCESSFUL,libghostlock.so 与源码构建 sha256 一致
  标志串:vr neutralize ×12 / neutralized ×2 / vendor_boot ×16
@hmascs
hmascs marked this pull request as ready for review October 3, 2026 17:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant