<!DOCTYPE html>
<html lang="en" class="Internet-Draft">
<head>
<meta charset="utf-8">
<meta content="Common,Latin" name="scripts">
<title>FAPI 2.0 Attacker Model</title>
<meta content="Daniel Fett" name="author">
<meta content="
       OIDF FAPI 2.0 is an API security profile suitable for high-security
applications based on the OAuth 2.0 Authorization Framework
 . This document describes that attacker model that informs
the decisions on security mechanisms employed by the FAPI security
profiles. 
    " name="description">
<meta content="xml2rfc 2.23.0" name="generator">
<meta content="security" name="keyword">
<meta content="openid" name="keyword">
<link href="FAPI_2_0_Attacker_Model.xml" type="application/rfc+xml" rel="alternate">
<link href="#copyright" rel="license">
<style type="text/css">/* fonts */
@import url('https://fonts.googleapis.com/css?family=Noto+Sans'); /* Sans-serif */
@import url('https://fonts.googleapis.com/css?family=Noto+Serif'); /* Serif (print) */
@import url('https://fonts.googleapis.com/css?family=Roboto+Mono'); /* Monospace */

@-ms-viewport {
  width: extend-to-zoom;
  zoom: 1.0;
}
/* general and mobile first */
html {
}
body {
  max-width: 90%;
  margin: 1.5em auto;
  color: #222;
  background-color: #fff;
  font-size: 14px;
  font-family: 'Noto Sans', Arial, Helvetica, sans-serif;
  line-height: 1.6;
  scroll-behavior: smooth;
}
.ears {
  display: none;
}

/* headings */
#title, h1, h2, h3, h4, h5, h6 {
  margin: 1em 0 0.5em;
  font-weight: bold;
  line-height: 1.3;
}
#title {
  clear: both;
  border-bottom: 1px solid #ddd;
  margin: 0 0 0.5em 0;
  padding: 1em 0 0.5em;
}
.author {
  padding-bottom: 4px;
}
h1 {
  font-size: 26px;
  margin: 1em 0;
}
h2 {
  font-size: 22px;
  margin-top: -20px;  /* provide offset for in-page anchors */
  padding-top: 33px;
}
h3 {
  font-size: 18px;
  margin-top: -36px;  /* provide offset for in-page anchors */
  padding-top: 42px;
}
h4 {
  font-size: 16px;
  margin-top: -36px;  /* provide offset for in-page anchors */
  padding-top: 42px;
}
h5, h6 {
  font-size: 14px;
}
#n-copyright-notice {
  border-bottom: 1px solid #ddd;
  padding-bottom: 1em;
  margin-bottom: 1em;
}
/* general structure */
p {
  padding: 0;
  margin: 0 0 1em 0;
  text-align: left;
}
div, span {
  position: relative;
}
div {
  margin: 0;
}
.alignRight.art-text {
  background-color: #f9f9f9;
  border: 1px solid #eee;
  border-radius: 3px;
  padding: 1em 1em 0;
  margin-bottom: 1.5em;
}
.alignRight.art-text pre {
  padding: 0;
}
.alignRight {
  margin: 1em 0;
}
.alignRight > *:first-child {
  border: none;
  margin: 0;
  float: right;
  clear: both;
}
.alignRight > *:nth-child(2) {
  clear: both;
  display: block;
  border: none;
}
svg {
  display: block;
}
.alignCenter.art-text {
  background-color: #f9f9f9;
  border: 1px solid #eee;
  border-radius: 3px;
  padding: 1em 1em 0;
  margin-bottom: 1.5em;
}
.alignCenter.art-text pre {
  padding: 0;
}
.alignCenter {
  margin: 1em 0;
}
.alignCenter > *:first-child {
  border: none;
  /* this isn't optimal, but it's an existence proof.  PrinceXML doesn't
     support flexbox yet.
  */
  display: table;
  margin: 0 auto;
}

/* lists */
ol, ul {
  padding: 0;
  margin: 0 0 1em 2em;
}
ol ol, ul ul, ol ul, ul ol {
  margin-left: 1em;
}
li {
  margin: 0 0 0.25em 0;
}
.ulCompact li {
  margin: 0;
}
ul.empty, .ulEmpty {
  list-style-type: none;
}
ul.empty li, .ulEmpty li {
  margin-top: 0.5em;
}
ul.compact, .ulCompact,
ol.compact, .olCompact {
  line-height: 100%;
  margin: 0 0 0 2em;
}

/* definition lists */
dl {
}
dl > dt {
  float: left;
  margin-right: 1em;
}
dl > dd {
  margin-bottom: .8em;
  min-height: 1.3em;
}
dl.compact > dd, dlCompact > dd {
  margin-bottom: 0em;
}
dl > dd > dl {
  margin-top: 0.5em;
  margin-bottom: 0em;
}

/* links */
a {
  text-decoration: none;
  z-index: 2;
}
a[href] {
  color: #3E8EDE;
}
a[href]:hover {
  background-color: #f2f2f2;
}
figcaption a[href],
a[href].selfRef {
  color: #222;
}
/* XXX probably not this:
a.selfRef:hover {
  background-color: transparent;
  cursor: default;
} */

/* Figures */
tt, code, pre, code {
  background-color: #f9f9f9;
  font-family: 'Roboto Mono', monospace;
}
pre {
  border: 1px solid #eee;
  margin: 0;
  padding: 1em;
}
img {
  max-width: 100%;
}
figure {
  margin: 0;
}
figure blockquote {
  margin: 0.8em 0.4em 0.4em;
}
figcaption {
  font-style: italic;
  margin: 0 0 1em 0;
}
@media screen {
  pre {
    overflow-x: auto;
    max-width: 100%;
    max-width: calc(100% - 22px);
  }
}

/* aside, blockquote */
aside, blockquote {
  margin-left: 0;
  padding: 1.2em 2em;
}
blockquote {
  background-color: #f9f9f9;
  border: 1px solid #ddd;
  border-radius: 3px;
  margin: 1em 0;
}
cite {
  display: block;
  text-align: right;
  font-style: italic;
}

/* tables */
table {
  width: 100%;
  margin: 0 0 1em;
  border-collapse: collapse;
  border: 1px solid #eee;
}
th, td {
  text-align: left;
  vertical-align: top;
  padding: 0.5em 0.75em;
}
th {
  text-align: left;
  background-color: #e9e9e9;
}
tr:nth-child(2n+1) > td {
  background-color: #f5f5f5;
}
table caption {
  font-style: italic;
  margin: 0;
  padding: 0;
  text-align: left;
}
table p {
  /* XXX to avoid bottom margin on table row signifiers. If paragraphs should
     be allowed within tables more generally, it would be far better to select on a class. */
  margin: 0;
}

/* pilcrow */
a.pilcrow {
  color: #777;
  text-decoration: none;
  visibility: hidden;
  user-select: none;
  -ms-user-select: none;
  -o-user-select:none;
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  -webkit-touch-callout: none;
}
@media screen {
  aside:hover > a.pilcrow,
  p:hover > a.pilcrow,
  blockquote:hover > a.pilcrow,
  div:hover > a.pilcrow,
  li:hover > a.pilcrow,
  pre:hover > a.pilcrow {
    visibility: visible;
  }
  a.pilcrow:hover {
    background-color: transparent;
  }
}

