Skip to content

Commit d89dfd4

Browse files
Merge pull request #155 from w3c/wrong-credential-attack
SHA: ba3b586 Reason: push, by @ianbjacobs Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent d70872b commit d89dfd4

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

index.html

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<meta content="w3c/ED" name="w3c-status">
77
<meta content="Bikeshed version d7036035b, updated Fri Oct 8 17:07:11 2021 -0700" name="generator">
88
<link href="https://www.w3.org/TR/secure-payment-confirmation/" rel="canonical">
9-
<meta content="4015745a298491ecc685647259da2b2c15bf7682" name="document-revision">
9+
<meta content="ba3b5863e77410956f82ee50e6924238503dc06a" name="document-revision">
1010
<style>/* style-autolinks */
1111

1212
.css.css, .property.property, .descriptor.descriptor {
@@ -279,7 +279,7 @@
279279
<div class="head">
280280
<p data-fill-with="logo"><a class="logo" href="https://www.w3.org/"> <img alt="W3C" height="48" src="https://www.w3.org/StyleSheets/TR/2016/logos/W3C" width="72"> </a> </p>
281281
<h1 class="p-name no-ref" id="title">Secure Payment Confirmation</h1>
282-
<h2 class="no-num no-toc no-ref heading settled" id="profile-and-date"><span class="content">Editor’s Draft, <time class="dt-updated" datetime="2021-11-02">2 November 2021</time></span></h2>
282+
<h2 class="no-num no-toc no-ref heading settled" id="profile-and-date"><span class="content">Editor’s Draft, <time class="dt-updated" datetime="2021-11-03">3 November 2021</time></span></h2>
283283
<div data-fill-with="spec-metadata">
284284
<dl>
285285
<dt>This version:
@@ -1360,7 +1360,9 @@ <h3 class="heading settled" data-level="10.2" id="sctn-security-merchant-data"><
13601360
<p>This could lead to a spoofing attack, in which a merchant presents incorrect
13611361
data to the user. For example, the merchant could tell the bank (in the
13621362
backend) that it is initiating a purchase of $100, but then pass $1 to the SPC
1363-
API (and thus show the user a $1 transaction to verify).</p>
1363+
API (and thus show the user a $1 transaction to verify). Or the merchant
1364+
could provide the correct transaction details but pass Secure Payment
1365+
Confirmation credentials that don’t match what the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party③⑦">Relying Party</a> expects.</p>
13641366
<p>Secure Payment Confirmation actually makes defeating this kind of attack easier
13651367
than it currently is on the web. In online payments today, the bank has to
13661368
trust that the merchant showed the user the correct amount in their checkout
@@ -1419,7 +1421,7 @@ <h3 class="heading settled" data-level="11.1" id="sctn-security-cross-origin-reg
14191421
<h3 class="heading settled" data-level="11.2" id="sctn-privacy-probing-credential-ids"><span class="secno">11.2. </span><span class="content">Probing for credential ids</span><a class="self-link" href="#sctn-privacy-probing-credential-ids"></a></h3>
14201422
<p>As per WebAuthn’s section on <a href="https://www.w3.org/TR/webauthn-3/#sctn-assertion-privacy">Authentication
14211423
Ceremony Privacy</a>, implementors of Secure Payment Confirmation must make sure
1422-
not to enable malicious callers (who now may not even be the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party③">Relying Party</a>)
1424+
not to enable malicious callers (who now may not even be the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party③">Relying Party</a>)
14231425
to distinguish between these cases:</p>
14241426
<ul>
14251427
<li data-md>
@@ -1433,7 +1435,7 @@ <h3 class="heading settled" data-level="11.2" id="sctn-privacy-probing-credentia
14331435
accessed then the caller can conclude that at least one of the passed
14341436
credentials is available to the user.</p>
14351437
<h3 class="heading settled" data-level="11.3" id="sctn-privacy-joining-payment-instruments"><span class="secno">11.3. </span><span class="content">Joining different payment instruments</span><a class="self-link" href="#sctn-privacy-joining-payment-instruments"></a></h3>
1436-
<p>If a <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party③">Relying Party</a> uses the same credentials for a given user across
1438+
<p>If a <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party③">Relying Party</a> uses the same credentials for a given user across
14371439
multiple payment instruments, this might allow a merchant to join information
14381440
about payment instruments that might otherwise not be linked. That is, across
14391441
two different transactions that a user U performs with payment instruments P1
@@ -1444,7 +1446,7 @@ <h3 class="heading settled" data-level="11.3" id="sctn-privacy-joining-payment-i
14441446
(e.g. their address), however it could become a privacy attack if, e.g.,
14451447
payment tokenization becomes commonplace.</p>
14461448
<p>One possible way to defeat this may be to hash the credential IDs with a random
1447-
salt from the Account Provider (<a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party③⑨">Relying Party</a>):</p>
1449+
salt from the Account Provider (<a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party④⓪">Relying Party</a>):</p>
14481450
<ol>
14491451
<li data-md>
14501452
<p>Merchant requests the list of credential IDs from the Account Provider.</p>
@@ -1467,10 +1469,10 @@ <h3 class="heading settled" data-level="11.3" id="sctn-privacy-joining-payment-i
14671469
a local list of credentials.</p>
14681470
<p>See <a href="https://github.com/w3c/secure-payment-confirmation/issues/77">this issue</a> for more details.</p>
14691471
<h3 class="heading settled" data-level="11.4" id="sctn-privacy-credential-id-tracking-vector"><span class="secno">11.4. </span><span class="content">Credential ID(s) as a tracking vector</span><a class="self-link" href="#sctn-privacy-credential-id-tracking-vector"></a></h3>
1470-
<p>Even for a single payment instrument, the credential ID(s) returned by the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party④">Relying Party</a> could be used by a malicious entity as a tracking vector, as
1472+
<p>Even for a single payment instrument, the credential ID(s) returned by the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party④">Relying Party</a> could be used by a malicious entity as a tracking vector, as
14711473
they are strong, cross-site identifiers. However in order to obtain them from
1472-
the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party④">Relying Party</a>, the merchant already needs an as-strong identifier to
1473-
give to the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party④">Relying Party</a> (e.g., the credit card number).</p>
1474+
the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party④">Relying Party</a>, the merchant already needs an as-strong identifier to
1475+
give to the <a data-link-type="dfn" href="https://w3c.github.io/webauthn/#relying-party" id="ref-for-relying-party④">Relying Party</a> (e.g., the credit card number).</p>
14741476
<p>As above, a possible solution to this would be to hash the credential ID(s)
14751477
with a random salt, making them non-consistent across calls.</p>
14761478
<h2 class="heading settled" data-level="12" id="sctn-accessibility-considerations"><span class="secno">12. </span><span class="content">Accessibility Considerations</span><a class="self-link" href="#sctn-accessibility-considerations"></a></h2>
@@ -1816,10 +1818,10 @@ <h3 class="no-num no-ref heading settled" id="index-defined-here"><span class="c
18161818
<li><a href="#ref-for-relying-party②④">10.1. Cross-origin authentication ceremony</a> <a href="#ref-for-relying-party②⑤">(2)</a>
18171819
<li><a href="#ref-for-relying-party②⑥">10.1.1. Login Attack</a> <a href="#ref-for-relying-party②⑦">(2)</a> <a href="#ref-for-relying-party②⑧">(3)</a> <a href="#ref-for-relying-party②⑨">(4)</a> <a href="#ref-for-relying-party③⓪">(5)</a> <a href="#ref-for-relying-party③①">(6)</a> <a href="#ref-for-relying-party③②">(7)</a>
18181820
<li><a href="#ref-for-relying-party③③">10.1.2. Payment Attack</a> <a href="#ref-for-relying-party③④">(2)</a> <a href="#ref-for-relying-party③⑤">(3)</a>
1819-
<li><a href="#ref-for-relying-party③⑥">10.2. Merchant-supplied authentication data</a>
1820-
<li><a href="#ref-for-relying-party③">11.2. Probing for credential ids</a>
1821-
<li><a href="#ref-for-relying-party③">11.3. Joining different payment instruments</a> <a href="#ref-for-relying-party③⑨">(2)</a>
1822-
<li><a href="#ref-for-relying-party④">11.4. Credential ID(s) as a tracking vector</a> <a href="#ref-for-relying-party④">(2)</a> <a href="#ref-for-relying-party④">(3)</a>
1821+
<li><a href="#ref-for-relying-party③⑥">10.2. Merchant-supplied authentication data</a> <a href="#ref-for-relying-party③⑦">(2)</a>
1822+
<li><a href="#ref-for-relying-party③">11.2. Probing for credential ids</a>
1823+
<li><a href="#ref-for-relying-party③">11.3. Joining different payment instruments</a> <a href="#ref-for-relying-party④⓪">(2)</a>
1824+
<li><a href="#ref-for-relying-party④">11.4. Credential ID(s) as a tracking vector</a> <a href="#ref-for-relying-party④">(2)</a> <a href="#ref-for-relying-party④">(3)</a>
18231825
</ul>
18241826
</aside>
18251827
<aside class="dfn-panel" data-for="term-for-webauthn-extensions">

0 commit comments

Comments
 (0)