Skip to content

Commit 683cc5d

Browse files
mnm678John Kjell
andauthored
Move TAP 8 to accepted (#187)
* Remove remaining references to revocation and add implementation revocation has been moved ot TAP 20. Signed-off-by: Marina Moore <mnm678@gmail.com> * Move TAP 8 to accepted Signed-off-by: Marina Moore <mnm678@gmail.com> * Apply suggestions from code review Co-authored-by: John Kjell <john@testifysec.com> Signed-off-by: Marina Moore <mnm678@users.noreply.github.com> --------- Signed-off-by: Marina Moore <mnm678@gmail.com> Signed-off-by: Marina Moore <mnm678@users.noreply.github.com> Co-authored-by: John Kjell <john@testifysec.com>
1 parent 60e950f commit 683cc5d

File tree

2 files changed

+19
-59
lines changed

2 files changed

+19
-59
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* [TAP 3: Multi-role delegations](tap3.md)
88
* [TAP 4: Multiple repository consensus on entrusted targets](tap4.md)
99
* [TAP 6: Include specification version in metadata](tap6.md)
10+
* [TAP 8: Key rotation and explicit self-revocation](tap8.md)
1011
* [TAP 9: Mandatory metadata signing schemes](tap9.md)
1112
* [TAP 10: Remove native support for compressed metadata](tap10.md)
1213
* [TAP 11: Using POUFs for Interoperability](tap11.md)
@@ -15,7 +16,6 @@
1516

1617
## Draft
1718

18-
* [TAP 8: Key rotation and explicit self-revocation](tap8.md)
1919
* [TAP 13: User Selection of the Top-Level Target Files Through Mapping Metadata](tap13.md)
2020
* [TAP 16: Snapshot Merkle Trees](tap16.md)
2121
* [TAP 17: Remove Signature Wrapper from the TUF Specification](tap17.md)

tap8.md

Lines changed: 18 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
* TAP: 8
22
* Title: Key rotation and explicit self-revocation
33
* Version: 2
4-
* Last-Modified: 16-Nov-2022
4+
* Last-Modified: 26-Mar-2024
55
* Author: Hannes Mehnert, Justin Cappos, Marina Moore
6-
* Status: Draft
6+
* Status: Accepted
77
* Content-Type: text/markdown
88
* Created: 10-May-2017
99

@@ -30,26 +30,12 @@ Snapshot and timestamp cannot use this rotation mechanism.
3030

3131
Conceptually, the rotation process says if you trusted threshold of keys
3232
X = X_0, ... X_n, now instead trust threshold of keys Y = Y_0, ... Y_n. Rotation
33-
of a key may be performed any number of times, transferring trust from X to Y, then
33+
of a role may be performed any number of times, transferring trust from X to Y, then
3434
from Y to Z, etc. Trust can even be transferred back from Z to X, allowing a key
3535
to be added to a role, then later removed. If a single key needs to be replaced,
3636
it can be safely rotated using the mechanism in this TAP.
3737

38-
The mechanism in this TAP has an additional use case: if a rotation
39-
to a null key is detected, it causes the role to no longer be trusted.
40-
A role could use a rotation to a null key if they suspect a threshold of keys
41-
have been compromised
42-
(a lost hard drive, system breach, etc). The role is able to create a
43-
rotation to null without the help of the delegator, so they are able to
44-
explicitly revoke trust in the role immediately, improving response time
45-
to a key compromise. A rotation to a null key revokes trust in the role,
46-
not specific keys, so all keys associated with the role will be invalid
47-
after a rotation to null. The client will detect a rotation
48-
to a null key and treat it as if the metadata was unsigned.
49-
50-
A delegator to a role A is able to help A recover from a rotation to null of A by
51-
delegating to a new set of keys for A with a new role name.
52-
Additionally, a delegator can overrule a rotate file by delegating to a new role
38+
A delegator can overrule a rotate file by delegating to a new role
5339
with a new set of keys. This ensures that the delegator is still the source of
5440
trust, but allows the role to act independently.
5541

@@ -71,7 +57,7 @@ delegations to be redone whenever this quorum changed.) Adding and
7157
removing delegations of a project often uses the project role's key which is
7258
delegated to. This project role gives persons with access to it elevated
7359
privileges, and needs intervention from a higher level of delegations if
74-
it needs to be rotated or revoked.
60+
it needs to be rotated.
7561

7662
With TAP 8, the delegation can be assigned to a role (that contains a set
7763
of keys and a threshold value). Developers could then collectively sign
@@ -130,15 +116,15 @@ role T to delegate to the new keyset e. If one of role D's keys is
130116
compromised, they have to wait for role T to replace the key with a new,
131117
trusted key.
132118

133-
With this proposal, the owner of role D can replace their own key, and also
134-
revoke their key without relying on the delegator. This will improve
119+
With this proposal, the owner of role D can replace their own key
120+
without relying on the delegator. This will improve
135121
response time to key compromises and prevent key sharing by allowing keys to be
136122
rotated more regularly. Combined with multi-role delegations this allows
137123
project teams to shrink and grow without delegation to a project key.
138124

139125
TUF already contains a key rotation mechanism, which is only specified
140126
and used for the root file. This proposal allows the rotation
141-
mechanism to be used by other delegations, and extends it with self-revocation.
127+
mechanism to be used by other delegations.
142128

143129

144130
# Specification
@@ -152,7 +138,7 @@ delegations stay intact, the targets can rotate keys, remove keys, or add keys.
152138
## Rotate file
153139