/* misc */
hr {
  border: 0;
  border-top: 1px solid #eee;
}
.bcp14 {
  font-variant: small-caps;
}

.role {
  font-variant: all-small-caps;
}

/* info block */
#identifiers {
  margin: 0;
  font-size: 0.9em;
}
#identifiers dt {
  width: 3em;
  clear: left;
}
#identifiers dd {
  float: left;
  margin-bottom: 0;
}
#identifiers .authors .author {
  display: inline-block;
  margin-right: 1.5em;
}
#identifiers .authors .org {
  font-style: italic;
}

/* The prepared/rendered info at the very bottom of the page */
.docInfo {
  color: #999;
  font-size: 0.9em;
  font-style: italic;
  margin-top: 2em;
}
.docInfo .prepared {
  float: left;
}
.docInfo .prepared {
  float: right;
}

/* table of contents */
#toc  {
  padding: 0.75em 0 2em 0;
  margin-bottom: 1em;
}
nav.toc ul {
  margin: 0 0.5em 0 0;
  padding: 0;
  list-style: none;
}
nav.toc li {
  line-height: 1.3em;
  margin: 0.75em 0;
  padding-left: 1.2em;
  text-indent: -1.2em;
}
/* references */
.references dt {
  text-align: right;
  font-weight: bold;
  min-width: 7em;
}
.references dd {
  margin-left: 8em;
  overflow: auto;
}

.refInstance {
  margin-bottom: 1.25em;
}

.references .ascii {
  margin-bottom: 0.25em;
}

/* index */
.index ul {
  margin: 0 0 0 1em;
  padding: 0;
  list-style: none;
}
.index ul ul {
  margin: 0;
}
.index li {
  margin: 0;
  text-indent: -2em;
  padding-left: 2em;
  padding-bottom: 5px;
}
.indexIndex {
  margin: 0.5em 0 1em;
}
.index a {
  font-weight: 700;
}
/* make the index two-column on all but the smallest screens */
@media (min-width: 600px) {
  .index ul {
    -moz-column-count: 2;
    -moz-column-gap: 20px;
  }
  .index ul ul {
    -moz-column-count: 1;
    -moz-column-gap: 0;
  }
}

/* authors */
address.vcard {
  font-style: normal;
  margin: 1em 0;
}

address.vcard .nameRole {
  font-weight: 700;
  margin-left: 0;
}
address.vcard .label {
  font-family: "Noto Sans",Arial,Helvetica,sans-serif;
  margin: 0.5em 0;
}
address.vcard .type {
  display: none;
}
.alternative-contact {
  margin: 1.5em 0 1em;
}
hr.addr {
  border-top: 1px dashed;
  margin: 0;
  color: #ddd;
  max-width: calc(100% - 16px);
}

/* temporary notes */
.rfcEditorRemove::before {
  position: absolute;
  top: 0.2em;
  right: 0.2em;
  padding: 0.2em;
  content: "The RFC Editor will remove this note";
  color: #b76427;
  background-color: rgba(249, 232, 105, 0.3);
}
.rfcEditorRemove {
  position: relative;
  padding-top: 1.8em;
  background-color: rgba(249, 232, 105, 0.3);
  border-radius: 3px;
}
.cref {
  background-color: rgba(249, 232, 105, 0.3);
  padding: 2px 4px;
}
.crefSource {
  font-style: italic;
}
/* alternative layout for smaller screens */
@media screen and (max-width: 1023px) {
  body {
    padding-top: 2em;
  }
  #title {
    padding: 1em 0;
  }
  h1 {
    font-size: 24px;
  }
  h2 {
    font-size: 20px;
    margin-top: -18px;  /* provide offset for in-page anchors */
    padding-top: 38px;
  }
  #identifiers dd {
    max-width: 60%;
  }
  #toc {
    position: fixed;
    z-index: 2;
    top: 0;
    right: 0;
    padding: 0;
    margin: 0;
    background-color: inherit;
    border-bottom: 1px solid #ccc;
  }
  #toc h2 {
    margin: -1px 0 0 0;
    padding: 4px 0 4px 6px;
    padding-right: 1em;
    min-width: 190px;
    font-size: 1.1em;
    text-align: right;
    background-color: #444;
    color: white;
    cursor: pointer;
  }
  #toc h2::before { /* css hamburger */
    float: right;
    position: relative;
    width: 1em;
    height: 1px;
    left: -164px;
    margin: 6px 0 0 0;
    background: white none repeat scroll 0 0;
    box-shadow: 0 4px 0 0 white, 0 8px 0 0 white;
    content: "";
  }
  #toc nav {
    display: none;
    padding: 0.5em 1em 1em;
    overflow: auto;
    height: calc(100vh - 48px);
    border-left: 1px solid #ddd;
  }
}

/* alternative layout for wide screens */
@media screen and (min-width: 1024px) {
  body {
    max-width: 724px;
    margin: 42px auto;
    padding-left: 1.5em;
    padding-right: 29em;
  }
  #toc {
    position: fixed;
    top: 42px;
    right: 42px;
    width: 25%;
    margin: 0;
    padding: 0 1em;
    z-index: 1;
  }
  #toc h2 {
    border-top: none;
    border-bottom: 1px solid #ddd;
    font-size: 1em;
    font-weight: normal;
    margin: 0;
    padding: 0.25em 1em 1em 0;
  }
  #toc nav {
    display: block;
    height: calc(90vh - 84px);
    bottom: 0;
    padding: 0.5em 0 0;
    overflow: auto;
  }
  img { /* future proofing */
    max-width: 100%;
    height: auto;
  }
}

/* pagination */
@media print {
  body {

    width: 100%;
  }
  p {
    orphans: 3;
    widows: 3;
  }
  #n-copyright-notice {
    border-bottom: none;
  }
  #toc, #n-introduction {
    page-break-before: always;
  }
  #toc {
    border-top: none;
    padding-top: 0;
  }
  figure, pre {
    page-break-inside: avoid;
  }
  figure {
    overflow: scroll;
  }
  h1, h2, h3, h4, h5, h6 {
    page-break-after: avoid;
  }
  h2+*, h3+*, h4+*, h5+*, h6+* {
    page-break-before: avoid;
  }
  pre {
    white-space: pre-wrap;
    word-wrap: break-word;
    font-size: 10pt;
  }
  table {
    border: 1px solid #ddd;
  }
  td {
    border-top: 1px solid #ddd;
  }
}

@page :first {
  padding-top: 0;
  @top-left {
    content: normal;
    border: none;
  }
  @top-center {
    content: normal;
    border: none;
  }
  @top-right {
    content: normal;
    border: none;
  }
}

@page {
  size: A4;
  margin-bottom: 45mm;
  padding-top: 20px;
}

/* Changes introduced to fix issues found during implementation */

