log4j安全配置-防御日志注入

举报
object 发表于 2025/01/03 15:45:15 2025/01/03
【摘要】 https://bbs.huaweicloud.com/blogs/444386前面梳理了CRLF注入,其中有一条就是关于日志注入的,除了手动的方式,就是我们经常使用的log4j本身就提供了CRLF防御手段,仅需一个简单的配置log4j配置文件示例截取其中的一个appender做介绍 <!-- 将日志信息输出到控制台 --> <appender name="ConsoleAppe...

https://bbs.huaweicloud.com/blogs/444386

前面梳理了CRLF注入,其中有一条就是关于日志注入的,除了手动的方式,就是我们经常使用的log4j本身就提供了CRLF防御手段,仅需一个简单的配置

普通过滤方法

定义过滤方法,过滤消息内容

/**
* 过滤CRLF注入
*
* @param msg 消息
* @return 过滤后的内容
*/
public static String cleanCRLFMsg(String msg) {
  if(msg == null) {
  return null;
}
  return msg.replaceAll('\n','_').replaceAll('\r','_');
}

log4j配置文件

示例

截取其中的一个appender做介绍

    <!-- 将日志信息输出到控制台 -->
    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
        <!--过滤器设置输出的级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <!-- 设置日志输出的最小级别 -->
            <param name="levelMin" value="WARN" />
            <!-- 设置日志输出的最大级别 -->
            <param name="levelMax" value="ERROR" />
            <!-- 设置日志输出的xxx,默认是false -->
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>

PatternLayout

patternLayout可以用来定义输出的样式,例如上面的示例就是,输出按照value的方式格式进行输出。其中的%m就是打印的日志具体信息,而我们需要控制输出的就是%m。

Log4j安全配置

我们只需要定义patternLayout时,添加log4j支持的配置即可。

%enc{%m}{CRLF}

调整为如下后,打印日志,则就会自动过滤掉换行符

        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%enc{%m}{CRLF}%n%n" />
        </layout>

%replace{%m}{[\r\n]}{}

%replace的作用就是替换打印的消息,是使用正则的方式进行替换,下面的value就是将\r\n替换为空字符

        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%replace{%m}{[\r\n]}{}%n%n" />
        </layout>

异常内容打印

上述仅对正常的日志内容进行了打印,但是对于异常的消息却无法通过上述进行防御,如果异常的消息打印时,包含了CRLF字符,就会导致日志注入情况。

不过需要造成这个情况,需要满足两个条件 1.能造成异常 2.造成的异常打印时,内容包含用户可控制的消息。 

ThrowablePatternConverter

可通过定制该类,重写方法,异常信息打印时,即可保证消息不被注入。

// todo 待补充完整的 ThrowablePatternConverter的代码实现

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。