如何修复Veracode CWE 117 (日志的输出中性不正确)
当Veracode静态分析检测到应用程序正在基于来自应用程序外部的数据编写日志消息时,它会报告CWE 117(“日志中毒”)。
这可能是来自HTTP请求、数据库甚至文件系统的数据。令人担忧的是,如果使用基于文件的日志记录,攻击者可能会使用空白字符,如回车符(CR)和换行符(LF),将自己的日志行注入应用程序日志。这些字符通常分别表示为\r\n和\r\n,或者用十六进制0x0D、0x0A表示。
在攻击过程中,这可能会被用来污染日志文件,从而无法知道哪些日志条目来自应用程序,哪些来自攻击者。由于日志完整性已丢失,日志文件在审计方面的用处可能会大大降低。
log.error( transactionId + " for user " + username + " was unsuccessful."
如果任何一个变量都在用户控制之下,它们就可以通过使用\r\n for user foobar was successful\rn
之类的输入注入假日志语句,从而允许它们伪造日志并掩盖它们的踪迹。
大多数新手会想知道应该使用什么方法从logger语句中传递的变量中删除CRLF。但是replaceAll()也不能解决这个问题,因为它不是Veracode批准的方法。Veracode推荐使用ESAPI对log进行处理,但是我并不想因为这个原因而引入ESAPI这个组件,那么就不得不寻求另外的方法。
在我的例子中,我使用了org.apache.commons.lang.StringEscapeUtils.escapeJava(),这成功解决了我的问题
log.error(StringEscapeUtils.escapeJava(transactionId) + " for user " + StringEscapeUtils.escapeJava(username) + " was unsuccessful."
当异常处理程序类面临问题时,可以使用org.apache.commons.lang.ExceptionUtils.getStackTrace()
log.error(ExceptionUtils.getStackTrace(ex));
参考链接:https://community.veracode.com/s/article/How-to-Fix-CWE-117-Improper-Output-Neutralization-for-Logs