提问人:user1766169 提问时间:5/20/2022 更新时间:6/7/2022 访问量:1491
Spring Boot:CRLF - 在 REST API 中安全地记录有效负载
Spring Boot: CRLF - Securely log payload in REST API
问:
我有一个公开 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
}
}
答:
链接的报告提出了一种可能的解决方案,即替换换行符以消除风险:
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 的实现。
评论
您可以尝试使用 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 );
}
}
您提到的漏洞与代码注入无关,只与操纵日志的可能性有关。
如果您正在生成纯文本日志,则补救措施是清理该消息(最好使用 Dmitriy 建议的 OWASP 库),但如果您使用某些工具(例如 ELK)管理日志,您可能应该生成 JSON 格式的日志,这将自动为您缓解此问题。
回到代码注入,考虑到您已经设置了一些最大有效负载长度,我认为您不能在该日志语句中进行任何代码注入。
评论