Skip to content
Back to skills

Security Scanning

ASecurity

Automated security scanning pipeline covering SAST (Semgrep), SCA (OWASP dependency-check), SBOM generation (Syft), vulnerability scanning (Grype), and secrets detection (detect-secrets). Invoked by security-architect for pre-commit gates, CI integration, and finding triage.

  • 40 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 6, 2026
devopsjavascriptpythonrustgojavabashsqlnodedockeraws

Works with

  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 10 files and shows the line behind each finding

Scanned September 6, 2026

npx -y skills add oimiragieo/agent-studio --skill security-scanning --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Security Scanning?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Security Scanning
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/oimiragieo-security-scanning/badge)](https://www.skillsdirectory.com/skills/oimiragieo-security-scanning)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: security-scanning
description: Automated security scanning pipeline covering SAST (Semgrep), SCA (OWASP dependency-check), SBOM generation (Syft), vulnerability scanning (Grype), and secrets detection (detect-secrets). Invoked by security-architect for pre-commit gates, CI integration, and finding triage.
version: 1.0.0
category: security
agents:
  - security-architect
  - devops
  - qa
tools:
  - Bash
  - Read
  - Write
  - Grep
source: builtin
trust_score: 100
provenance_sha: c6195cf3c263847d
---

# Security Scanning Skill

Automated security scanning pipeline: SAST, SCA, SBOM, and secrets detection.

## Tools

| Tool                   | Purpose                           | Install                            |
| ---------------------- | --------------------------------- | ---------------------------------- |
| Semgrep                | SAST — static analysis            | `pip install semgrep`              |
| OWASP dependency-check | SCA — known CVEs in deps          | `brew install dependency-check`    |
| Syft                   | SBOM generation                   | `brew install anchore/syft/syft`   |
| Grype                  | Vulnerability scanner (uses SBOM) | `brew install anchore/grype/grype` |
| detect-secrets         | Secrets detection                 | `pip install detect-secrets`       |

## Phase 1: SAST — Static Analysis (Semgrep)

```bash
# Run default ruleset
semgrep --config auto .

# Run security-focused rules only
semgrep --config p/security-audit .

# Run OWASP Top 10 rules
semgrep --config p/owasp-top-ten .

# Output JSON for CI
semgrep --config auto --json --output semgrep-results.json .

# Fail CI on any HIGH or CRITICAL finding
semgrep --config auto --severity ERROR .
```

**Recommended rulesets:**

- `p/security-audit` — broad security audit
- `p/owasp-top-ten` — OWASP Top 10 coverage
- `p/javascript` — JS/TS patterns (injection, XSS, prototype pollution)
- `p/python` — Python patterns (SQL injection, insecure deserialization)
- `p/secrets` — hardcoded credential detection

## Phase 2: SCA — Software Composition Analysis (OWASP dependency-check)

```bash
# Scan Node.js project
dependency-check --project myapp --scan . --format JSON --out dependency-check-report

# Scan with NVD API key (avoids rate limiting)
dependency-check --project myapp --scan . \
  --nvdApiKey "$NVD_API_KEY" \
  --format HTML --out reports/

# CI integration: fail on CVSS >= 7.0
dependency-check --project myapp --scan . \
  --failOnCVSS 7 \
  --format JSON --out reports/

# Suppress false positives
dependency-check --project myapp --scan . \
  --suppression suppressions.xml
```

## Phase 3: SBOM Generation (Syft)

```bash
# Generate SBOM for current directory
syft . -o spdx-json > sbom.spdx.json

# SBOM from Docker image
syft my-image:latest -o cyclonedx-json > sbom.cyclonedx.json

# Multiple formats
syft . -o spdx-json -o cyclonedx-json -o syft-json

# Sign SBOM with cosign
cosign attest --predicate sbom.spdx.json --type spdx $IMAGE_DIGEST
```

## Phase 4: Vulnerability Scanning (Grype)

```bash
# Scan from SBOM
grype sbom:sbom.spdx.json

# Scan Docker image directly
grype my-image:latest

# Scan current directory
grype .

# Fail on CRITICAL or HIGH
grype sbom:sbom.spdx.json --fail-on high

# Output JSON for CI
grype sbom:sbom.spdx.json -o json > grype-results.json

# Filter by severity
grype sbom:sbom.spdx.json --only-fixed
```

## Phase 5: Secrets Detection (detect-secrets)

```bash
# Create baseline (initial scan)
detect-secrets scan > .secrets.baseline

# Audit baseline interactively
detect-secrets audit .secrets.baseline

# Scan for new secrets (CI check)
detect-secrets scan --baseline .secrets.baseline

# Add to pre-commit hook
# .pre-commit-config.yaml:
# - repo: https://github.com/Yelp/detect-secrets
#   rev: v1.4.0
#   hooks:
#   - id: detect-secrets
#     args: ['--baseline', '.secrets.baseline']
```

## Pre-Commit Gate

```yaml
# .pre-commit-config.yaml
repos:
  - repo: https://github.com/returntocorp/semgrep
    rev: v1.58.0
    hooks:
      - id: semgrep
        args: ['--config', 'p/security-audit', '--error']

  - repo: https://github.com/Yelp/detect-secrets
    rev: v1.4.0
    hooks:
      - id: detect-secrets
        args: ['--baseline', '.secrets.baseline']
```

## CI Integration (GitHub Actions)

```yaml
# .github/workflows/security.yml
name: Security Scan
on: [push, pull_request]

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: SAST (Semgrep)
        uses: returntocorp/semgrep-action@v1
        with:
          config: p/security-audit

      - name: Generate SBOM
        uses: anchore/sbom-action@v0
        with:
          format: spdx-json
          output-file: sbom.spdx.json

      - name: Vulnerability Scan (Grype)
        uses: anchore/scan-action@v3
        with:
          sbom: sbom.spdx.json
          fail-build: true
          severity-cutoff: high

      - name: Secrets Detection
        run: |
          pip install detect-secrets
          detect-secrets scan --baseline .secrets.baseline
```

## Finding Triage Workflow

```
HIGH/CRITICAL findings:
  → Create security issue immediately
  → Assign to security-architect for review
  → Block merge until resolved or suppressed with justification

MEDIUM findings:
  → Log in security backlog
  → Review in next sprint
  → Add to suppression file with justification if false positive

LOW/INFO findings:
  → Weekly review
  → Suppress with justification or accept risk
```

## Suppression Patterns

**Semgrep (inline):**

```python
# nosemgrep: python.lang.security.audit.hardcoded-password.hardcoded-password
PASSWORD = os.environ["PASSWORD"]
```

**detect-secrets (.secrets.baseline):**

```bash
# Mark as false positive during audit
detect-secrets audit .secrets.baseline
# Press 'n' to mark as not a secret
```

**Grype (grype.yaml):**

```yaml
ignore:
  - vulnerability: CVE-2021-44228
    reason: 'Not affected — log4j not in classpath'
```

## When to Invoke

- `Skill({ skill: 'security-scanning' })` — before any security review
- Pre-commit: automatically via pre-commit hooks
- CI: on every PR targeting main/release branches
- Release gates: mandatory before any production deployment

## Iron Laws

1. **ALWAYS** scan before merging to main — no exceptions for "quick fixes"
2. **NEVER** suppress a HIGH/CRITICAL finding without documented justification and security-architect approval
3. **ALWAYS** generate and store SBOM for every container image pushed to production
4. **NEVER** commit secrets baseline with unmarked findings — audit every detected secret
5. **ALWAYS** update SBOM and re-scan after any dependency change

## Anti-Patterns

| Anti-Pattern                     | Why It Fails                      | Correct Approach                         |
| -------------------------------- | --------------------------------- | ---------------------------------------- |
| Skipping SCA for "known" deps    | CVEs are discovered continuously  | Always run SCA; pin versions + audit     |
| Suppressing all Semgrep findings | Breaks the safety net             | Suppress only with justification + owner |
| Not rotating detected secrets    | Secret is already compromised     | Rotate immediately, then suppress        |
| SBOM generated but not scanned   | SBOM alone adds no security value | Always run Grype against generated SBOM  |
| Scanning only in CI              | Developers get slow feedback loop | Add pre-commit hooks for SAST + secrets  |

## Memory Protocol (MANDATORY)

**Before starting:**
Read `.claude/context/memory/learnings.md`

**After completing:**

- New pattern -> `.claude/context/memory/learnings.md`
- Issue found -> `.claude/context/memory/issues.md`
- Decision made -> `.claude/context/memory/decisions.md`

> ASSUME INTERRUPTION: If it's not in memory, it didn't happen.

Files in this skill

  • SKILL.md7.7 KB
  • commands/security-scanning.md117 B
  • hooks/post-execute.cjs187 B
  • hooks/pre-execute.cjs293 B
  • references/research-requirements.md292 B
  • rules/security-scanning.md293 B
  • schemas/input.schema.json496 B
  • schemas/output.schema.json261 B
  • scripts/main.cjs1 KB
  • templates/implementation-template.md191 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…