Skip to content

Latest commit

 

History

History
178 lines (133 loc) · 20.8 KB

roadmap.md

File metadata and controls

178 lines (133 loc) · 20.8 KB

Shellsmith 功能路线图

本文件只写当前状态、当前主题与进入条件。已完成版本的结果进入各版本 Release Notes 或路线图历史档案,实验数据进入对应设计文档,不在本文件复制。

当前基线

项目 当前结论
版本基线 当前源码 1.8.0,本轮从已公开的 1.7.0 升级;正式发布状态以 GitHub Releases 为准,历史版本内容不在本文件重复
正式交付形态 Linux、macOS、Windows 桌面 GUI;CLI 仅供本地开发、调试与回归,不由 CI 单独出包
Android 支持 标准模式支持 Android 5.0 及以上;Android 4.4 工控兼容模式限定 armeabi-v7a
iOS 支持 工作副本接入、签名链核验与 Archive/Export 验证;运行期保护依赖上游 freeRASP 能力
维护策略 补丁线只处理可稳定复现、且影响安装、启动、数据安全、大范围兼容或安全边界的缺陷;安全类缺陷可单独发补丁版
当前公开问题 需真机或样本才能推进:#3 / #10 / #13 启动崩溃类未复现,#109 uni-app 缺样本,#11 杀软误报、#121 Fedora 空白窗、#129 Windows keytool、#2 16 KB 设备、#110 反调试探针均为「已修复待真机验证」。细节见融合项目 Issue 台账

当前状态:安全态势

最近一轮针对自身实现与发布链路的审计(只读代码审计 + 对已构建产物的检查)确认了下列状态。它是当前排期的依据,不是宣传口径。

已收口

项目 结论
打开链接的命令注入 Windows 上此前把链接交给 cmd /c start 解析且白名单只比较字符串前缀,更新说明(不在更新包验签范围内)里的注入链接可执行任意程序;1.6.3 改为系统 shell API + 按 URL 组件与字符白名单校验
PVM2 打包器与运行时不同源 打包器 JAR 与壳运行时曾分别来自仓库产物与外部固定提交,镜像格式版本不一致会让产物在设备上启动即崩;1.6.2 起运行时源码随仓库分发,发布期闸门恢复为硬性拦截
只读位置无法一键更新 从磁盘映像或 Gatekeeper 转位路径运行的 macOS 应用此前只能跳转下载页;1.6.1 起改装到「应用程序」并从该位置启动

明确的边界(需要架构决策,不是实现缺陷)

边界 说明
DEXB v6 不提供对静态分析的机密性 包裹密钥的两个输入(证书指纹、build_id)都在包内明文头部,仅凭 APK 即可离线还原 IKM,并派生 PVM2、assets、业务 SO 的密钥。该层实际提供的是「改包重签后无法运行」与提高自动化分析成本。详见技术内参的「DEXB v6 的机密性边界」
原生库可被替换 壳运行时以无自校验的 System.loadLibrary 加载,替换 .so 即可绕过签名校验与运行期检查
运行期存在明文落盘 解密后的 DEX 缓存、assets 与业务 .so 均写入应用私有目录且不清理

待修(按严重度,尚未排期)

项目 说明
apktool 3.0.1 资源解码路径穿越 资源解码路径未做规范化,打开恶意 APK 可写出输出目录之外;同时存在版本硬编码、发布分发物无哈希固定、CI 无依赖漏洞扫描
签名口令与子密钥暴露面 apksigner 口令经命令行参数传递;PVM2/PAS2/PSO2 子密钥经环境变量传给打包器
本地密码保护强度 enc:v1 的密钥由固定串与路径拼哈希得出,拿到 shield.db 即可离线还原
发布链路信任与并发 自动发布链路持有更新签名私钥且工作流级 contents: write,检出未关闭凭据持久化,无并发控制与人工审批
iOS 保护强度与验证 freeRASP 只通知不阻断,注入调用不注册回调;Swift Confidential 校验在解析不到配置时静默跳过
运行期反分析 反调试/反 Root 全在进程内可 patch;壳库启动期完整性校验已加入并在 Release 默认开启,解压副本的更广设备矩阵和更强的运行时防护仍需继续验证
反馈接口滥用面 无全局日上限、CORS 为通配、正文零清洗、首次部署用的 schema 缺限流表
文档与实现一致性 部分流程文档与实际工作流不符;本文件此前长期停留在 1.4.0 阶段,即为其中一例

