skills/curiouslearner/secret-scanner/SKILL.md
Detect accidentally committed secrets, credentials, and sensitive information in code.
npx skillsauth add aiskillstore/marketplace secret-scannerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Detect accidentally committed secrets, credentials, and sensitive information in code.
You are a secret detection expert. When invoked:
Scan for Secrets:
Pattern Detection:
Contextual Analysis:
Risk Assessment:
Generate Report: Create comprehensive secret exposure report with remediation steps
# AWS Access Key ID
AKIA[0-9A-Z]{16}
# AWS Secret Access Key
[0-9a-zA-Z/+=]{40}
# AWS Session Token
[A-Za-z0-9/+=]{200,}
# GCP API Key
AIza[0-9A-Za-z-_]{35}
# GCP Service Account
"type": "service_account"
# Azure Storage Key
[a-zA-Z0-9+/]{88}==
# Azure Client Secret
[0-9a-zA-Z-_~]{34,}
# GitHub Personal Access Token
ghp_[0-9a-zA-Z]{36}
# GitHub OAuth Token
gho_[0-9a-zA-Z]{36}
# GitHub App Token
(ghu|ghs)_[0-9a-zA-Z]{36}
glpat-[0-9a-zA-Z-_]{20}
# MongoDB Connection String
mongodb(\+srv)?://[^\s]+
# PostgreSQL Connection String
postgres(ql)?://[^\s]+
# MySQL Connection String
mysql://[^\s]+
# Generic DB Password
(password|pwd|pass)\s*[:=]\s*['"][^'"]+['"]
# Generic API Key
api[_-]?key\s*[:=]\s*['"][^'"]+['"]
# Stripe
sk_live_[0-9a-zA-Z]{24,}
# Slack
xox[baprs]-[0-9a-zA-Z-]{10,}
# Twilio
SK[0-9a-fA-F]{32}
# SendGrid
SG\.[0-9A-Za-z\-_]{22}\.[0-9A-Za-z\-_]{43}
-----BEGIN (RSA|DSA|EC|OPENSSH|PGP) PRIVATE KEY-----
eyJ[A-Za-z0-9-_=]+\.eyJ[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*
@secret-scanner
@secret-scanner --severity high
@secret-scanner --git-history
@secret-scanner src/
@secret-scanner --include-env-files
@secret-scanner --entropy-check
@secret-scanner --report
# Install git-secrets
brew install git-secrets # macOS
# or
git clone https://github.com/awslabs/git-secrets.git
# Initialize
git secrets --install
git secrets --register-aws
# Scan repository
git secrets --scan
git secrets --scan-history
# Add custom patterns
git secrets --add 'api[_-]?key\s*[:=]\s*['"'"'][^'"'"']+['"'"']'
git secrets --add 'password\s*[:=]\s*['"'"'][^'"'"']+['"'"']'
# Install
pip install truffleHog
# Scan repository
trufflehog git file://. --json
# Scan remote repository
trufflehog git https://github.com/user/repo.git
# Scan with high entropy only
trufflehog git file://. --entropy-only
# Scan specific branch
trufflehog git file://. --branch main
# Install
brew install gitleaks # macOS
# Scan repository
gitleaks detect --source . --verbose
# Scan with report
gitleaks detect --source . --report-format json --report-path report.json
# Scan uncommitted files
gitleaks protect --staged
# Scan git history
gitleaks detect --source . --log-opts "--all"
# Install
pip install detect-secrets
# Create baseline
detect-secrets scan > .secrets.baseline
# Audit baseline
detect-secrets audit .secrets.baseline
# Scan for new secrets
detect-secrets scan --baseline .secrets.baseline
# Scan for AWS keys
grep -r "AKIA[0-9A-Z]\{16\}" .
# Scan for private keys
grep -r "BEGIN.*PRIVATE KEY" .
# Scan for passwords
grep -ri "password\s*=\s*['\"]" . --include="*.js" --include="*.py"
# High entropy strings
grep -r "[a-zA-Z0-9]\{32,\}" .
# Secret Scanner Report
**Repository**: my-application
**Scan Date**: 2024-01-15 14:30:00 UTC
**Branch**: main
**Commits Scanned**: 1,234
**Files Scanned**: 456
---
## Executive Summary
🔴 **CRITICAL SECURITY ISSUE DETECTED**
**Total Secrets Found**: 12
- Critical: 4
- High: 3
- Medium: 3
- Low: 2
**Immediate Actions Required**: 4 secrets need rotation NOW
---
## Critical Secrets (4)
### 🔴 AWS Access Key Exposed
**Severity**: Critical
**File**: src/config/aws.js
**Line**: 12
**Commit**: a3f5c2b (2024-01-10)
**Age**: 5 days
**Secret Found**:
```javascript
const AWS_ACCESS_KEY_ID = 'AKIAIOSFODNN7EXAMPLE';
const AWS_SECRET_ACCESS_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';
Pattern Match: AWS Access Key ID pattern Entropy Score: 4.2 (High)
Risk Assessment:
Exposure:
Immediate Actions:
Remediation:
# 1. Revoke key immediately via AWS Console or CLI
aws iam delete-access-key --access-key-id AKIAIOSFODNN7EXAMPLE
# 2. Create new key
aws iam create-access-key --user-name production-user
# 3. Update environment variables (DO NOT COMMIT)
export AWS_ACCESS_KEY_ID="new-key-id"
export AWS_SECRET_ACCESS_KEY="new-secret-key"
# 4. Remove from git history
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch src/config/aws.js" \
--prune-empty --tag-name-filter cat -- --all
# Or use BFG Repo Cleaner
bfg --replace-text passwords.txt
Prevention:
// NEVER do this:
const AWS_ACCESS_KEY_ID = 'AKIAIOSFODNN7EXAMPLE';
// ALWAYS do this:
const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID;
// Add to .gitignore:
.env
.env.local
.env.production
credentials.json
aws-config.json
Git History Cleanup Required: YES Priority: P0 - Fix immediately
Severity: Critical File: config/database.yml Line: 8 Commit: f9e2a1d (2024-01-05)
Secret Found:
production:
url: postgresql://admin:[email protected]:5432/appdb
Pattern Match: PostgreSQL connection string with password Entropy Score: 3.8 (High)
Risk Assessment:
Immediate Actions:
Remediation:
# Use environment variables
production:
url: <%= ENV['DATABASE_URL'] %>
# Or use secrets manager
production:
url: <%= SecretsManager.get('database_url') %>
Priority: P0 - Fix immediately
Severity: Critical File: deploy/keys/id_rsa Line: 1-27 Commit: b4c7e3a (2023-12-20)
Secret Found:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1234567890...
[REDACTED]
-----END RSA PRIVATE KEY-----
Pattern Match: RSA Private Key Age: 26 days
Risk Assessment:
Immediate Actions:
Remediation:
# 1. Remove key from servers
ssh user@server "sed -i '/ssh-rsa AAAA.../d' ~/.ssh/authorized_keys"
# 2. Generate new key (DO NOT COMMIT)
ssh-keygen -t ed25519 -C "[email protected]"
# 3. Add to .gitignore
*.pem
*.key
id_rsa
id_rsa.pub
*.ppk
Priority: P0 - Fix immediately
Severity: Critical File: src/payments/stripe.js Line: 5 Commit: d8f1a2c (2024-01-12)
Secret Found:
const stripe = require('stripe')('sk_live_51Abc123XYZ...');
Pattern Match: Stripe Live Secret Key Entropy Score: 4.1 (High)
Risk Assessment:
Immediate Actions:
Remediation:
// NEVER do this:
const stripe = require('stripe')('sk_live_51Abc123XYZ...');
// ALWAYS do this:
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
Priority: P0 - Fix immediately
Severity: High File: .github/workflows/deploy.yml Line: 23 Commit: e3b9c4f (2024-01-14)
Secret Found:
env:
GITHUB_TOKEN: ghp_1234567890abcdefghijklmnopqrstuvwx
Pattern Match: GitHub Personal Access Token Scope: Repository access, potentially org-wide
Immediate Actions:
Remediation:
# Use built-in GITHUB_TOKEN (automatically available)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Or store in repository secrets
env:
CUSTOM_TOKEN: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
Priority: P1 - Fix within 24 hours
Severity: High File: src/email/sender.js Line: 8
Secret Found:
const apiKey = 'SG.1234567890abcdefgh.ijklmnopqrstuvwxyz1234567890abcdefgh';
Risk: Unauthorized email sending, quota exhaustion Action: Rotate key, use environment variable
Priority: P1 - Fix within 24 hours
Severity: High File: src/auth/config.js Line: 15
Secret Found:
const JWT_SECRET = 'my-super-secret-jwt-key-123';
Risk: Token forgery, authentication bypass Action: Generate strong secret, store securely
Remediation:
// Generate strong secret
const crypto = require('crypto');
const secret = crypto.randomBytes(64).toString('hex');
// Use environment variable
const JWT_SECRET = process.env.JWT_SECRET;
// Validation
if (!JWT_SECRET || JWT_SECRET.length < 32) {
throw new Error('JWT_SECRET must be at least 32 characters');
}
Priority: P1 - Fix within 24 hours
Severity: Medium File: src/api/client.js Line: 12
Secret Found:
const API_URL = 'https://api.example.com?key=abc123def456';
Risk: API quota abuse, service disruption Action: Move to environment variable
Priority: P2 - Fix within 7 days
Severity: Low File: docker-compose.yml Line: 18
Secret Found:
POSTGRES_PASSWORD: devpassword123
Risk: Low (development only) Note: Still use environment variables for consistency
Priority: P3 - Fix in next sprint
File: README.md Line: 45
Example: api_key="your-api-key-here"
Reason: Example/placeholder text Action: None (consider adding comment to prevent future flags)
Total Commits Analyzed: 1,234 Commits with Secrets: 8 Branches Affected: main, develop, feature/payment
Historical Secret Exposure:
Commit: a3f5c2b - AWS keys (2024-01-10)
Commit: f9e2a1d - DB password (2024-01-05)
Commit: b4c7e3a - SSH key (2023-12-20)
Commit: d8f1a2c - Stripe key (2024-01-12)
Recommendation: Rewrite git history to remove secrets
# 1. Clone fresh copy
git clone --mirror https://github.com/user/repo.git
# 2. Create file with secrets to remove
cat > secrets.txt << EOF
AKIAIOSFODNN7EXAMPLE
SuperSecret123!
sk_live_51Abc123XYZ
ghp_1234567890abcdefghijklmnopqrstuvwx
EOF
# 3. Run BFG
bfg --replace-text secrets.txt repo.git
# 4. Clean up
cd repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
# 5. Force push
git push --force
# Install
pip install git-filter-repo
# Remove specific files
git filter-repo --path src/config/aws.js --invert-paths
# Remove secrets by pattern
git filter-repo --replace-text secrets.txt
⚠️ IMPORTANT: After history rewrite
1. All team members must delete local clones
2. Clone repository fresh
3. DO NOT merge old branches
4. Update all CI/CD pipelines
# .husky/pre-commit
#!/bin/sh
gitleaks protect --staged --verbose --redact
# Secrets
.env
.env.*
!.env.example
*.pem
*.key
*.ppk
*_rsa
*_dsa
credentials.json
secrets.yml
secrets.yaml
config/credentials/*
aws-config.json
# OS Files
.DS_Store
Thumbs.db
# .env.example (commit this)
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
AWS_ACCESS_KEY_ID=your_access_key_here
AWS_SECRET_ACCESS_KEY=your_secret_key_here
STRIPE_SECRET_KEY=sk_test_your_key_here
# .env (DO NOT COMMIT - add to .gitignore)
DATABASE_URL=postgresql://admin:[email protected]:5432/prod
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
HashiCorp Vault
const vault = require('node-vault');
const client = vault({ endpoint: process.env.VAULT_ADDR });
async function getSecret(path) {
const result = await client.read(path);
return result.data;
}
const dbPassword = await getSecret('secret/database/password');
AWS Secrets Manager
const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();
async function getSecret(secretName) {
const data = await secretsManager.getSecretValue({
SecretId: secretName
}).promise();
return JSON.parse(data.SecretString);
}
Doppler
# Install Doppler CLI
doppler setup
# Run app with secrets
doppler run -- node app.js
name: Secret Scanning
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Gitleaks
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: TruffleHog
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: main
If secrets are exposed:
Secrets Found: 12 Critical: 4 (require immediate rotation) High: 3 (rotate within 24h) Medium: 3 (fix within 7 days) Low: 2 (fix next sprint)
Estimated Remediation Time: 4-6 hours Git History Cleanup: Required Team Training: Recommended
Overall Risk: 🔴 CRITICAL - Immediate action required
## Notes
- Scan repository before every public release
- Implement automated scanning in CI/CD
- Regular secret rotation is critical
- Train developers on secure secret handling
- Use secrets management tools for production
- Never commit .env files
- Review git history for secrets before open-sourcing
- Establish incident response plan for exposed secrets
- Monitor for secrets in issues, pull requests, and discussions
- Remember: Once committed, assume secret is compromised
development
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.