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

    xiaoxiao2022-07-09  209

    关于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简介。

    最新回复(0)