问题背景
近期接到用户反馈,使用Virbox Protector工具对JAR包进行Java VME加固后,在麒麟系统上运行时出现异常,错误日志提示sense loader exception: /tmp/sense_loader/CC000xxxx_loader_linux_x64.so无法从共享目标中映射段,具体现象如下:
原因剖析
系统安全机制
银河麒麟操作系统作为国产化安全操作系统,广泛应用于政务、国防、金融等关键领域,其核心理念是确保系统底层程序的完整性与可信性。系统会对每一个加载运行的底层程序进行来源校验,对于无法验证可信性的软件,将直接拦截其运行。
签名的必要性
1. JAR包为何通常无需签名?
JAR包本质是压缩格式的Java字节码集合,并非原生机器码。其运行依赖Java虚拟机,所有操作均在JVM沙箱机制下受限执行,无法直接访问底层硬件或执行高危系统调用。
2. 加固后为何必须签名?
采用VME技术保护后,JAR包内会嵌入由C/C++编写的SO加载器库。这类二进制文件属于ELF格式原生代码,可直接与内核交互、调用系统底层接口,其行为不受JVM约束,因此必须通过签名建立信任链。
3. 签名的核心价值
数字签名能够证明二进制文件的发布者身份(如麒麟官方或认证开发商)。系统在加载未签名或签名无效的二进制文件前,会强制校验,未通过则直接阻断执行。
文件结构变化
保护前:标准JAR包仅包含Java类文件与资源文件
加固后:VME保护会生成随机命名目录(如CC0000006916935900021FFC5AC54D5D),内含SO加载器库,用于解释执行转换后的自定义虚拟机字节码
因此,麒麟系统拦截的根本原因是无法验证该SO库的可信来源。
解决方案
当前提供两种解决路径:
方案一:安全中心白名单
若系统部署了安全中心管控模块,可在"应用程序执行控制"中添加认证策略,将loader库文件加入免检列表。
方案二:数字签名认证(推荐)
对于无安全中心的环境,直接对SO库进行数字签名是最优解。
证书申请
- 访问麒麟应用软件分发平台;
- 根据官方操作指引完成开发者认证与证书申请。
签名操作
- 插入已授权的UKEY设备;
- 打开终端,执行签名命令(参考下图格式);
- 解压加固后的JAR包,根据目标架构选择SO文件:
- ARM架构:
loader_linux_a64.so - X86_64架构:
loader_linux_x64.so
- ARM架构:
- 输入UKEY密码,等待签名完成,成功提示如下:
- 将签名后的SO库替换回原位置,重新打包JAR包:
# 进入解压目录(如demo_new)
jar -cfM0 <新jar包名称> ./*
# 示例:jar -cfM0 demo_signed.jar ./*
- 新生成的JAR包即可正常运行,SO库加载不再被拦截。