后续更新计划

客户端加固的目标是提高分析成本,不承诺「无法逆向」。代码保护专项的现状、修改位置、执行顺序和验收标准统一见Android 代码保护升级实施方案。升级分支已实现关键方法清单、真实覆盖报告、最终产物核验与运行时清理联动;下列维护与研究候选不代表已发布能力,也不替代专项验收。离线升级不依赖外部服务,不新增固定成本。

优先处理(不改变产品形态)

工作项 目的 进入条件
收敛保护实现的公开面 壳体与虚拟机的格式定义、解释器与编译器源码不再随公开仓库分发,减少分析者可直接使用的完整规格;LICENSE 与 NOTICE 继续随发布包提供 构建可复现性不下降:源码改为私有子模块或预构建产物,CI 与本地构建步骤同步更新
降级产物内的诊断线索 原生库中保留的 PVM2 诊断串与依赖路径/版本串可直接用于指纹与格式推断 诊断信息不再进入发布产物;排障改为独立符号文件或本地构建选项
修复 apktool 相关风险 打开不受信任 APK 即可被写出目录,属于主用法上的现实风险 升级到已修复版本,同步全部硬编码版本引用并加哈希校验;CI 增加依赖漏洞扫描作为兜底
补齐运行期反分析 反调试/反 Root 可被进程内 patch;壳库完整性需要覆盖系统实际加载的解压副本,策略位仍依赖签名包元数据 缓存路径补齐检查;壳库校验覆盖 nativeLibraryDir 与 APK 直接映射两种路径;Release 默认开启、Debug 可显式覆盖;全部按失败关闭,并在文档与报告中如实区分「检测」与「阻断」

随后处理

工作项 目的 进入条件
设备密钥与首次配置边界 设备包装可保护本地状态或限制缓存复制;若原始 IKM 仍可从 APK 恢复,事后包装不能阻止离线解密或仿真 先明确秘密来源。需要 APK 单独不足以解密时,必须有使用方后台授权配置或受控设备预配置;同时设计换机、清数据、重装和密钥失效行为
关键方法覆盖与明文生命周期 升级分支已实现必保方法最后调用退出清理、镜像及解析副本清理,并通过并发与异常路径检查;继续按真实业务扩大经过验证的范围 新增语义必须有原始/转换版本的结果与异常对照;完整内存 DEX 与方法回填继续保持下方暂停/停止结论

中期评估

工作项 目的 进入条件
分析环境识别与误导路径 自动化分析依赖「重建结果与样本一致」来自我确认。对高置信分析环境改走语义等价但误导的路径,比直接崩溃更有效(崩溃等于把检查点告诉分析者) 严格限定高置信信号与可配置开关,误报不得影响正常用户;必须有回归样本证明正常环境不受影响
资源与标识符加密 明文路由类名清单、字符串池与资源命名会直接降低分析成本 不影响启动耗时与第三方框架兼容;回归覆盖既有 ARouter/TheRouter 路径
隐藏 Root 与分析环境规则扩充 现有检测在 Magisk Hide、Zygisk 等隐藏方案下覆盖不足。可补的通用信号包括异常挂载点(/proc/self/mountinfo)、属性交叉比对(getprop 与 /system/build.prop 原始文件结果不一致)、隐藏的 su 残留元数据、注入库路径(/proc/self/maps) 以可插拔规则模块承载,规则更新不改核心架构与协议;只基于通用行为特征,不针对特定工具品牌或版本;误报不得影响正常用户与工控设备
iOS 常量覆盖与联动响应 把 API endpoint、密钥材料等字面量纳入 Swift Confidential 覆盖范围;并让运行期检测结果与业务联动(高置信威胁下使敏感常量失效或返回诱饵数据),不再只是「检测到但不阻断」 前置条件:先修「freeRASP 不阻断」「注入时不注册回调」「Swift Confidential 校验在解析不到配置时静默跳过」三处管道;联动策略必须在隐私与兼容说明中写明

