我收到了我的javaEE应用程序的veracode报告.它在任何日志记录中都存在缺陷(使用log4j),因此我将其添加StringEscapeUtils.escapeJava(log)到所有日志记录中,但是veracode会将其报告为安全漏洞.
这是正确的解决方案吗?我还可以做些什么?
这是报告信息:标题:日志的输出中和不正确
说明:函数调用可能导致日志伪造攻击.将未经过授权的用户提供的数据写入日志文件允许攻击者伪造日志条目或将恶意内容注入日志文件.损坏的日志文件可用于覆盖攻击者的跟踪或作为攻击日志查看或处理实用程序的传递机制.例如,如果Web管理员使用基于浏览器的实用程序来查看日志,则可能会发生跨站点脚本攻击.
建议:尽可能避免将用户输入直接嵌入日志文件中.使用安全日志记录机制(例如OWASP ESAPI Logger)清理用户提供的用于构造日志条目的数据,该机制将自动删除意外的回车符和换行符,并且可以配置为对非字母数字数据使用HTML实体编码.只在绝对必要时编写自定义黑名单代码.始终验证用户提供的输入,以确保它符合预期的格式,尽可能使用集中数据验证例程.
他们建议使用ESAPI,但这是一个非常大的项目,所以我需要最简单的解决方案,这就是我尝试使用String.escape'StringEscapeUtils.escapeJava(log)'的原因.
先进的!
有一个Spring全局@ExceptionHandler(Exception.class)方法可以记录异常:
@ExceptionHandler(Exception.class)
void handleException(Exception ex) {
logger.error("Simple error message", ex);
...
Run Code Online (Sandbox Code Playgroud)
Veracode扫描表明此日志记录已经Improper Output Neutralization for Logs建议使用ESAPI记录器.有没有办法在不将记录器更改为ESAPI的情况下修复此漏洞?这是我遇到此问题的代码中唯一的地方,我试图找出如何以最小的更改来修复它.也许ESAPI有一些我没有注意到的方法?
PS当前记录器是slf4j上的Log4j
UPD: 最后我使用了ESAPI记录器.我以为它不会使用我的默认日志服务,但我错了,它只是使用我的slf4j logger接口和适当的配置.
private static final Logger logger = ESAPI.getLogger(MyClass.class);
...
logger.error(null, "Simple error message", ex);
Run Code Online (Sandbox Code Playgroud)
ESAPI具有log4j记录器和记录器工厂的扩展.可以配置在ESAPI.properties中使用的内容.例如:
ESAPI.Logger=org.owasp.esapi.reference.Log4JLogFactory
Run Code Online (Sandbox Code Playgroud)