@@ -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
119120All 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
239234SCSs 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
281276logs 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
332347the 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
354358The 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
423401The SCS MUST provide an identity management system or some other means of
@@ -429,7 +407,7 @@ branches, approval of changes).
429407
430408Depending on the SCS, identity management may be provided by source control
431409services (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
433411authentication systems used by the organization (e.g., Active Directory, Okta,
434412etc.).
435413
@@ -439,6 +417,7 @@ Activities conducted on the SCS SHOULD be attributed to authenticated
439417identities.
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
448427statement of fact from the perspective of the SCS. The SCS MUST document the
449428format 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
458436It 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