待考虑(受成本约束,不作为任何事项的前置条件)

方向 现状与判断 如果要做,必须先满足
使用方自有服务的可选接入 维护者不提供或运维服务器、密钥服务及中转。默认加固链路离线;联网仅在使用方提供服务地址、接口与凭据并显式配置后接入,不作为离线升级前置条件 区分桌面加固时取材料与应用运行时授权:前者若把完整恢复材料放回 APK,仍无包外秘密收益;后者须由使用方提供可信首次配置及授权服务,独立设计运行时身份、服务不可用与恢复行为,不能把桌面管理凭据打入 APK

将来若推进,协议必须按下列口径设计,否则没有安全收益:设备证明(Play Integrity / App Attest)是必需项而不是可选项,并以证明绑定的设备公钥包裹密钥后再下发。仅校验签名证书指纹、包名与版本号的方案不成立——这三项都在 APK 内公开,任何人都能原样重放请求领取密钥;同时若所有设备收到同一把明文密钥,一次响应泄漏即等于全部用户可解。

评估口径

每轮相关改动后按下列可测指标复跑并记录,避免用主观感受判断防护效果:

  1. 转换成功率、所选方法/指令覆盖率、关键方法覆盖率分别报告;必需方法必须全部通过最终产物核验,空清单不算通过。
  2. 外层解密后关键方法的原始实现残留、VM 镜像与解析副本驻留范围;不能用“无 DEX 魔数”代替核验。
  3. 离线恢复和仿真所需的条件与成本;保持包内密钥时如实记录可恢复,设备包装不算解决首次秘密来源。
  4. 跨构建分析结果的实际复用程度、语义一致性与恢复时间;不同字节或不同 Opcode 映射不等于无法复用。
  5. 运行时策略是否在启动、前台、后台和方法入口按声明生效,以及误报、业务正确性、启动/调用耗时与内存预算。
  6. 包外高价值资产和密钥是否具有可信首次配置、恢复与撤销流程;没有对应能力时明确标注不适用。

明确非目标

  • 不承诺「无法被逆向」;对外只描述提高成本与具体已实现的能力。
  • 不针对特定逆向工具的品牌或版本做检测,只基于通用行为特征判断。
  • 不增加在线 APK 上传、云端分析或远程证书处理。
  • 不把完整 APK 路径、密码、用户目录、业务包名或证书材料写入匿名统计。
  • 批量加固暂缓;未来如恢复评估,必须复用单 APK 的预检与任务快照。
  • 不把 CLI 作为正式 Release 产物,也不增加单独的 CLI CI 打包任务。
  • 不借预检改造 APK 重写、签名、运行时加载或加密协议。

代码保护升级分支进展

codex/android-code-protection-upgrade 已实现通用方法保护验收链、运行时清理与阻断联动、Native 构建证据接入及最终签名摘要绑定。仓库 APK 与 7 模块 AAB 通过宿主打包检查,Native/组合样本通过单台 Android 15 设备回归;授权真实 APK 已完成候选清点、限定方法功能回归与离线恢复检查。高频启动强停已定位到该设备的厂商进程创建计数策略,校准后补齐三组分段启动/PSS 测量,温控中断及历史压力失败均保留。完整业务、跨设备及抗语义还原能力仍须按范围验证,不能标记整包“3.5 代达标”。最新采样结论和证据统一见 实施方案与验证记录。

后续候选

候选方向不等于已排期版本;只有需求、依赖条件和验收资源同时具备后才进入下一版本。

