Commit bcb8fac
doc: restructure security.rst for clarity; remove dfetch check as security claim (#1282)
* doc: restructure security.rst for clarity; remove dfetch check as security claim
- Remove the "Security assessment output formats" section — dfetch check's
SARIF and Code Climate outputs are CI integration features, not part of
dfetch's security model
- Fix the Threat Models section: toctree now contains only the two actual
threat models; the misleading "each page is generated from Python modules"
claim (which did not apply to compliance_track or control_register) is corrected
- Give CRA Compliance its own toctree for compliance_track and control_register
- Move security_pipeline to a subsection of Further Reading (hidden toctree
keeps Sphinx happy); removes it from the main narrative flow
- Trim Further Reading: shorter descriptions, remove the EU Blue Guide entry
and the Code Climate / CycloneDX / SARIF format references
https://claude.ai/code/session_01MoaUFm7mhFxEFuk14NKPh2
* doc: fix factual errors in security/CRA compliance documentation
Corrections identified by compliance review against CRA (EU) 2024/2847,
BSI TR-03183-1, and ENISA/NIST references:
- Article 13(5) misidentification (critical): replace with correct
framing — Article 13(5) covers manufacturer documentation obligations,
not open-source or voluntary compliance. The note and classification
table now state that dfetch has no legal obligation under the CRA and
that downstream integrators must fulfil their own Article 13 duties.
- Recital 18 imprecision: the opening note now cites Article 3(1)
(the operative scope provision) alongside Recital 18 (interpretive
context). Recitals are preamble text, not binding law.
- Legal basis table: replace "Article 3(14), Recital 18, Article 13(5)"
with the correct chain: Article 3(1) (scope), Article 3(14)
(open-source software steward definition, for reference), Recital 18.
- Voluntary alignment row: remove incorrect Article 13(5) citation;
state plainly that the document is voluntary.
- "Art. 2(a)-(m)" corrected to "Annex I Part I (a)-(m)": Article 2
of the CRA is the scope article, not the essential requirements.
- Part II §4 N/A: rewritten without citing Recital 18 as the operative
basis; explains the obligation falls on commercial manufacturers only.
- ISO/IEC 27005 vocabulary claim removed: BSI TR-03183-1 is the
actual source of the Mitigate/Accept/Transfer vocabulary; ISO/IEC 27005
uses different terminology (Retain/Tolerate/Treat/Share/Terminate).
- prEN 40000-1-2 title updated to reflect SDL focus confirmed by
CEN/CLC work-programme sources; marked as working title.
- OSCAL 1.1.2 pinning noted in all three files: NIST released 1.2.2
in April 2026; the docs now clarify 1.1.2 is the pinned version.
https://claude.ai/code/session_01MoaUFm7mhFxEFuk14NKPh2
* doc: add Annex V map; fix ECR-B, ECR-C, ECR-D assessment accuracy
CRA Annex V technical documentation map (new section):
- Added between Classification Decision and Applicable Standards
- Maps each of the six Annex V elements to the corresponding dfetch
artifact or section, as a convenience for downstream Article 13
conformity assessments
ECR-B SO.SecureDefaultConfiguration gap was blank despite ⚠ Partial:
- Documents the actual gap: integrity hash (C-005) is opt-in; manifest
entries without an ``integrity`` field are fetched without verification
ECR-C SO.UserUpdateNotification — C-040 was wrongly mapped:
- C-040 is "test result attestation on source archive", not an update
notification mechanism
- Reclassified as N/A with rationale: dfetch is a passive CLI tool with
no persistent process; proactive in-product notifications are not
technically feasible without architectural change
- Note below table rewritten: clarifies that SUM-1/SUM-2 are satisfied
by PyPI+OIDC publishing and the CVE release gate (C-043), and explains
the N/A reasoning for LNM-1 in detail
ECR-D SO.AccessControl — framing was misleading:
- C-006 (non-interactive VCS) and C-036 (credential redaction) are
confidentiality controls, not authentication/authorisation mechanisms
- Gap now states explicitly that dfetch has no native access control
layer and delegates entirely to the VCS server and host OS
- SO.AccessControlReport gap note updated: C-045 detects plaintext
transport but does not log events
https://claude.ai/code/session_01MoaUFm7mhFxEFuk14NKPh2
* doc: correct SO.UserUpdateNotification — dfetch does check for new versions
dfetch check and dfetch environment both call newer_version_available()
in dfetch/util/github_version_check.py, which polls the GitHub releases
API and notifies the user if a newer release exists (suppressed in CI).
- Restore SO.UserUpdateNotification as ✓ Implemented with direct
reference to github_version_check.py; note CI suppression in Gaps
- Move C-040 (test result attestation) to ECR-A where it belongs:
attesting that CI tests passed before release is a vulnerability
management control, not an update notification mechanism
- Correct the note below the table: replace the wrong "N/A — passive
CLI tool" explanation with an accurate description of the check
https://claude.ai/code/session_01MoaUFm7mhFxEFuk14NKPh2
* doc: fix six weak/wrong ECR→SO control mappings in compliance_track
ECR-E SO.DataTransmittedConfidentiality (C-005 removed):
C-005 is an integrity hash, not a confidentiality control. Only C-045
remains; status downgraded to ⚠ Partial since C-045 warns but does not
enforce HTTPS/SSH — enforcement is delegated to the VCS client.
ECR-E SO.ComAuth (C-003, C-004 removed):
C-003 (archive symlink validation) and C-004 (archive member type
checks) are archive-extraction safety controls, not channel
authentication. They are already correctly placed in ECR-J. SO.ComAuth
now references only C-045 with a gap note: server authentication is
delegated to the OS trust store and VCS client; status ⚠ Partial.
ECR-F SO.DataTransmittedIntegrity (C-003, C-004 → C-005):
C-003/C-004 validate archive contents after download — that is archive
extraction safety, not transmission integrity. C-005 is the actual
end-to-end integrity control (HMAC hash over downloaded archive content,
opt-in). Gap updated: C-005 applies to archive sources only; git/svn
rely on VCS object integrity and TLS/SSH channel integrity.
ECR-I SO.LimitExternalImpact (blank gap filled):
⚠ Partial with no documented gap was inconsistent. Gap now states:
no connection timeout or rate limiting on VCS operations.
ECR-J SO.ReduceAttackSurface (blank gap filled):
⚠ Partial with no documented gap was inconsistent. Gap now states:
no domain/URL-scheme allowlist on manifest remote URLs; no network
operation timeout enforced.
ECR-L SO.LogSecurityRelevantActivities (C-036 removed):
C-036 (persisted-metadata credential redaction) is a data-protection
control, not a security logging control. Controls column set to "—";
gap updated to accurately describe the logging situation: no persistent
structured log, no audit trail of fetch operations.
https://claude.ai/code/session_01MoaUFm7mhFxEFuk14NKPh2
* doc: correct three compliance_track claims against actual code
ECR-C SO.UserUpdateNotification — CI suppression scope:
The suppression guard (os.environ.get("CI")) is in check.py line 102,
not in github_version_check.py. dfetch environment calls
newer_version_available() unconditionally with no CI guard. Both the
row gap column and the note below the table are corrected.
ECR-I SO.LimitExternalImpact — timeout gap scoped to git/svn only:
archive.py implements timeouts (15 s reachability, 60 s download via
_http_conn). The gap now correctly states that only git and svn
subprocess calls have no timeout.
ECR-J SO.ReduceAttackSurface — same timeout correction applied.
https://claude.ai/code/session_01MoaUFm7mhFxEFuk14NKPh2
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent a5b7fc6 commit bcb8fac
3 files changed
Lines changed: 135 additions & 87 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
9 | | - | |
10 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
11 | 12 | | |
12 | | - | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
24 | | - | |
| 25 | + | |
25 | 26 | | |
26 | 27 | | |
27 | 28 | | |
| |||
56 | 57 | | |
57 | 58 | | |
58 | 59 | | |
59 | | - | |
| 60 | + | |
60 | 61 | | |
61 | 62 | | |
62 | 63 | | |
63 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
64 | 119 | | |
65 | 120 | | |
66 | 121 | | |
| |||
77 | 132 | | |
78 | 133 | | |
79 | 134 | | |
80 | | - | |
| 135 | + | |
81 | 136 | | |
82 | 137 | | |
83 | 138 | | |
| |||
89 | 144 | | |
90 | 145 | | |
91 | 146 | | |
92 | | - | |
| 147 | + | |
93 | 148 | | |
94 | 149 | | |
95 | 150 | | |
| |||
120 | 175 | | |
121 | 176 | | |
122 | 177 | | |
123 | | - | |
| 178 | + | |
124 | 179 | | |
125 | 180 | | |
126 | 181 | | |
127 | 182 | | |
128 | 183 | | |
129 | | - | |
| 184 | + | |
130 | 185 | | |
131 | 186 | | |
132 | 187 | | |
| |||
150 | 205 | | |
151 | 206 | | |
152 | 207 | | |
153 | | - | |
154 | | - | |
| 208 | + | |
| 209 | + | |
155 | 210 | | |
156 | 211 | | |
157 | 212 | | |
| |||
161 | 216 | | |
162 | 217 | | |
163 | 218 | | |
164 | | - | |
| 219 | + | |
165 | 220 | | |
166 | 221 | | |
167 | 222 | | |
168 | 223 | | |
169 | | - | |
| 224 | + | |
170 | 225 | | |
171 | 226 | | |
172 | 227 | | |
| |||
180 | 235 | | |
181 | 236 | | |
182 | 237 | | |
183 | | - | |
184 | | - | |
185 | | - | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
186 | 241 | | |
187 | 242 | | |
188 | | - | |
189 | | - | |
190 | | - | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
191 | 246 | | |
192 | 247 | | |
193 | 248 | | |
| |||
205 | 260 | | |
206 | 261 | | |
207 | 262 | | |
208 | | - | |
209 | | - | |
| 263 | + | |
| 264 | + | |
210 | 265 | | |
211 | 266 | | |
212 | 267 | | |
| |||
231 | 286 | | |
232 | 287 | | |
233 | 288 | | |
234 | | - | |
| 289 | + | |
235 | 290 | | |
236 | 291 | | |
237 | 292 | | |
| |||
246 | 301 | | |
247 | 302 | | |
248 | 303 | | |
249 | | - | |
| 304 | + | |
250 | 305 | | |
251 | 306 | | |
252 | 307 | | |
| |||
255 | 310 | | |
256 | 311 | | |
257 | 312 | | |
258 | | - | |
259 | | - | |
| 313 | + | |
| 314 | + | |
260 | 315 | | |
261 | 316 | | |
262 | 317 | | |
| |||
296 | 351 | | |
297 | 352 | | |
298 | 353 | | |
299 | | - | |
300 | | - | |
301 | | - | |
302 | | - | |
303 | | - | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
304 | 368 | | |
305 | 369 | | |
306 | 370 | | |
| |||
314 | 378 | | |
315 | 379 | | |
316 | 380 | | |
317 | | - | |
| 381 | + | |
318 | 382 | | |
319 | 383 | | |
320 | 384 | | |
| |||
0 commit comments