在这篇文章中,我们回顾如何嗅探JVM的变量可能的方法。这篇文章的主要目的是解释如何保护你的应用程序。计划是进行下一步的攻击。
从Dump中读取敏感数据。通过在外部依赖中注入恶意软件来窃取源代码。
从Java Dump中窃取数据, 如果有人获得了对Java进程的访问权,他可能会读取敏感信息,如密码或数据库地址。
让我们来看看下一个数据源的配置:
@Bean
public DataSource dataSource(){MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");mysqlDataSource.setUser("xxmySqlUser");mysqlDataSource.setPassword("xxsecretPassword");return mysqlDataSource;
}
现在,如果黑客攻击我们的服务器并获得了对JVM进程的访问权,那么他可以通过使用jcmd程序来Dump JVM的内存。比如:
jcmd 20932 GC.heap_dump d:\dump\JVM_DUMP.bin
当他得到JVM的Dump时,他可以用VisualVM剖析器用QOL语言来查询它。
例如,为了获取所有以 "JDBC
"开头的字符串,他可以进行下一步查询:
select s from java.lang.String s where s.toString().startsWith("jdbc")
或者作为一种选择,他可以获取MysqlDataSource对象
select filter(heap.classes(), "/com.mysql.cj.jdbc.MysqlDataSource/.test(it.name)")
如何防止从Dump中读取数据?
为了防止这个攻击需要这么做:
-
在JVM启动时添加参数-XX:+DisableAttachMechanism。
-
在Linux中通过禁用trace syscall来禁用jcmd调用(如果你使用ubuntu)
-
对于非root用户,通过设置hidepid=1来禁止对进程的访问
-
在Java端对数据进行加密
原创 Peter Megadotnet