方向 当前状态 进入条件
Native VMP 语义与兼容性扩展 CMake 构建与 CLI/GUI 证据核验已接入升级分支;整数、float/double、分支/循环及漏斗移位共 111 个语义测试函数通过宿主与单机 ARM64/ARMv7 对照,真实 APK 仅 1 个 SO 内的 1 个函数已接入 native-vmp 仍需自有源码或兼容 bitcode;MOCIKA_VMP 显式选择函数,不支持语义直接编译失败。后续先扩展有边界的指针/内存,再处理直接调用;异常、间接调用及跨设备能力须独立实现和验证。严格模式不会自动把已有第三方 SO 变为 Native VMP。顺序与验收条件见下一轮优化方案
发布链路收敛 可先做基础项 最小权限拆分、关闭检出凭据持久化、按版本并发控制、签名与发布引入人工审批;与安装包代码签名、macOS 公证同属一条线
发布供应链完善 可先做基础项 产物来源证明、依赖清单与可追溯记录;安装包代码签名与公证需要账号、证书及持续维护投入
AAB 正式支持 条件受阻 已完成主要 delivery 的本地变换与 APKS 结构链,install-time 另有双机闭环;仍需要 Google Play 账号、Play 应用签名、延迟下载生命周期与内部测试轨道,详见 AAB 可行性结论
工具链局部轻量化 待专项原型 先用数据证明 apktool 或整包重建是主要瓶颈;未知结构必须保留可靠回退,详见 工具链研究
可选资源保护 需求驱动 有真实用户场景、资源选择和应用侧读取接口设计;不通过 Hook 透明拦截,详见 资源保护研究
兼容性真机验证 持续观察 仅对已获授权的真实样本与设备推进,结论写入兼容性记录,不提交用户 APK

已暂停或停止的方向

方向 状态 结论
API 29 以上完整内存 DEX 暂停产品接入 公开加载链路与回退状态已完成大量实验,但真实大 APK 的长期内存性价比门禁未通过,详见 内存 DEX 设计
DEX 结构与方法代码分离 停止产品接入 离线协议、真实多 DEX 与攻击测试已完成;公开运行时仍要求形成完整 DEX,继续只能依赖高风险私有运行时或独立虚拟机,详见 代码分离研究
ART/系统函数 Hook、自修改代码、可写可执行内存 禁止 与多版本兼容、安全软件风险和项目安全边界冲突,不进入正式方案
独立在线加固服务 不计划 除「服务端密钥下发」这一受成本约束的待考虑方向外,项目保持本地离线处理,不托管用户 APK、证书或密码

