On Mon, May 9, 2022 at 11:35 PM Mike West <mk...@chromium.org> wrote:

> Hey Łukasz,
>
> I'm in favor of shipping this change. It will harden our defenses against
> side-channel attacks at minimal web-visible cost, and clear a path for a
> WebKit implementation that some folks have expressed interest in (see the CORB
> thread on webkit-dev@
> <https://lists.webkit.org/pipermail/webkit-dev/2022-March/032167.html>).
> That said, I have two questions:
>
>    1. The ORB telemetry results - Mar 2022
>    
> <https://docs.google.com/document/d/1MbYQbL4WQyZdCQcZcKyzxHA0UxbHTC0O4bQXFgm8o6A/edit?usp=sharing>
>  document
>    suggests a substantially smaller impact than the 0.01% number you mention a
>    few times in this intent: 0.002% - 0.006% (it would be ideal if you could
>    create a public version of that document :) ). Can you help me understand
>    the distinctions between those measurements?
>
> 0.01% is just a conservative rounding of the 0.002%-0.006% numbers from
the other doc.  (Sorry about that... https://xkcd.com/2585/ seems somewhat
applicable I guess...)


>
>    1.
>    2. The current specification situation is confusing.
>    https://fetch.spec.whatwg.org/#corb doesn't match what Chrome does,
>    and https://github.com/annevk/orb doesn't match what this v0.1
>    implementation does. Is there something we can point developers to which
>    would explain Chrome's behavior once we ship this initial stab at ORB?
>
> Hmmm... this is a fair point.  We have some docs, but I am not sure if
they are distilled/clear enough for public consumption.  Notably, the "Gradual
CORB -> ORB transition <http:///>" doc talks about the main difference
between full ORB and ORB v0.1 (JS sniffing -vs- HTML/JSON/XML sniffing) and
also provides a fairly comprehensive list of other, minor differences is in
the "Appendix: ORB v0.1 vs full ORB differences
<https://docs.google.com/document/d/1qUbE2ySi6av3arUEw5DNdFJIKKBbWGRGsXz_ew3S7HQ/edit#heading=h.mptmm5bpjtdn>"
section of the doc.

But... I think that explaining Chrome behavior can be done by just
referring to the full ORB spec.  Chrome's ORB v0.1 blocks only a subset of
resources that full ORB would block, but the ones that are blocked by
Chrome can be explained by the full ORB algorithm (adding a disclaimer to
that explanation as needed and pointing out that Chrome only implements a
subset of the full ORB algorithm).  Does that seem reasonable?