154140
The signed portion of a `rotate` file is as follows (there's also a
155-
signatures wrapper as in tuf spec, not shown here):
141+
signatures wrapper as in the TUF specification, not shown here):
156142

157143
```python
158144
{
@@ -162,12 +148,12 @@ signatures wrapper as in tuf spec, not shown here):
162148
"keys" : {
163149
KEYID : KEY
164150
, ... } ,
165-
"threshold" : THRESHOLD }
151+
"threshold" : THRESHOLD
166152
}
167153
```
168154

169155
Where ROLE, KEYID, KEY, and THRESHOLD are as defined in the original
170-
tuf spec. The value of ROLE has to be the same as the role for the
156+
tuf specification. The value of ROLE has to be the same as the role for the
171157
delegation. The value of THRESHOLD is its new value. VERSION is
172158
the integer version number of rotate files for this role. Version
173159
numbers MUST increase by exactly 1 from the previous rotate file for
@@ -221,16 +207,13 @@ The client will then look for all files that begin with `rotate/foo.rotate` in
221207
the snapshot metadata. The client will process these in version order (ie starting
222208
with `rotate/foo.rotate.1`, then `rotate/foo.rotate.2` by first checking for this
223209
version file in a local cache. The client will then fetch the rotate file from
224-
remote. If the remote file is a rotation to null, and is signed with the currently
225-
trusted keys, the client will halt the verification of this metadata and act as if
226-
it is unverified when continuing the update process (and look for metadata from
227-
the next role in the pre-order depth-first search). Otherwise, the client should
210+
remote. The client should then
228211
ensure that the cached file is identical to the remote version. The client will
229212
then verify the rotate file using the currently trusted public key(s) for this role.
230213
If a rotate
231214
file is successfully verified, the client will update the set of trusted keys for
232-
this role to be the set listed in the rotate files. If key data is missing
233-
or there is a rotation to null, the targets file is invalid and the client will
215+
this role to be the set listed in the rotate files. If key data is missing,
216+
the targets file is invalid and the client will
234217
proceed with the update process as if verification for this role failed (by moving
235218
on to another trusted role for this target, or reporting an error to the user).
236219

@@ -294,20 +277,6 @@ foo.rotate.2 is created, which contains the existing keyids as well as
294277
Evelyn's public key, and a threshold value of 3. This
295278
is signed with at least 2 keys from the current set of keyids.
296279

297-
## Rotation to Null
298-
299-
Clients need to check for rotations to a null key, and any delegation pointing
300-
to a rotation to a null key is invalid. The null key is a hard coded value used across
301-
tuf implementations. This enables a role to explicitly revoke their
302-
own key(s) by introducing a rotation to null.
303-
304-
**Prioritizing Self Revocation**
305-
Rotation files are immutable unless replaced with a revocation (rotate
306-
to null). This is the only case in which they can be replaced or
307-
modified. If a client wants to rotate to a different
308-
key, without having access to their currently delegated private key,
309-
this requires a key revocation by the delegating metadata.
310-
311280
Rotations which do not have any entry point anymore (the delegation they
312281
stem from has can been replaced with new keys) can be
313282
safely removed from the repository. If the delegation of foo is
@@ -327,7 +296,7 @@ The interaction between the Fulcio TAP and this TAP may impact the security
327296
considerations in this TAP. If the Fulcio server or OIDC issuer is compromised,
328297
an attacker could gain control over all TUF roles controlled by that entity.
329298
If this happens, the attacker could use TAP 8 to create large-scale rotations
330-
to null to perform a denial of service. However, this attack can be safely
299+
to perform a denial of service. However, this attack can be safely
331300
recovered from using the delegator to replace all effected keys. This is
332301
especially effective if the top-level targets is controlled by offline keys.
333302
For this reason, we recommend that both root and top-level targets are
@@ -347,25 +316,16 @@ provide a simple mechanism for extending and shrinking project membership
347316
without an individual with elevated privileges, but based
348317
on a threshold of signatures.
349318

350-
Clients need to take care to check for rotation to a null key (rotate
351-
files that contain a null key). This shall be handled in the
352-
same manner as an invalid metadata signature on by the role possessing
353-
the key. The role will be invalid until it is re-delegated to with a new key.
354-
Clients MUST use snapshot metadata to ensure that they recieve all rotate files
319+
Clients MUST use snapshot metadata to ensure that they receive all rotate files
355320
in the chain.
356321

357-
Intentionally rotating to null enables a repository, a
358-
project, and individuals to explicitly revoke their key material
359-
themselves. An individual whose key is compromised can introduce
360-
a rotation to null, and all delegations to them will be invalid.
361-
362322
For mitigation of private key compromises, rotation can be used if and
363323
only if it can be assured that the legitimate holder is faster (at the
364324
snapshot service, and/or at the client) than the attacker who got
365325
control over the private key. Because this is hard to achieve, it is
366326
recommended for proper mitigation that the delegation itself is changed from
367327
the compromised key to a new key as soon as possible. Key revocation using
368-
rotation defined in this TAP can be used as a stop-gap for delegations made
328+
rotation defined in TAP 20 can be used as a stop-gap for delegations made
369329
by offline keys that may take some time to update.
370330

371331
As a general note, this TAP only extends the possibilities of a target,
@@ -396,7 +356,7 @@ verify the rotation chain.
396356

397357
# Augmented Reference Implementation
398358

399-
TODO
359+
https://github.com/theupdateframework/python-tuf/pull/2257/files
400360

401361
# Copyright
402362

0 commit comments

Comments
 (0)