Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【致命】发现一个致命的问题,既然加密是为了交付,假如三方直接登入机器dumpjava内存,一下就看到秘钥了。 #121

Open
kingsant opened this issue Mar 30, 2023 · 8 comments

Comments

@kingsant
Copy link

【致命】发现一个致命的问题,既然加密是为了交付,假如三方直接登入机器dumpjava内存,一下就看到秘钥了。
被这个给坑了~给大家推荐graalvm

@Bahramudin
Copy link

@kingsant 我用Graalvm,可是MyBatis不支持,你有办法吗,我编译什么的都正常结束,可是运行可执行文件文件的时候报如下错:

java.lang.ExceptionInInitializerError: null
        at org.mybatis.spring.mapper.MapperScannerConfigurer.postProcessBeanDefinitionRegistry(MapperScannerConfigurer.java:363) ~[web.exe:3.0.1]
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344) ~[na:na]
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:145) ~[na:na]
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:747) ~[web.exe:6.0.8]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:565) ~[web.exe:6.0.8]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[web.exe:3.0.6]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[web.exe:3.0.6]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[web.exe:3.0.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[web.exe:3.0.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[web.exe:3.0.6]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[web.exe:3.0.6]
        at com.adil.bms.web.BmsApplication.main(BmsApplication.java:19) ~[web.exe:na]
Caused by: org.apache.ibatis.logging.LogException: Error creating logger for logger org.mybatis.spring.mapper.ClassPathMapperScanner.  Cause: java.lang.NullPointerException
        at org.apache.ibatis.logging.LogFactory.getLog(LogFactory.java:54) ~[na:na]
        at org.apache.ibatis.logging.LogFactory.getLog(LogFactory.java:47) ~[na:na]
        at org.mybatis.logging.LoggerFactory.getLogger(LoggerFactory.java:32) ~[na:na]
        at org.mybatis.spring.mapper.ClassPathMapperScanner.<clinit>(ClassPathMapperScanner.java:61) ~[na:na]
        ... 12 common frames omitted
Caused by: java.lang.NullPointerException: null
        at org.apache.ibatis.logging.LogFactory.getLog(LogFactory.java:52) ~[na:na]
        ... 15 common frames omitted

如果您有办法的话 教我怎么解决,Graalvm确实是很棒,非常安全 没法反编译什么的。可是MyBatis不支持 非常糟糕。

@huyangv
Copy link

huyangv commented Oct 30, 2023

1 -DisableAttachMechanism 启动,同时自己编译一个jdk版本,将一个特殊的文件的md5(比如java.exe)编码进go文件,然后自己写代码校验jdk和md5
2 混淆构建xjar的go代码 而不是直接go build

@xuchaochao
Copy link

1 -DisableAttachMechanism 启动,同时自己编译一个jdk版本,将一个特殊的文件的md5(比如java.exe)编码进go文件,然后自己写代码校验jdk和md5 2 混淆构建xjar的go代码 而不是直接go build

为啥还要自己编译一个jdk版本。。。?不是很懂 请大神指点下 @huyangv

@huyangv
Copy link

huyangv commented Jun 27, 2024

1 -DisableAttachMechanism 启动,同时自己编译一个jdk版本,将一个特殊的文件的md5(比如java.exe)编码进go文件,然后自己写代码校验jdk和md5 2 混淆构建xjar的go代码 而不是直接go build

为啥还要自己编译一个jdk版本。。。?不是很懂 请大神指点下 @huyangv

其实我不太熟悉java,但是举个简单的例子。
1 阿里巴巴的dump代码工具使用的就是jvm的attach,除了DisableAttachMechanism以外可能还有其它参数(假设统称为附加命令),作用大概就是允许外部访问jvm,进行堆栈分析or代码dump。
2 已知所有的附加命令都是通过java -jar 时传递给jvm,如果攻击者使用自己编译的版本,直接无视所有禁用,一样还是能附加到你的应用然后dump代码出来。
3 所以我的想法是你可以自己编译一个jdk版本,根据需要可以在编译时直接把可能造成应用不安全的参数全部屏蔽,然后分发应用的时候使你的jdk和应用绑定,方法就很多了。

以上思路就是,你只能用我的jdk启动我加密后的jar,并且我的jvm运行后不允许任何外部附加or分析。

@MisterChangRay
Copy link

1 -DisableAttachMechanism 启动,同时自己编译一个jdk版本,将一个特殊的文件的md5(比如java.exe)编码进go文件,然后自己写代码校验jdk和md5 2 混淆构建xjar的go代码 而不是直接go build

为啥还要自己编译一个jdk版本。。。?不是很懂 请大神指点下 @huyangv

其实我不太熟悉java,但是举个简单的例子。 1 阿里巴巴的dump代码工具使用的就是jvm的attach,除了DisableAttachMechanism以外可能还有其它参数(假设统称为附加命令),作用大概就是允许外部访问jvm,进行堆栈分析or代码dump。 2 已知所有的附加命令都是通过java -jar 时传递给jvm,如果攻击者使用自己编译的版本,直接无视所有禁用,一样还是能附加到你的应用然后dump代码出来。 3 所以我的想法是你可以自己编译一个jdk版本,根据需要可以在编译时直接把可能造成应用不安全的参数全部屏蔽,然后分发应用的时候使你的jdk和应用绑定,方法就很多了。

以上思路就是,你只能用我的jdk启动我加密后的jar,并且我的jvm运行后不允许任何外部附加or分析。

你这里只是禁止了应用层附加分析。 但除了应用层,驱动层,系统层,都可以进行附加分析。

攻防都是相对的,看代价。

如果不需要交付源码独立部署的情况,本身最好就不要选择java这类的语言。c, go, rust之类的都行

@MisterChangRay
Copy link

分享下
https://github.com/MisterChangRay/xjar4springboot3
基于xjar修改,支持了springboot3,
另外本项目还修改了以下逻辑,提高加密安全性:

关闭jvm远程调试功能,避免内存dump破解
验证java应用功能性, 避免被伪装应用截取密钥
新增java.exe文件的md5校验逻辑, 可以指定jdk版本以及防止伪装破解
最后计划加上启动器的自我校验? 进一步提高破解难度!不过这个就不计划开源了

@huyangv
Copy link

huyangv commented Dec 27, 2024

分享下 https://github.com/MisterChangRay/xjar4springboot3 基于xjar修改,支持了springboot3, 另外本项目还修改了以下逻辑,提高加密安全性:

关闭jvm远程调试功能,避免内存dump破解 验证java应用功能性, 避免被伪装应用截取密钥 新增java.exe文件的md5校验逻辑, 可以指定jdk版本以及防止伪装破解 最后计划加上启动器的自我校验? 进一步提高破解难度!不过这个就不计划开源了

这个攻防最基本的还是要自编 自定义jdk。
jar侧的任何加密操作都没有用,这个xjar也是一样的,java agent探针能读取到密码,就能静态解开jar了。

@MisterChangRay
Copy link

MisterChangRay commented Dec 28, 2024

分享下 https://github.com/MisterChangRay/xjar4springboot3 基于xjar修改,支持了springboot3, 另外本项目还修改了以下逻辑,提高加密安全性:
关闭jvm远程调试功能,避免内存dump破解 验证java应用功能性, 避免被伪装应用截取密钥 新增java.exe文件的md5校验逻辑, 可以指定jdk版本以及防止伪装破解 最后计划加上启动器的自我校验? 进一步提高破解难度!不过这个就不计划开源了

这个攻防最基本的还是要自编 自定义jdk。 jar侧的任何加密操作都没有用,这个xjar也是一样的,java agent探针能读取到密码,就能静态解开jar了。

都是相对的,自定义JDK那么系统层面又没有用了? 自定义操作系统?有总比直接暴露源码强哈哈

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

No branches or pull requests

5 participants