[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[ocsp stapling] reject incorrect http response if the status code is not 2xx - #89908

Closed
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling
Closed

[ocsp stapling] reject incorrect http response if the status code is not 2xx#89908
cdlliuy wants to merge 1 commit into
dotnet:mainfrom
cdlliuy:ocspstapling

Conversation

@cdlliuy

Copy link
Copy Markdown

Draft a possible fix for #89907

@ghostghost added area-System.Net.Http community-contribution Indicates that the PR has been added by a community member labels Aug 3, 2023
@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

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

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Net.Http, community-contribution

Milestone:-

@ghost

ghost commented Aug 3, 2023

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

Issue Details

Draft a possible fix for #89907

Author:cdlliuy
Assignees:-
Labels:

area-System.Security, community-contribution

Milestone:-

@vcsjones

Copy link
Copy Markdown
Member

If the server really is indeed stapling a nonsense OCSP then I think a more appropriate fix would be to make sure that the stapled response is a well formed OCSP response, valid for the certificate, etc.

This fix as written will still staple incorrect responses if happens to respond with non-OCSP content but with an HTTP 200 status code.

Also, returning null for >= HTTP 300 will break following redirects.

A more appropriate fix might be that in

if (SSL_set_tlsext_status_ocsp_resp(ssl, copy, len) !=1)

We might consider parsing the content and, if it isn’t a parseable OCSP, then skipping the stapling. That still doesn’t address the problem where a wrong OCSP response might be stapled.

@wfurt

wfurt commented Aug 3, 2023

Copy link
Copy Markdown
Member

we may still bail for anything > 400 @vcsjones ? The body is likely some kind of error message anyway.

@vcsjones

Copy link
Copy Markdown
Member

still bail for anything > 400 @vcsjones ?

That seems reasonable, but not a complete fix. I would guess that there is greater than zero CAs out there that return an error result with an HTTP 200, or someone has a proxy, captive portal, etc. that intercepts HTTP requests and may return HTTP 200 pages.

@bartonjs

Copy link
Copy Markdown
Member

There should be a path when we download it where we crack the payload to extract the notAfter value. That path should be able to be enhanced to say not just "I didn't get a date from it" (it's optional), but also "it's not a valid response". I kinda thought it was already checking that, but apparently not. (Leaving a note in case someone has the time to dig before I do)

@bartonjs

Copy link
Copy Markdown
Member

So, I don't think the proposed fix would even help, since it should be hitting the same "we ignored this" case that should already be happening.

If a bad response got in there, it sort of feels like some very wonky thing happened, like that array got overwritten?

CryptoNative_X509DecodeOcspToExpiration looks like it might pass if there was a legitimate response plus some dangling garbage, which probably isn't what was intended, but also doesn't sound like the problem that was experienced.

@cdlliuy

cdlliuy commented Aug 4, 2023

Copy link
Copy Markdown
Author

yeah, I agree the original fix won't work (and also break the redirect flow by typo. Checking status code>=400 is better than current)

So the current idea is to validate the OCSP content, and cache the correct format only. Is my understanding correct?
will "retrying the connection to ocsp responder" help here in case it is an intermittent failure.

Then, for the failed case, i.e. a bad response status code or bad content, does it still "return null" for DownloadOcsp request?
When "returning null", what will happen in client side? will client side fall back to client-driven ocsp? or just fail the https connection request?

@bartonjs

Copy link
Copy Markdown
Member

Since the proposed fix is not correct (it's invalidating the redirect handler code immediately below it), and doesn't feel like the right shape at all (an HTTP 200 with an error message is still "not a valid OCSP payload"), I'm going ahead and closing this PR. We'll continue discussion/investigation on the issue instead of the PR.

@bartonjsbartonjs closed this Aug 4, 2023
@ghostghost locked as resolved and limited conversation to collaborators Sep 3, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Securitycommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cdlliuy@vcsjones@wfurt@bartonjs@adamsitnik@MihaZupan