bigpowers 2.86.1 → 2.86.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/security-review/SKILL.md +3 -1
- package/.agents/skills/smoke-test/SKILL.md +1 -1
- package/.codebuddy/skills/security-review/SKILL.md +3 -1
- package/.codebuddy/skills/smoke-test/SKILL.md +1 -1
- package/.codex/skills/security-review/SKILL.md +3 -1
- package/.codex/skills/smoke-test/SKILL.md +1 -1
- package/.hermes/skills/security-review/SKILL.md +3 -1
- package/.hermes/skills/smoke-test/SKILL.md +1 -1
- package/.kilocode/rules/security-review.md +3 -1
- package/.kilocode/rules/smoke-test.md +1 -1
- package/.mimocode/skills/security-review/SKILL.md +3 -1
- package/.mimocode/skills/smoke-test/SKILL.md +1 -1
- package/.pi/package.json +1 -1
- package/.pi/prompts/security-review.md +3 -1
- package/.pi/prompts/smoke-test.md +1 -1
- package/.pi/skills/security-review/SKILL.md +3 -1
- package/.pi/skills/smoke-test/SKILL.md +1 -1
- package/.trae/skills/security-review/SKILL.md +3 -1
- package/.trae/skills/smoke-test/SKILL.md +1 -1
- package/.windsurf/rules/security-review.md +3 -1
- package/.windsurf/rules/smoke-test.md +1 -1
- package/.zcode/skills/security-review/SKILL.md +3 -1
- package/.zcode/skills/smoke-test/SKILL.md +1 -1
- package/CHANGELOG.md +7 -0
- package/package.json +1 -1
- package/scripts/lib/__pycache__/link_utils.cpython-312.pyc +0 -0
- package/scripts/lib/__pycache__/srp_engine_links.cpython-312.pyc +0 -0
- package/scripts/verify-cwe-fixture-sync.sh +88 -0
- package/skills/security-review/SKILL.md +3 -1
- package/skills/security-review/fixtures/CWE-639-idor-negative.go +48 -0
- package/skills/security-review/fixtures/CWE-639-idor-positive.go +29 -0
- package/skills/smoke-test/SKILL.md +1 -1
- package/skills-lock.json +2 -2
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
package/.pi/package.json
CHANGED
|
@@ -57,6 +57,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
57
57
|
|------|-----|------------------|------------------|
|
|
58
58
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
59
59
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
60
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
61
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
60
62
|
|
|
61
63
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
62
64
|
|
|
@@ -108,7 +110,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
108
110
|
|
|
109
111
|
## Verify
|
|
110
112
|
|
|
111
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
112
114
|
|
|
113
115
|
---
|
|
114
116
|
|
|
@@ -77,7 +77,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
77
77
|
|
|
78
78
|
## Verify
|
|
79
79
|
|
|
80
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
80
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
@@ -58,6 +58,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
58
58
|
|------|-----|------------------|------------------|
|
|
59
59
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
60
60
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
61
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
62
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
61
63
|
|
|
62
64
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
63
65
|
|
|
@@ -109,7 +111,7 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
109
111
|
|
|
110
112
|
## Verify
|
|
111
113
|
|
|
112
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
114
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
113
115
|
|
|
114
116
|
---
|
|
115
117
|
|
|
@@ -78,7 +78,7 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
78
78
|
|
|
79
79
|
## Verify
|
|
80
80
|
|
|
81
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
81
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [2.86.2](https://github.com/danielvm-git/bigpowers/compare/v2.86.1...v2.86.2) (2026-07-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **verify:** repair two gates that could not fail ([#97](https://github.com/danielvm-git/bigpowers/issues/97), [#98](https://github.com/danielvm-git/bigpowers/issues/98)) ([5f54699](https://github.com/danielvm-git/bigpowers/commit/5f54699f11875da2db1bae939f313d69c2fa7adf))
|
|
7
|
+
|
|
1
8
|
## [2.86.1](https://github.com/danielvm-git/bigpowers/compare/v2.86.0...v2.86.1) (2026-07-26)
|
|
2
9
|
|
|
3
10
|
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# story: e80s05
|
|
3
|
+
# Assert security-review's CWE rule table and its fixtures/ directory agree.
|
|
4
|
+
#
|
|
5
|
+
# e80s05 ("security-review fixture table growth") was marked done while the
|
|
6
|
+
# fixtures directory gained a class the table never listed. Remembering to
|
|
7
|
+
# update both is exactly the kind of discipline that decays, so this makes the
|
|
8
|
+
# drift mechanical instead: every fixture class needs a table row, and every
|
|
9
|
+
# table row needs both fixtures on disk.
|
|
10
|
+
#
|
|
11
|
+
# Usage:
|
|
12
|
+
# bash scripts/verify-cwe-fixture-sync.sh [--self-test]
|
|
13
|
+
set -uo pipefail
|
|
14
|
+
|
|
15
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
16
|
+
SKILL_MD="$REPO_ROOT/skills/security-review/SKILL.md"
|
|
17
|
+
FIXTURES="$REPO_ROOT/skills/security-review/fixtures"
|
|
18
|
+
|
|
19
|
+
fail=0
|
|
20
|
+
note() { echo " $1"; }
|
|
21
|
+
|
|
22
|
+
check_sync() {
|
|
23
|
+
local skill_md="$1" fixtures="$2"
|
|
24
|
+
local rc=0
|
|
25
|
+
|
|
26
|
+
[ -f "$skill_md" ] || { echo "FAIL: missing $skill_md"; return 1; }
|
|
27
|
+
[ -d "$fixtures" ] || { echo "FAIL: missing $fixtures"; return 1; }
|
|
28
|
+
|
|
29
|
+
# Classes present on disk, derived from the -positive fixture filenames.
|
|
30
|
+
local disk_classes
|
|
31
|
+
disk_classes=$(find "$fixtures" -name '*-positive.*' -exec basename {} \; 2>/dev/null \
|
|
32
|
+
| sed 's/-positive\..*$//' | sort -u)
|
|
33
|
+
|
|
34
|
+
# Every disk class must appear in the rule table.
|
|
35
|
+
local c
|
|
36
|
+
for c in $disk_classes; do
|
|
37
|
+
if ! grep -q "$c" "$skill_md"; then
|
|
38
|
+
note "FAIL: fixture class '$c' has no row in the CWE rule table"
|
|
39
|
+
rc=1
|
|
40
|
+
fi
|
|
41
|
+
done
|
|
42
|
+
|
|
43
|
+
# Every fixture referenced by the table must exist, both polarities.
|
|
44
|
+
local ref
|
|
45
|
+
for ref in $(grep -oE 'fixtures/[A-Za-z0-9._-]+' "$skill_md" | sed 's|fixtures/||' | sort -u); do
|
|
46
|
+
if [ ! -f "$fixtures/$ref" ]; then
|
|
47
|
+
note "FAIL: table references fixtures/$ref which does not exist"
|
|
48
|
+
rc=1
|
|
49
|
+
fi
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
for c in $disk_classes; do
|
|
53
|
+
local pos neg
|
|
54
|
+
pos=$(find "$fixtures" -name "$c-positive.*" | head -1)
|
|
55
|
+
neg=$(find "$fixtures" -name "$c-negative.*" | head -1)
|
|
56
|
+
if [ -z "$pos" ] || [ -z "$neg" ]; then
|
|
57
|
+
note "FAIL: class '$c' needs BOTH a -positive and a -negative fixture"
|
|
58
|
+
rc=1
|
|
59
|
+
fi
|
|
60
|
+
done
|
|
61
|
+
|
|
62
|
+
return $rc
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
# --self-test proves this gate can fail: point it at a fixtures dir holding a
|
|
66
|
+
# class the table does not list, and require a non-zero exit.
|
|
67
|
+
if [ "${1:-}" = "--self-test" ]; then
|
|
68
|
+
tmp=$(mktemp -d)
|
|
69
|
+
trap 'rm -rf "$tmp"' EXIT
|
|
70
|
+
mkdir -p "$tmp/fixtures"
|
|
71
|
+
printf '| Rule | CWE | Positive fixture | Negative fixture |\n' > "$tmp/SKILL.md"
|
|
72
|
+
: > "$tmp/fixtures/CWE-999-unlisted-positive.py"
|
|
73
|
+
: > "$tmp/fixtures/CWE-999-unlisted-negative.py"
|
|
74
|
+
|
|
75
|
+
if check_sync "$tmp/SKILL.md" "$tmp/fixtures" >/dev/null 2>&1; then
|
|
76
|
+
echo "FAIL: self-test — gate passed on an unlisted fixture class (it cannot fail)"
|
|
77
|
+
exit 1
|
|
78
|
+
fi
|
|
79
|
+
echo "PASS: self-test — gate rejects a fixture class missing from the table"
|
|
80
|
+
exit 0
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
if check_sync "$SKILL_MD" "$FIXTURES"; then
|
|
84
|
+
echo "PASS: CWE rule table and fixtures/ are in sync"
|
|
85
|
+
exit 0
|
|
86
|
+
fi
|
|
87
|
+
echo "FAIL: security-review CWE table and fixtures/ have drifted"
|
|
88
|
+
exit 1
|
|
@@ -64,6 +64,8 @@ Every **new detection rule** added to this skill MUST:
|
|
|
64
64
|
|------|-----|------------------|------------------|
|
|
65
65
|
| SQL injection | CWE-89 | `fixtures/CWE-89-sqli-positive.py` | `fixtures/CWE-89-sqli-negative.py` |
|
|
66
66
|
| XSS (DOM) | CWE-79 | `fixtures/CWE-79-xss-positive.js` | `fixtures/CWE-79-xss-negative.js` |
|
|
67
|
+
| Missing tenant scoping (IDOR) | CWE-639 | `fixtures/CWE-639-idor-positive.go` | `fixtures/CWE-639-idor-negative.go` |
|
|
68
|
+
| Fail-open verify directive | CWE-754 | `fixtures/CWE-fail-open-verify-positive.sh` | `fixtures/CWE-fail-open-verify-negative.sh` |
|
|
67
69
|
|
|
68
70
|
Before merging a new category, run both fixtures through the detection guidance and confirm positive flags / negative passes.
|
|
69
71
|
|
|
@@ -115,4 +117,4 @@ Each finding: **`File:Line` — Severity — Category**
|
|
|
115
117
|
|
|
116
118
|
## Verify
|
|
117
119
|
|
|
118
|
-
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && git rev-parse HEAD >/dev/null 2>&1`
|
|
120
|
+
→ verify: `test -d specs/security && test -f scripts/lib/parallel-review-worktrees.sh && bash scripts/verify-cwe-fixture-sync.sh >/dev/null && git rev-parse HEAD >/dev/null 2>&1`
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// story: e80s05
|
|
2
|
+
// Negative fixture: correctly scoped tenant query (must NOT be flagged).
|
|
3
|
+
//
|
|
4
|
+
// The org comes from the authenticated context, never from the request, and it
|
|
5
|
+
// is part of the WHERE clause. A caller from another organization gets zero
|
|
6
|
+
// rows rather than someone else's site.
|
|
7
|
+
//
|
|
8
|
+
// Note the retrofit trap this deliberately avoids: bigbase's BUG-2026-07-24T184443
|
|
9
|
+
// added `org_id INTEGER NOT NULL DEFAULT 0`, which passed tests on new rows and
|
|
10
|
+
// hid 8 of 9 production sites whose legacy rows defaulted to org 0. Scope on a
|
|
11
|
+
// real, backfilled org_id — never a placeholder default.
|
|
12
|
+
package fixtures
|
|
13
|
+
|
|
14
|
+
import (
|
|
15
|
+
"database/sql"
|
|
16
|
+
"net/http"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
func orgIDFromContext(r *http.Request) (string, bool) {
|
|
20
|
+
v, ok := r.Context().Value(ctxOrgID).(string)
|
|
21
|
+
return v, ok && v != ""
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type ctxKey string
|
|
25
|
+
|
|
26
|
+
const ctxOrgID ctxKey = "org_id"
|
|
27
|
+
|
|
28
|
+
func handleGetSiteNegative(w http.ResponseWriter, r *http.Request, db *sql.DB) {
|
|
29
|
+
orgID, ok := orgIDFromContext(r)
|
|
30
|
+
if !ok {
|
|
31
|
+
http.Error(w, "forbidden", http.StatusForbidden)
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
siteID := r.URL.Query().Get("site_id")
|
|
35
|
+
|
|
36
|
+
// SAFE: the tenant predicate is not optional and does not come from input.
|
|
37
|
+
row := db.QueryRow(
|
|
38
|
+
`SELECT id, name, domain FROM sites WHERE id = ? AND org_id = ?`,
|
|
39
|
+
siteID, orgID,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
var id, name, domain string
|
|
43
|
+
if err := row.Scan(&id, &name, &domain); err != nil {
|
|
44
|
+
http.Error(w, "not found", http.StatusNotFound)
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
_, _ = w.Write([]byte(name + " " + domain))
|
|
48
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// story: e80s05
|
|
2
|
+
// Positive fixture: IDOR / missing tenant scoping (must be flagged).
|
|
3
|
+
//
|
|
4
|
+
// Modelled on the bigbase family (BUG-129/130/133/135/136/140/143): the
|
|
5
|
+
// handler authenticates the caller, then trusts an ID from the request and
|
|
6
|
+
// queries by that ID alone. Authentication is proven; authorization is not.
|
|
7
|
+
// Nothing in the type system or a diff-scoped review makes this look wrong —
|
|
8
|
+
// the bug is a predicate that was never written.
|
|
9
|
+
package fixtures
|
|
10
|
+
|
|
11
|
+
import (
|
|
12
|
+
"database/sql"
|
|
13
|
+
"net/http"
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
func handleGetSitePositive(w http.ResponseWriter, r *http.Request, db *sql.DB) {
|
|
17
|
+
siteID := r.URL.Query().Get("site_id")
|
|
18
|
+
|
|
19
|
+
// VULNERABLE: scoped by primary key only. Any authenticated caller from any
|
|
20
|
+
// organization can read any site by guessing or enumerating site_id.
|
|
21
|
+
row := db.QueryRow(`SELECT id, name, domain FROM sites WHERE id = ?`, siteID)
|
|
22
|
+
|
|
23
|
+
var id, name, domain string
|
|
24
|
+
if err := row.Scan(&id, &name, &domain); err != nil {
|
|
25
|
+
http.Error(w, "not found", http.StatusNotFound)
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
_, _ = w.Write([]byte(name + " " + domain))
|
|
29
|
+
}
|
|
@@ -81,4 +81,4 @@ Part of **★ VERIFY ★**: `verify-work` → `validate-contracts` → `smoke-te
|
|
|
81
81
|
|
|
82
82
|
## Verify
|
|
83
83
|
|
|
84
|
-
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && grep -
|
|
84
|
+
→ verify: `test -x scripts/run-smoke.sh && grep -q 'run-smoke.sh' skills/smoke-test/SKILL.md && ! grep -q 'See \[REFERENCE.md\](REFERENCE.md)$' skills/smoke-test/SKILL.md && echo OK`
|
package/skills-lock.json
CHANGED
|
@@ -303,7 +303,7 @@
|
|
|
303
303
|
},
|
|
304
304
|
"security-review": {
|
|
305
305
|
"description": ">",
|
|
306
|
-
"sha256": "
|
|
306
|
+
"sha256": "3d046f443689fc1e",
|
|
307
307
|
"path": "skills/security-reviewSKILL.md"
|
|
308
308
|
},
|
|
309
309
|
"seed-conventions": {
|
|
@@ -333,7 +333,7 @@
|
|
|
333
333
|
},
|
|
334
334
|
"smoke-test": {
|
|
335
335
|
"description": "\"Post-deploy health-check against a live URL. Validates HTTP status, response content, and critical endpoints. Runnable standalone OR as the final step of the deploy skill.\"",
|
|
336
|
-
"sha256": "
|
|
336
|
+
"sha256": "050170d66ada581e",
|
|
337
337
|
"path": "skills/smoke-testSKILL.md"
|
|
338
338
|
},
|
|
339
339
|
"spike-prototype": {
|