Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update Proxy-Support check to be case insensitive #61446

Merged
merged 2 commits into from
Nov 23, 2021

Conversation

ChrisFWood
Copy link
Contributor

RFC4559 does not specify that the Proxy-Support header value used to
determine if the proxy server will honour client server authentication
integrity is case sensitive. Updating the check to be case insensitive
to prevent failures when value is supplied using differences in case.

Fix #61414

RFC4559 does not specify that the Proxy-Support header value used to
determine if the proxy server will honour client server authentication
integrity is case sensitive. Updating the check to be case insensitive
to prevent failures when value is supplied using differences in case.

Fix dotnet#61414
@ghost ghost added the community-contribution Indicates that the PR has been added by a community member label Nov 11, 2021
@ghost
Copy link

ghost commented Nov 11, 2021

Tagging subscribers to this area: @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

Issue Details

RFC4559 does not specify that the Proxy-Support header value used to
determine if the proxy server will honour client server authentication
integrity is case sensitive. Updating the check to be case insensitive
to prevent failures when value is supplied using differences in case.

Fix #61414

Author: ChrisFWood
Assignees: -
Labels:

area-System.Net.Http

Milestone: -

Copy link
Member

@karelz karelz left a comment

Choose a reason for hiding this comment

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

Thanks for the fix @ChrisFWood

@karelz karelz added this to the 7.0.0 milestone Nov 11, 2021
@@ -61,7 +61,7 @@ private static bool ProxySupportsConnectionAuth(HttpResponseMessage response)

foreach (string v in values)
{
if (v == "Session-Based-Authentication")
Copy link
Member

Choose a reason for hiding this comment

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

Separately, @geoffkizer, we might want to audit use of Headers and update appropriate sites to use NonValidated.

Copy link
Contributor

Choose a reason for hiding this comment

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

Is the goal here to improve performance by avoiding the added processing/memory use that happens when you go through TryGetValues etc?

There are semantic differences with NonValidated. In particular if the server sent something like

Proxy-Support: Session-Based-Authentication, Some-Other-Magic-Token

Then the current code would enumerate this as two header values and successfully match the first. In general for header processing, this is what you want (e.g. consider Connection: close handling).

If we just use NonValidated here then we would need to parse these tokens ourselves. Which we could certainly do, and we could certainly do it in a more efficient way than the current header parsing logic does (e.g. deal with spans instead of allocating strings). But I'm not sure the perf here matters much.

There could be (and almost certainly are) scenarios where this perf does matter, e.g. Connection: close. But again, it's not as simple as just using NonValidated.

In short: Yes, there are things we should look into as far as improving header access perf, but NonValidated by itself doesn't really help all that much, and we need to investigate further to determine if/how to actually do better here.

Copy link
Member

Choose a reason for hiding this comment

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

Is the goal here to improve performance by avoiding the added processing/memory use that happens when you go through TryGetValues etc?

Yes, that would be the goal.

@danmoseley
Copy link
Member

Is a test feasible?

@geoffkizer
Copy link
Contributor

Is a test feasible?

Sadly, I cannot find a test for the existing behavior here. Given how small this change is, I think we should just take it despite the lack of tests.

Authentication tests in general are a pain because you need to have a certain machine setup to run them. But we do have some, and we should certainly add one that covers this case as well in the future.

@wfurt did I miss anything here? Thoughts?

@ChrisFWood
Copy link
Contributor Author

Is a test feasible?

Fair question, I couldn't see anything testing that area to update, and I'm not that familiar with workings of authentication via proxy. In theory I could use reflection to test the private static method modified, rather than the whole authentication via proxy piece.

@karelz
Copy link
Member

karelz commented Dec 13, 2022

/backport to release/6.0

@github-actions github-actions bot unlocked this conversation Dec 13, 2022
@github-actions
Copy link
Contributor

Started backporting to release/6.0: https://github.com/dotnet/runtime/actions/runs/3688296891

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Dec 13, 2022
@karelz karelz modified the milestones: 7.0.0, 6.0.x, 7.0.x Jan 6, 2023
@karelz karelz modified the milestones: 7.0.x, 7.0.0 Jan 6, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-System.Net.Http community-contribution Indicates that the PR has been added by a community member
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Proxy-Support header case sensitive causes proxied API failure when using HttpClient
5 participants