@kaademos/secure-sdlc 1.0.2 → 1.2.0
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/.claude/agents/grc-analyst.md +11 -5
- package/.claude/agents/product-manager.md +3 -3
- package/.claude-plugin/marketplace.json +51 -0
- package/.claude-plugin/plugin.json +31 -0
- package/.github/workflows/secure-sdlc-gate.yml +47 -8
- package/CHANGELOG.md +44 -0
- package/CLAUDE.md +1 -0
- package/README.md +65 -15
- package/cli/src/commands/init.js +7 -2
- package/cli/src/utils/stack-detect.js +26 -0
- package/docs/templates/compliance-attestation.md +40 -1
- package/docs/templates/threat-model.md +1 -1
- package/package.json +4 -1
- package/skills/ai-security/SKILL.md +163 -0
- package/skills/compliance-and-audit/SKILL.md +173 -0
- package/skills/security-and-hardening/SKILL.md +117 -0
- package/skills/threat-modeling/SKILL.md +151 -0
- package/stacks/django.md +7 -7
- package/stacks/express.md +6 -6
- package/stacks/fastapi.md +6 -6
- package/stacks/golang.md +274 -0
- package/stacks/nextjs.md +6 -6
- package/stacks/rails.md +6 -6
|
@@ -29,7 +29,9 @@ Maintain awareness of applicable controls from:
|
|
|
29
29
|
- **PCI DSS v4.0** (if payment card data is in scope)
|
|
30
30
|
- **OWASP ASVS** (as the technical requirements anchor)
|
|
31
31
|
- **GDPR / UK GDPR** (if personal data is processed)
|
|
32
|
-
- **
|
|
32
|
+
- **HIPAA** (Security & Privacy Rules — if protected health information is in scope)
|
|
33
|
+
- **DORA** (if applicable to EU financial services)
|
|
34
|
+
- **FedRAMP** (NIST SP 800-53 baseline — if selling to US federal agencies)
|
|
33
35
|
|
|
34
36
|
---
|
|
35
37
|
|
|
@@ -54,10 +56,14 @@ When invoked at the start of a project or feature:
|
|
|
54
56
|
```markdown
|
|
55
57
|
## Control Mapping
|
|
56
58
|
|
|
57
|
-
| ASVS Ref | Requirement | SOC 2 | ISO 27001 | NIST CSF | PCI DSS |
|
|
58
|
-
|
|
59
|
-
|
|
|
60
|
-
|
|
|
59
|
+
| ASVS Ref | Requirement | SOC 2 | ISO 27001 | NIST CSF | PCI DSS | HIPAA | DORA | FedRAMP |
|
|
60
|
+
|----------|-------------|-------|-----------|----------|---------|-------|------|---------|
|
|
61
|
+
| V6.2.1 | Password complexity | CC6.1 | A.8.5 | PR.AC-1 | Req 8.3 | §164.312(d) | Art. 9 | IA-5 |
|
|
62
|
+
| V14.1.1 | Encryption at rest | CC6.7 | A.8.24 | PR.DS-1 | Req 3.5 | §164.312(a)(2)(iv) | Art. 9 | SC-28 |
|
|
63
|
+
|
|
64
|
+
> Only populate columns for frameworks selected in `secure-sdlc.yaml`. Add HIPAA when
|
|
65
|
+
> protected health information is processed, DORA for EU financial entities, and FedRAMP
|
|
66
|
+
> (NIST SP 800-53 control families: AC, AU, IA, SC, …) when targeting US federal agencies.
|
|
61
67
|
```
|
|
62
68
|
|
|
63
69
|
---
|
|
@@ -51,9 +51,9 @@ For each feature, produce a `docs/security-requirements.md` using this structure
|
|
|
51
51
|
|
|
52
52
|
| ID | Requirement | ASVS Ref | Priority | Acceptance Criteria |
|
|
53
53
|
|----|-------------|----------|----------|---------------------|
|
|
54
|
-
| SR-001 | All API endpoints require authentication |
|
|
55
|
-
| SR-002 | Passwords must meet complexity requirements |
|
|
56
|
-
| SR-003 | Sensitive data encrypted at rest |
|
|
54
|
+
| SR-001 | All API endpoints require authentication | V8.3.1 | MUST | Unauthenticated requests return HTTP 401 |
|
|
55
|
+
| SR-002 | Passwords must meet complexity requirements | V6.2.1 | MUST | Passwords < 8 chars or common passwords rejected |
|
|
56
|
+
| SR-003 | Sensitive data encrypted at rest | V14.1.1 | MUST | AES-256 or equivalent; key management documented |
|
|
57
57
|
|
|
58
58
|
### Privacy Requirements
|
|
59
59
|
- [ ] Data minimisation: only collect fields required for this feature
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "secure-sdlc-agents",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Kaademos",
|
|
5
|
+
"email": "kaademos@github.com"
|
|
6
|
+
},
|
|
7
|
+
"metadata": {
|
|
8
|
+
"description": "A team of 8 AI security specialists embedded in your coding workflow — covering every phase of the Secure SDLC from requirements to release gating.",
|
|
9
|
+
"version": "1.2.0"
|
|
10
|
+
},
|
|
11
|
+
"plugins": [
|
|
12
|
+
{
|
|
13
|
+
"name": "secure-sdlc-agents",
|
|
14
|
+
"source": {
|
|
15
|
+
"source": "github",
|
|
16
|
+
"repo": "Kaademos/secure-sdlc-agents"
|
|
17
|
+
},
|
|
18
|
+
"description": "8 AI security specialist agents for the full Secure SDLC: threat modelling, AppSec, GRC, IaC review, AI/LLM security, and release gating. Works with Claude Code, Cursor, Windsurf, and any MCP-compatible tool.",
|
|
19
|
+
"version": "1.2.0",
|
|
20
|
+
"author": {
|
|
21
|
+
"name": "Kaademos"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/Kaademos/secure-sdlc-agents",
|
|
24
|
+
"repository": "https://github.com/Kaademos/secure-sdlc-agents",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"keywords": [
|
|
27
|
+
"security",
|
|
28
|
+
"appsec",
|
|
29
|
+
"sdlc",
|
|
30
|
+
"owasp",
|
|
31
|
+
"asvs",
|
|
32
|
+
"compliance",
|
|
33
|
+
"threat-modeling",
|
|
34
|
+
"secure-coding",
|
|
35
|
+
"devsecops",
|
|
36
|
+
"grc"
|
|
37
|
+
],
|
|
38
|
+
"category": "security",
|
|
39
|
+
"tags": [
|
|
40
|
+
"security",
|
|
41
|
+
"appsec",
|
|
42
|
+
"devsecops",
|
|
43
|
+
"owasp",
|
|
44
|
+
"compliance",
|
|
45
|
+
"threat-modeling",
|
|
46
|
+
"agent-skills"
|
|
47
|
+
],
|
|
48
|
+
"strict": true
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "secure-sdlc-agents",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "A team of AI security specialists embedded in your coding workflow. 8 agents covering every phase of the Secure SDLC: requirements, threat modelling, code review, IaC security, compliance, and release gating. Works with Claude Code, Cursor, Windsurf, and any MCP-compatible tool.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Kaademos",
|
|
7
|
+
"url": "https://github.com/Kaademos"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/Kaademos/secure-sdlc-agents",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"security",
|
|
13
|
+
"appsec",
|
|
14
|
+
"sdlc",
|
|
15
|
+
"owasp",
|
|
16
|
+
"asvs",
|
|
17
|
+
"compliance",
|
|
18
|
+
"threat-modeling",
|
|
19
|
+
"secure-coding"
|
|
20
|
+
],
|
|
21
|
+
"agents": [
|
|
22
|
+
".claude/agents/product-manager.md",
|
|
23
|
+
".claude/agents/appsec-engineer.md",
|
|
24
|
+
".claude/agents/grc-analyst.md",
|
|
25
|
+
".claude/agents/cloud-platform-engineer.md",
|
|
26
|
+
".claude/agents/dev-lead.md",
|
|
27
|
+
".claude/agents/release-manager.md",
|
|
28
|
+
".claude/agents/security-champion.md",
|
|
29
|
+
".claude/agents/ai-security-engineer.md"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
@@ -241,7 +241,7 @@ jobs:
|
|
|
241
241
|
strategy:
|
|
242
242
|
fail-fast: false
|
|
243
243
|
matrix:
|
|
244
|
-
language: ['javascript-typescript', 'python']
|
|
244
|
+
language: ['javascript-typescript', 'python', 'ruby', 'go', 'java-kotlin']
|
|
245
245
|
steps:
|
|
246
246
|
- name: Checkout
|
|
247
247
|
uses: actions/checkout@v4
|
|
@@ -250,25 +250,64 @@ jobs:
|
|
|
250
250
|
id: check-lang
|
|
251
251
|
run: |
|
|
252
252
|
LANG="${{ matrix.language }}"
|
|
253
|
+
# EXISTS gates every downstream step so absent languages skip cleanly.
|
|
254
|
+
# BUILD_MODE tells CodeQL how to build: interpreted languages need no
|
|
255
|
+
# build ("none"); Go must be built ("autobuild"); java-kotlin can use
|
|
256
|
+
# "none" for pure-Java repos but MUST build when Kotlin is present
|
|
257
|
+
# (Kotlin analysis has no build-mode: none support).
|
|
258
|
+
EXISTS=false
|
|
259
|
+
BUILD_MODE=none
|
|
253
260
|
if [ "$LANG" = "javascript-typescript" ]; then
|
|
254
|
-
find . -name "*.js" -o -name "*.ts" | grep -v node_modules | grep -q . &&
|
|
261
|
+
find . -name "*.js" -o -name "*.ts" | grep -v node_modules | grep -q . && EXISTS=true
|
|
255
262
|
elif [ "$LANG" = "python" ]; then
|
|
256
|
-
find . -name "*.py" | grep -q . &&
|
|
263
|
+
find . -name "*.py" | grep -q . && EXISTS=true
|
|
264
|
+
elif [ "$LANG" = "ruby" ]; then
|
|
265
|
+
find . -name "*.rb" | grep -q . && EXISTS=true
|
|
266
|
+
elif [ "$LANG" = "go" ]; then
|
|
267
|
+
find . -name "*.go" | grep -q . && EXISTS=true
|
|
268
|
+
BUILD_MODE=autobuild
|
|
269
|
+
elif [ "$LANG" = "java-kotlin" ]; then
|
|
270
|
+
find . -name "*.java" -o -name "*.kt" | grep -q . && EXISTS=true
|
|
271
|
+
# Kotlin requires a build; pure-Java repos skip it for reliability.
|
|
272
|
+
if find . -name "*.kt" | grep -q .; then
|
|
273
|
+
BUILD_MODE=autobuild
|
|
274
|
+
fi
|
|
257
275
|
else
|
|
258
|
-
|
|
276
|
+
EXISTS=true
|
|
259
277
|
fi
|
|
278
|
+
echo "EXISTS=$EXISTS" >> $GITHUB_OUTPUT
|
|
279
|
+
echo "BUILD_MODE=$BUILD_MODE" >> $GITHUB_OUTPUT
|
|
280
|
+
echo "Language=$LANG Exists=$EXISTS BuildMode=$BUILD_MODE"
|
|
281
|
+
|
|
282
|
+
# Set up the toolchain BEFORE CodeQL so autobuild can resolve the build.
|
|
283
|
+
# Without a matching toolchain, autobuild is the #1 cause of CodeQL CI
|
|
284
|
+
# failures on enterprise Go/Maven/Gradle projects.
|
|
285
|
+
- name: Set up Go
|
|
286
|
+
if: steps.check-lang.outputs.EXISTS == 'true' && matrix.language == 'go'
|
|
287
|
+
uses: actions/setup-go@v5
|
|
288
|
+
with:
|
|
289
|
+
go-version: stable
|
|
290
|
+
cache: false # no go.sum path assumptions; CodeQL only needs a build
|
|
291
|
+
|
|
292
|
+
- name: Set up JDK
|
|
293
|
+
if: steps.check-lang.outputs.EXISTS == 'true' && matrix.language == 'java-kotlin' && steps.check-lang.outputs.BUILD_MODE == 'autobuild'
|
|
294
|
+
uses: actions/setup-java@v4
|
|
295
|
+
with:
|
|
296
|
+
distribution: temurin
|
|
297
|
+
# Latest LTS. If your project targets an older JDK (11/17) and the
|
|
298
|
+
# build fails, change this to match — that's the one knob to turn.
|
|
299
|
+
java-version: '21'
|
|
260
300
|
|
|
261
301
|
- name: Initialize CodeQL
|
|
262
302
|
if: steps.check-lang.outputs.EXISTS == 'true'
|
|
263
303
|
uses: github/codeql-action/init@v3
|
|
264
304
|
with:
|
|
265
305
|
languages: ${{ matrix.language }}
|
|
306
|
+
build-mode: ${{ steps.check-lang.outputs.BUILD_MODE }}
|
|
266
307
|
queries: security-and-quality
|
|
267
308
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
uses: github/codeql-action/autobuild@v3
|
|
271
|
-
|
|
309
|
+
# No standalone Autobuild step: build-mode "autobuild" runs the autobuilder
|
|
310
|
+
# during analysis, and build-mode "none" needs no build at all.
|
|
272
311
|
- name: Perform CodeQL Analysis
|
|
273
312
|
if: steps.check-lang.outputs.EXISTS == 'true'
|
|
274
313
|
uses: github/codeql-action/analyze@v3
|
package/CHANGELOG.md
CHANGED
|
@@ -6,8 +6,52 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## [1.2.0] — 2026-06-26
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- **Go stack profile** (`stacks/golang.md`) — dense, code-driven security guidance for Go (net/http, Gin, Echo, Fiber): `html/template` XSS, `database/sql`/GORM parameterisation, CORS, security headers, `gosec`/`govulncheck`
|
|
13
|
+
- **Go security notes** in `getStackSecurityNotes()` plus a `getStackProfile()` resolver so detected `gin`/`echo`/`fiber` projects map to the `golang` profile and notes
|
|
14
|
+
- **Worked example `04-oauth-flow`** — OAuth 2.0 / OIDC social login (authorization-code + PKCE); `redirect_uri` exact matching, `state` vs `nonce`, ID-token validation, anchored to ASVS 5.0 V10 and RFC 9700
|
|
15
|
+
- **Worked example `05-payment-processing`** — redirect-based hosted checkout (PCI DSS SAQ A); webhook signature verification, idempotency, server-side amount, reflecting the Jan 2025 SAQ A changes
|
|
16
|
+
- **HIPAA, DORA, and FedRAMP** control tables in `compliance-attestation.md` and the GRC agent's control-mapping example
|
|
17
|
+
- **Automated test suite** (`test/`, Node built-in runner, zero new dependencies) — guards version sync across manifests, agent frontmatter, and the stack-detection ↔ `stacks/*.md` mapping
|
|
18
|
+
- **CI workflow** (`.github/workflows/ci.yml`) — runs the suite on Node 18, 20, and 22 plus an `npm pack` content check
|
|
19
|
+
- **Release workflow** (`.github/workflows/release.yml`) — publishes to npm with provenance and creates a GitHub Release on `v*` tags
|
|
20
|
+
- **`CODE_OF_CONDUCT.md`** (Contributor Covenant 2.1), **`.editorconfig`**, npm/CI/Node README badges, and a committed `package-lock.json`
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- **CodeQL SAST** (`secure-sdlc-gate.yml`) — matrix expanded to `ruby`, `go`, and `java-kotlin`; per-language `build-mode` with toolchain setup so compiled-language scans are reliable on enterprise repos (pure-Java uses `build-mode: none`)
|
|
24
|
+
- **ASVS references migrated from 4.0 to 5.0** repo-wide using the official OWASP `mapping_v4.0.3_to_v5.0.0` mapping (stack profiles, examples, agents, templates, skill, PR template)
|
|
25
|
+
- **`secure-sdlc init`** only prints a `stacks/<name>.md` pointer when that profile actually ships
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
- Pre-existing CSRF control mislabel in the Django, Express, Rails, and Go stack profiles (`V14.4.5`/HSTS → real CSRF control `V3.5.1`)
|
|
29
|
+
- Broken `stacks/<gin|echo|fiber>.md` reference — Go framework projects now resolve to `stacks/golang.md`
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
9
33
|
## [1.0.2]
|
|
10
34
|
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## [1.1.0] — 2026-04-06
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
- **`.claude-plugin/plugin.json`** — Claude Code plugin marketplace manifest; agents now installable with a single `/plugin marketplace add Kaademos/secure-sdlc-agents` command (zero-dependency, no npm, no cloning)
|
|
41
|
+
- **`skills/` directory** — 4 SKILL.md files in the agent-skills–compatible format for cross-ecosystem discoverability:
|
|
42
|
+
- `skills/security-and-hardening/` — secure coding, PR review, OWASP Top 10 prevention, severity gating
|
|
43
|
+
- `skills/threat-modeling/` — STRIDE + LINDDUN structured threat model workflow
|
|
44
|
+
- `skills/ai-security/` — OWASP LLM Top 10 2025, prompt injection, excessive agency, output validation
|
|
45
|
+
- `skills/compliance-and-audit/` — risk register, framework mapping (SOC 2, ISO 27001, GDPR, PCI DSS), audit evidence
|
|
46
|
+
- **README — "Option 0"** plugin marketplace as the first and fastest install path (before git clone and npm)
|
|
47
|
+
- **README — "The 4-Minute Problem"** concrete breach table replacing the generic problem statement — 5 real vulnerabilities a vibe-coded file upload misses, each mapped to the catching agent
|
|
48
|
+
- **README — "Who Do You Call?"** ASCII decision tree covering every SDLC moment → correct agent → exact command
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
- **README.md** — title tagline tightened to be specific and direct ("8 AI security specialists. Invoked at the exact phase where each vulnerability would have been caught.")
|
|
52
|
+
- **`package.json` `files`** — added `skills/` and `.claude-plugin/` to the npm publish manifest
|
|
53
|
+
|
|
54
|
+
|
|
11
55
|
### Added
|
|
12
56
|
- **npm package** `@kaademos/secure-sdlc` (root `package.json`) — global install via `npm install -g @kaademos/secure-sdlc`, `npx @kaademos/secure-sdlc`, semver releases;
|
|
13
57
|
- **`secure-sdlc paths`** — prints `PACKAGE_ROOT` and MCP server path after install
|
package/CLAUDE.md
CHANGED
|
@@ -175,6 +175,7 @@ If the project uses one of these stacks, reference the relevant profile in `stac
|
|
|
175
175
|
| Django | `stacks/django.md` |
|
|
176
176
|
| Express.js | `stacks/express.md` |
|
|
177
177
|
| Ruby on Rails | `stacks/rails.md` |
|
|
178
|
+
| Go (net/http, Gin, Echo, Fiber) | `stacks/golang.md` |
|
|
178
179
|
|
|
179
180
|
Stack profiles contain framework-specific vulnerability patterns, secure coding examples,
|
|
180
181
|
and recommended libraries. Reference them when the dev-lead or appsec-engineer agents
|
package/README.md
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
|
-
](https://github.com/Kaademos/secure-sdlc-agents/actions/workflows/ci.yml)
|
|
2
|
+
[](https://www.npmjs.com/package/@kaademos/secure-sdlc)
|
|
3
|
+
[](https://nodejs.org)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+

|
|
5
6
|

|
|
6
7
|
|
|
7
8
|
# Secure SDLC Agents
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
**8 AI security specialists. Invoked at the exact phase where each vulnerability would have been caught.**
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Claude Code, Cursor, Windsurf, Warp, and any tool
|
|
12
|
+
Requirements → threat modelling → code review → IaC → compliance → release gate.
|
|
13
|
+
|
|
14
|
+
Works in Claude Code, Cursor, Windsurf, Warp, and any MCP-compatible tool.
|
|
14
15
|
|
|
15
16
|
---
|
|
16
17
|
|
|
17
|
-
## The
|
|
18
|
+
## The 4-Minute Problem
|
|
19
|
+
|
|
20
|
+
You asked Claude Code to build a file upload feature. It wrote working code in 4 minutes.
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
at the end — or skipped entirely. Threat models don't happen. ASVS requirements are never
|
|
21
|
-
written. Compliance evidence is scrambled together the night before an audit.
|
|
22
|
+
It missed:
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
| Vulnerability | Severity | Which agent catches it |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| SVG file with embedded `<script>` stored and served without sanitisation | **CRITICAL** | `appsec-engineer` — MIME type validation, output encoding |
|
|
27
|
+
| No file size limit or type allowlist | **HIGH** | `appsec-engineer` — input validation, magic byte checks |
|
|
28
|
+
| S3 bucket provisioned with `public-read` ACL | **CRITICAL** | `cloud-platform-engineer` — IaC security review |
|
|
29
|
+
| No rate limiting on the upload endpoint | **HIGH** | `appsec-engineer` — anti-automation controls |
|
|
30
|
+
| Upload URL in API response leaks internal bucket path | **MEDIUM** | `dev-lead` — information disclosure review |
|
|
31
|
+
|
|
32
|
+
Every one of these has appeared in real breach post-mortems. AI agents optimise for *working code*, not *secure code*. This project embeds the specialists that close that gap — at the exact phase where each issue would have been caught.
|
|
25
33
|
|
|
26
34
|
---
|
|
27
35
|
|
|
@@ -57,9 +65,48 @@ at the end, but a set of specialists you summon at the exact moment their expert
|
|
|
57
65
|
|
|
58
66
|
---
|
|
59
67
|
|
|
68
|
+
## Who Do You Call?
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
What are you working on?
|
|
72
|
+
│
|
|
73
|
+
├── Starting a new feature?
|
|
74
|
+
│ ├── product-manager → "Define security requirements for X using ASVS L2"
|
|
75
|
+
│ └── grc-analyst → "Initialise risk register, map to SOC2 / GDPR / PCI-DSS"
|
|
76
|
+
│
|
|
77
|
+
├── Designing the architecture?
|
|
78
|
+
│ ├── appsec-engineer → "Threat model this design using STRIDE"
|
|
79
|
+
│ ├── cloud-platform-engineer → "Review IaC for this feature"
|
|
80
|
+
│ └── ai-security-engineer → "Security review — feature calls an LLM" ← always include this
|
|
81
|
+
│
|
|
82
|
+
├── Writing or merging code?
|
|
83
|
+
│ ├── dev-lead → "Review PR #N for secure coding issues and dependency risks"
|
|
84
|
+
│ └── appsec-engineer → "Triage SAST findings for PR #N"
|
|
85
|
+
│
|
|
86
|
+
├── Quick security question (any phase)?
|
|
87
|
+
│ └── security-champion → "Is this pattern / library safe? Context: ..."
|
|
88
|
+
│
|
|
89
|
+
└── Ready to ship?
|
|
90
|
+
└── release-manager → "Run pre-release security checklist for vX.Y.Z"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
60
95
|
## Quick start
|
|
61
96
|
|
|
62
|
-
### Option
|
|
97
|
+
### Option 0 — Claude Code Plugin Marketplace
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
/plugin marketplace add Kaademos/secure-sdlc-agents
|
|
101
|
+
|
|
102
|
+
/plugin install secure-sdlc-agents@secure-sdlc-agents
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
All 8 agents are immediately available in your session. No cloning, no npm, no file copying.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Option A — Git clone (zero dependencies)
|
|
63
110
|
|
|
64
111
|
```bash
|
|
65
112
|
git clone https://github.com/Kaademos/secure-sdlc-agents.git
|
|
@@ -288,6 +335,7 @@ Deep, framework-specific security guidance in `stacks/`:
|
|
|
288
335
|
| Django | [`stacks/django.md`](stacks/django.md) — CSRF, strong params, ORM injection, production settings |
|
|
289
336
|
| Express.js | [`stacks/express.md`](stacks/express.md) — helmet, rate limiting, CSRF, Zod validation |
|
|
290
337
|
| Ruby on Rails | [`stacks/rails.md`](stacks/rails.md) — Brakeman, Pundit, strong parameters, credentials |
|
|
338
|
+
| Go (net/http, Gin, Echo, Fiber) | [`stacks/golang.md`](stacks/golang.md) — html/template XSS, database/sql & GORM injection, CORS, gosec/govulncheck |
|
|
291
339
|
|
|
292
340
|
---
|
|
293
341
|
|
|
@@ -329,6 +377,8 @@ In `warp-workflows/` — import into Warp for one-click SDLC automation:
|
|
|
329
377
|
| [`01-login-feature/`](examples/01-login-feature/) | Auth flow (bcrypt, MFA, sessions) | JWT alg:none, hardcoded secrets, cost factor |
|
|
330
378
|
| [`02-api-endpoint/`](examples/02-api-endpoint/) | Public REST API | IDOR via UUID path param, IAM over-privilege |
|
|
331
379
|
| [`03-file-upload/`](examples/03-file-upload/) | File upload to S3 | SVG XSS, magic byte validation, public bucket |
|
|
380
|
+
| [`04-oauth-flow/`](examples/04-oauth-flow/) | OAuth 2.0 / OIDC social login | redirect_uri exact match, PKCE, state vs nonce, ID-token validation |
|
|
381
|
+
| [`05-payment-processing/`](examples/05-payment-processing/) | Card checkout (hosted page) | PCI DSS SAQ A scoping, webhook signature, idempotency, amount tampering |
|
|
332
382
|
|
|
333
383
|
---
|
|
334
384
|
|
package/cli/src/commands/init.js
CHANGED
|
@@ -163,12 +163,17 @@ export default async function init(options) {
|
|
|
163
163
|
console.log(chalk.dim(` secure-sdlc kickoff\n`));
|
|
164
164
|
|
|
165
165
|
if (stack.name !== "unknown") {
|
|
166
|
-
const { getStackSecurityNotes } = await import("../utils/stack-detect.js");
|
|
166
|
+
const { getStackSecurityNotes, getStackProfile } = await import("../utils/stack-detect.js");
|
|
167
167
|
const notes = getStackSecurityNotes(stack.name);
|
|
168
168
|
if (notes.length) {
|
|
169
169
|
console.log(chalk.bold(`\n${stack.display} security notes for your team:\n`));
|
|
170
170
|
notes.slice(0, 3).forEach((n) => console.log(chalk.dim(` • ${n}`)));
|
|
171
|
-
|
|
171
|
+
// Only point to a profile that actually ships — avoids a broken reference
|
|
172
|
+
// for stacks that have notes but no dedicated stacks/<name>.md (e.g. terraform).
|
|
173
|
+
const profile = getStackProfile(stack.name);
|
|
174
|
+
if (existsSync(join(REPO_ROOT, "stacks", `${profile}.md`))) {
|
|
175
|
+
console.log(chalk.dim(` (see stacks/${profile}.md for full guidance)\n`));
|
|
176
|
+
}
|
|
172
177
|
}
|
|
173
178
|
}
|
|
174
179
|
}
|
|
@@ -79,10 +79,29 @@ export function detectStack(projectRoot) {
|
|
|
79
79
|
return { name: "unknown", display: "Unknown", language: "Unknown" };
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Maps a detected stack name to the stack that owns its security guidance.
|
|
84
|
+
* Framework variants (e.g. Gin/Echo/Fiber) share their language's profile and notes.
|
|
85
|
+
*/
|
|
86
|
+
const STACK_ALIASES = {
|
|
87
|
+
gin: "golang",
|
|
88
|
+
echo: "golang",
|
|
89
|
+
fiber: "golang",
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Resolves the stack profile (notes key + stacks/<name>.md) for a detected stack.
|
|
94
|
+
* Falls back to the stack name itself when no alias applies.
|
|
95
|
+
*/
|
|
96
|
+
export function getStackProfile(stackName) {
|
|
97
|
+
return STACK_ALIASES[stackName] || stackName;
|
|
98
|
+
}
|
|
99
|
+
|
|
82
100
|
/**
|
|
83
101
|
* Returns the top security considerations for a given stack.
|
|
84
102
|
*/
|
|
85
103
|
export function getStackSecurityNotes(stackName) {
|
|
104
|
+
stackName = getStackProfile(stackName);
|
|
86
105
|
const notes = {
|
|
87
106
|
nextjs: [
|
|
88
107
|
"Review Server Actions for CSRF and authorisation — they're POST endpoints by default",
|
|
@@ -120,6 +139,13 @@ export function getStackSecurityNotes(stackName) {
|
|
|
120
139
|
"Audit before_action filters for auth — ensure every controller action is covered",
|
|
121
140
|
"Brakeman is the standard Rails SAST tool — run on every PR",
|
|
122
141
|
],
|
|
142
|
+
golang: [
|
|
143
|
+
"Render HTML with html/template (context-aware escaping) — never text/template, and avoid template.HTML on user input",
|
|
144
|
+
"Use database/sql placeholders ($1/?) or GORM's ? conditions — never fmt.Sprintf user input into queries",
|
|
145
|
+
"CORS: set an explicit AllowedOrigins list — never combine wildcard/AllowAllOrigins with AllowCredentials:true",
|
|
146
|
+
"net/http ships no security headers — add CSP, HSTS, X-Content-Type-Options via middleware (e.g. unrolled/secure)",
|
|
147
|
+
"Run gosec (SAST) and govulncheck (vulnerable deps) in CI; hash passwords with bcrypt (cost ≥ 12) or argon2id",
|
|
148
|
+
],
|
|
123
149
|
terraform: [
|
|
124
150
|
"Pin provider versions with ~> constraints, not latest",
|
|
125
151
|
"Use terraform-aws-modules/terraform-google-modules — don't write IAM from scratch",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
**Release version:** v[X.Y.Z]
|
|
4
4
|
**Date:** [YYYY-MM-DD]
|
|
5
5
|
**Author:** GRC Analyst Agent + [Human GRC lead]
|
|
6
|
-
**Frameworks in scope:** [SOC 2 / ISO 27001 / NIST CSF / PCI DSS / GDPR — delete inapplicable]
|
|
6
|
+
**Frameworks in scope:** [SOC 2 / ISO 27001 / NIST CSF / PCI DSS / GDPR / HIPAA / DORA / FedRAMP — delete inapplicable]
|
|
7
7
|
**Status:** Draft / Review / Approved
|
|
8
8
|
|
|
9
9
|
---
|
|
@@ -110,6 +110,45 @@ ISO/IEC 27001:2022 Annex A, NIST CSF 2.0]
|
|
|
110
110
|
|
|
111
111
|
---
|
|
112
112
|
|
|
113
|
+
### HIPAA *(complete only if protected health information (PHI) is in scope)*
|
|
114
|
+
|
|
115
|
+
| Standard / Rule | Safeguard | Status | Evidence Reference | Notes |
|
|
116
|
+
|-----------------|-----------|--------|--------------------|-------|
|
|
117
|
+
| §164.308(a)(1) | Security Rule — Security management process (risk analysis) | ✅ Met / ⚠️ Gap / 🚫 Fail | | |
|
|
118
|
+
| §164.312(a)(1) | Security Rule — Access control (technical safeguards) | | | |
|
|
119
|
+
| §164.312(b) | Security Rule — Audit controls | | | |
|
|
120
|
+
| §164.312(e)(1) | Security Rule — Transmission security (encryption in transit) | | | |
|
|
121
|
+
| §164.502(b) | Privacy Rule — Minimum necessary use and disclosure | | | |
|
|
122
|
+
|
|
123
|
+
*Extend with additional Security/Privacy Rule standards (e.g. §164.308 administrative, §164.310 physical) relevant to the systems in scope.*
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### DORA *(complete only if an EU financial entity or critical ICT third-party provider)*
|
|
128
|
+
|
|
129
|
+
| Article / Pillar | Requirement | Status | Evidence Reference | Notes |
|
|
130
|
+
|------------------|-------------|--------|--------------------|-------|
|
|
131
|
+
| Art. 5–15 | ICT risk management framework | ✅ Met / ⚠️ Gap / 🚫 Fail | | |
|
|
132
|
+
| Art. 17–23 | ICT-related incident management, classification & reporting | | | |
|
|
133
|
+
| Art. 24–27 | Digital operational resilience testing (incl. TLPT) | | | |
|
|
134
|
+
| Art. 28–30 | ICT third-party risk management | | | |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
### FedRAMP *(complete only if selling to US federal agencies — NIST SP 800-53 baseline)*
|
|
139
|
+
|
|
140
|
+
| Control Family | Control | Status | Evidence Reference | Notes |
|
|
141
|
+
|----------------|---------|--------|--------------------|-------|
|
|
142
|
+
| AC — Access Control | AC-2 Account management | ✅ Met / ⚠️ Gap / 🚫 Fail | | |
|
|
143
|
+
| AU — Audit & Accountability | AU-2 Event logging | | | |
|
|
144
|
+
| IA — Identification & Authentication | IA-2 Identification and authentication (organisational users) | | | |
|
|
145
|
+
| SC — System & Communications Protection | SC-7 Boundary protection | | | |
|
|
146
|
+
| SC — System & Communications Protection | SC-28 Protection of information at rest | | | |
|
|
147
|
+
|
|
148
|
+
*Select the impact baseline (Low / Moderate / High) and extend with the corresponding 800-53 control families (CM, CP, IR, RA, SI, …).*
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
113
152
|
## Gaps
|
|
114
153
|
|
|
115
154
|
Controls that are not fully met at the time of this attestation:
|
|
@@ -116,7 +116,7 @@ Priority list of mitigations to carry into the build phase:
|
|
|
116
116
|
|
|
117
117
|
| Priority | Threat ID(s) | Mitigation | Owner | ASVS Ref |
|
|
118
118
|
|----------|-------------|------------|-------|----------|
|
|
119
|
-
| 1 | T-001, T-004 | Implement account lockout and generic error responses | Dev Lead |
|
|
119
|
+
| 1 | T-001, T-004 | Implement account lockout and generic error responses | Dev Lead | V6.3.1, V14.1.1 |
|
|
120
120
|
| 2 | | | | |
|
|
121
121
|
|
|
122
122
|
---
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaademos/secure-sdlc",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Secure SDLC agent team — CLI to scaffold docs, hooks, CI, and MCP-ready security workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
"docs/templates",
|
|
16
16
|
"hooks",
|
|
17
17
|
"stacks",
|
|
18
|
+
"skills",
|
|
19
|
+
".claude-plugin",
|
|
18
20
|
"warp-workflows",
|
|
19
21
|
".github/workflows/secure-sdlc-gate.yml",
|
|
20
22
|
".cursor/rules",
|
|
@@ -27,6 +29,7 @@
|
|
|
27
29
|
"scripts": {
|
|
28
30
|
"prepack": "node cli/bin/secure-sdlc.js --version",
|
|
29
31
|
"sdlc": "node cli/bin/secure-sdlc.js",
|
|
32
|
+
"test": "node --test test/*.test.js",
|
|
30
33
|
"test:pack": "npm pack --dry-run --ignore-scripts 2>&1"
|
|
31
34
|
},
|
|
32
35
|
"keywords": [
|