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

问题描述 投票:0回答:3

我有一个 Spring Boot 应用程序,它公开了 REST API。我需要记录有效负载,以便能够在 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
3个回答
1
投票

您可以尝试使用 OWASP Json Sanitizer 库 (https://github.com/OWASP/json-sanitizer) 在记录 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 );
    }
} 

1
投票

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

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

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

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

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

您还可以配置记录器服务以替换所有消息事件的换行符。以下是使用替换功能的 LogBack 的示例配置。

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.