/* Separate body from document info even without intervening H1 */
section {
  clear: both;
}


/* Top align author divs, to avoid names without organization dropping level with org names */
.author {
  vertical-align: top;
}

/* Leave room in document info to show Internet-Draft on one line */
#identifiers dt {
  width: 8em;
}

/* Don't waste quite as much whitespace between label and value in doc info */
#identifiers dd {
  margin-left: 1em;
}

/* Give floating toc a background color (needed when it's a div inside section */
#toc {
  background-color: white;
}

/* Make the collapsed ToC header render white on gray also when it's a link */
@media screen and (max-width: 1023px) {
  #toc h2 a,
  #toc h2 a:link,
  #toc h2 a:focus,
  #toc h2 a:hover,
  #toc a.toplink,
  #toc a.toplink:hover {
    color: white;
    background-color: #444;
    text-decoration: none;
  }
}

/* Give the bottom of the ToC some whitespace */
@media screen and (min-width: 1024px) {
  #toc {
    padding: 0 0 1em 1em;
  }
}

/* Style section numbers with more space between number and title */
.section-number {
  padding-right: 0.5em;
}

/* prevent monospace from becoming overly large */
tt, code, pre, code {
  font-size: 95%;
}

/* Fix the height/width aspect for ascii art*/
.art-text pre {
  line-height: 1.12;
}

/* Add styling for a link in the ToC that points to the top of the document */
a.toplink {
  float: right;
  margin-right: 0.5em;
}

/* Fix the dl styling to match the RFC 7992 attributes */
dl > dt,
dl.dlParallel > dt {
  float: left;
  margin-right: 1em;
}
dl.dlNewline > dt {
  float: none;
}

/* Provide styling for table cell text alignment */
table td.text-left,
table th.text-left {
  text-align: left;
}
table td.text-center,
table th.text-center {
  text-align: center;
}
table td.text-right,
table th.text-right {
  text-align: right;
}

/* Make the alternative author contact informatio look less like just another
   author, and group it closer with the primary author contact information */
.alternative-contact {
  margin: 0.5em 0 0.25em 0;
}
address .non-ascii {
  margin: 0 0 0 2em;
}

/* With it being possible to set tables with alignment
  left, center, and right, { width: 100%; } does not make sense */
table {
  width: auto;
}

/* Avoid reference text that sits in a block with very wide left margin,
   because of a long floating dt label.*/
.references dd {
  overflow: visible;
}

/* Control caption placement */
caption {
  caption-side: bottom;
}

/* Limit the width of the author address vcard, so names in right-to-left
   script don't end up on the other side of the page. */

address.vcard {
  max-width: 20em;
  margin-right: auto;
}

/* For address alignment dependent on LTR or RTL scripts */
address div.left {
  text-align: left;
}
address div.right {
  text-align: right;
}

/* Provide table alignment support.  We can't use the alignX classes above
   since they do unwanted things with caption and other styling. */
table.right {
 margin-left: auto;
 margin-right: 0;
}
table.center {
 margin-left: auto;
 margin-right: auto;
}
table.left {
 margin-left: 0;
 margin-right: auto;
}

/* Give the table caption label the same styling as the figcaption */
caption a[href] {
  color: #222;
}

@media print {
  .toplink {
    display: none;
  }

  /* avoid overwriting the top border line with the ToC header */
  #toc {
    padding-top: 1px;
  }

  /* Avoid page breaks inside dl and author address entries */
  dd {
    page-break-before: avoid;
  }
  .vcard {
    page-break-inside: avoid;
  }

}
/* Avoid wrapping of URLs in references */
.references a {
  white-space: nowrap;
}
/* Tweak the bcp14 keyword presentation */
.bcp14 {
  font-variant: small-caps;
  font-weight: bold;
  font-size: 0.9em;
}
/* Tweak the invisible space above H* in order not to overlay links in text above */
 h2 {
  margin-top: -18px;  /* provide offset for in-page anchors */
  padding-top: 31px;
 }
 h3 {
  margin-top: -18px;  /* provide offset for in-page anchors */
  padding-top: 24px;
 }
 h4 {
  margin-top: -18px;  /* provide offset for in-page anchors */
  padding-top: 24px;
 }
</style>
<link href="rfc-local.css" type="text/css" rel="stylesheet">
</head>
<body>
<script>
window.addEventListener('load',addMetadata);

async function addMetadata() {

  // Copy all CSS rules for "#identifiers" to "#metadata"
    try {
        const cssRules = document.styleSheets[0].cssRules;
        for (let i = 0; i < cssRules.length; i++) {
            if (/#identifiers/.exec(cssRules[i].selectorText)) {
                const rule = cssRules[i].cssText.
                             replace('#identifiers','#metadata');
                document.styleSheets[0].
                        insertRule(rule, document.styleSheets[0].cssRules.length);
            }
        }
    } catch (e) {
        console.log(e);
    }

  // Retrieve the "metadata" element from the document
    const div = document.getElementById('metadata');
    if (!div) {
        console.log("Could not locate metadata <div> element");
        return;
    }
    div.style.background='#eee';

  // Insert the metadata block
  // [TODO: make this more sophisticated and linkify the values]
    try {
        const jsonFile = document.URL.replace(/html$/,'json');
        const response = await fetch(jsonFile);
        const metadata = (await response.json())[0];

        const label = {
            'STATUS': 'Status',
            'OBSOLETES': 'Obsoletes',
            'OBSOLETED-BY': 'Obsoleted By',
            'UPDATES': 'Updates',
            'UPDATED-BY': 'Updated By',
            'SEE-ALSO': 'See Also',
            'ERRATA-URL': 'Errata',
        };

        let metadataHTML = "<dl style='overflow:hidden'>";
        ['STATUS', 'OBSOLETES', 'OBSOLETED-BY', 'UPDATES',
         'UPDATED-BY', 'SEE-ALSO', 'ERRATA-URL'].forEach(key => {
            if (metadata[key]) {
                metadataHTML += `<dt>${label[key]}:</dt><dd>${metadata[key]}</dd>`;
            }
        })
                metadataHTML += "</dl>";
        div.innerHTML = metadataHTML;

    } catch (e) {
        console.log(e);
    }
}
</script>
<table class="ears">
<thead><tr>
<td class="left">Internet-Draft</td>
<td class="center">fapi-2_0-attacker-model</td>
<td class="right">February 2020</td>
</tr></thead>
<tfoot><tr>
<td class="left">Fett</td>
<td class="center">Expires 29 August 2020</td>
<td class="right">[Page]</td>
</tr></tfoot>
</table>
<div class="document-information">
<dl id="identifiers">
<dt class="label-workgroup">Workgroup:</dt>
<dd class="workgroup">connect</dd>
<dt class="label-internet-draft">Internet-Draft:</dt>
<dd class="internet-draft">fapi-2_0-attacker-model-00</dd>
<dt class="label-published">Published:</dt>
<dd class="published">
<time datetime="2020-02-26" class="published">26 February 2020</time>
    </dd>
