Linux问题情报分享(1):内核Stack *补丁导致Java程序启动失败

关于Stack *,缺少耐心的读者,请参考Stack * 漏洞正粉碎 Linux 防御危及 root 权限,较全面的介绍请参考Stack Guard Page Circumvention Affecting Multiple Packages
各个Linux发行版都已经发布了升级,合并了上游补丁。 上游补丁通过增大stack guard gap(堆栈保护措施,更多请参考Buffer overflow protection)尺寸到1M的方式,修复了Linux Kernel Stack *安全漏洞。但是,这个修正会导致JVM崩溃。

终端显示问题可能是这样的

# A fatal error has been detected by the Java Runtime Environment:

#

# SIGBUS (0x7) at pc=0x00007f0d190f6ec3, pid=17221, tid=0x00007f0d2be12740

#

# Problematic frame:

# j java.lang.Object.()V+0

调试coredump,结果可能是这样的

Linux问题情报分享(1):内核Stack *补丁导致Java程序启动失败

总的说来,就是Java程序启动失败。

这个问题会影响CentOS5, 6, 7和部分Debain发行版本。

临时解决方案的实质是给JVM指定线程堆栈为2M并且重启之。

对于具体应用,这可以通过给java命令行(或者适当的命令行)增加“-Xss2m”参数或者通过配置文件来调整。也可以通过环境变量JAVA_OPTS(或者对于tomcat,CATALINA_OPTS)来调整。比如

CATALINA_OPTS="${CATALINA_OPTS} -Xss2m"

如果是JNI方式,则可以通过环境变量JAVA_TOOL_OPTIONS来处理。对于这个环境变量,更多信息请参考Linux系统小技巧(4):环境变量JAVA_TOOL_OPTIONS简介

上一篇:linux常用名称解析


下一篇:软考新思维--2017年上半年信息系统项目管理师上午试题分析与答案(试题26-30题)