Without saying whether it is appropriate to block data urls, I would like to say that doing what the site is doing with icons in data urls is far from the best way to do it. Since there are better ways to accomplish the same output, it's not in itself a use pattern that must be preserved. It is better to either have the icons in a separate file, or if that is unsuitable, have them inline in an invisible svg. I put a quick demo at https://dbratell.github.io/svg-use-icons/ but in short you could have

<svg style="display:none"><defs><symbol id="icon1">...</symbol><symbol id="icon2">...</symbol></defs></svg>

And then refer to the icons in it with <svg><use xlink:href="#icon1"></svg> or <svg><use xlink:href="#icon2"></svg>

That would have cut tens of KB from the cz site source. I checked with fs and thanks to optimizations Blink would not have created a separate svg document for each icon but that was also a risk.

(Also curious to the answer to Alex' question)

/Daniel

On 2023-01-18 17:50, Alex Russell wrote:
Per today's API OWNERs meeting, a dumb question: is the XSS risk here largely down to script execution triggered by this pattern? Or non-script content in the inline'd SVG?

Thanks

On Tuesday, January 17, 2023 at 10:52:29 PM UTC-8 Jun Kokatsu wrote:

    On Tue, Jan 17, 2023 at 11:36 AM Brandon Heenan
    <bhee...@google.com> wrote:

        Thanks for adding me. Yes, this definitely seems like the
        pattern where we'd want a temporary enterprise policy to
        re-enable support for ~3 milestones after we remove support by
        default. go/chrome-enterprise-friendly
        <https://goto.google.com/chrome-enterprise-friendly> gets into
        the details of the why,
        
https://source.chromium.org/chromium/chromium/src/+/main:docs/enterprise/add_new_policy.md
        
<https://source.chromium.org/chromium/chromium/src/+/main:docs/enterprise/add_new_policy.md>
        is the step-by-step, and the enterprise team is always happy
        to advise as well.

    Thank you for the details on enterprise policy! I'll make sure to
    follow those steps when I plan to remove the feature by default!

        On Tue, Jan 17, 2023 at 10:51 AM Rick Byers
        <rby...@chromium.org> wrote:

            On Tue, Jan 17, 2023 at 4:48 AM Yoav Weiss
            <yoavwe...@chromium.org> wrote:

                Would it be possible to turn
                
<https://source.chromium.org/chromium/chromium/src/+/main:components/page_load_metrics/browser/observers/use_counter/ukm_features.cc;l=30?q=ukm%20usecounter&ss=chromium>
                the usecounter into a UKM to get a better view of the
                number of impacted origins, beyond just the homepage?


            Yeah that could be useful. But we've also got some leads
            already so getting more leads may not be critical until we
            follow up on the ones we have. Can we find a developer for
            one of those sites who will talk to us about where that
            pattern is coming from in their toolchain and how they'd
            migrate off it? Having the UKM data will also help in
            selecting the sites that will have the most impact on our
            users (and hence our UseCounter stats). Maybe we'll get
            lucky and find that, despite the long tail, 90% of the
            usage is from just a few sites we can work with.

    Added UKM at https://crrev.com/c/4171733.


                I wonder if this would be a good candidate for a
                deprecation trial + enterprise policy. That would
                solve this injection vector for the broader web, while
                giving impacted folks some more time to move away from
                this pattern.


            Good idea. Impacting a large number of small sites is
            still problematic for a deprecation trial. Just reaching
            enough to make any change at all is the hard part. Perhaps
            we can make replacing the usage easier than the overhead
            of getting an applying an OT token? Still a deprecation
            trial would probably be useful. Enterprise policy,
            certainly. +Brandon Heenan <mailto:bhee...@google.com> can
            help advise on that. I'd also advise leaving this enabled
            for WebView (at least to start), it feels like the sort of
            chromium rendering quirk we've found Android apps to rely
            on disproportionately in the past.

                On Fri, Jan 13, 2023 at 9:11 PM 'Jun Kokatsu' via
                blink-dev <blink-dev@chromium.org> wrote:

                    Thank you Rick for the detailed explanation!

                    On Fri, Jan 13, 2023 at 10:30 AM Rick Byers
                    <rby...@chromium.org> wrote:

                        Eliminating this makes sense to me given the
                        security benefit. Thank you for pushing it!
                        But it does seem somewhat risky from a web
                        compat perspective. 0.005% is above our "small
                        but non-trivial risk
                        
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.mqfkui78vo5z>"
                        rule of thumb. Here's a bit of an analysis
                        according to our other compat principles
                        <http://bit.ly/blink-compat>:

                          * Severity of breakage
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.u5ya6jvru7dl>:
                            lower given this is likely only about some
                            visualis, but this site
                            <https://jobs.nzz.ch/> is a good example
                            of non-trivial UI breakage. This pattern
                            of putting a base64-encoded SVG into an
                            SVG <use> element with nothing else in the
                            <svg> is weird, isn't it? Why would
                            someone do that rather than just put the
                            SVG in directly, or put the data URL into
                            an img tag?

                    I've looked into that site. And it seems like they
                    are reusing a single SVG image (i.e. data: URL SVG
                    image) which contains several images, and changing
                    which image should be rendered by combination of
                    symbol
                    
<https://developer.mozilla.org/en-US/docs/Web/SVG/Element/symbol> +
                    id (which is only possible in use element, and not
                    in img tag). Migration can be done by hosting the
                    same image in the same-origin endpoint, converting
                    it to blob: URL and assigning that to the <use>
                    element, or inlining each SVG image.


            Interesting. So could we write a tool which, given the
            source html, transforms it to simply inline the selected
            SVG? That would save some bytes too, right? We've found in
            the past that when we give developers easy tools to
            trivially adapt their code, then it makes moderate-risk
            deprecations go quite smoother. I.e. when we get to the
            point of having a deprecation warning (and report
            <https://wicg.github.io/deprecation-reporting/>) for the
            usage, if we can simply say "for most cases we've found
            you can just run your html through this tool to adapt it
            automatically", then that would help a LOT in having the
            comfort to make the breaking change. Someone from the
            devrel or tooling teams with experience in how developers
            approach images in practice (eg. +Addy Osmani
            <mailto:ad...@chromium.org>) might be able to advise on a
            pragmatic and helpful path.


    I've created a site to convert data: URLs in SVGUseElement to
    inline SVG.
    https://data-urls-in-svg-converter.glitch.me/
    <https://data-urls-in-svg-converter.glitch.me/>

                          * I don't suppose there's some creative way
                            to allow this specific odd pattern while
                            still getting the security benefit, is there?

                    Unfortunately, no. While we could read the href
                    value of <use> elements and convert the data: URL
                    to blob: URL, we won't know if the data: URL was
                    set by the site owner, or a malicious attacker
                    (through HTML injection). So while we could
                    provide such a library, it does not provide the
                    security benefit that we are seeking.

                          * Unique sites impacted
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.4k9u8ddizqrq>:
                            Finding a variety of small sites is
                            actually a lot worse than if we had found
                            only a few bigger sites. It means there's
                            probably some common tool or pattern
                            leading different designers/developers to
                            do this and so likely a relatively large
                            number of individuals who would need to be
                            involved in fixing the breakage. Of course
                            our HTTP Archive list of sites is just a
                            subset of who's fully impacted, so if the
                            problem is a long-tail one as it seems,
                            HTTP archive data shows us only the tip of
                            that long tail.
                          * Security
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.iklh96dxj81w>:
                            it's definitely worth taking some comapt
                            risk to reduce XSS surface area. I don't
                            fully understand the threat model though.
                            Is this mainly a risk for sites who are
                            programmatically putting (potentially
                            attacker-controlled) strings into
                            SVGUseElement hrefs? Or are you more
                            worried about cases where the attacker
                            controls the HTML and can take advantage
                            of this oddity in the platform on any
                            normal site? I'm just trying to gauge the
                            magnitude of the security benefit here to
                            weigh it against the comapt risk, any help
                            is appreciated.

                    We are worried about both (i.e. Server-side
                    injection and DOM XSS). The fact that this has led
                    to several browser security feature bypasses (e.g.
                    Sanitizer API and Trusted Types) suggests that
                    it's not a commonly known XSS sink, and therefore
                    we believe that it's common for security
                    mechanisms (e.g. sanitizers, linters) to miss this
                    odd feature.

                          * Ease of adaptation
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.x5bhg5grhfeo>:
                            seems like it should be easy to use an
                            alternative, at least for these image
                            cases, but I guess it's hard to say
                            without knowing why people are doing this.
                            Is there perhaps some website design tool
                            which is generating this and will need to
                            change?

                    I think it is easy to migrate by hosting the same
                    image to the same-origin endpoint. However, I do
                    understand that it's just less work to use data:
                    URL than using same-origin image or blob: URL.

                          * Interop
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.4hjbxw7513sw>:
                            The fact that this doesn't work in Safari
                            is a vote in favor of breaking it in
                            chromium to achieve interop. It does work
                            in Firefox though.

                     For the interop, it's best to use a same-origin
                    URL or blob: URL. And since both Mozilla and
                    Webkit are supportive, I believe it's positive.

                          * Standards conformance
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.xcsa26ortrmi>:
                            This is allowed by spec today, so breaking
                            it requires some more diligence

                    Note that the PR
                    <https://github.com/w3c/svgwg/pull/901> to SVG
                    spec got merged.


            Right, yes, sorry. What I meant was we took the initiative
            to make a breaking change to long established behavior -
            IMHO that makes the bar higher than if Chrome had just had
            a bug in allowing something that was never spec'd or
            allowed by other browsers. Still I think we can use this
            positively in our outreach - say something like "the spec
            has changed to not allow this, all the major browser
            engines agree that for security reasons it should be
            disallowed. It already doesn't work in Safari and
            other WebKit browsers, we want to help you fix your site
            to work in all browsers".

                          * Enterprise
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.axcg738lzcs9>:
                            Being broken in Safari is an indication
                            the risk will be higher in
                            enterprise software which is often
                            chromium-only. We may need to go through
                            the enterprise breaking change process
                            
<https://www.chromium.org/developers/enterprise-changes/>.
                          * Outreach
                            
<https://docs.google.com/document/d/1RC-pBBvsazYfCNNUSkPqAVpSpNJ96U8trhNkfV0v9fk/edit#heading=h.t9ade4ywppcg>:
                            Given the relatively high usage, if we
                            want to proceed with this plan I think
                            this is the main opportunity for
                            mitigations. Can we try contacting some of
                            these sites we've identified to understand
                            why they're using this pattern? Is there a
                            tool generating this pattern which we can
                            get updated before we make the change? I
                            think we'd need a blog post capturing what
                            we've learned from talking with a few
                            customers who have done this and how they
                            fixed it for their UI design flow.

                        Sorry it's not looking to be an easy decision,
                        but I hope this gives you some ideas for how
                        we might be able to reduce the risk to a point
                        that we could proceed. WDYT?


                    Yes, it sounds good to me! I will check what has
                    to be done and do those step by step 🙂


            Ok, good luck! Sorry this isn't as straightforward as a
            clear recipe.  But if we can get a couple developers
            telling us they were easily able to fix their issue by
            using a tool or straightforward instructions we can point
            other to, and we see the UseCounter drop significantly
            (say by half or so) without major new red flags, then I'd
            personally be OK approving a removal attempt. Of course
            it's common to learn during beta (or, worst case, upon
            stable release) that the compat issue is worse than we
            thought and so the change needs to be reverted (or flagged
            off with finch) in a hurry. But I think we've learned a
            lot over the years about how to predict and avoid that
            failure mode. Let me know if I can do anything else to
            help, happy to meet to brainstorm further for example.
            Good luck!


    Thanks! I'll start outreach for a couple of sites we already know
    are affected, and go from there!



                        Rick

                        On Thu, Jan 12, 2023 at 3:11 PM 'Jun Kokatsu'
                        via blink-dev <blink-dev@chromium.org> wrote:

                            On Thu, Jan 12, 2023 at 10:44 AM Mike
                            Taylor <miketa...@chromium.org> wrote:

                                On 1/11/23 6:49 PM, 'Jun Kokatsu' via
                                blink-dev wrote:


                                        Contact emails

                                jkoka...@google.com


                                        Specification

                                
https://svgwg.org/svg2-draft/struct.html#UseElementHrefAttribute
                                
<https://svgwg.org/svg2-draft/struct.html#UseElementHrefAttribute>

                                https://github.com/w3c/svgwg/pull/901/files
                                <https://github.com/w3c/svgwg/pull/901/files>


                                        Summary

                                Assigning a data: URL in
                                SVGUseElement can cause XSS. And this
                                also led to a Trusted Types bypass.


                                Therefore, we plan to deprecate and
                                remove support for it.



                                        Blink component

                                Blink>SVG
                                
<https://bugs.chromium.org/p/chromium/issues/list?q=component:Blink%3ESVG>


                                        Motivation

                                Assigning an attacker controlled
                                string to SVGUseElement.href causes
                                XSS and a Trusted Types bypass
                                
<https://github.com/w3c/trusted-types/issues/357>because
                                of data: URLs. If we fix this bug by
                                requiring TrustedScriptURL assignment
                                to SVGUseElement.href under Trusted
                                Types enforcement, many sites would
                                need to refactor code (even for
                                same-origin URL or Blob URL assignment).


                                Since Webkit does not support data:
                                URLs in SVGUseElement and both
                                Mozilla and Webkit are supportive for
                                the removal, we think that removing
                                support for data: URLs in
                                SVGUseElement is the right way to
                                solve this problem.


                                Additionally, data: URLs can only
                                trigger script execution in script
                                loaders such as HTMLScriptElement.src
                                or dynamic import
                                
<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import>.
                                However, SVGUseElement is an
                                exception to this, which also caused
                                a bypass
                                
<https://bugs.chromium.org/p/chromium/issues/detail?id=1306450#c10>in
                                the Sanitizer API. We believe that
                                this also led to several other bugs
                                in sanitizers and linters missing a
                                check for this special case.


                                The usage
                                
<https://chromestatus.com/metrics/feature/timeline/popularity/4356>of
                                data: URLs in SVGUseElement is about
                                0.005%.


                                Digging into the HTTP Archive shows
                                usages in ~50 sites. There are 2
                                major sites (slickdeals.net
                                <http://slickdeals.net>and
                                hunter.104.com.tw
                                <http://hunter.104.com.tw>) which use
                                data: URLs in SVGUseElement.

                                The use in slickdeals.net
                                <http://slickdeals.net>is invisible
                                (i.e. used in the footer but doesn't
                                appear), and hunter.104.com.tw
                                <http://hunter.104.com.tw>is using it
                                for a single icon in the footer
                                (which is already broken when
                                rendered in Webkit). Rest of the
                                usages seems to be in individual
                                small sites.

                                I poked around the 10 sample sites at
                                the bottom of the use counter:

                                https://www.aspareanord.it/,
                                https://www.umbria.camcom.it,
                                https://www.bisenzio.it/,
                                https://www.comune.vernio.po.it/
                                <https://www.comune.vernio.po.it/>,
                                https://appaltinnovativi.gov.it/
                                <https://appaltinnovativi.gov.it/>,
                                https://www.gdf.gov.it/,
                                https://www.us.schott.com/,
                                https://shop.wavin.com/,
                                https://jobs.nzz.ch/,
                                https://www.learnapp.com/

                                For the 6 Italian sites (I guess the
                                same agency made them?), the right
                                arrow icon next to "Vedi" would
                                disappear. For a site like
                                https://jobs.nzz.ch - there's a number
                                of visually significant design icons
                                that would be gone towards the bottom
                                (and yes, it looks sort of broken
                                today in Safari).

                                It's not the end of the world, looking
                                at these 10 sites, but I wonder how a
                                developer would know how to fix this.
                                Have you considered a DevTools issue?


                            Thank you for the suggestion! Yes, I do
                            plan to follow Deprecation steps
                            
<https://chromium.googlesource.com/chromium/src/+/HEAD/third_party/blink/renderer/core/frame/deprecation/README.md>
 and
                            add a Devtools issue 🙂


                                        Initial public proposal



                                        TAG review



                                        TAG review status

                                Not applicable.

                                Because this intent removes part of a
                                feature, and it is already shipped in
                                Webkit (i.e. never supported).


                                        Risks



                                        Interoperability and
                                        Compatibility



                                Gecko: Positive
                                
<https://github.com/mozilla/standards-positions/issues/718>


                                WebKit: Positive
                                
<https://github.com/WebKit/standards-positions/issues/108>


                                Web developers: No signals



                                        Debuggability



                                        Is this feature fully tested
                                        by web-platform-tests
                                        
<https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md>?

                                Yes
                                
<https://github.com/web-platform-tests/wpt/pull/37511>


                                        Flag name

                                RemoveDataUrlInSvgUse



                                        Requires code in //chrome?

                                False


                                        Tracking bug

                                
https://bugs.chromium.org/p/chromium/issues/detail?id=1300195
                                
<https://bugs.chromium.org/p/chromium/issues/detail?id=1300195>


                                        Estimated milestones

                                Deprecate for 2 milestones, then
                                remove depending on breakages.

                                Can you say more about what the
                                deprecation looks like (i.e., blog
                                post, deprecation reports, devtools
                                issue, etc)?


                                        Link to entry on the Chrome
                                        Platform Status

                                
https://chromestatus.com/feature/5128825141198848
                                
<https://chromestatus.com/feature/5128825141198848>


                                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
                                <mailto:blink-dev+unsubscr...@chromium.org>.
                                To view this discussion on the web
                                visit
                                
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAOWKMF6VXw7jmQoZM47i3ybzn%3D5Pc4mw26Khv9U9aP_UzBt-dg%40mail.gmail.com
                                
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAOWKMF6VXw7jmQoZM47i3ybzn%3D5Pc4mw26Khv9U9aP_UzBt-dg%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
                            <mailto:blink-dev+unsubscr...@chromium.org>.
                            To view this discussion on the web visit
                            
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAOWKMF5KQOG5R8baUM41T4fR01QbGFjvvEsf629h%2BzASCn_F0Q%40mail.gmail.com
                            
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAOWKMF5KQOG5R8baUM41T4fR01QbGFjvvEsf629h%2BzASCn_F0Q%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
                    <mailto:blink-dev+unsubscr...@chromium.org>.
                    To view this discussion on the web visit
                    
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAOWKMF65KcSCkzVupRw4n8ZG%3DKKbG5GY62HzwNSZW4Z78ZYd_w%40mail.gmail.com
                    
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAOWKMF65KcSCkzVupRw4n8ZG%3DKKbG5GY62HzwNSZW4Z78ZYd_w%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/d63c3823-20b6-457c-bff9-f85429421bf0n%40chromium.org <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/d63c3823-20b6-457c-bff9-f85429421bf0n%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/50b4316e-6c59-f829-c6f0-11a8553d9aa2%40gmail.com.

Reply via email to