<dt class="label-intended-status">Intended Status:</dt>
<dd class="intended-status">Standards Track</dd>
<dt class="label-expires">Expires:</dt>
<dd class="expires"><time datetime="2020-08-29">29 August 2020</time></dd>
<dt class="label-authors">Author:</dt>
<dd class="authors">
<div class="author">
      <div class="author-name">D. Fett</div>
<div class="org">yes.com</div>
</div>
</dd>
</dl>
</div>
<h1 id="title">FAPI 2.0 Attacker Model</h1>
<section id="section-abstract">
      <h2 id="abstract"><a href="#abstract" class="selfRef">Abstract</a></h2>
<p id="section-abstract-1">OIDF FAPI 2.0 is an API security profile suitable for high-security
applications based on the OAuth 2.0 Authorization Framework
<span>[<a href="#RFC6749" class="xref">RFC6749</a>]</span>. This document describes that attacker model that informs
the decisions on security mechanisms employed by the FAPI security
profiles.<a href="#section-abstract-1" class="pilcrow">¶</a></p>
</section>
<div id="status-of-memo">
<section id="section-boilerplate.1">
        <h2 id="name-status-of-this-memo">
<a href="#name-status-of-this-memo" class="section-name selfRef">Status of This Memo</a>
        </h2>
<p id="section-boilerplate.1-1">
        This Internet-Draft is submitted in full conformance with the
        provisions of BCP 78 and BCP 79.<a href="#section-boilerplate.1-1" class="pilcrow">¶</a></p>
<p id="section-boilerplate.1-2">
        Internet-Drafts are working documents of the Internet Engineering Task
        Force (IETF). Note that other groups may also distribute working
        documents as Internet-Drafts. The list of current Internet-Drafts is
        at <span><a href="https://datatracker.ietf.org/drafts/current/">https://datatracker.ietf.org/drafts/current/</a></span>.<a href="#section-boilerplate.1-2" class="pilcrow">¶</a></p>
<p id="section-boilerplate.1-3">
        Internet-Drafts are draft documents valid for a maximum of six months
        and may be updated, replaced, or obsoleted by other documents at any
        time. It is inappropriate to use Internet-Drafts as reference
        material or to cite them other than as "work in progress."<a href="#section-boilerplate.1-3" class="pilcrow">¶</a></p>
<p id="section-boilerplate.1-4">
        This Internet-Draft will expire on 29 August 2020.<a href="#section-boilerplate.1-4" class="pilcrow">¶</a></p>
</section>
</div>
<div id="copyright">
<section id="section-boilerplate.2">
        <h2 id="name-copyright-notice">
<a href="#name-copyright-notice" class="section-name selfRef">Copyright Notice</a>
        </h2>
<p id="section-boilerplate.2-1">
            Copyright (c) 2020 IETF Trust and the persons identified as the
            document authors. All rights reserved.<a href="#section-boilerplate.2-1" class="pilcrow">¶</a></p>
<p id="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<span><a href="https://trustee.ietf.org/license-info">https://trustee.ietf.org/license-info</a></span>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Simplified BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Simplified BSD License.<a href="#section-boilerplate.2-2" class="pilcrow">¶</a></p>
</section>
</div>
<div id="toc">
<section id="section-boilerplate.3">
        <a href="#" onclick="scroll(0,0)" class="toplink">▲</a><h2 id="name-table-of-contents">
<a href="#name-table-of-contents" class="section-name selfRef">Table of Contents</a>
        </h2>
<nav class="toc"><ul class="toc ulEmpty">
<li class="toc ulEmpty" id="section-boilerplate.3-1.1">
            <p id="section-boilerplate.3-1.1.1"><a href="#section-1" class="xref">1</a>.  <a href="#name-introduction" class="xref">Introduction</a><a href="#section-boilerplate.3-1.1.1" class="pilcrow">¶</a></p>
<ul class="toc ulEmpty">
<li class="toc ulEmpty" id="section-boilerplate.3-1.1.2.1">
                <p id="section-boilerplate.3-1.1.2.1.1"><a href="#section-1.1" class="xref">1.1</a>.  <a href="#name-warning" class="xref">Warning</a><a href="#section-boilerplate.3-1.1.2.1.1" class="pilcrow">¶</a></p>
</li>
              <li class="toc ulEmpty" id="section-boilerplate.3-1.1.2.2">
                <p id="section-boilerplate.3-1.1.2.2.1"><a href="#section-1.2" class="xref">1.2</a>.  <a href="#name-copyright-notice-license" class="xref">Copyright notice & license</a><a href="#section-boilerplate.3-1.1.2.2.1" class="pilcrow">¶</a></p>
</li>
              <li class="toc ulEmpty" id="section-boilerplate.3-1.1.2.3">
                <p id="section-boilerplate.3-1.1.2.3.1"><a href="#section-1.3" class="xref">1.3</a>.  <a href="#name-notational-conventions" class="xref">Notational Conventions</a><a href="#section-boilerplate.3-1.1.2.3.1" class="pilcrow">¶</a></p>
</li>
            </ul>
</li>
          <li class="toc ulEmpty" id="section-boilerplate.3-1.2">
            <p id="section-boilerplate.3-1.2.1"><a href="#section-2" class="xref">2</a>.  <a href="#name-security-goals" class="xref">Security Goals</a><a href="#section-boilerplate.3-1.2.1" class="pilcrow">¶</a></p>
<ul class="toc ulEmpty">
<li class="toc ulEmpty" id="section-boilerplate.3-1.2.2.1">
                <p id="section-boilerplate.3-1.2.2.1.1"><a href="#section-2.1" class="xref">2.1</a>.  <a href="#name-authorization" class="xref">Authorization</a><a href="#section-boilerplate.3-1.2.2.1.1" class="pilcrow">¶</a></p>
</li>
              <li class="toc ulEmpty" id="section-boilerplate.3-1.2.2.2">
                <p id="section-boilerplate.3-1.2.2.2.1"><a href="#section-2.2" class="xref">2.2</a>.  <a href="#name-authentication" class="xref">Authentication</a><a href="#section-boilerplate.3-1.2.2.2.1" class="pilcrow">¶</a></p>
</li>
              <li class="toc ulEmpty" id="section-boilerplate.3-1.2.2.3">
                <p id="section-boilerplate.3-1.2.2.3.1"><a href="#section-2.3" class="xref">2.3</a>.  <a href="#name-session-integrity" class="xref">Session Integrity</a><a href="#section-boilerplate.3-1.2.2.3.1" class="pilcrow">¶</a></p>
</li>
            </ul>
</li>
          <li class="toc ulEmpty" id="section-boilerplate.3-1.3">
            <p id="section-boilerplate.3-1.3.1"><a href="#section-3" class="xref">3</a>.  <a href="#name-attacker-model" class="xref">Attacker Model</a><a href="#section-boilerplate.3-1.3.1" class="pilcrow">¶</a></p>
