Skip to content

C#: Fix false positives in cs/log-forging for extension methods#21498

Open
Gregro wants to merge 1 commit intogithub:mainfrom
Gregro:csharp/fix-log-forging-extension-methods
Open

C#: Fix false positives in cs/log-forging for extension methods#21498
Gregro wants to merge 1 commit intogithub:mainfrom
Gregro:csharp/fix-log-forging-extension-methods

Conversation

@Gregro
Copy link

@Gregro Gregro commented Mar 19, 2026

The log forging query previously treated all arguments to methods called on logger types as sinks, including user-defined extension methods. This caused false positives when extension methods sanitize input internally, since interprocedural analysis was bypassed.

Now, only direct instance method calls on logger types are treated as sinks. User-defined extension methods are analyzed interprocedurally, allowing the query to see sanitization within method bodies.

Known framework extension methods (Microsoft.Extensions.Logging.LoggerExtensions) are modeled as explicit sinks via Models as Data.

Fixes #15824

@Gregro Gregro marked this pull request as ready for review March 19, 2026 18:29
@Gregro Gregro requested a review from a team as a code owner March 19, 2026 18:29
Copilot AI review requested due to automatic review settings March 19, 2026 18:29
@Gregro Gregro force-pushed the csharp/fix-log-forging-extension-methods branch from 86f9414 to 2539358 Compare March 19, 2026 18:30
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the C# cs/log-forging dataflow to avoid treating user-defined logger extension methods as sinks, reducing false positives while still flagging framework logging extension methods via Models as Data.

Changes:

  • Refines the log-forging sink definition to focus on direct instance calls on logger types rather than all calls with logger arguments.
  • Adds Models-as-Data sink models for Microsoft.Extensions.Logging.LoggerExtensions logging APIs.
  • Extends CWE-117 test coverage to include safe/unsafe user-defined extension methods and updates expected results + changelog.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected Updates expected results to reflect new sink modeling and interprocedural flows through extension methods.
csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.cs Adds user-defined logger extension methods (safe/unsafe) to validate reduced false positives.
csharp/ql/lib/semmle/code/csharp/security/dataflow/LogForgingQuery.qll Adjusts sink definition intended to exclude extension methods from being treated as sinks.
csharp/ql/lib/ext/Microsoft.Extensions.Logging.Sinks.model.yml Introduces explicit sink models for Microsoft.Extensions.Logging.LoggerExtensions APIs.
csharp/ql/lib/change-notes/2026-03-19-fix-log-forging-extension-methods.md Documents the analysis change and new MaD modeling.

Comment on lines +61 to +63
this.getExpr() = any(LoggerType i).getAMethod().getACall().getAnArgument() or
this.getExpr() =
any(MethodCall call | call.getQualifier().getType() instanceof LoggerType).getAnArgument()
}
}

static class LoggerExtensions
{
public static void WarnSafe(this ILogger logger, string message)
{
logger.Warn(message.Replace(Environment.NewLine, ""));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

False positive - Log entries created from user input (cs/log-forging)

2 participants