You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* fix: SHA-pin slsa_with_provenance action; explicit shell=False; fix C-009/C-024 doc errors
- Pin slsa-framework/source-actions/slsa_with_provenance to commit SHA
dea965cdca5e0cb422bf7b2653c9d15f678ad01c (was tag v0.1.0, violating
the C-009 commit-SHA pinning control for the most security-sensitive
workflow)
- Add explicit shell=False to subprocess.run() in cmdline.py; the default
is False but the code did not state it, undermining the C-007 claim
- Rename duplicate C-009 "Plaintext transport detection" (usage model) to
C-045 to eliminate the control-ID conflict with C-009 "Actions
commit-SHA pinning" (supply-chain model); update all references in
compliance_data.py, compliance_track.rst, threat_model_usage.rst,
control_register.rst
- Rename C-024 from "secrets: inherit scope" to "Explicit secret
forwarding" — the implementation deliberately avoids secrets: inherit
and uses selective named forwarding; the old name was the inverse of
the actual behaviour
- Fix DFT-15 (VCS externals) accept rationale: the "Manifest under code
review" assumption does not cover nested submodule/external URLs that
come from the upstream repo, not dfetch.yaml; rebase on dfetch scope
boundary assumption with explicit residual-risk statement
- Add Risk Rating Methodology section to security.rst documenting the
Sev/Risk scale (L/M/H/VH/C) aligned with BSI TR-03183-1 §5.3; add
cross-reference from both threat model pages and update report_template
- Clarify ECR-C SO.Updateability and ECR-M SO.SecureDataDeletion: add
explanatory notes and gaps column text so "✓ Implemented" rows with no
control listed are not misleading to conformity assessors
- Update C-009 description from absolute "Every third-party Action" to
"All third-party Actions" (accurate after the SHA-pin fix above)
https://claude.ai/code/session_01CtU2HEmkrr4gBHvZMRT3U5
* fix: restore nosec B603 on subprocess.run with explicit scope
B603 is bandit's reminder-check for subprocess calls regardless of
shell=False; the suppression acknowledges that cmd is list-form args
constructed entirely from internal code, not from untrusted user input.
Scoped to B603 only (was unscoped # nosec before).
https://claude.ai/code/session_01CtU2HEmkrr4gBHvZMRT3U5
* fix: add RST section label for Risk Rating Methodology; fix stale C-009 in DFT-26
- Add .. _risk-rating-methodology: label above the section heading in
security.rst so :ref: cross-references resolve to the section itself
rather than the page-level anchor
- Update all three reference sites to use <risk-rating-methodology>:
security/report_template.rst, threat_model_supply_chain.rst,
threat_model_usage.rst
- Replace stale C-009 with C-045 in the DFT-26 note in tm_usage.py
(C-009 is commit-SHA pinning; C-045 is plaintext transport detection)
https://claude.ai/code/session_01CtU2HEmkrr4gBHvZMRT3U5
---------
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: doc/explanation/compliance_track.rst
+22-7Lines changed: 22 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -141,7 +141,7 @@ The table below summarises dfetch's implementation of each prEN 40000-1-4 Securi
141
141
* - **ECR-C** — Ensure that vulnerabilities can be addressed through security updates, including automatic updates enabled by default, with an opt-out mechanism, user notification, and the option to postpone updates.
142
142
- SO.Updateability
143
143
- —
144
-
- —
144
+
- Satisfied by pip distribution (``pip install --upgrade dfetch``); no dfetch-specific control required — see note below table.
145
145
- ✓ Implemented
146
146
* -
147
147
- SO.AutomaticUpdates
@@ -165,7 +165,7 @@ The table below summarises dfetch's implementation of each prEN 40000-1-4 Securi
165
165
- ⚠ Partial
166
166
* -
167
167
- SO.AccessControlReport
168
-
- :ref:`C-009<c-009>`
168
+
- :ref:`C-045<c-045>`
169
169
- No persistent log of unauthorised access attempts
170
170
- ⚠ Partial
171
171
* - **ECR-E** — Protect the confidentiality of stored, transmitted or otherwise processed data by state-of-the-art mechanisms such as encryption at rest and in transit.
@@ -180,12 +180,12 @@ The table below summarises dfetch's implementation of each prEN 40000-1-4 Securi
@@ -210,7 +210,7 @@ The table below summarises dfetch's implementation of each prEN 40000-1-4 Securi
210
210
- ⚠ Partial
211
211
* -
212
212
- SO.IntegrityReport
213
-
- :ref:`C-009<c-009>`
213
+
- :ref:`C-045<c-045>`
214
214
- No persistent integrity-violation log
215
215
- ⚠ Partial
216
216
* - **ECR-G** — Process only data, personal or other, that are adequate, relevant and limited to what is necessary in relation to the intended purpose of the product with digital elements (data minimisation).
@@ -260,7 +260,7 @@ The table below summarises dfetch's implementation of each prEN 40000-1-4 Securi
260
260
- ⚠ Partial
261
261
* -
262
262
- SO.MonitorSecurityRelevantActivities
263
-
- :ref:`C-009<c-009>`
263
+
- :ref:`C-045<c-045>`
264
264
- —
265
265
- ⚠ Partial
266
266
* -
@@ -276,7 +276,7 @@ The table below summarises dfetch's implementation of each prEN 40000-1-4 Securi
276
276
* - **ECR-M** — Provide the possibility for users to securely and easily remove on a permanent basis all data and settings and, where such data can be transferred to other products or systems, ensure that this is done in a secure manner.
277
277
- SO.SecureDataDeletion
278
278
- —
279
-
- —
279
+
- No dfetch-specific control required — satisfied by design (no personal data stored); standard OS file deletion suffices — see note below table.
280
280
- ✓ Implemented
281
281
* -
282
282
- SO.DataTransmittedConfidentiality
@@ -294,6 +294,21 @@ The table below summarises dfetch's implementation of each prEN 40000-1-4 Securi
294
294
- —
295
295
- — N/A
296
296
297
+
.. rubric:: Notes on "Implemented" rows with no control listed
298
+
299
+
**ECR-C SO.Updateability** — No dfetch-specific control is needed. SUM-1/SUM-2
300
+
are satisfied by the PyPI distribution mechanism (``pip install --upgrade dfetch``
301
+
and GitHub Releases binary packages). pip's TLS-protected download channel provides
302
+
the required secure update path. The update mechanism is the responsibility of the
303
+
user's package manager, not of dfetch itself.
304
+
305
+
**ECR-M SO.SecureDataDeletion** — No dfetch-specific control is needed. DLM-1 is
306
+
satisfied by design: dfetch stores no personal data, credentials, or cryptographic
307
+
keying material on disk. The only on-disk state is ``.dfetch_data.yaml`` (non-sensitive
308
+
dependency metadata — credentials stripped by :ref:`C-036 <c-036>`) and vendored
309
+
source files (third-party code). Standard OS file deletion (``rm`` / ``del``) is
310
+
sufficient to remove all dfetch data; no secure-wipe facility is warranted.
The Sev / Risk rating scale and treatment vocabulary (Mitigate / Accept / Transfer)
21
+
are defined in the :ref:`Risk Rating Methodology <risk-rating-methodology>` section of the main security page.
20
22
21
23
Threat model for dfetch. Covers the pre-install lifecycle: code contribution, CI/CD, build (wheel / sdist), PyPI distribution, Winget manifest submission, and consumer installation. The installed dfetch package is the handoff point to tm_usage.py.
22
24
@@ -879,7 +881,7 @@ Controls
879
881
* - C-009
880
882
- Actions commit-SHA pinning
881
883
- DFT-07
882
-
- Every third-party GitHub Action is pinned to a full commit SHA, preventing tag-mutable supply-chain substitution. ``.github/workflows/*.yml``
884
+
- All third-party GitHub Actions are pinned to a full commit SHA (``@<40-hex>``), preventing tag-mutable supply-chain substitution. ``.github/workflows/*.yml``
883
885
* - C-010
884
886
- OIDC trusted publishing
885
887
- DFT-07
@@ -917,9 +919,9 @@ Controls
917
919
- DFT-02
918
920
- A CycloneDX SBOM is generated during the build and published alongside the PyPI release, satisfying CRA Article 13 requirements.
919
921
* - C-024
920
-
- ``secrets: inherit`` scope
922
+
- Explicit secret forwarding
921
923
- DFT-07
922
-
- ``ci.yml`` only passes required repository secrets to the test and docs workflows, preventing malicious PR steps from exfiltrating unrelated secrets.
924
+
- ``ci.yml`` explicitly names only the secrets each child workflow requires (``CODACY_PROJECT_TOKEN`` → ``test.yml``; ``GH_DFETCH_ORG_DEPLOY`` → ``docs.yml``); all other repository secrets are not forwarded. ``secrets: inherit`` is deliberately not used so that malicious PR steps cannot exfiltrate unrelated secrets. ``.github/workflows/ci.yml``
The Sev / Risk rating scale and treatment vocabulary (Mitigate / Accept / Transfer)
21
+
are defined in the :ref:`Risk Rating Methodology <risk-rating-methodology>` section of the main security page.
20
22
21
23
Threat model for dfetch. Covers the post-install lifecycle: reading the manifest, fetching dependencies from VCS and archive sources, applying patches, writing vendored files, and generating reports (SBOM, SARIF, check output). The installed dfetch package - produced by the supply chain in tm_supply_chain.py - is the entry point.
22
24
@@ -1013,7 +1015,7 @@ Threats
1013
1015
|**Risk:** 🟠H
1014
1016
|**STRIDE:** T
1015
1017
|**Status:** Accept
1016
-
- Git submodules are followed: ``git submodule update --init --recursive`` is called unconditionally during every Git fetch (``dfetch/vcs/git.py``), and each submodule is recorded as a ``Dependency`` with ``source_type='git-submodule'`` (``gitsubproject.py``). SVN ``export`` is invoked without ``--ignore-externals``; each ``svn:externals`` entry triggers an additional fetch, and ``SvnSubProject._fetch_externals()`` records it as a ``Dependency`` with ``source_type='svn-external'`` (``svnsubproject.py``). Both behaviours are intentional — dfetch vendors submodule and external trees and surfaces them in metadata — but the fetched URLs come from the upstream repository (``.gitmodules`` / ``svn:externals``), not from ``dfetch.yaml``, and therefore bypass manifest code review and carry no integrity hash. Suppressing these fetches (e.g. passing ``--no-recurse-submodules`` or ``--ignore-externals``) would be a design change that removes intentional vendoring behaviour. Accepted based on the **Manifest under code review** assumption: the choice to vendor an upstream that contains submodules or svn:externals is declared in ``dfetch.yaml`` and subject to code review; the decision to trust those nested URLs is made at the manifest-review boundary.
1018
+
- Git submodules are followed: ``git submodule update --init --recursive`` is called unconditionally during every Git fetch (``dfetch/vcs/git.py``), and each submodule is recorded as a ``Dependency`` with ``source_type='git-submodule'`` (``gitsubproject.py``). SVN ``export`` is invoked without ``--ignore-externals``; each ``svn:externals`` entry triggers an additional fetch, and ``SvnSubProject._fetch_externals()`` records it as a ``Dependency`` with ``source_type='svn-external'`` (``svnsubproject.py``). Both behaviours are intentional — dfetch vendors submodule and external trees and surfaces them in metadata — but the fetched URLs come from the upstream repository (``.gitmodules`` / ``svn:externals``), not from ``dfetch.yaml``, and therefore bypass manifest code review and carry no integrity hash. Suppressing these fetches (e.g. passing ``--no-recurse-submodules`` or ``--ignore-externals``) would be a design change that removes intentional vendoring behaviour. The initial decision to vendor a given upstream repository (which may contain submodules or SVN externals) is declared in ``dfetch.yaml`` and subject to code review. However, the specific nested URLs in ``.gitmodules`` or ``svn:externals`` are not visible in ``dfetch.yaml`` and are not independently reviewed; if an upstream maintainer adds a new submodule after the initial review, dfetch will fetch it on the next ``dfetch update`` without a new ``dfetch.yaml`` change triggering review. Residual risk: a compromised upstream maintainer could inject a malicious submodule URL that bypasses the manifest review boundary. Accepted based on the **dfetch scope boundary** assumption: the security of fetched third-party source code and its nested dependencies is the responsibility of the manifest author who selects and pins each upstream; ``dfetch check`` version-drift notifications prompt review before any upstream change (including new submodules) is vendored.
1017
1019
* - DFT-16
1018
1020
- Configured destination path allows writes to security-sensitive project directories
1019
1021
- A-22: dfetch Process
@@ -1101,7 +1103,7 @@ Threats
1101
1103
|**Risk:** 🟠H
1102
1104
|**STRIDE:** T I
1103
1105
|**Status:** Mitigate
1104
-
- C-009 emits a visible warning immediately before the VCS command when a plaintext scheme (``http://``, ``git://``, ``svn://``) is detected, with credentials redacted and ``https://`` / ``svn+ssh://`` recommended. Detection only — dfetch does not reject or upgrade plaintext URLs; scheme selection remains the manifest author's responsibility.
1106
+
- C-045 emits a visible warning immediately before the VCS command when a plaintext scheme (``http://``, ``git://``, ``svn://``) is detected, with credentials redacted and ``https://`` / ``svn+ssh://`` recommended. Detection only — dfetch does not reject or upgrade plaintext URLs; scheme selection remains the manifest author's responsibility.
1105
1107
* - DFT-28
1106
1108
- CI/CD build cache poisoned to silently substitute a malicious compiled artifact
1107
1109
- A-20: Local VCS Cache (temp)
@@ -1188,7 +1190,7 @@ Controls
1188
1190
- Manifest input validation
1189
1191
- DFT-04, DFT-08
1190
1192
- StrictYAML schema with ``SAFE_STR = Regex(r"^[^\x00-\x1F\x7F-\x9F]*$")`` rejects control characters in all string fields. ``dfetch/manifest/schema.py``
1191
-
* - C-009
1193
+
* - C-045
1192
1194
- Plaintext transport detection
1193
1195
- DFT-26
1194
1196
- ``plaintext_warning()`` (``dfetch/manifest/project.py``) inspects the resolved remote URL immediately before each VCS command is issued (inside the ``check_for_update`` and ``update`` spinners in ``subproject.py``). If the scheme is ``http://``, ``git://``, or ``svn://``, a visible warning is emitted naming the redacted URL (credentials stripped from the userinfo component) and recommending ``https://`` or ``svn+ssh://``. Detection only — dfetch still proceeds with the plaintext connection; the control raises user awareness but does not enforce scheme selection. ``dfetch/manifest/project.py, dfetch/project/subproject.py``
0 commit comments