> Thanks!
>
> -mike
>
>
> On Mon, May 9, 2022 at 8:26 PM Łukasz Anforowicz <luka...@chromium.org>
> wrote:
>
>> On Fri, May 6, 2022 at 4:45 PM Mike Taylor <miketa...@chromium.org>
>> wrote:
>>
>>> Hi there,
>>>
>>> While we review this, can we ask WebKit for a signal? (
>>> bit.ly/blink-signals).
>>>
>>
>> Done - see:
>> https://lists.webkit.org/pipermail/webkit-dev/2022-May/032222.html
>>
>>
>>> Also, https://github.com/w3ctag/design-reviews/issues/618 is the TAG
>>> review for this, correct?
>>>
>>
>> Not quite.  This was a review of just one aspect of ORB - having a list
>> of MIME types for which it is never allowed to have a response in
>> mode=no-cors (this aspect is shared across ORB and CORB) .  OTOH some
>> comments in this review
>> <https://github.com/w3ctag/design-reviews/issues/618#issuecomment-806017154>
>> did highlight that ORB has no impact on behavior and
>> functionality (assuming HTTP responses use correct `Content-Type`).
>>
>> For now, I assume that no additional reviews are needed given that
>>
>>    - No new API surface
>>    - No behavior change if HTTP responses use correct `Content-Type`.
>>    - If an incorrect or inaccurate `Content-Type` is used, then ORB v0.1
>>    introduces minimal change in behavior compared to CORB (blocking 
>> additional
>>    0.01% of HTTP responses;  see the original email for more details and
>>    examples).
>>
>> FWIW, since ORB does cause known changes in 0.01% of HTTP responses, we
>> thought that an official intent-to-ship route is the safest path going
>> forward.  OTOH, feel free to guide us toward another process if needed -
>> e.g. maybe an argument can be made to use the "web developer facing
>> change to existing code
>> <https://www.chromium.org/blink/launching-features/#web-developer-facing-change-to-existing-code>"
>> path instead.
>>
>> Thanks,
>>
>> -Lukasz
>>
>>
>>> On 5/5/22 2:02 PM, Łukasz Anforowicz wrote:
>>>
>>> Hello!
>>>
>>> The goal of this email is to:
>>>
>>>    - Seek LGTMs from Blink API owners for the intent to ship ORB v0.1
>>>    <https://chromestatus.com/feature/4933785622675456> in Chrome M103.
>>>    A formal, semi-automatically-generated intent-to-ship data can be found 
>>> at
>>>    the end of this email.
>>>    - Provide an overview of ORB, motivations for shipping it, and its
>>>    (low) risks.
>>>    - Highlight scenarios where web developers might want to
>>>    double-check the MIME types used by their HTTP servers when serving 
>>> certain
>>>    resources.
>>>
>>>
>>> *Overview of ORB*
>>>
>>> Opaque Response Blocking (ORB) is a replacement for Cross-Origin Read
>>> Blocking (CORB).  CORB and ORB are both heuristics that attempt to prevent
>>> cross-origin disclosure of “no-cors” subresources.  An example attack that
>>> ORB and CORB prevent is where an attacker’s frame contains <img src=”
>>> https://victim.example.com/secret.json”> which an attacker reads using
>>> either Spectre or a compromised renderer.  Site Isolation depends on either
>>> CORB or ORB to keep cross-site secrets out of the renderer process.  For
>>> more information please see
>>> https://www.chromium.org/Home/chromium-security/corb-for-developers.
>>>
>>> We are considering replacing CORB with ORB because ORB is more secure:
>>> CORB fails open (it only blocks what its heuristics recognize as blockable)
>>> and ORB fails closed (it only allows what its heuristics recognize as
>>> scripts, stylesheets, images, audio, or video).  Improved security
>>> properties mean that ORB is more likely to be a broadly adopted standard.
>>>
>>> ORB spec is being iterated on at https://github.com/annevk/orb.  ORB
>>> has not been shipped by any browser today (Firefox tracks their efforts in
>>> 1532642 <https://bugzilla.mozilla.org/show_bug.cgi?id=1532642#c19> and
>>> plans to resume the work soon).  CORB is partially covered by
>>> https://fetch.spec.whatwg.org/#corb (HTML, JSON, JS-parser-breaker, nor
>>> XML sniffing is not covered).  Chromium is the only browser that implements
>>> CORB today.
>>>
>>>
>>>
>>> *Motivation for ORB v0.1 *
>>>
>>> At this point, there remain open questions about the feasibility of the
>>> JS detection heuristics required by full ORB.  Still, the incremental
>>> benefits of adopting even a subset of ORB are definitely desirable.  We
>>> call this subset ORBv0.1 - the main difference from full ORB is replacing
>>> JS sniffing/parsing with CORB’s more limited HTML, JSON, and XML sniffers.
>>> In other words, ORBv0.1 still fails open and only blocks a subset of known
>>> response types, but it blocks more than CORB.
>>>
>>> *ORBv0.1 offers incremental security benefits compared to CORB*.
>>> ORBv0.1 blocks the following kinds of HTTP responses that CORB wouldn’t
>>> block:
>>>
>>>    - CORB blocks responses that contain HTML and XML only if they are
>>>    labeled with HTML mime type
>>>    <https://mimesniff.spec.whatwg.org/#html-mime-type> or XML mime type
>>>    <https://mimesniff.spec.whatwg.org/#xml-mime-type>.  ORBv0.1 blocks
>>>    responses that contain HTML and XML even if they are mislabeled (e.g. 
>>> HTML
>>>    served as application/octet-stream, or XML served as text/html).
>>>    - CORB blocks range request responses only if they are labeled with
>>>    HTML, JSON, or XML mime type.  ORBv0.1 blocks all range request 
>>> responses,
>>>    unless they come from a URL that ORBv0.1 has earlier recognized (via
>>>    sniffing, or via mime type) as audio or video.
>>>
>>> Note that both CORB and ORBv0.1 would block responses that contain JSON
>>> or JS-parser-breakers.  OTOH, this CORB protection can be bypassed if the
>>> victim’s server allows range requests (which are not blocked by CORB,
>>> except for HTML, JSON, or XML mime type). ORBv0.1 closes that gap.
>>>
>>> ORBv0.1 is also an incremental step toward full ORB compliance.  At the
>>> very least ORBv0.1 makes it easier to experiment with JS detection
>>> heuristics (including full Javascript parsing if necessary and acceptable
>>> from performance perspective).
>>>
>>>
>>> *Shipping ORBv0.1 in Chrome 103*
>>>
>>> Implementing ORB in Chromium is tracked in https://crbug.com/1178928 - *we
>>> plan to ship ORBv0.1 in Chrome M103*. Chrome’s implementation of CORB
>>> and ORBv0.1 covers all platforms except iOS.  This also includes Android
>>> WebView.  Chrome’s implementation is hosted in the NetworkService.
>>>
>>>
>>> *Backcompatibility risks of ORBv0.1*
>>>
>>> *The backcompatibility risk of shipping ORB seems low: less than 0.01%
>>> of all HTTP requests are at risk* because they are blocked by ORB and
>>> not by CORB.  Note that this is an *upper* bound for the amount of possible
>>> breakage:
>>>
>>>    - This number includes responses with payload that is *not* valid in
>>>    no-cors contexts.  For example - <img src=”
>>>    https://example.com/document.html”> will not work regardless of
>>>    whether ORB blocks such a response or not.
>>>    - This number is based on older telemetry results.  Recent CLs
>>>    should further reduce the risk:
>>>       - https://crrev.com/c/3554875: Always allowing all audio/* and
>>>       video/* reduces the risk of breaking range responses.
>>>       - https://crrev.com/c/3599601: Always allowing “text/css” removes
>>>       the risk of breaking html/css polyglot documents (which used to be 
>>> blocked
>>>       by ORBv0.1 when they sniffed as HTML or has JS-parser-breakers)
>>>
>>> Still, there are certain scenarios that have a higher risk profile -
>>> ORBv0.1 risks breaking the following scenarios:
>>>
>>>    - HTTP 200 responses for audio / image / video subresources that 1)
>>>    are not labeled as audio/*, image/*, nor video/* mime type, and that 2) 
>>> do
>>>    *not* sniff as media according to the audio/video
>>>    
>>> <https://mimesniff.spec.whatwg.org/#audio-or-video-type-pattern-matching-algorithm>
>>>    or image sniffing
>>>    
>>> <https://mimesniff.spec.whatwg.org/#image-type-pattern-matching-algorithm>
>>>    algorithms used by ORB, and that 3) *do* sniff as HTML, JSON, or XML.
>>>       - *Hypothetical* example: DASH manifests (a format that sniffs as
>>>       XML), labeled as application/octet-stream or text/html.  These are 
>>> only
>>>       *hypothetical* (i.e. there is no real backcompatibility risk), because
>>>       there is no native DASH support in Chrome - polyfills use 
>>> CORS-mediated
>>>       `fetch(...)` and are therefore unaffected by ORB.
>>>    - HTTP 206 range request responses for audio / video subresources
>>>    that are not labeled as audio/*, image/*, nor video/* mime type, and that
>>>    have not been earlier (e.g. when processing a HTTP 200 response) sniffed 
>>> as
>>>    media according to the audio/video sniffing
>>>    
>>> <https://mimesniff.spec.whatwg.org/#audio-or-video-type-pattern-matching-algorithm>
>>>    algorithms used by ORB.
>>>       - Example: hypothetical future/under-development/new video format
>>>       served as application/octet-stream or text/html and requested via 
>>> range
>>>       requests.
>>>       - Example: format covered by the sniffing spec
>>>       <https://mimesniff.spec.whatwg.org/#matching-a-mime-type-pattern>,
>>>       but not implemented by Chromium sniffers (we have decided against 
>>> updating
>>>       Chromium code when discussing https://crrev.com/c/3352765).  For
>>>       example, AIFF or AVI video served as application/octet-stream or 
>>> text/html
>>>       and requested via range requests.
>>>       - Example: mp4 video that is labeled as application/octet-stream
>>>       and requires range requests that start reading the media resources 
>>> from its
>>>       middle bytes (giving ORB no chances to sniff the initial bytes as 
>>> video).
>>>       - Telemetry shows that out of all responses blocked by ORB and
>>>       not by CORB (so out of 0.01% of all HTTP responses) between 4.1% (on
>>>       Windows) and 39.6% (on Android) have been blocked because of an 
>>> unexpected
>>>       range response (this data was gathered before the fix in
>>>       https://crrev.com/c/3554875).
>>>
>>> In the scenarios outlined above, web developers should double-check that
>>> the HTTP responses use a Content-Type that indicates multimedia content -
>>> e.g. audio/*, video/*, application/dash+xml, application/ogg, text/vtt, etc.
>>>
>>> For more details, please see the (Google-internal) “ORB telemetry
>>> results - Mar 2022
>>> <https://docs.google.com/document/d/1MbYQbL4WQyZdCQcZcKyzxHA0UxbHTC0O4bQXFgm8o6A/edit?usp=sharing>”
>>> document.
>>>
>>>
>>> *Managing the backcompatibility risk*
>>>
>>> Given low risk of shipping ORB v0.1 (less than 0.01% of all HTTP
>>> responses), we have considered but ultimately decided against taking the
>>> following actions:
>>>
>>>    - We don’t plan to implement support for a reverse Origin Trial
>>>    (that could be used by ORB-affected websites in an emergency, to opt-out 
>>> of
>>>    ORB).  We believe that a base::Feature-based kill-switch is a sufficient
>>>    precaution.
>>>    - We don’t plan to emit additional notifications about responses
>>>    blocked by ORB.  We believe that the existing CORB warning in DevTools is
>>>    sufficient:
>>>
>>> Cross-Origin Read Blocking (CORB) blocked cross-origin response
>>> https://www.example.com/example.html with MIME type text/html. See
>>> https://www.chromestatus.com/feature/5629709824032768 for more details.
>>>
>>>
>>>    - For now we plan to keep referring to the feature as CORB (e.g. in
>>>    DevTools warnings), because
>>>       - ORB builds on top of CORB (e.g. wrt blocking behavior where a
>>>       blocked response has its HTTP response headers stripped and is 
>>> injected
>>>       with an empty response body).
>>>       - Plenty of CORB documentation exists and applies equally well to
>>>       ORB (e.g. rationale and description of security benefits provided at
>>>       https://www.chromium.org/Home/chromium-security/corb-for-developers
>>>       ).
>>>    - We don’t gather additional information about affected HTTP
>>>    resources:
>>>       - We want to avoid gathering URLs of HTTP resources, since they
>>>       may be PII (Personally Identifiable Information).  We also note that
>>>       Rappor
>>>       
>>> <https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/42852.pdf>
>>>       is deprecated and UKM only allows logging of certain, limited URLs 
>>> (e.g.
>>>       URLs of top-level pages, and of installed Chrome Extensions).
>>>       - Non-PII information gathered via temporary crash keys
>>>       <https://chromium-review.googlesource.com/c/chromium/src/+/3465612>
>>>       have been sufficient for identifying and fixing some incorrect 
>>> behavior
>>>       (see https://crrev.com/c/3554875: which fixed handling of range
>>>       requests).
>>>
>>> We did or plan to take the following actions to manage the risk of
>>> shipping ORB:
>>>
>>>    - We tweaked CORB's https://chromestatus.com/feature/5629709824032768 
>>> entry
>>>    to call out what is changing in Chrome 103.
>>>    - We plan to respond to bug reports (if any) by
>>>    - Identifying whether the blocked response affected page behavior,
>>>       or only changed what type of error occurred (which is the typical 
>>> outcome
>>>       for bugs filed about CORB).
>>>       - Recommending to use a more specific MIME type in the
>>>       Content-Type HTTP response header.
>>>       - Consider deploying a base::Feature-based kill switch if
>>>       required (possibly only on some platforms; we’ve determined that 
>>> deploying
>>>       the kill-switch on Android-WebView-only is feasible).
>>>
>>>
>>> *Implementation risks*
>>>
>>> PerFactoryState will be stored per URLLoaderFactory and will remember
>>> URLs of cross-origin audio/video responses that didn’t have audio/* nor
>>> video/* mime type, but that sniffed as audio/video.  We think that the
>>> additional memory pressure should be acceptable.  We will monitor existing
>>> memory metrics during launch.
>>>
>>>
>>> *Plans beyond ORB v0.1*
>>>
>>> Shipping ORB v0.1 will allow the following tasks to move forward:
>>>
>>>    - Deleting code associated with CORB.
>>>    - Removing remaining differences between ORB spec and Chrome’s ORB
>>>    implementation.  For more details please see the “ORB v0.1 vs full
>>>    ORB differences
>>>    
>>> <https://docs.google.com/document/d/1qUbE2ySi6av3arUEw5DNdFJIKKBbWGRGsXz_ew3S7HQ/edit#heading=h.mptmm5bpjtdn>”
>>>    section in the “Gradual CORB -> ORB transition
>>>    
>>> <https://docs.google.com/document/d/1qUbE2ySi6av3arUEw5DNdFJIKKBbWGRGsXz_ew3S7HQ/edit?usp=sharing>”
>>>    document.  Lack of Javascript sniffing is one major difference, but there
>>>    are also minor other differences (e.g. blocking by injecting an empty
>>>    response body VS a network error).
>>>
>>>
>>> Thanks,
>>>
>>> Lukasz Anforowicz (on behalf of the Chrome Security Architecture team)
>>>
>>> PS. Below is the more formal,
>>> automatically-generated(-and-then-slightly-edited) intent-to-ship data
>>> based on https://chromestatus.com/feature/4933785622675456:
>>>
>>> *Contact emails:*
>>> luka...@chromium.org, cr...@chromium.org, vogelh...@chromium.org
>>>
>>> *Specification:*
>>> https://github.com/annevk/orb
>>>
>>> *Summary:*
>>> Opaque Response Blocking (ORB) is a replacement for Cross-Origin Read
>>> Blocking (CORB - https://chromestatus.com/feature/5629709824032768).
>>> CORB and ORB are both heuristics that attempt to prevent cross-origin
>>> disclosure of “no-cors” subresources.  This entry tracks v0.1 of ORB -
>>> Chrome's first step toward full ORB implementation.
>>>
>>> For interop web authors should check Content-Type headers of their
>>> resources and indicate multimedia content when needed (e.g. audio/*,
>>> application/dash+xml, etc).
>>>
>>> *Blink component:*
>>> Internals>Sandbox>SiteIsolation
>>>
>>> *TAG review status:*
>>> Not applicable
>>>
>>> *Interoperability and Compatibility Risk:*
>>> The backcompatibility risk of shipping ORB v0.1 seems low: less than
>>> 0.01% of all HTTP requests are at risk because they are blocked by ORB and
>>> not by CORB.
>>>
>>> For more information, see the draft of the "Backcompatibility risks of
>>> ORBv0.1" and the "Managing the backcompatibility risk" sections at
>>> https://docs.google.com/document/d/1dO1NP6xchEiCN990zMczXcSvgcRzSnWBtAgflVBXoTg/edit?usp=sharing
>>>
>>> Gecko: In development (
>>> https://bugzilla.mozilla.org/show_bug.cgi?id=1532642).
>>>
>>> WebKit: No signal
>>>
>>> Web developers: No signals
>>>
>>> Other signals:
>>>
>>> *Ergonomics:*
>>> N/A (no public API)
>>>
>>> *Activation:*
>>> N/A
>>>
>>> *Security:*
>>> N/A
>>>
>>> *WebView application risks:*
>>> No known WebView-specific risks
>>>
>>> *Debuggability:*
>>> No changes compared to CORB - mostly relying on a DevTools console
>>> warning that gets emitted when CORB/ORB block a HTTP response.
>>>
>>> *Is this feature fully tested by web-platform-tests?*
>>> Not really…
>>>
>>> CORB and ORBv0.1 do have coverage via wpt/fetch/corb but:
>>>
>>>
>>>    1. CORB and ORBv0.1 are Chrome-only technologies (the latter is a
>>>    step toward adopting the full, cross-browser ORB standard).  And 
>>> therefore
>>>    right now wpt/fetch/corb are Chrome-specific tests.
>>>    2. Covering full ORB will require significant refactoring of the
>>>    tests - among other things we might need to change whether a blocked
>>>    response is verified by checking for A) an empty response body VS B) a
>>>    network/fetch error.
>>>
>>> *Flag name:*
>>> --enable-features=OpaqueResponseBlockingV01
>>>
>>> *Requires code in //chrome?:*
>>> False
>>>
>>> *Tracking bug:*
>>> https://crbug.com/1178928
>>>
>>> *Measurement:*
>>> Google-internal "ORB telemetry results - Mar 2022" doc can be found at
>>> https://docs.google.com/document/d/1MbYQbL4WQyZdCQcZcKyzxHA0UxbHTC0O4bQXFgm8o6A/edit?usp=sharing
>>>
>>> *Estimated milestones:*
>>> Shipping on desktop 103
>>> Shipping on Android 103
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "blink-dev" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to blink-dev+unsubscr...@chromium.org.
>>> To view this discussion on the web visit
>>> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAA_NCUH%3Df4KJK7F1rZ9PugP4O9kPQ%2BSzot0VjD6hyxZ%3Dqn_Bjw%40mail.gmail.com
>>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAA_NCUH%3Df4KJK7F1rZ9PugP4O9kPQ%2BSzot0VjD6hyxZ%3Dqn_Bjw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>>
>>> --
>> You received this message because you are subscribed to the Google Groups
>> "blink-dev" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to blink-dev+unsubscr...@chromium.org.
>> To view this discussion on the web visit
>> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAA_NCUGAOpNbCx-gZsttKo1cSGAoHugVJJBEjGrqA9AjQ1KtOw%40mail.gmail.com
>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAA_NCUGAOpNbCx-gZsttKo1cSGAoHugVJJBEjGrqA9AjQ1KtOw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to blink-dev+unsubscr...@chromium.org.
To view this discussion on the web visit 
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAA_NCUG3%2ByUxFwTnrA0ahvAuvfXP4%2BKhbMyhO9XPfpLySDF8jg%40mail.gmail.com.

Reply via email to