并行维护规则

  • main 始终保持可发布;复杂功能使用临时 feat/* 或 fix/* 分支,合并后删除。
  • 安全类缺陷可跨主题单独发补丁版,但必须在 Release Notes 中写明影响范围与是否已完成真机或端到端验证。
  • 稳定版 Issue 与社区反馈持续观察,只有可复现的高优先级缺陷才抢占当前开发任务。
  • 一个小版本聚焦一个主题;预检、运行时安全、协议变更与工具链重写不得混成一次发布。
  • 涉及加密协议或运行时格式的改动必须带版本号与回退路径;不得在缺少迁移方案时改变既有格式语义。
  • 已完成内容不再复制回本文件;版本结果进入 Release Notes 或路线图历史档案,实验数据进入对应设计文档。

下一步执行顺序

  1. 现实安全缺陷单独发补丁,不与载荷格式和工具链重写混为一次发布;源码公开与否不作为代码保护达标证据。
  2. 代码保护专项沿用已实现的构建、报告、产物核验和运行时清理链,按明确的方法范围补充业务与设备证据;性能采样须先校准设备规则,抗还原检查保留公开材料可恢复的结果,详见实施方案。
  3. Native VMP 扩展按自有源码/bitcode 路径和实际语义需要推进,不声称 APK 后处理能虚拟化任意已有 SO。
  4. 服务端或受控设备预配置保持独立增强;在可信首次配置与成本来源明确前不排期,也不阻塞离线代码保护升级。设备缓存包装不替代该前提。
  5. 对 Issue #109 等兼容性条目仅在收到经授权的真实样本后复现与定位。
  6. 稳定版按实际问题维护补丁线,不为等待反馈持续推出空转的预发布版本。

代码保护专项状态更新:2026-10-15;其他稳定版条目保留原审计口径。

下一轮优化顺序与完成条件(2026-10-15)

保持默认离线、自动管理本机项目资料、手机安装即用。当前真实产物的起点是 19 个 DEX 方法和 1 个 SO 内的 1 个 Native 函数;111 个 Native 语义测试函数不能计入业务覆盖。 下面是待实施的工作,不能当作已交付能力。

顺序 调整内容与现有入口 完成条件
先补覆盖诊断 复用 Pvm2Report、protection_report.rs 和现有方法清点,把未选择、策略排除、不支持语义、转换失败、产物未验证分别展示;对排除原因做聚合,按真实阻塞数量安排扩展 输入范围、可转换范围、实际转换范围和执行验证范围各有独立分母;必保方法遗漏阻断交付;GUI 显示具体缺口。自动分析只能发现候选,不能自行判定哪些是业务核心
扩大 DEX 实际覆盖 沿 AutoVmpPolicy → Pvm2Safety → Pvm2Compiler → JNI 运行时排查限制;用方法语义和调用边界逐步细化目录/类名排除规则 从清点中选取多种通用业务语义形成回归,比较返回值、异常、副作用及并发行为;每扩一类都重建并检查最终 APK。兼容性排除不能直接整体取消,也不能把静态可转换数量当作运行通过数量
补 Native 内存语义 在现有 LLVM Pass/解释器内先支持明确范围的缓冲区、索引、标量 load/store,再评估结构体字段;优先使实际算法主体可以转换 明确指针来源、长度、生命周期、别名、对齐和 32/64 位 ABI 契约;越界及不支持的原子/volatile 操作拒绝。宿主内存检查及 ARM64/ARMv7 对照通过,实际 SO 中核验原函数体替换
补 Native 调用边界 内存语义稳定后处理签名固定的直接调用及受保护函数互调,复用构建证据链 核验参数、返回值、错误传播和回调约束;间接调用、JNI 对象、C++ 异常、可变参数继续明确拒绝,直到有对应实现和回归。无源码/bitcode 的第三方 SO 仍不计为 VMP
验证还原成本变化 复用 ApkRecoveryCheck 和 Native 独立恢复器,先记录当前恢复基线,再逐项评估 VM 指令组合、控制流表示及跨构建差异 使用多个随机构建,比较规范化后的程序、恢复器复用率、语义重建时间和所需人工工作;仅字节不同或旧脚本报错不算有效改进。当前完整载荷/VM 字节码仍可静态恢复,不能把新格式直接标为抗还原通过
补当前产物性能与兼容 沿用 measure-apk-acceptance.py 和已有温控/分段采样流程,绑定新的基线、均衡与严格产物摘要 先约定启动、内存、热点方法和包体预算,再比较中位数/P95、失败样本与业务正确性;单台手机仅得出该设备结论。补测无资源 APK 重打包、AAB 各模块,不能复用旧 APK 的成绩

算法调整先复用当前 ChaCha20-Poly1305、HKDF 和随机数机制,检查不同用途的派生域、 nonce 使用、认证范围及失败处理。项目身份隔离已经实现,不再增加第二套密钥管理。 如果运行恢复材料仍随 APK 分发,更换密码算法或增加包裹层数不会消除独立恢复路径; 后续投入应落在实际代码覆盖、语义变换及有对照的恢复成本上。

每阶段保留同一套可运行回归,产物报告同时列出「转换成功」「最终产物核验」「设备执行」 和「性能测量」状态。只有覆盖及验收证据改变,才更新能力描述;不以实现一个新操作码 或增加测试次数作为整包代数升级依据。