<ul class="toc ulEmpty">
<li class="toc ulEmpty" id="section-boilerplate.3-1.3.2.1">
                <p id="section-boilerplate.3-1.3.2.1.1"><a href="#section-3.1" class="xref">3.1</a>.  <a href="#name-assumptions" class="xref">Assumptions</a><a href="#section-boilerplate.3-1.3.2.1.1" class="pilcrow">¶</a></p>
</li>
              <li class="toc ulEmpty" id="section-boilerplate.3-1.3.2.2">
                <p id="section-boilerplate.3-1.3.2.2.1"><a href="#section-3.2" class="xref">3.2</a>.  <a href="#name-attackers" class="xref">Attackers</a><a href="#section-boilerplate.3-1.3.2.2.1" class="pilcrow">¶</a></p>
<ul class="toc ulEmpty">
<li class="toc ulEmpty" id="section-boilerplate.3-1.3.2.2.2.1">
                    <p id="section-boilerplate.3-1.3.2.2.2.1.1"><a href="#section-3.2.1" class="xref">3.2.1</a>.  <a href="#name-a1-web-attacker" class="xref">A1 - Web Attacker</a><a href="#section-boilerplate.3-1.3.2.2.2.1.1" class="pilcrow">¶</a></p>
</li>
                  <li class="toc ulEmpty" id="section-boilerplate.3-1.3.2.2.2.2">
                    <p id="section-boilerplate.3-1.3.2.2.2.2.1"><a href="#section-3.2.2" class="xref">3.2.2</a>.  <a href="#name-a1a-web-attacker-participat" class="xref">A1a - Web Attacker (participating as AS)</a><a href="#section-boilerplate.3-1.3.2.2.2.2.1" class="pilcrow">¶</a></p>
</li>
                  <li class="toc ulEmpty" id="section-boilerplate.3-1.3.2.2.2.3">
                    <p id="section-boilerplate.3-1.3.2.2.2.3.1"><a href="#section-3.2.3" class="xref">3.2.3</a>.  <a href="#name-a2-network-attacker" class="xref">A2 - Network attacker</a><a href="#section-boilerplate.3-1.3.2.2.2.3.1" class="pilcrow">¶</a></p>
</li>
                  <li class="toc ulEmpty" id="section-boilerplate.3-1.3.2.2.2.4">
                    <p id="section-boilerplate.3-1.3.2.2.2.4.1"><a href="#section-3.2.4" class="xref">3.2.4</a>.  <a href="#name-attackers-at-the-authorizat" class="xref">Attackers at the Authorization Endpoint</a><a href="#section-boilerplate.3-1.3.2.2.2.4.1" class="pilcrow">¶</a></p>
</li>
                  <li class="toc ulEmpty" id="section-boilerplate.3-1.3.2.2.2.5">
                    <p id="section-boilerplate.3-1.3.2.2.2.5.1"><a href="#section-3.2.5" class="xref">3.2.5</a>.  <a href="#name-attackers-at-the-token-endp" class="xref">Attackers at the Token Endpoint</a><a href="#section-boilerplate.3-1.3.2.2.2.5.1" class="pilcrow">¶</a></p>
</li>
                </ul>
</li>
            </ul>
</li>
          <li class="toc ulEmpty" id="section-boilerplate.3-1.4">
            <p id="section-boilerplate.3-1.4.1"><a href="#section-4" class="xref">4</a>.  <a href="#name-non-repudiation-requirement" class="xref">Non-Repudiation Requirements</a><a href="#section-boilerplate.3-1.4.1" class="pilcrow">¶</a></p>
<ul class="toc ulEmpty">
<li class="toc ulEmpty" id="section-boilerplate.3-1.4.2.1">
                <p id="section-boilerplate.3-1.4.2.1.1"><a href="#section-4.1" class="xref">4.1</a>.  <a href="#name-affected-messages" class="xref">Affected messages</a><a href="#section-boilerplate.3-1.4.2.1.1" class="pilcrow">¶</a></p>
</li>
            </ul>
</li>
          <li class="toc ulEmpty" id="section-boilerplate.3-1.5">
            <p id="section-boilerplate.3-1.5.1"><a href="#section-5" class="xref">5</a>.  <a href="#name-normative-references" class="xref">Normative References</a><a href="#section-boilerplate.3-1.5.1" class="pilcrow">¶</a></p>
</li>
          <li class="toc ulEmpty" id="section-boilerplate.3-1.6">
            <p id="section-boilerplate.3-1.6.1"><a href="#section-6" class="xref">6</a>.  <a href="#name-informative-references" class="xref">Informative References</a><a href="#section-boilerplate.3-1.6.1" class="pilcrow">¶</a></p>
</li>
          <li class="toc ulEmpty" id="section-boilerplate.3-1.7">
            <p id="section-boilerplate.3-1.7.1"><a href="#section-appendix.a" class="xref"></a>  <a href="#name-authors-address" class="xref">Author's Address</a><a href="#section-boilerplate.3-1.7.1" class="pilcrow">¶</a></p>
</li>
        </ul>
</nav>
</section>
</div>
<div id="introduction">
<section id="section-1">
      <h2 id="name-introduction">
<a href="#section-1" class="section-number selfRef">1. </a><a href="#name-introduction" class="section-name selfRef">Introduction</a>
      </h2>
<p id="section-1-1">Since OIDF FAPI aims at providing an API protection profile for
high-risk scenarios, clearly defined security requirements are
indispensable. In this document, the security requirements are
expressed through attacker models, security goals, and non-repudiation
requirements. From these requirements, the utilized security
mechanisms are derived in the Baseline and Advanced profiles.<a href="#section-1-1" class="pilcrow">¶</a></p>
<p id="section-1-2">The ultimate aim is to provide systematic proofs of the security of
the FAPI profiles similar to those in <span>[<a href="#arXiv.1901.11520" class="xref">arXiv.1901.11520</a>]</span>. Such proofs
can rule out large classes of attacks rooted in the logic of security
protocols. The security requirements in this document are therefore
expressed in a form that lends itself well to a transfer into a formal
representation required for an automated or manual analysis of the
security of FAPI. This work draws from the attacker model and security
goals formulated in <span>[<a href="#arXiv.1901.11520" class="xref">arXiv.1901.11520</a>]</span>.<a href="#section-1-2" class="pilcrow">¶</a></p>
<div id="warning">
<section id="section-1.1">
        <h3 id="name-warning">
<a href="#section-1.1" class="section-number selfRef">1.1. </a><a href="#name-warning" class="section-name selfRef">Warning</a>
        </h3>
<p id="section-1.1-1">This document is not an OIDF International Standard. It is distributed
for review and comment. It is subject to change without notice and may
not be referred to as an International Standard.<a href="#section-1.1-1" class="pilcrow">¶</a></p>
<p id="section-1.1-2">Recipients of this draft are invited to submit, with their comments,
notification of any relevant patent rights of which they are aware and
to provide supporting documentation.<a href="#section-1.1-2" class="pilcrow">¶</a></p>
</section>
</div>
<div id="copyright-notice-license">
<section id="section-1.2">
        <h3 id="name-copyright-notice-license">
