|
12 | 12 | "title": "<?include?> directive follows within-workspace symlinks to files outside the workspace root", |
13 | 13 | "severity": "high", |
14 | 14 | "confidence": "confirmed", |
| 15 | + "status": "fixed", |
| 16 | + "fixed_by": "PR #670 — replaced os.DirFS with os.OpenRoot(rootDir).FS() via lint.OpenRootFS in internal/lint/file.go; os.OpenRoot enforces RESOLVE_BENEATH semantics, refusing symlinks whose targets escape the workspace root", |
15 | 17 | "surface": "directive", |
16 | 18 | "cwe": "CWE-73", |
17 | 19 | "location": { |
|
33 | 35 | "title": "<?catalog glob:?> follows within-workspace symlinks to files outside the workspace root", |
34 | 36 | "severity": "high", |
35 | 37 | "confidence": "confirmed", |
| 38 | + "status": "fixed", |
| 39 | + "fixed_by": "PR #670 — same fix as S001: all RootFS construction sites use lint.OpenRootFS backed by os.OpenRoot; os.OpenRoot.FS() denies GlobWalk traversal through symlinks that target paths outside the workspace root", |
36 | 40 | "surface": "directive", |
37 | 41 | "cwe": "CWE-73", |
38 | 42 | "location": { |
|
54 | 58 | "title": "CLI engine-runner goroutines lack per-goroutine recover() — rule panic crashes the process", |
55 | 59 | "severity": "medium", |
56 | 60 | "confidence": "confirmed", |
| 61 | + "status": "fixed", |
| 62 | + "fixed_by": "PR #670 — added defer recover() at the top of lintFile (internal/engine/runner.go:396-400); panics in any rule's Check or Fix are caught, converted to InternalError diagnostics, and the process continues linting the remaining files", |
57 | 63 | "surface": "cli", |
58 | 64 | "cwe": "CWE-390", |
59 | 65 | "location": { |
|
71 | 77 | "title": "<?catalog glob:?> has no per-directive file-count cap — large repos can cause OOM", |
72 | 78 | "severity": "low", |
73 | 79 | "confidence": "confirmed", |
| 80 | + "status": "fixed", |
| 81 | + "fixed_by": "PR #670 — added maxCatalogMatches = 10_000 constant in internal/rules/catalog/rule.go:40; resolveGlobMatchesFrom returns errCatalogCapExceeded and emits a user-facing diagnostic once the cap is exceeded", |
74 | 82 | "surface": "directive", |
75 | 83 | "cwe": "CWE-400", |
76 | 84 | "location": { |
|
88 | 96 | "title": "hasSymlinkAncestor skips ancestor scan when cwd is unresolvable and no .git root exists", |
89 | 97 | "severity": "low", |
90 | 98 | "confidence": "confirmed", |
| 99 | + "status": "fixed", |
| 100 | + "fixed_by": "PR #670 — changed hasSymlinkAncestor in internal/lint/files.go:274-277 to return an error when ancestorStopBoundary is empty (fail-closed); the caller now skips the path rather than silently passing the symlink check", |
91 | 101 | "surface": "cli", |
92 | 102 | "cwe": "CWE-61", |
93 | 103 | "location": { |
|
105 | 115 | "title": "<?include?> path validation does not explicitly reject URL schemes — incidentally safe but fragile", |
106 | 116 | "severity": "info", |
107 | 117 | "confidence": "confirmed", |
| 118 | + "status": "fixed", |
| 119 | + "fixed_by": "PR #670 — added explicit strings.Contains(file, \"://\") URL-scheme check in validateIncludeDirective (internal/rules/include/rule.go:140-143); URL-scheme paths are now rejected with a diagnostic rather than incidentally failing at os.DirFS", |
108 | 120 | "surface": "directive", |
109 | 121 | "cwe": "CWE-918", |
110 | 122 | "location": { |
|
122 | 134 | "title": "githooksync rule reads hook and gitattributes files with unbounded os.ReadFile", |
123 | 135 | "severity": "info", |
124 | 136 | "confidence": "confirmed", |
| 137 | + "status": "fixed", |
| 138 | + "fixed_by": "PR #670 — replaced all four os.ReadFile calls in internal/rules/githooksync/rule.go (lines 187, 261, 307, 398) with bytelimit.ReadFileLimited(path, hookMaxReadBytes) where hookMaxReadBytes = 1024*1024", |
125 | 139 | "surface": "git", |
126 | 140 | "cwe": "CWE-400", |
127 | 141 | "location": { |
|
0 commit comments