09-日志伪造缺陷
2025/1/1大约 2 分钟安全开发安全开发应用安全
日志伪造缺陷 - 腾讯安全代码审计实战系列09
日志伪造漏洞(Log Forging)是一种通过利用不可信数据注入日志条目中的攻击。当攻击者能够将恶意输入注入到应用程序的日志文件中时,可能导致不准确的日志记录,误导性审核记录,潜在的统计偏差,甚至可能引发更严重的攻击。这可能被恶意利用来掩盖攻击者的真实操作或栽赃他人。
修复建议
- 永远不要在日志中直接记录未经验证或未处理的用户输入,尤其是当这些输入包含控制字符(如换行符)时。
- 采用白名单方法,对日志中允许的字符进行严格限制,以确保仅记录已批准的、已验证的条目。
- 对于需要记录的动态内容,使用服务器生成的安全标识符,替代用户提供的数据。
- 应用适当的日志输出编码或转义机制来处理用户输入,从而避免控制字符注入。
示例代码
public class LoggerExample {
private Log logger;
public LoggerExample() {
// 初始化日志记录器
logger = new Log();
}
// bad:直接在日志中记录未经处理的用户输入
public void LogSensitiveData(HttpSessionState Session) {
string userInput = (string)Session["userInput"];
logger.WriteEntry("User input: " + userInput); // 可能导致日志伪造
}
// good:描述性记录,避免记录敏感或未经处理的数据
public void LogWithoutSensitiveData() {
logger.WriteEntry("User input processing failed."); // 仅记录处理状态
}
// good:对用户输入进行验证或转义处理后再记录
public void LogWithValidationOrSanitization(HttpSessionState Session) {
string userInput = (string)Session["userInput"];
if (IsValid(userInput)) {
logger.WriteEntry("Valid user input processed."); // 确保输入已经通过验证
} else {
string sanitizedInput = Sanitize(userInput); // 转义任何潜在危险的字符
logger.WriteEntry("Invalid input received: " + sanitizedInput); // 记录脱敏后的输入
}
}
private bool IsValid(string input) {
// 基本验证逻辑
return !string.IsNullOrWhiteSpace(input) && input.All(c => Char.IsLetterOrDigit(c));
}
private string Sanitize(string input) {
// 简单的字符替换以去除换行符
return input.Replace("\n", "_").Replace("\r", "_");
}
}