See the 30 March agenda for links to materials.
[Presentation from Justin Toupin and Danyao Wang]
Justin: Thanks for joining today's meeting in light of challenging times. We are looking forward to your questions
[Danyao Wang on the threat analysis behind many of these proposals.]
Danyao: I work on Chrome at
Google
... one of the superpowers of payment handlers is the ability
to share information cross-origins
... so we did a pro-active threat assessment for privacy (and
also partly security; more to come on that front)
... we wanted to do this analysis before payment handler usage
scales
Danyao: We've identified four main groups of threats:
(1) Cross-origin tracking without user interaction
(2) Cross-origin tracking without sufficiently clear user intent to interact
(3) Phishing
(4) Fingerprinting
[The slides summarize these groups.]
Danyao: When show() triggers a
payment handler the payment handler might choose to not show
any user interface, which is one of the issues.
... a user may not realize that a payment handler was
activated.
... Note that one of the phishing concerns is no different than
pop-ups today, but we wanted to include it for
completeness
... Our assessment today is that the fingerprinting risk
associated with payment handlers is low
today for two reasons (1) browser throttling of calls to
hasEnrolledInstrument and (2) small number of payment handlers,
but the latter could change over time as number grows
Gerhard: This is really useful.
There are two times a payment handler can be installed: manual
and just-in-time (JIT).
... does the threat assessment differ depending on which installation
path was used?
Danyao: Short answer: today, no.
Today the threat is not
significantly different because installation is silent. So it's
easy for any party to install a PH as the user "drives by" a site. No
click is required; just visiting a 1p web site suffices
today
... one of the proposals is to make the installation ceremony
more intentional, and we think that will help
Justin: Based on these groups of threats, our proposed mitigations fell into two main categories:
(1) those that are straightforward and self-contained.
(2) those with more complicated implications
Justin: We hope for the former to achieve consensus quickly on what we believe are robuts proposals. For the second we are really seeking more input
[Three Straightforward mitigations]
(1) require user gestures
(2) Strong ux of cross-origin switch
(3) Open payment handler in 3p context by default, but with user consent can have 1p access
Justin: for "require user gestures":
* require user gesture to trigger show(). (Note that this is already required by PR API.)
* require user gesture in a payment handler window before show() promise is allowed to resolve
Justin: How does requiring user gesture to trigger show() affect implementations that make use of cross-origin iframes where the user gesture is not propagated along postMessage()?
Danyao: We are looking for any
merchants or payment handler providers to let us know
... we heard from Google Pay, for example, that in the case of
Stripe payment requests are initiated from an iframe. This
iframe origin is different from the calling context. The user gesture
is not created in the frame, and there's no way to attach the
user gesture to the show(). (Editor: See more below from Mathieu Hofman on this.)
<Zakim> AdrianHB, you wanted to ask about use cases where PH passes request over other channel (e.g. to mobile)
AdrianHB: Use case - you invoke a
payment handler that does not display UI
... the server pushes a message to a mobile phone
... the user consents to pay from the phone
... the user data is sent back to the payment handler code, which
can package up the payment method response, without ever having to
show UI
... can your proposal accommodate that use case?
Danyao: I think the use case here primarily applies to native handlers.
AdrianHB: Not necessarily. A Web-based payment handler could forward information to a service that communicates with the user over another channel (e.g., mobile push, or some other Web API like WebAuthn)
<benoit> imagine a PH that simply renders a QR code and all the interaction is in the phone ... there's no gesture, is there?
Danyao: I think the principle we
are proposing here is that the user be aware that a PH has been
invoked after show()
... so there might be a browser-created spinner (for example) even if there is
no window created by the ph
... e.g., the browser spinner might display "Foo.com is awaiting your response."
... the browser could paint that UI (or the payment handler could)
AdrianHB: Suppose browser paints the
spinner. The spinner can go away before the ph closes
... maybe we can add a sort of time out. Like "the window must
be open for N seconds without a user gesture."
Danyao: I agree that we would
want to support this use cases. Time-based approach may be
reasonable.
... so a combo of user gesture or time on the page is probably
useful.
... so part of next step could be to document flows that would
be "broken" by this proposal (to require user gesture)
and to document workarounds or
solutions
Gerhard: We are using exactly
the flow that Adrian describes (some form of out-of-band notice to the user, eg. over GSM)
... so I agree with something like a "minimum amount of time"
or "minimum amount of space on the screen"
... there are two scenarios potentially:
1) User gesture before show()
2) Or payment can indicate to the user agent "I will do a gesture once I run, so don't ask for one in advance"
Danyao: I am hearing the
requirement for a gesture either before show() or after, and
finding a way to get a single gesture.
... How would we trust that a ph would require the user
gesture?
... we can, for example, ensure that the ph cannot close
without the gesture
... but we cannot guarantee, for example, that the ph has
already has not yet persisted some user information
Gerhard: Maybe there's a
permission thing: I cannot do X until I've gotten consent
(e.g., can't get to indexDB until something has
happened).
... I want to show some information, and upon user "continue"
gesture, I want to be able to access userDb (for example)
Danyao: We will discuss similar proposals later on: restricting write access prior to some other event.
Justin: I agree that some proposals here are likely to cover multiple use cases
tomasz: For SRC (tomorrow's
agenda) we would like to propose to use an iframe in the
payment handler window, where the payment handler does not
display any interaction, but all the interaction is managed
through the iframe.
... that's a case where the user gesture needs to be propagated
to the embedded iframe.
Danyao: In that case, the interactive UI (from iframe)...we can probably treat any user gesture in the frame tree as sufficient.
Frank: I am happy to discuss more about use cases offline
danyao: Thanks, Frank.
Mathieu: Here's more description of
what Danyao was referring to earlier: Our (Stripe) users can call
payment request; processing happens within an iframe.
... for security reasons
... we need the propagation of user gesture ... where the
gesture is done in the merchant page, but the call happens
within a iframe.
... for PCI compliance the basic card data can't go through the
merchant
Danyao: Could the call for action button be rendered in the iframe?
Mathieu: We'd need to allow merchants to determine what shows up in our iframe, which becomes tricky
<AdrianHB> @mathieu: would this go away if you didn't use PR for basic-card?
<mhofman> I suppose, but that's the main use case for us today
Justin: Next is UX indication of
cross-origin switch
... this one is mostly an implementation detail. To alert the user more
clearly that they are interacting on a different origin
... we are thinking about two use cases:
(1) How to alert them during loading
(2) Within the payment handler window, more emphasis on the origin of the payment handler
Justin: We need to do more UX research to validate the efficacy. I think this is otherwise straightforward.
[The proposal to move payment handlers to 3p context by default]
Justin: Browsers are moving in a particular
direction around storage mechanisms and we want payment handlers
to be consistent with that direciton. The proposal is that, by default,
a payment handler opens in 3p context (double-keyed with merchant origin) but the browser will grant 1p access when there is some form of
(one-time) user consent.
... Question is how to sandbox the ph service worker to 3p
access when sw typically have 1p storage
Danyao: The entire proposal
around "Storage Access API" is still under discussion in
Google; so don't have a timeline for moving forward to this
implementation
... we won't roll out this change until we have a good solution
for use cases
... the main challenge here is that the service worker acts an
access point for persistent storage of user's payment
credentials.
... but the sw can also be used in the normal sw sense (e.g.,
intercept fetch requests).
... question is how to differentiate when sw is operating as
part of payment flow v. other flows
... while payment flow we want to restrict storage access, but
we don't want to break other use cases.
... so one proposal is that a sw cannot serve both roles:
payment handler AND another role
... what we are looking for here is more on your use cases that
require storage?
<Matt> Or is the limit only for certain events and not the actual payment event?
ChrisD: What would the user
experience be like to get user consent? Would it be
meaningful?
... Would it be specific like "You are going to make a payment
with X. Is that ok?"
Justin: Are you asking about consent for first party storage access?
ChrisD: Yes
Justin: We'll walk through some
example flows to show that.
... I agree that getting the language right for the user will
definitely be a challenge; I don't think we are there
yet.
... the other approach might be to simply follow
the browser's general
UX approach for requesting consent from the user for storage access.
ChrisD: From reading the proposals, it seems a lot are mitigated through consent, which is a tough UX issue
Justin: Agreed
AdrianHB: I like the mobile solution. Have you done any UX testing for desktop?
Justin: Yes, we are researching for both desktop and mobile
AdrianHB: Danyao commented about being able to understand when to impose (or not impose) restrictions. Are we talking about read-only access to indexDB here?
Danyao: In the 3p storage proposal we don't refer to the "no write access to indexDB" proposal.
AdrianHB: What I'm trying to address in my question - how do we partition functions of a service worker?
Danyao: Yes, we need to look more
into event handling
... a service worker could communicate with open tasks in that
origin and post messages, so the operation could break out of
the event handler itself
... that would require that the user also have a tab open with
the malicious payment handler.
Bryan: On the 3p proposal, I'm wearing my Amazon Pay hat.
<Matt> You can skip me on the queue. I think the discussion vaguely answered my question. Will dive more offline.
Bryan: 1p access is important to
us and we see it as one of the major benefits of the payment
handler approach
... To clarify the concern of payment handlers having access to
1p storage - is that primarily about user checking or reading
of 1p data?
Danyao: mostly about writing of 1p data by a tracker using the payment handler api
(For more details about the origin of the 3p proposal, see: https://github.com/w3c/payment-handler/issues/351)
<Matt> Also remember that there are cases where the PH and Tracker are the same entity.... Its very difficult to protect against that
Danyao: Today its very easy to install a SW (silently) and persist user state
Bryan: +1 to the write access
limitation proposal
... Regarding "one-time user consent", what are you pinning the
user to?
Danyao: Browser instance.
Mathieu: Is there a difference
between this and storage access API?
... For the flows where we need to onboard the user, how would
it work if we are in a payment handler and create local
storage.
Danyao: Regarding "Storage Access
API", yes, the intention was for this to be the same (that is:
we would leverage that emerging specification.)
have been
... we want to align with it
... also note that Storage Access API is partially deployed
(Webkit, Firefox) but not yet in Chrome (experimentation
happening)
... as far as we are thinking for Chrome around payments, once
1p access is granted, then both read and write would be allowed
-- you would be able to set up state on enrollment.
Mathieu: One use case for service workers generally is to intercept some requests. A proposal: if the PH was not installed from 1P ahead of time (or through whatever user consent mechanism), allow it to run but not permanently installed, and only allow it to communicate / act on behalf (including fetch handling) of frames within the page that made the PR invocation (PH sheet and iframes of origin in main document). Would not need 1P storage until storage access granted through PH sheet.
ChrisD: If you present a PH from
having 1p access, will that prevent it from storing shipping,
etc.
... would you potentially provide read access without
consent?
Danyao: I need to think through
more that question
... it seems to me that "read only before consent" may be
ok
<Zakim> Chris_D, you wanted to ask if the PH only has access to 1st party access, will it prevent it from auto populating payment instrument and billing details into the payment flow - one
Justin: Back to proposals that have more complex issues. The next proposals fall basically under three main strategies:
(1) explicit user install
(2) payment handler vetting
(3) threat vector removal
Justin: these are not entirely
mutually exclusive.
... and also there are probably still edge cases with
each
... and the questions about user consent and how good it is are
still important here
[Explicit user consent for install]
Justin: PHs need explicit user consent to access local storage and hasEnrolledINstrument(). Consent could happen at install or first use
(We see some flows and UX)
Justin: We think that both of these flows (we've shown) may be required for different use cases
AdrianHB: Point of clarification on your first flow example - is that JIT?
Justin: Yes
AdrianHB: how would this work if you also had to show the sheet?
Justin: The reason that we need
the second flow is where JIT is not possible (e.g.,
standardized payment method)
... I don't have any UI here for how it would look with the
sheet, but it would look very similar
Danyao: If we were to have a payment sheet, it would probably show prior to the user consent prompt.
Justin: Also when a payment handler
selector is
required (the sheet or other mechanism), that is another option to provide
information about whether a payment handler has been used
previously.
... A pro of the explicit install proposal: transparent to the user and probably improves user awareness
Justin: But con New consent step might create drop-off. Key open questions: could an extra consent step harm viability of ph? What happens when consent is declined? What does that flow look like?
jalpesh: on the experience that AdrianHB was referring to, is the second screen shown by the browser?
Justin: Yes
Jalpesh: That makes sense.
Justin: We don't know yet what forms of customization (if any) might be possible by the payment handler
nicktr: I think that consent is
really important.
... the consent is likely to be one-time, so the friction may
be lessened in that way
... I think explicitly install is strongly the way to go.
<AdrianHB> +1 to NickTR
Ian: The proposal refers to two options for consent: at install or on first use. Based on discussion there might be a third option: during the payment handler's execution. The idea is that the payment handler may have a way to integrate consent smoothly into that particular payment method flow. The browser could prevent the payment handler from doing some things until such time as the payment handler has triggered the request for consent.
Gerhard: Explicit install brings
with it some benefits
... to nick's point, if I install it on Chrome instance #1, do
I need to consent to Chrome instant #2?
Justin: My intuition is that it
would be nice to propagate across instances of a browser, but a lot of
investigation would be necessary. And we'd also want to align
with similar browser use cases.
... so as a guiding principle is that if the browser knows the
user across instances, it should work that way
Gerhard: There are two phases to
using a payment handler (e.g., guest checkout scenario):
(1) Enrollment of credentials and (2) Transaction time. It may make sense to
allow for two different consent journeys --- when I am doing
things at the payment handler 1p context, or when I am shopping
on a different merchant site (JIT install)
... so JIT install and "explicit install" may involve 2 consent
flows
AdrianHB: I agree maybe in the 1p
instance we don't need the same level of user gesture
... e.g, ordinary service worker install
... but the user still would need to do things when the user
wants to use this handler on other sites
mhofman: Would there be any way
for the merchant to see if the payment handler has already been
installed?
... and to install the onboarding "penalty" if they don't want
to opt into that.
Danyao: hasEnrolledInstrument
could answer that
mhofman: But what if hasEnrolledInstrument
("hEI") usage is
restricted?
Danyao: For now the restrictions we have in mind for hEI are (1) if not installed, hEI returns false(). (2) but after install can return true (but read only access to storage)
btidor: Does this really plug the
privacy hole? Will users forget having installed payment
handlers? And will they understand their ongoing consent?
... I suggest perhaps moving the consent into the payment flow
itself
Danyao: We did explore expiration
of consent. E.g., if the user has not used the ph after some
period of time, then the user is reprompted
... ...I agree that "permanent approval" poses issues
... expiry is on the table
<AdrianHB> @btidor: I think there are a number of mitigations that can be introduced to handle long lived PHs potentially tracking users. For example, if the hasEnrolledInstrument is called a lot but the Ph is never invoked the browser might expire the consent
rouslan: the user may not
understand that installing a ph on one site might be used on
other sites
... would it be crazy to install payment handlers from a web
site
... that means that each web site would have to go through the
onboarding flow
... the advantage would be that the user understands more that
the ph interacts with different web sites
<AdrianHB> I would expect that there will soon be an ability within browsers to review the Payment Apps you have installed etc
<danyao> +1 yes to give user ability to review installed payment handlers
Justin: Next topic is 'payment
handler vetting'
... One proposal is that only "vetted" payment handlers could
have access to 1p local storage and
hasEnrolledInstrument.
... vetting could be per-browser or a global registry
... pros include low incremental user friction and minimal
change for current payment handlers
... cons include payment handler onboarding friction and cost
of maintaining a gatekeeper registry
Gerhard_: There are a number of
organizations that do some vetting
... so may wish to distribute the vetting process to other
organizations
<AdrianHB> Propose that we make "vetting payment handlers" a last resort
Ian: I have concerns about any entity being a centralised gatekeeper. Tthe payment method manifest is an implementation of a delegated approach. I wondered if the FIDO folk can offer insight from their certification experiences...
<AdrianHB> "Certification" to use a Web Platform API would be unprecedented
John_Bradley: Complicated beasts.
I would lean on existing programs, especially in Europe
... where people have to register and get a qualified digital
certificate
... running a certification program is expensive and
potentially legally fraught.
JohnFontana: +1 to JohnB's comments. Once you wander away from simplicity it can be very challenging.
stpeter: Agree in general with challenge of registry. We and the other browsers have had challenging experiences with Web extensions that have malicious behavior. I think we need to take action on this front in some form or another.
stpeter: Increasing onboarding friction for those who are already doing the right thing is not a major problem
ChrisD: +1 to Peter
<AdrianHB> +1 to stpeter
<Zakim> Chris_D, you wanted to comment that payment handlers get to solicit sensitive PFI from consumers; WebPayments gives a payment handler a level of credibility and therefore should it
ChrisD: Payment handlers need to be trusted by users...so I think we need to take steps to ensure that rogue payment handlers are not unleashed, and it would not be a major hurdle for legitimate market actors
Justin: Third option at a high
level is to attempt to remove threat vectors.
... for example, do we need hasEnrolledInstrument
?
... we have heard that some in the ecosystem consider this very
important.
... are there alternatives that would still be useful?
Danyao: Two additional proposals
related to querying user environment.
... there has been some confusion about canMakePayment
and
hasEnrolledInstrument
.
... we've linked to a proposal to clarify that there are 2
events available
... but having 2 APIs doesn't change the threat surface
... but it would have some impact on payment handler
distributors (since there would be a second event to
handle)
<benoit> no idea what happened to my connection; my concerns about a certification process were likely already mentioned by now by others ... that up-starts will have a Goliath to face, and using existing programs like those in the EU for PISP or even PCI impose a burden that a) may not be necessary for early stage companies, or b) may not exist from a regulatory is the startup's country/region
<AdrianHB> +1 benoit
Danyao: While waiting, I have greater clarity and understanding of concerns. Justin and I will update the proposals and schedule offline converations
<mhofman> What was the @chromium list that was mentioned?
AdrianHB: Proposal inspired by
payment handlers that want to use WebAuthn for strong
authentication
... goal is to combine 2 gestures: launch webauthn and launch
payment handler. The proposal involves a
modification to payment handler registration -- the ph
registers credentials. Gist of idea is to have
the browser trigger webauthn for registered credentials and
update the UX to say "Authenticate" and to enable single
gesture to launch WebAuthn or payment handler
... Some questions in the deck.
...including: scenarios where this would not work (e.g., JIT
installation)? Would this work equally well with other forms of
credential than WebAuthn?
Gerhard_: We've seen demos of a minimal flow. Could you achieve the same with a payment handler specifically done for authentication?
AdrianHB: The minimum UI flow is
similar to what I'm talking about. The difference at the moment
is the signal from the browser that the user has agreed to the
payment.
... it's not a full signed assertion (with WebAuthn
challenge)
Danyao: +1 to Adrian's
distinction
... the original minimal flow was just a demo. Seeing AHB's
proposal, I think that's a direction to go in.
<Zakim> Chris_D, you wanted to ask whether WebAuthN data could be exposed to a rouge payment handler by providing the assertion proactively? Could a rouge PH act as a man-in-the middle if
Nick: Let's take up Chris's question at call on Weds on authentication
Nick: Thanks to all. Tomorrow SRC!