Spring Boot:CRLF - 在 REST API 中安全地记录有效负载

Spring Boot: CRLF - Securely log payload in REST API

提问人:user1766169 提问时间:5/20/2022 更新时间:6/7/2022 访问量:1491

问:

我有一个公开 REST API 的 Spring Boot 应用程序。我需要记录有效负载,以便能够在 API 调用的 JSON 中找到错误。 我运行了一个代码分析工具,该工具在记录有效负载时报告以下安全风险。https://find-sec-bugs.github.io/bugs.htm#CRLF_INJECTION_LOGS

如何防止代码注入?我想删除新行只能防止虚假日志条目,而不能防止代码注入?

REST API:

@PostMapping("/my/api")
public ResponseEntity<String> handleApi(@RequestBody Body body) {

有效负载记录:

@Slf4j
public class CustomRequestLoggingFilter extends AbstractRequestLoggingFilter {
private static final int MAX_PAYLOAD_LENGTH = 64000;

public CustomRequestLoggingFilter() {
    this.setIncludeQueryString(true);
    this.setIncludePayload(true);
    this.setMaxPayloadLength(MAX_PAYLOAD_LENGTH);
}

@Override
public void afterRequest(HttpServletRequest request, String message) {
    if (request.getRequestURI().equals("/my/api")) {
        log.info(message); //This is the security risk
    }
}
spring-boot rest crlf-vulnerability

评论


答:

0赞 Ori Marko 5/26/2022 #1

链接的报告提出了一种可能的解决方案,即替换换行符以消除风险:

 log.info(message.replaceAll("[\r\n]",""));

您可以手动清理每个参数。

log.info("User " + val.replaceAll("[\r\n]","") + " (" + userAgent.replaceAll("[\r\n]","") + ") was not authenticated");

或者使用其他解决方案来更改日志记录配置:

您还可以配置记录器服务以替换所有消息事件的新行。下面是使用 replace 函数的 LogBack 配置示例。

<pattern>%-5level - %replace(%msg){'[\r\n]', ''}%n</pattern>

最后,您可以使用记录器实现,将换行符替换为空格。OWASP Security Logging 项目具有 Logback 和 Log4j 的实现。

评论

0赞 user1766169 5/30/2022
这并不能回答删除新行是否会保护我免受代码注入的问题。
0赞 Ori Marko 5/30/2022
@user1766169有很多注入和很多保护,那么问题是关于代码中的一个发现/问题以及解决方案,您可以期待一个可以阻止所有注入的答案
1赞 Dmitriy 5/30/2022 #2

您可以尝试使用 OWASP Json Sanitizer 库 (https://owasp.org/www-project-json-sanitizer/migrated_content) 在记录 Json 输入之前对其进行清理和清理。如果您不担心向项目添加额外的第三方依赖项。

注意:此库的最后一个版本是在 2021 年 1 月 11 日

例:

@Override
public void afterRequest(HttpServletRequest request, String message) {
    if (request.getRequestURI().equals("/my/api")) {
        String sanitizedJson = JsonSanitizer.sanitize(message);
        log.info(sanitizedJson );
    }
} 
0赞 agascon 6/7/2022 #3

您提到的漏洞与代码注入无关,只与操纵日志的可能性有关。

如果您正在生成纯文本日志,则补救措施是清理该消息(最好使用 Dmitriy 建议的 OWASP 库),但如果您使用某些工具(例如 ELK)管理日志,您可能应该生成 JSON 格式的日志,这将自动为您缓解此问题。

回到代码注入,考虑到您已经设置了一些最大有效负载长度,我认为您不能在该日志语句中进行任何代码注入。

评论

0赞 user1766169 6/8/2022
从问题中的链接复制并粘贴:“攻击者还可能将代码或其他命令注入日志文件,并利用日志处理实用程序中的漏洞(例如命令注入或 XSS)”