<a href="#section-1.2" class="section-number selfRef">1.2. </a><a href="#name-copyright-notice-license" class="section-name selfRef">Copyright notice & license</a>
        </h3>
<p id="section-1.2-1">The OpenID Foundation (OIDF) grants to any Contributor, developer,
implementer, or other interested party a non-exclusive, royalty free,
worldwide copyright license to reproduce, prepare derivative works
from, distribute, perform and display, this Implementers Draft or
Final Specification solely for the purposes of (i) developing
specifications, and (ii) implementing Implementers Drafts and Final
Specifications based on such documents, provided that attribution be
made to the OIDF as the source of the material, but that such
attribution does not indicate an endorsement by the OIDF.<a href="#section-1.2-1" class="pilcrow">¶</a></p>
<p id="section-1.2-2">The technology described in this specification was made available from
contributions from various sources, including members of the OpenID
Foundation and others. Although the OpenID Foundation has taken steps
to help ensure that the technology is available for distribution, it
takes no position regarding the validity or scope of any intellectual
property or other rights that might be claimed to pertain to the
implementation or use of the technology described in this
specification or the extent to which any license under such rights
might or might not be available; neither does it represent that it has
made any independent effort to identify any such rights. The OpenID
Foundation and the contributors to this specification make no (and
hereby expressly disclaim any) warranties (express, implied, or
otherwise), including implied warranties of merchantability,
non-infringement, fitness for a particular purpose, or title, related
to this specification, and the entire risk as to implementing this
specification is assumed by the implementer. The OpenID Intellectual
Property Rights policy requires contributors to offer a patent promise
not to assert certain patent claims against other contributors and
against implementers. The OpenID Foundation invites any interested
party to bring to its attention any copyrights, patents, patent
applications, or other proprietary rights that may cover technology
that may be required to practice this specification.<a href="#section-1.2-2" class="pilcrow">¶</a></p>
</section>
</div>
<div id="notational-conventions">
<section id="section-1.3">
        <h3 id="name-notational-conventions">
<a href="#section-1.3" class="section-number selfRef">1.3. </a><a href="#name-notational-conventions" class="section-name selfRef">Notational Conventions</a>
        </h3>
<p id="section-1.3-1">The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in RFC
2119 [RFC2119].<a href="#section-1.3-1" class="pilcrow">¶</a></p>
</section>
</div>
</section>
</div>
<div id="security-goals">
<section id="section-2">
      <h2 id="name-security-goals">
<a href="#section-2" class="section-number selfRef">2. </a><a href="#name-security-goals" class="section-name selfRef">Security Goals</a>
      </h2>
<p id="section-2-1">FAPI 2.0 profiles aim to achieve at least the following security goals
(with respect to the attacker models defined below):<a href="#section-2-1" class="pilcrow">¶</a></p>
<div id="authorization">
<section id="section-2.1">
        <h3 id="name-authorization">
<a href="#section-2.1" class="section-number selfRef">2.1. </a><a href="#name-authorization" class="section-name selfRef">Authorization</a>
        </h3>
<p id="section-2.1-1">FAPI 2.0 profiles MUST ensure that <strong>no attacker can access resources
belonging to a user.</strong><a href="#section-2.1-1" class="pilcrow">¶</a></p>
<p id="section-2.1-2">The access token is the ultimate credential for access to resources in
OAuth. Therefore, this security goal is fulfilled if no attacker can
successfully obtain and use an access token belonging to a user.<a href="#section-2.1-2" class="pilcrow">¶</a></p>
</section>
</div>
<div id="authentication">
<section id="section-2.2">
        <h3 id="name-authentication">
<a href="#section-2.2" class="section-number selfRef">2.2. </a><a href="#name-authentication" class="section-name selfRef">Authentication</a>
        </h3>
<p id="section-2.2-1">FAPI 2.0 profiles MUST ensure that <strong>no attacker is able to log in at
a client under the identity of a user.</strong><a href="#section-2.2-1" class="pilcrow">¶</a></p>
<p id="section-2.2-2">The ID token is the credential for authentication in OpenID Connect.
This security goal therefore is fulfilled if no attacker can obtain
and use an ID token carrying the identity of a user for login.<a href="#section-2.2-2" class="pilcrow">¶</a></p>
</section>
</div>
<div id="session-integrity">
<section id="section-2.3">
        <h3 id="name-session-integrity">
<a href="#section-2.3" class="section-number selfRef">2.3. </a><a href="#name-session-integrity" class="section-name selfRef">Session Integrity</a>
        </h3>
<p id="section-2.3-1">Session Integrity is concerned with attacks where a user is tricked
into logging in under the attacker's identity or inadvertently using
the resources of the attacker instead of the user's own resources.
Attacks in this field include CSRF attacks (traditionally defended
against by using "state" in OAuth) and session swapping attacks.<a href="#section-2.3-1" class="pilcrow">¶</a></p>
<p id="section-2.3-2">In detail:<a href="#section-2.3-2" class="pilcrow">¶</a></p>
<ul>
<li id="section-2.3-3.1">
            <p id="section-2.3-3.1.1">For authentication: FAPI 2.0 profiles MUST ensure that <strong>no
attacker is able to force a user to be logged in under the
identity of the attacker.</strong><a href="#section-2.3-3.1.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-2.3-3.2">
            <p id="section-2.3-3.2.1">For authorization: FAPI 2.0 profiles MUST ensure that <strong>no
attacker is able to force a user to use resources of the
attacker.</strong><a href="#section-2.3-3.2.1" class="pilcrow">¶</a></p>
</li>
        </ul>
</section>
</div>
</section>
</div>
<div id="attacker-model">
<section id="section-3">
      <h2 id="name-attacker-model">
<a href="#section-3" class="section-number selfRef">3. </a><a href="#name-attacker-model" class="section-name selfRef">Attacker Model</a>
      </h2>
<div id="assumptions">
<section id="section-3.1">
        <h3 id="name-assumptions">
<a href="#section-3.1" class="section-number selfRef">3.1. </a><a href="#name-assumptions" class="section-name selfRef">Assumptions</a>
        </h3>
<p id="section-3.1-1">This attacker model assumes that certain parts of the infrastructure
are working correctly. Failures in these parts likely lead to attacks
that are out of the scope of this attacker model and MUST be
considered and analyzed separately.<a href="#section-3.1-1" class="pilcrow">¶</a></p>
<p id="section-3.1-2">For example, if a major flaw in TLS was found that undermines data
integrity in TLS connections, a network attacker (A2, below) would be
able to compromise practically all OAuth and OpenID Connect sessions
in various ways. This would be fatal, as even application-level
signing and encryption is based on key distribution via TLS
connections.<a href="#section-3.1-2" class="pilcrow">¶</a></p>
<p id="section-3.1-3">The following parts of the infrastructure are out of the scope of this
attacker model:<a href="#section-3.1-3" class="pilcrow">¶</a></p>
<ul>
<li id="section-3.1-4.1">
            <p id="section-3.1-4.1.1"><strong>TLS:</strong> It is assumed that TLS connections are not broken, i.e.,
