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