core-lib / xjar

Spring Boot JAR 安全加密运行工具,支持的原生JAR。
Apache License 2.0
1.65k stars 469 forks source link

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

Open kingsant opened 1 year ago

kingsant commented 1 year ago

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

Bahramudin commented 1 year ago

@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 commented 11 months ago

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

xuchaochao commented 3 months ago

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

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

huyangv commented 3 months ago

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分析。