data integrity and confidentiality are ensured. The correct public
keys are used to establish connections and private keys are not
known to attackers (except for explicitly compromised parties).
Exceptions are A6 and A9, where an attacker compromises a TLS
terminating endpoint.<a href="#section-3.1-4.1.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-3.1-4.2">
            <p id="section-3.1-4.2.1"><strong>JWKS:</strong> Where applicable, key distribution mechanisms work as
intended, i.e., encryption and signature verification keys of
uncompromised parties are retrieved from the correct endpoints.<a href="#section-3.1-4.2.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-3.1-4.3">
            <p id="section-3.1-4.3.1"><strong>Browsers and Endpoints:</strong> Except for A4a and A4b, devices and
browsers used by resource owners are not compromised. Other
endpoints not controlled by an attacker behave according to the
protocol.<a href="#section-3.1-4.3.1" class="pilcrow">¶</a></p>
</li>
        </ul>
</section>
</div>
<div id="attackers">
<section id="section-3.2">
        <h3 id="name-attackers">
<a href="#section-3.2" class="section-number selfRef">3.2. </a><a href="#name-attackers" class="section-name selfRef">Attackers</a>
        </h3>
<p id="section-3.2-1">FAPI 2.0 profiles aim to ensure the security goals listed above for
arbitrary combinations of the following attackers:<a href="#section-3.2-1" class="pilcrow">¶</a></p>
<div id="a1-web-attacker">
<section id="section-3.2.1">
          <h4 id="name-a1-web-attacker">
<a href="#section-3.2.1" class="section-number selfRef">3.2.1. </a><a href="#name-a1-web-attacker" class="section-name selfRef">A1 - Web Attacker</a>
          </h4>
<p id="section-3.2.1-1">Standard web attacker model. Can send and receive messages just like
any other party controlling one or more endpoints on the internet. Can
participate in protocols flows as a normal user. Can use arbitrary
tools (e.g., browser developer tools, custom software, local
interception proxies) on their own endpoints to tamper with messages and
assemble new messages. Can send links to honest users that are then
visited by these users. This means that the web attacker has the
ability to cause arbitrary authorization requests from users'
browsers, as long as the contents are known to the attacker.<a href="#section-3.2.1-1" class="pilcrow">¶</a></p>
<p id="section-3.2.1-2">Cannot intercept or block messages sent between other parties, and
cannot break cryptography unless the attacker has learned the
respective decryption keys. Deviating from the common web attacker
model, A1 cannot play the role of a legitimate AS in the ecosystem
(see A1a).<a href="#section-3.2.1-2" class="pilcrow">¶</a></p>
</section>
</div>
<div id="a1a-web-attacker-participating-as-as">
<section id="section-3.2.2">
          <h4 id="name-a1a-web-attacker-participat">
<a href="#section-3.2.2" class="section-number selfRef">3.2.2. </a><a href="#name-a1a-web-attacker-participat" class="section-name selfRef">A1a - Web Attacker (participating as AS)</a>
          </h4>
<p id="section-3.2.2-1">Like the web attacker A1, but can also participate as an AS in the
ecosystem. Note that this AS can reuse/replay messages it has received
from honest ASs and can send users to endpoints of honest ASs.<a href="#section-3.2.2-1" class="pilcrow">¶</a></p>
</section>
</div>
<div id="a2-network-attacker">
<section id="section-3.2.3">
          <h4 id="name-a2-network-attacker">
<a href="#section-3.2.3" class="section-number selfRef">3.2.3. </a><a href="#name-a2-network-attacker" class="section-name selfRef">A2 - Network attacker</a>
          </h4>
<p id="section-3.2.3-1">Controls the whole network (like a rogue WiFi access point or a
nation-state sponsored hacker). Can intercept, block, and tamper with
messages intended for other people, but cannot break cryptography
unless the attacker has learned the respective decryption keys.<a href="#section-3.2.3-1" class="pilcrow">¶</a></p>
<p id="section-3.2.3-2">Note: Most attacks that are exclusive to this kind of attacker can be
defended against by using transport layer protection like TLS.<a href="#section-3.2.3-2" class="pilcrow">¶</a></p>
</section>
</div>
<div id="attackers-at-the-authorization-endpoint">
<section id="section-3.2.4">
          <h4 id="name-attackers-at-the-authorizat">
<a href="#section-3.2.4" class="section-number selfRef">3.2.4. </a><a href="#name-attackers-at-the-authorizat" class="section-name selfRef">Attackers at the Authorization Endpoint</a>
          </h4>
<p id="section-3.2.4-1"><strong>Note:</strong> The attackers for the authorization request are more
fine-grained than those for the token endpoint and resource endpoint,
since these messages pass through the complex environment of the
user's browser/app/OS with a larger attack surface. This demands for a
more fine-grained analysis.<a href="#section-3.2.4-1" class="pilcrow">¶</a></p>
<div id="a3a-read-authorization-request">
<section id="section-3.2.4.1">
            <h5 id="name-a3a-read-authorization-requ">
<a href="#section-3.2.4.1" class="section-number selfRef">3.2.4.1. </a><a href="#name-a3a-read-authorization-requ" class="section-name selfRef">A3a - Read Authorization Request</a>
            </h5>
<p id="section-3.2.4.1-1">The capabilities of the web attacker, but can also read the
authorization request. This might happen on mobile operating systems
(where apps can register for URLs), on all operating systems through
the browser history, or due to Cross-Site Scripting on the AS. There
have been cases where anti-virus software intercepts TLS connections
and stores/analyzes URLs.<a href="#section-3.2.4.1-1" class="pilcrow">¶</a></p>
</section>
</div>
<div id="a3b-read-authorization-response">
<section id="section-3.2.4.2">
            <h5 id="name-a3b-read-authorization-resp">
<a href="#section-3.2.4.2" class="section-number selfRef">3.2.4.2. </a><a href="#name-a3b-read-authorization-resp" class="section-name selfRef">A3b - Read Authorization Response</a>
            </h5>
<p id="section-3.2.4.2-1">The capabilities of the web attacker, but can also read the
authorization response. This can happen e.g., due to the URL leaking
in proxy logs, web browser logs, web browser history, or on mobile
operating systems.<a href="#section-3.2.4.2-1" class="pilcrow">¶</a></p>
</section>
</div>
</section>
</div>
<div id="attackers-at-the-token-endpoint">
<section id="section-3.2.5">
          <h4 id="name-attackers-at-the-token-endp">
<a href="#section-3.2.5" class="section-number selfRef">3.2.5. </a><a href="#name-attackers-at-the-token-endp" class="section-name selfRef">Attackers at the Token Endpoint</a>
          </h4>
<div id="a5-read-token-requests-and-responses">
<section id="section-3.2.5.1">
            <h5 id="name-a5-read-token-requests-and-">
<a href="#section-3.2.5.1" class="section-number selfRef">3.2.5.1. </a><a href="#name-a5-read-token-requests-and-" class="section-name selfRef">A5 - Read Token Requests and Responses</a>
            </h5>
