On Thu, Feb 15, 2024 at 12:50 AM David Benjamin <david...@chromium.org>
wrote:

> On Wed, Feb 14, 2024 at 9:20 AM Yoav Weiss (@Shopify) <
> yoavwe...@chromium.org> wrote:
>
>> LGTM1
>>
>> On Wednesday, February 14, 2024 at 2:36:10 AM UTC+1 Nidhi Jaju wrote:
>>
>> On Wed, Feb 14, 2024 at 2:48 AM James Hartig <fastest...@gmail.com>
>> wrote:
>>
>> My employer ran into the window size during our pre-production validation
>> and it was difficult to debug since it was working in cURL, the zstd CLI,
>> and only presented itself on certain URLs. I appreciate Nidhi responding to
>> our issue so quickly and updating Chrome to have a more helpful error
>> message in the future. The Go package we use already updated their
>> default <https://github.com/klauspost/compress/pull/913> to 8MB (without
>> any awareness to Chrome's size) which should help future users of that
>> package but there might be other packages out there that might not have a
>> low enough default. The updated Chrome error message will help but only if
>> you run into that error message when testing; which might not if you happen
>> to be testing with small responses. I'm not sure where developers should be
>> looking to be aware of the window size. Does it make sense to mention in
>> the Chrome Status entry? If the spec is updated that might be good enough
>> but I just wanted to discuss other avenues that might be more
>> developer-aware.
>>
>>
>> Thank you, I've included these details about the window size limits under
>> the "Interoperability and Compatibility Risks" section in the ChromeStatus
>> entry.
>>
>> On Tue, Feb 13, 2024 at 6:43 PM Yoav Weiss (@Shopify) <
>> yoavwe...@chromium.org> wrote:
>>
>>
>>
>> On Tue, Feb 13, 2024 at 9:29 AM Nidhi Jaju <nidhij...@chromium.org>
>> wrote:
>>
>>
>>
>> On Tue, Feb 13, 2024 at 4:18 PM Yoav Weiss (@Shopify) <
>> yoavwe...@chromium.org> wrote:
>>
>> Thanks for working on this!! This is extremely exciting!
>>
>> On Tue, Feb 13, 2024 at 1:11 AM Nidhi Jaju <nidhij...@chromium.org>
>> wrote:
>>
>> Contact emails
>>
>> nidhij...@chromium.org
>>
>> Explainer
>>
>> https://docs.google.com/document/d/1aDyUw4mAzRdLyZyXpVgWvO-
>> eLpc4ERz7I_7VDIPo9Hc/edit?usp=sharing
>>
>> Specification
>>
>> https://datatracker.ietf.org/doc/html/rfc8878
>>
>> Design docs
>>
>> https://docs.google.com/document/d/14dbzMpsYPfkefAJos124uPrlkvW7j
>> yPJhzjujSWws2k/edit?usp=sharing
>>
>> Summary
>>
>> Zstandard, or “zstd”, is a data compression mechanism described in
>> RFC8878. It is a fast lossless compression algorithm, targeting real-time
>> compression scenarios at zlib-level and better compression ratios. The
>> "zstd" token was added as an IANA-registered Content-Encoding token as per
>> https://datatracker.ietf.org/doc/html/rfc8878#name-content-encoding.
>>
>> Adding support for "zstd" as a Content-Encoding will help load pages
>> faster and use less bandwidth, and spend less time and CPU/power on
>> compression on our servers, resulting in reduced server costs.
>>
>> Blink component
>>
>> Internals>Network
>> <https://bugs.chromium.org/p/chromium/issues/list?q=component:Internals%3ENetwork>
>>
>> TAG review
>>
>> https://github.com/w3ctag/design-reviews/issues/930
>>
>> TAG review status
>>
>> Pending
>>
>> Risks
>> Interoperability and Compatibility
>>
>> Servers that have a broken implementation of zstd might exist, but the
>> risk of this is small. Additionally, middleware and middleboxes like virus
>> checkers that intercept HTTPS connections might not support zstd, but might
>> fail to remove it from the Accept-Encoding header in the request.
>>
>> Another known risk is interoperability between clients that support zstd
>> regarding window frame sizes. In Chrome, we limit the window frame size to
>> 8MB to prevent excessive memory usage, but this limit does not exist in
>> curl and when using zstd directly. We have seen very few sites that use a
>> window size larger than 8MB which causes decoding errors, but we have added
>> new net error codes and debugging messages to help them understand what to
>> do in this situation.
>>
>>
>> I know we discussed
>> <https://w3c.github.io/web-performance/meetings/2023/2023-09-TPAC/index.html#h.xn2d3li0b8op>
>> this at length at the WebPerfWG.
>> Can you summarize developments and/or findings since that discussion on
>> that front?
>> Should we expect the default output of CLI tools to be compatible with
>> what we want to ship here?
>> Should we expect interoperability between Chromium and e.g. curl?
>>
>>
>> We've been discussing it with the zstd team at Meta at
>> https://github.com/facebook/zstd/issues/2713. The plan is to take it to
>> the HTTP WG at the IETF and either file an errata or publish a new document
>> with more strict window size guidelines. The zstd CLI tool currently
>> supports up to 8MB as a default, so the same limit. The library will use
>> 128MB by default, however, and Curl currently supports up to 128MB windows.
>> We expect those defaults to change to match any spec changes. In practice,
>> we've seen very limited reports of sites running into this limit, and we've
>> added helpful messages in Chromium to guide anyone who does run into it.
>>
>>
>> Thanks! Pushing that limit into the standard and having curl (and other
>> tools) follow that makes sense and seems important.
>>
>> Thinking out loud, the main risk here is for folks to be testing their
>> content outside of Chromium (e.g. with curl) and then have that content
>> break in Chromium. At the same time if content is tested in Chromium, it
>> will work in another client that supports larger windows.
>> So the (seemingly small) risk here is one we take on ourselves, rather
>> than risk we externalize on the ecosystem.
>>
>>
>> Yes, that sounds right. We'll continue to push to standardize this
>> behavior across the ecosystem.
>>
>>
>>
>>
>>
>>
>>
>>
>> Gecko: Positive (https://github.com/mozilla/
>> standards-positions/issues/775)
>>
>> WebKit: Positive (https://github.com/WebKit/
>> standards-positions/issues/168)
>>
>> Web developers: Positive (https://crbug.com/1246971) Meta (Yann and
>> Felix) and Akamai (Nic) are positive about zstd content-encoding on the
>> browser. Meta has collaborated with us to improve the compression ratios
>> for Meta origins during the experiment and is seeing positive user-level
>> results. Alibaba is also supportive of shipping zstd support as they saw
>> massive savings on their origins in terms of server CPU cost.
>>
>> Other signals:
>>
>> Ergonomics
>>
>> While both Zstandard and Brotli are clear wins over gzip
>> content-encoding, which of Zstandard or Brotli to use depends on many
>> factors, and site authors may need to experiment to identify the optimal
>> choice for their content.
>>
>> Zstandard uses more memory for decompression than gzip. However, this is
>> also true for Brotli, and we haven't seen any problems in practice.
>>
>> Activation
>>
>> The "zstd" Content-Encoding is not as widely supported by HTTP servers as
>> gzip. Of the top 5 web servers, Nginx has a third-party module, which
>> should also work for OpenResty (untested). Apache, IIS, and LiteSpeed
>> appear to have no support. Explicit server support is often only necessary
>> for dynamic content. For static (pre-compressed) content, Zstandard can
>> often be supported just by configuration.
>>
>> Only one public CDN is known to be able to compress Zstandard itself, and
>> some CDN's may require custom configuration to pass-through Zstandard
>> correctly.
>>
>> Zstd support is not particularly difficult to implement for a server that
>> already implements multiple content encodings. The C implementation has a
>> straightforward API and there are implementations for many other languages.
>> There is also a lively community of Zstandard enthusiasts which should help
>> accelerate adoption.
>>
>> Security
>>
>> CRIME <https://en.wikipedia.org/wiki/CRIME> and BREACH
>> <https://en.wikipedia.org/wiki/BREACH> mean that the resource being
>> compressed can be considered readable by the document deploying them. That
>> is bad if any of them contains information that the document cannot already
>> obtain by other means. An attacker may provide correctly formed compressed
>> frames with unreasonable memory requirements, and dictionaries may interact
>> unexpectedly with a decoder, leading to possible memory or other
>> resource-exhaustion attacks. It is possible to store arbitrary user
>> metadata in skippable frames, so they can be used as a watermark to track
>> the path of the compressed payload. It is important to note that these
>> concerns apply to all compression formats, not just zstd.
>>
>> To mitigate these risks, similar to Brotli, we'll be advertising support
>> for "zstd" encoding only if transferred data is opaque to proxies, to
>> ensure that resources don't contain private data that the origin cannot
>> read otherwise.
>>
>>
>> I'm not sure what that means. Can you elaborate on that?
>>
>>
>> This essentially means that, like Brotli, Zstd is only available in
>> secure contexts
>> <https://source.chromium.org/chromium/chromium/src/+/main:net/http/http_request_headers.cc;l=284-290;drc=4787fce6c51383f5631643ac3d14cc512d656de6>
>> i.e. over https.
>>
>>
>> Limiting zstd support to secure contexts makes perfect sense. However I
>> believe the reason we're doing that for brotli is more around compatibility
>> concerns with old network-based proxies
>> <https://issues.chromium.org/issues/40930163> that aren't ready for
>> non-gzip content-encodings.
>> I don't think secure contexts do much to protect against BREACH if
>> attackers can control parts of the response. At the same time, I don't know
>> that we're doing anything on that front for other compression formats, so
>> that seems fine.
>>
>
> Right, secure contexts don't magically make dangerous features safe. The
> *only* thing secure contexts do is make the name in the URL bar
> meaningful. The user may still be talking to evil.example.
>
> It sounds like there are more risks discussed here than BREACH, so I think
> we need to examine them separately:
>
> 1. Information leaks when you compress together attacker-controlled data
> and secret data. (BREACH)
> 2. DoS risks from the decompressor
> 3. Watermarking from user-specific encodings of the resource
>
> For BREACH, the description of the document not being able to read it
> confused me a little. When you compress something, the *length* of the
> compressed resource, even when encrypted, gets leaked to all manner of
> attackers via all manner of ways. I'm guessing the reference to the
> document is that resource timing APIs allow the document to learn the
> length of resources it otherwise cannot read? That is one attack vector
> (not at all mitigated by secure contexts), but there are others.
> Ultimately, BREACH means the server cannot *just* transparently compress
> every resource it sends. In particular, any kind of dynamic HTML resource
> will likely contain some attacker controlled strings.
>
> That said, the mitigation is mostly on the server to do. Once the resource
> gets to us, the leak has already happened. The only connection to proxies,
> and where we can do something on the client, is that sometimes proxies will
> try to transparently compress all HTTP resources indiscriminately. If that
> proxy is part of the network path and not the site, it has no hope of
> mitigating this. So being opaque to proxies is good and cuts out that minor
> component of the problem, but doesn't actually address the broader issue.
> It's just fine because the broader issue is for the server to address.
> (Though it means that our documentation to use it should mention the
> server's responsibility here!)
>

Thank you for the additional discussion about the different security risks.
I've added a note about the server's responsibility to the ChromeStatus
entry to take care with including attacker-controlled data in compressed
content.


>
> For DoS risks, secure contexts also don't do anything. We assume that the
> attacker can direct the user to visit any website under their control, so
> users could well visit https://evil.example and securely get a
> DoS-triggering payload from it. As decompression happens in the network
> service, shared across sites, that DoS would impact other sites too. So, in
> order to deploy zstd or any such compression scheme, we need to mitigate
> DoS attacks directly, usually by applying limits. It sounds like you all
> have applied a frame size limit? Is that sufficient to avoid DoS, or are
> the other avenues for a zstd decompression to consume excessive resources?
>

Yes, we added a window size limit of 8MB, which means that Chromium will
use a maximum of 8MB memory buffer to decompress frames to protect it from
unreasonable requirements. In addition, for zip bomb-like attacks, Chromium
doesn't decompress faster than the renderer consumes data, so we won't
accumulate excessive amounts of data in the network process.


> Finally, the watermarking concerns also aren't mitigated by secure
> contexts, but I think that's fine. This doesn't really apply to the web's
> security model because we already assume the resource may be user-specific
> in all manner of ways. (I mean, it can contain a Set-Cookie header!)
> Rather, when we want two contexts to be uncorrelated, we control whether
> they can communicate at all, rather than making assumptions on the encoding
> mechanism. (Network state partitioning, cookie controls, etc.)
>

Agreed, for the content itself, we’ll continue to rely on the existing
partitioning present in Chromium, as with other content encodings.


>
> Adding zstd to third_party/ in Chromium adds a large new code surface that
>> processes untrusted data, which inevitably brings risks of new security
>> holes. However, this is mitigated by the extensive fuzzing and security
>> analysis done on zstd by Google and other community members.
>>
>> Furthermore, zstd is implemented in C, which is not a memory-safe
>> language, and the network service is not yet sandboxed on all platforms.
>>
>> WebView application risks
>>
>> Does this intent deprecate or change behavior of existing APIs, such that
>> it has potentially high risk for Android WebView-based applications?
>>
>> Apps which use a WebView to display content from Meta's servers will
>> suddenly start using Zstandard. Since we've already extensively tested our
>> implementation against Meta's servers in Chrome, no problems are expected.
>> There is a killswitch. No special treatment should be needed.
>>
>>
>> Debuggability
>>
>> No special support needed.
>>
>> Zstd content-encoding support is exposed to the devtools protocol, so
>> developers are able to override it and view the headers from the inspector.
>>
>> A new net error has been added for decoding errors related to window
>> frame size.
>>
>> Will this feature be supported on all six Blink platforms (Windows, Mac,
>> Linux, ChromeOS, Android, and Android WebView)?
>>
>> Yes
>>
>> Is this feature fully tested by web-platform-tests
>> <https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md>
>> ?
>>
>> Yes (https://wpt.fyi/results/fetch/content-encoding/zstd
>> <https://wpt.fyi/results/fetch/content-encoding/zstd?label=experimental&label=master&aligned>
>> )
>>
>> Flag name on chrome://flags
>>
>> enable-zstd-content-encoding
>>
>> Finch feature name
>>
>> ZstdContentEncoding
>>
>> Requires code in //chrome?
>>
>> False
>>
>> Tracking bug
>>
>> https://bugs.chromium.org/p/chromium/issues/detail?id=1246971
>>
>> Launch bug
>>
>> https://launch.corp.google.com/launch/4266275
>>
>> Measurement
>>
>> https://chromestatus.com/metrics/feature/timeline/popularity/4629
>>
>> Adoption plan
>>
>> In our experimental group, around 1% of responses use "zstd"
>> content-encoding. Given the significant benefits of zstandard over gzip,
>> we'd like to see it increase to 10% within 2 years.
>>
>> Estimated milestones
>>
>> Shipping on desktop
>>
>> 123
>>
>> DevTrial on desktop
>>
>> 117
>>
>> Shipping on Android
>>
>> 123
>>
>> DevTrial on Android
>>
>> 117
>>
>> Shipping on WebView
>>
>> 123
>>
>>
>> Anticipated spec changes
>>
>> Open questions about a feature may be a source of future web compat or
>> interop issues. Please list open issues (e.g. links to known github issues
>> in the project for the feature specification) whose resolution may
>> introduce web compat/interop risk (e.g., changing to naming or structure of
>> the API in a non-backward-compatible way).
>>
>> The current standard, RFC8878, doesn't require a limit on the window size
>> used by HTTP servers when compressing Zstandard. An update of some form
>> will be needed to ensure interoperability.
>>
>> Link to entry on the Chrome Platform Status
>>
>> https://chromestatus.com/feature/6186023867908096
>>
>> Links to previous Intent discussions
>>
>> Intent to Prototype: https://groups.google.com/a/
>> chromium.org/g/blink-dev/c/GDsI0Hw-jYk/m/Yc5QZWD-AwAJ
>>
>> Intent to Experiment: https://groups.google.com/a/
>> chromium.org/g/blink-dev/c/I6IWfl95gRU
>>
>>
>> This intent message was generated by Chrome Platform Status
>> <https://chromestatus.com/>.
>>
>>
>> --
>> 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/CAMZNYAN7VRca4VfRqP7pi%
>> 2BnqwDuor4ZVjF9yDNH1mZcXteQURw%40mail.gmail.com
>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAMZNYAN7VRca4VfRqP7pi%2BnqwDuor4ZVjF9yDNH1mZcXteQURw%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/f823c2bc-f224-4ff7-9f78-e9eba9a4949cn%40chromium.org
>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/f823c2bc-f224-4ff7-9f78-e9eba9a4949cn%40chromium.org?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/CAMZNYAMDwUHi%3DLzPafbdg5CgQm4t27ZFLg3am53-no0D3Fg%2B%2BQ%40mail.gmail.com.

Reply via email to