Skip to content

Commit b8ae06f

Browse files
committed
content updates
1 parent d5a184b commit b8ae06f

File tree

1 file changed

+148
-124
lines changed

1 file changed

+148
-124
lines changed

docs/spec/draft/source-requirements.md

Lines changed: 148 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ level.
7979

8080
| Track/Level | Requirements | Focus
8181
| ----------- | ------------ | -----
82-
| [Source L1](#source-l1) | Use a version control system | First steps towards operational maturity
83-
| [Source L2](#source-l2) | History and controls for protected branches & tags | Preserve history and ensure the process has been followed
84-
| [Source L3](#source-l3) | Signed provenance | Tampering by the source control system
85-
| [Source L4](#source-l4) | Code review | Tampering by project contributors
82+
| [Source L1](#source-l1) | Use a version control system. | Generation and use of discrete Source Revisions.
83+
| [Source L2](#source-l2) | Preserve Change History and generate Source Provenance. | Reliable history through enforced controls and evidence.
84+
| [Source L3](#source-l3) | Enforce organizational intent with technical controls. | Consumer knowledge of consumable Source Revisions and their guaranteed technical controls.
85+
| [Source L4](#source-l4) | Require code review. | Improved code quality and resistance to insider threats.
8686

8787
<section id="source-l1">
8888

@@ -105,45 +105,53 @@ Migrating to the appropriate tools is an important first step on the road to ope
105105
</section>
106106
<section id="source-l2">
107107

108-
### Level 2: Controls
108+
### Level 2: History & Provenance
109109

110110
<dl class="as-table">
111111
<dt>Summary<dd>
112112

113-
Clarifies which branches and tags in a repo are consumable and guarantees that
114-
all changes to protected branches and tags are recorded and subject to the
115-
organization's technical controls.
113+
At least one branch’s history is continuous, immutable, and retained, and the
114+
SCS issues Source Provenance Attestations for each new Source Revision.
115+
The attestations provide contemporaneous, tamper‑resistant evidence of when
116+
changes were made, who made them, and which technical controls were enforced.
116117

117118
<dt>Intended for<dd>
118119

119120
All organizations of any size producing software of any kind.
120121

121122
<dt>Benefits<dd>
122123

123-
Allows organizations and source consumers the ability to ensure the change
124-
management process has been followed to track changes to the software over time
125-
and attribute those changes to the actors that made them.
124+
Reliable history allows organizations and consumers to track changes to software
125+
over time, enabling attribution of those changes to the actors that made them.
126+
Source Provenance provides strong, tamper-resistant evidence of the process that
127+
was followed to produce a Source Revision.
126128

127129
</dl>
128130
</section>
129131
<section id="source-l3">
130132

131-
### Level 3: Signed and Auditable Provenance
133+
### Level 3: Communication and Enforcement of Intent
132134

133135
<dl class="as-table">
134136
<dt>Summary<dd>
135137

136-
The SCS generates credible, tamper-resistant, and contemporaneous evidence of how a specific revision was created.
137-
It is provided to authorized users of the source repository in a documented format.
138+
The SCS is configured to enforce the Organization's intentions for the Source
139+
Repository using any necessary technical controls.
140+
141+
The Organization clarifies which revisions and Named References in a repo are
142+
intended for consumption and defines which technical controls are guaranteed in
143+
those contexts.
138144

139145
<dt>Intended for<dd>
140146

141-
Organizations that want strong guarantees and auditability of their change management processes.
147+
Organizations with many Named References or who otherwise need to document
148+
which controls were in place as Source Revisions were created.
142149

143150
<dt>Benefits<dd>
144151

145-
Provides information to policy enforcement tools to reduce the risk of tampering
146-
within the SCS's storage systems.
152+
A verifier can use this published data to ensure that a given Source Revision
153+
was created in the correct way by verifying the Source Provenance or VSA
154+
for all expected claims and properties.
147155

148156
</dl>
149157
</section>
@@ -193,47 +201,34 @@ attestations.
193201

194202
<td>✓<td>✓<td>✓<td>✓
195203

196-
<tr id="protect-consumable-branches-and-tags"><td>Protect consumable branches and tags <a href="#protect-consumable-branches-and-tags">🔗</a><td>
204+
<tr id="configure-controls"><td>Configure the SCS to enforce intent <a href="#configure-controls">🔗</a><td>
197205

198-
An organization producing source revisions MUST implement a change management
199-
process to ensure changes to source matches the organization's intent.
206+
The organization MUST configure access controls that govern access to sensitive
207+
operations on the Source Repository.
208+
These controls MUST be implemented using the SCS-provided
209+
[Identity Management capability](#identity-management).
200210

201-
The organization MUST specify which branches and tags are covered by the process
202-
and are intended for use in its own applications or services or those of
203-
downstream consumers of the software.
211+
> For example, an organization may configure the SCS to assign users to a
212+
`maintainers` role and only allow users in `maintainers` to make updates to `main`.
204213

205-
> For example, if an organization has branches 'main' and 'experimental' and it
206-
intends for 'main' to be protected then it MUST indicate to the SCS that 'main'
207-
should be protected. From that point forward revisions on 'main' will be
208-
eligible for Source Level 2+ while revisions made solely on 'experimental' will
209-
not.
214+
The SCS MUST be configured to produce a reliable [Change History](#history)
215+
for all consumable Source Revisions.
210216

211-
The organization MUST use the SCS provided
212-
[Identity Management capability](#identity-management) to configure the actors
213-
and roles that are allowed to perform sensitive actions on protected branches
214-
and tags.
217+
> For example, if the organization intends for all new Source Revisions on the
218+
`main` branch to be unit tested prior to acceptance, this MUST be explicitly
219+
configured in the SCS, not a social contract.
215220

216-
> For example, an organization may configure the SCS to assign users to a `maintainers` role and only allow users in `maintainers` to make updates to `main`.
221+
If the SCS supports "tags" (or other Named References that do not support
222+
continuity enforcement mechanisms or change management processes), the SCS MUST
223+
be configured to prevent tags from being moved or deleted.
217224

218-
The organization MUST specify what technical controls consumers can expect to be
219-
enforced for revisions in each protected branch and tag using the
220-
[Enforced change management process](#enforced-change-management-process)
221-
and it MUST document the meaning of those controls.
222-
223-
> For example, an organization may claim that revisions on `main` passed unit
224-
tests before being accepted. The organization could then configure the SCS to
225-
enforce this requirement and store corresponding [test result attestations] for
226-
all affected revisions. They may then embed the `ORG_SOURCE_UNIT_TESTED`
227-
property in the [Source VSA](#source-verification-summary-attestation). Consumers
228-
would then expect that future revisions on `main` have been united tested and
229-
determine if that expectation has been met by looking for the
230-
`ORG_SOURCE_UNIT_TESTED` property in the VSAs and, if desired, consult the
231-
[test result attestations] as well.
232-
233-
[test result attestations]: https://github.com/in-toto/attestation/blob/main/spec/predicates/test-result.md
225+
> For example, if a git tag `release1` is used to indicate a release revision
226+
with ID `abc123`, controls must be configured to prevent that tag from being
227+
updated to any other revision in the future.
228+
Evidence of these controls (and their continuity) will appear in the Source
229+
Provenance documents for revision `abc123`.
234230

235231
<td><td>✓<td>✓<td>✓
236-
237232
<tr id="safe-expunging-process"><td>Safe Expunging Process <a href="#safe-expunging-process">🔗</a><td>
238233

239234
SCSs MAY allow the organization to expunge (remove) content from a repository
@@ -281,6 +276,26 @@ to be kept private to the extent possible. Organizations SHOULD prefer to make
281276
logs public if possible.
282277

283278
<td><td>✓<td>✓<td>✓
279+
<tr id="intent"><td>Declare which revisions are consumable <a href="#intent">🔗</a><td>
280+
281+
The organization MUST specify which Source Revisions are intended for use and
282+
how to find them.
283+
284+
> For example, if an organization has branches `main` and `experimental` and it
285+
intends for Source Revisions on `main` to be used, then it MUST document that
286+
revisions on `main` can be consumed. From that point forward, revisions on
287+
`main` will be considered consumable while revisions solely on `experimental`
288+
will not.
289+
290+
The organization MUST specify what technical controls consumers can expect to be
291+
enforced on consumable Source Revisions and it MUST document the meaning of
292+
those controls.
293+
294+
> For example, if an organization requires Static Application Security Testing
295+
on consumable revisions and implements it via a required GitHub Actions workflow,
296+
it must indicate the name of this workflow and what it accomplishes.
297+
298+
<td><td><td>✓<td>✓
284299

285300
</table>
286301

@@ -332,92 +347,55 @@ the SCS-issued [source provenance](#source-provenance) when issuing
332347
the VSAs.
333348

334349
<td>✓<td>✓<td>✓<td>✓
335-
<tr id="branches"><td>Protected Branches <a href="#branches">🔗</a><td>
336-
337-
The SCS MUST provide a mechanism for organizations to indicate which branches
338-
should be protected by SLSA Source Level 2+ requirements.
339-
340-
E.g. The organization may configure the SCS to protect `main` and
341-
`refs/heads/releases/*`, but not `refs/heads/playground/*`.
342350

343-
<td><td>✓<td>✓<td>✓
344351
<tr id="history"><td>History <a href="#history">🔗</a><td>
345352

346-
Revisions are created by applying specific code changes (a "diff" in git) on
347-
top of earlier revisions of a branch. This sequence of changes, the revisions
348-
they produced, and how they were introduced into a branch constitute the history
349-
of that branch.
350-
351-
The SCS MUST record the sequence of changes, the revisions they created,
352-
the actors that introduced them and the context they were introduced into.
353+
The SCS MUST record the sequence of all Source Revisions ever referenced by a
354+
branch.
355+
This MUST include metadata capturing when each change occurred and the actor who
356+
made it.
353357

354358
The SCS MUST prevent tampering with these records on protected branches.
355359

356360
> For example, in systems like GitHub or GitLab, this can be accomplished by
357361
enabling branch protection rules that prevent force pushes and branch deletions.
358362

359-
<td><td>✓<td>✓<td>✓
360-
<tr id="enforced-change-management-process"><td>Enforced change management process <a href="#enforced-change-management-process">🔗</a><td>
363+
If revisions have their own ancestries in the VCS, the SCS MUST ensure that all
364+
new revisions added to a branch are descendants of the previous revision of the branch.
361365

362-
The SCS MUST
363-
364-
- Ensure organization-defined technical controls are enforced for changes made
365-
to protected branches.
366-
- Allow organizations to specify
367-
[additional properties](#additional-properties) to be included in the
368-
[Source VSA](#source-verification-summary-attestation) when the corresponding controls are
369-
enforced.
370-
- Allow organizations to distribute additional attestations related to their
371-
technical controls to consumers authorized to access the corresponding source
372-
revision.
373-
- Prevent organization-specified properties from beginning with any value
374-
other than `ORG_SOURCE_` unless the SCS endorses the veracity of the
375-
corresponding claims.
376-
377-
> For example: enforcement of the organization-defined technical controls could
378-
be accomplished by the configuration of branch protection rules (e.g.
379-
[GitHub](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets),
380-
[GitLab](https://docs.gitlab.com/ee/user/project/repository/branches/protected.html))
381-
which require additional checks to 'pass' (e.g. unit tests, linters) or the
382-
application and verification of [gittuf](https://github.com/gittuf/gittuf)
383-
policies.
366+
> For example, if `main` currently points to revision `a`, it may only be
367+
moved to a new revision, `b`, if `b` has `a` somewhere in its revision ancestry.
384368

385369
<td><td>✓<td>✓<td>✓
386370
<tr id="continuity"><td>Continuity <a href="#continuity">🔗</a><td>
387371

388-
In a source control system, each new revision is built on top of prior
389-
revisions. Controls (e.g. [history](#history) or
390-
[enforced change management process](#enforced-change-management-process)) are
391-
only effective if they are used continuously from one revision to another. If
392-
a control is disabled for the introduction of a new revision and then re-enabled
393-
it is difficult to reason about the effectiveness of the control. 'Continuity' is
394-
the concept of ensuring controls are enforced continuously from the time they
395-
were introduced, leading to a higher degree of trust in the revisions produced
396-
after their introduction.
397-
398-
On [protected branches](#branches) continuity for [history](#history) and
399-
[enforced change management process](#enforced-change-management-process)
400-
controls MUST be established and tracked from a specific revision forward
401-
through each new revision created. If there is a lapse in continuity for a
402-
specific control, continuity of that control MUST be re-established from a new
403-
revision.
404-
405-
Continuity exceptions are allowed via the [safe expunging process](#safe-expunging-process).
406-
407-
<td><td>✓<td>✓<td>✓
408-
<tr id="protected-tags"><td>Protected Tags <a href="#protected-tags">🔗</a><td>
372+
In a Source Control System, each new revision is built on top of prior
373+
revisions. Technical Controls (e.g. [history](#history) or
374+
[branch protections](#branches)) are only effective if they are used
375+
continuously from one revision to another. If a control is disabled for the
376+
introduction of a new revision and then re-enabled it is difficult to reason
377+
about the effectiveness of the control. 'Continuity' is the concept of ensuring
378+
technical controls are enforced continuously along a branch, leading to a higher
379+
degree of trust in the revisions produced after their introduction.
409380

410-
If the SCS supports tags (or other non-branch revision trackers), additional
411-
care must be taken to prevent unintentional changes.
412-
Unlike branches, tags have no built-in continuity enforcement mechanisms or
413-
change management processes.
381+
On [protected branches](#branches), continuity for controls MUST be established
382+
and tracked from a specific revision forward through each new revision created.
383+
If there is a lapse in continuity for a specific control, continuity of that
384+
control MUST be re-established from a new revision.
414385

415-
The SCS MUST provide a mechanism for organizations to indicate which tags should
416-
be protected by SLSA Source Level 2+ requirements.
386+
Continuity exceptions are allowed via the [safe expunging process](#safe-expunging-process).
417387

418-
The SCS MUST prevent protected tags from being moved or deleted.
388+
> For example, the main branch currently points to revision `a` and a new
389+
technical control `t` is configured.
390+
The next revision on the `main` branch, `b` will be the first revision that can
391+
claim to have been protected by `t` and `b` is the first revision in the
392+
"continuity" of `t`.
393+
If in the future, `t` is disabled, any revisions added to `main` while `t` is
394+
disabled cannot claim to have been protected by `t` and the "continuity" of `t`
395+
will be reset.
419396

420397
<td><td>✓<td>✓<td>✓
398+
421399
<tr id="identity-management"><td>Identity Management <a href="#identity-management">🔗</a><td>
422400

423401
The SCS MUST provide an identity management system or some other means of
@@ -429,7 +407,7 @@ branches, approval of changes).
429407

430408
Depending on the SCS, identity management may be provided by source control
431409
services (e.g., GitHub, GitLab), implemented using cryptographic signatures
432-
(e.g., using gittuf to manage public keys for actors), or extend existing
410+
(e.g., using gittuf to manage public keys for actors), or extending existing
433411
authentication systems used by the organization (e.g., Active Directory, Okta,
434412
etc.).
435413

@@ -439,6 +417,7 @@ Activities conducted on the SCS SHOULD be attributed to authenticated
439417
identities.
440418

441419
<td><td>✓<td>✓<td>✓
420+
442421
<tr id="source-provenance"><td>Source Provenance <a href="#source-provenance">🔗</a><td>
443422

444423
[Source Provenance](#source-provenance-attestations) are attestations that
@@ -448,17 +427,62 @@ associated with the revision identifier delivered to consumers and are a
448427
statement of fact from the perspective of the SCS. The SCS MUST document the
449428
format and intent of all Source Provenance attestations it produces.
450429

451-
At Source Level 3, Source Provenance MUST be created contemporaneously with the
452-
branch being updated to use that revision such that they provide a credible,
453-
auditable, record of changes.
430+
Source Provenance MUST be created contemporaneously with the branch being
431+
updated such that they provide a credible, auditable, record of changes.
454432

455-
If a consumer is authorized to access a revision, they MUST be able to fetch the
456-
corresponding source provenance documents for that revision.
433+
If a consumer is authorized to access a revision, they MUST be able to access the
434+
corresponding Source Provenance documents for that revision.
457435

458436
It is possible that an SCS can make no claims about a particular revision.
459437

460438
> For example, this would happen if the revision was created on another SCS,
461-
or if the revision was not the result of an accepted change management process.
439+
on a unprotected branch (such as a `topic` branch), or if the revision was not
440+
the result of the expected change management process.
441+
442+
The SCS MUST
443+
444+
- Allow organizations to provide
445+
[organization-specified properties](#additional-properties) to be included in the
446+
[Source VSA](#source-verification-summary-attestation) when the corresponding controls are
447+
enforced.
448+
- Allow organizations to distribute additional attestations related to their
449+
technical controls to consumers authorized to access the corresponding Source
450+
Revision.
451+
- Prevent organization-specified properties from beginning with any value
452+
other than `ORG_SOURCE_` unless the SCS endorses the veracity of the
453+
corresponding claims.
454+
455+
<td><td>✓<td>✓<td>✓
456+
<tr id="branches"><td>Protected Branches <a href="#branches">🔗</a><td>
457+
458+
The SCS MUST provide any technical controls needed to enforce the organization's
459+
intent for the repo.
460+
461+
The SCS MUST provide a mechanism for organizations to indicate which branches
462+
should be protected by technical controls.
463+
464+
> For example, the organization may instruct the SCS to protect `main` and
465+
`refs/heads/releases/*`, but not `refs/heads/experimental/*` using branch
466+
protection rules (e.g. [GitHub](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets),
467+
[GitLab](https://docs.gitlab.com/ee/user/project/repository/branches/protected.html))
468+
or via the application and verification of [gittuf](https://github.com/gittuf/gittuf)
469+
policies.
470+
471+
<td><td><td>✓<td>✓
472+
<tr id="protected-tags"><td>Protected Tags <a href="#protected-tags">🔗</a><td>
473+
474+
The SCS MUST provide any technical controls needed to enforce the organization's
475+
intent for the repo.
476+
477+
The SCS MUST provide a mechanism for organizations to indicate which tags
478+
should be protected by technical controls.
479+
480+
> For example, the organization may instruct the SCS to prevent the deletion of
481+
all `refs/tags/*` using tag
482+
protection rules (e.g. [GitHub](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets),
483+
[GitLab](https://docs.gitlab.com/user/project/protected_tags/))
484+
or via the application and verification of [gittuf](https://github.com/gittuf/gittuf)
485+
policies.
462486

463487
<td><td><td>✓<td>✓
464488
<tr id="two-party-review"><td>Two-party review <a href="#two-party-review">🔗</a><td>

0 commit comments

Comments
 (0)