<p id="section-3.2.5.1-1">This attacker makes the client use a token endpoint that is not the
one of the honest AS. This attacker can read and tamper with messages
sent to and from this token endpoint that the client thinks as of an
honest AS.<a href="#section-3.2.5.1-1" class="pilcrow">¶</a></p>
</section>
</div>
<div id="a7-read-resource-requests-and-responses">
<section id="section-3.2.5.2">
            <h5 id="name-a7-read-resource-requests-a">
<a href="#section-3.2.5.2" class="section-number selfRef">3.2.5.2. </a><a href="#name-a7-read-resource-requests-a" class="section-name selfRef">A7 - Read Resource Requests and Responses</a>
            </h5>
<p id="section-3.2.5.2-1">The capabilities of the web attacker, but this attacker can also read
requests sent to and from the resource server, for example because the
attacker can read TLS intercepting proxy logs on the RS's side.<a href="#section-3.2.5.2-1" class="pilcrow">¶</a></p>
</section>
</div>
<div id="a8-tamper-with-resource-responses">
<section id="section-3.2.5.3">
            <h5 id="name-a8-tamper-with-resource-res">
<a href="#section-3.2.5.3" class="section-number selfRef">3.2.5.3. </a><a href="#name-a8-tamper-with-resource-res" class="section-name selfRef">A8 - Tamper with Resource Responses</a>
            </h5>
<p id="section-3.2.5.3-1">The capabilities of A7, but this attacker can also tamper with
responses from the resource servers (e.g., a fully compromised
resource server).<a href="#section-3.2.5.3-1" class="pilcrow">¶</a></p>
</section>
</div>
</section>
</div>
</section>
</div>
</section>
</div>
<div id="non-repudiation-requirements">
<section id="section-4">
      <h2 id="name-non-repudiation-requirement">
<a href="#section-4" class="section-number selfRef">4. </a><a href="#name-non-repudiation-requirement" class="section-name selfRef">Non-Repudiation Requirements</a>
      </h2>
<p id="section-4-1">Beyond what is captured by the security goals and the attacker model,
parties could try to deny having sent a particular message, for
example, a payment request. For this purpose, non-repudiation is
needed. This is achieved by providing application-level signatures
that can be stored together with the payload and meaningful metadata
of a request or response.<a href="#section-4-1" class="pilcrow">¶</a></p>
<div id="affected-messages">
<section id="section-4.1">
        <h3 id="name-affected-messages">
<a href="#section-4.1" class="section-number selfRef">4.1. </a><a href="#name-affected-messages" class="section-name selfRef">Affected messages</a>
        </h3>
<ul>
<li id="section-4.1-1.1">
            <p id="section-4.1-1.1.1">NR1: Authorization Requests<a href="#section-4.1-1.1.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-4.1-1.2">
            <p id="section-4.1-1.2.1">NR2: Authorization Responses<a href="#section-4.1-1.2.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-4.1-1.3">
            <p id="section-4.1-1.3.1">NR3: ID Token Contents<a href="#section-4.1-1.3.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-4.1-1.4">
            <p id="section-4.1-1.4.1">NR4: Introspection Responses<a href="#section-4.1-1.4.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-4.1-1.5">
            <p id="section-4.1-1.5.1">NR5: Userinfo Responses<a href="#section-4.1-1.5.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-4.1-1.6">
            <p id="section-4.1-1.6.1">NR6: Resource Requests<a href="#section-4.1-1.6.1" class="pilcrow">¶</a></p>
</li>
          <li id="section-4.1-1.7">
            <p id="section-4.1-1.7.1">NR7: Resource Responses<a href="#section-4.1-1.7.1" class="pilcrow">¶</a></p>
</li>
        </ul>
</section>
</div>
</section>
</div>
<section id="section-5">
      <h2 id="name-normative-references">
<a href="#section-5" class="section-number selfRef">5. </a><a href="#name-normative-references" class="section-name selfRef">Normative References</a>
      </h2>
<dl class="references">
<dt id="RFC6749">[RFC6749]</dt>
    <dd>
<span class="refAuthor">Hardt, D., Ed.</span>, <span class="refTitle">"The OAuth 2.0 Authorization Framework"</span>, <span class="seriesInfo">RFC 6749</span>, <span class="seriesInfo">DOI 10.17487/RFC6749</span>, <time datetime="2012-10">October 2012</time>
          <span>, <<a href="https://www.rfc-editor.org/info/rfc6749">https://www.rfc-editor.org/info/rfc6749</a>></span>. </dd>
</dl>
</section>
<section id="section-6">
      <h2 id="name-informative-references">
<a href="#section-6" class="section-number selfRef">6. </a><a href="#name-informative-references" class="section-name selfRef">Informative References</a>
      </h2>
<dl class="references">
<dt id="arXiv.1901.11520">[arXiv.1901.11520]</dt>
    <dd>
<span class="refAuthor">Fett, D.</span><span class="refAuthor">, Hosseyni, P.</span><span class="refAuthor">, and R. Küsters</span>, <span class="refTitle">"An Extensive Formal Security Analysis of the OpenID Financial-grade API"</span>, <time datetime="2019-01-31">31 January 2019</time>
        <span>, <<a href="http://arxiv.org/abs/1901.11520/">http://arxiv.org/abs/1901.11520/</a>></span>. </dd>
</dl>
</section>
<div id="authors-addresses">
<section id="section-appendix.a">
      <h2 id="name-authors-address">
<a href="#name-authors-address" class="section-name selfRef">Author's Address</a>
      </h2>
<address class="vcard">
        <div dir="auto" class="left"><span class="fn nameRole">Daniel Fett</span></div>
<div dir="auto" class="left"><span class="org">yes.com</span></div>
<div class="email">
<span>Email:</span>
<a href="mailto:mail@danielfett.de" class="email">mail@danielfett.de</a>
</div>
</address>
</section>
</div>
<script>var toc = document.getElementById("toc");
var tocToggle = toc.querySelector("h2");
var tocNav = toc.querySelector("nav");

// mobile menu toggle
tocToggle.onclick = function(event) {
    if (window.innerWidth < 1024) {
 var tocNavDisplay = tocNav.currentStyle ? tocNav.currentStyle.display : getComputedStyle(tocNav, null).display;
 if (tocNavDisplay == "none") {
     tocNav.style.display = "block";
 } else {
     tocNav.style.display = "none";
 }
    }
}

// toc anchor scroll to anchor
tocNav.addEventListener("click", function (event) {
    event.preventDefault();
    if (event.target.nodeName == 'A') {
 if (window.innerWidth < 1024) {
     tocNav.style.display = "none";
 }
 var href = event.target.getAttribute("href");
 var anchorId = href.substr(1);
 var anchor =  document.getElementById(anchorId);
 anchor.scrollIntoView(true);
 window.history.pushState("","",href);
    }
});

// switch toc mode when window resized
window.onresize = function () {
    if (window.innerWidth < 1024) {
 tocNav.style.display = "none";
    } else {
 tocNav.style.display = "block";
    }
}
</script>
</body>
</html>