閱讀326 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Linux問題情報分享(1):內核Stack Clash補丁導致Java程序啟動失敗

關於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,結果可能是這樣的

41A6E8C871E0231234617A2F0862DB96

總的說來,就是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簡介

最後更新:2017-07-27 09:03:00

  上一篇:go  阿裏雲安全肖力:邊界消亡後,你需要四個“新認知”
  下一篇:go  Linux係統小技巧(5):如何列出和排序正在讀寫的進程?