Security
Skill VoDaiLocz/kilo-kit-mcp/skills/kilo-kit/development/security
An MCP server for safer coding agents: skill routing, C4 workflow gates, memory checks, and verification before completion.
npx -y skills add VoDaiLocz/kilo-kit-mcp --skill securityAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 24 stars24 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Security-focused development skill covering OWASP Top 10 and secure coding. Use when implementing authentication, handling user data, or security review. Keywords: security, auth, authentication, authorization, OWASP, XSS, SQL injection, CSRF, secure
SKILL.md
11.6 KB, as published. Nobody here has run it
π Security Best Practices Skill
Philosophy: Security is not optional. Build it in from the start.
When to Use
Use this skill when:
- Implementing authentication/authorization
- Handling user input
- Working with sensitive data
- Doing security code review
- Building user-facing features
- Setting up deployment/infrastructure
Do NOT use this skill when:
- Just formatting code
- Pure UI/styling changes
- No user data involved
Prerequisites
Before starting:
- Understand what data you're handling
- Know your threat model (who might attack)
- Have access to codebase
- Understand the tech stack
OWASP Top 10 Quick Reference
1. Broken Access Control (A01:2021)
What: Users can access data/functions they shouldn't.
Prevention:
// β Bad: No authorization check
app.get('/users/:id', async (req, res) => {
const user = await db.users.findById(req.params.id);
res.json(user);
});
// β
Good: Check ownership
app.get('/users/:id', authorize(), async (req, res) => {
const user = await db.users.findById(req.params.id);
if (user.id !== req.user.id && req.user.role !== 'admin') {
throw new ForbiddenException();
}
res.json(user);
});
Checklist:
- Default deny (require explicit permission)
- Verify ownership of resources
- Role-based access control implemented
- Admin functions protected
- CORS configured correctly
2. Cryptographic Failures (A02:2021)
What: Weak crypto, exposed sensitive data.
Prevention:
// β Bad: Weak hashing
const hash = crypto.createHash('md5').update(password).digest('hex');
// β
Good: Strong hashing with bcrypt
const hash = await bcrypt.hash(password, 12);
// β Bad: Hardcoded secrets
const API_KEY = "sk_live_abc123";
// β
Good: Environment variables
const API_KEY = process.env.API_KEY;
Checklist:
- Passwords hashed with bcrypt/argon2 (cost factor β₯12)
- Sensitive data encrypted at rest
- TLS/HTTPS enforced
- No hardcoded secrets
- Secrets in environment variables
- Old/weak algorithms avoided (MD5, SHA1)
3. Injection (A03:2021)
What: Malicious data executed as code/query.
Prevention:
// β Bad: SQL Injection
const query = `SELECT * FROM users WHERE email = '${email}'`;
// β
Good: Parameterized queries
const user = await db.query(
'SELECT * FROM users WHERE email = $1',
[email]
);
// β Bad: Command injection
exec(`convert ${filename} output.png`);
// β
Good: Use library functions
await sharp(filename).toFile('output.png');
Types to Prevent:
- SQL Injection
- NoSQL Injection
- Command Injection
- LDAP Injection
- XPath Injection
Checklist:
- Use parameterized queries/ORM
- Validate and sanitize all input
- Escape output appropriately
- Avoid shell commands with user input
- Use allow-lists, not block-lists
4. Insecure Design (A04:2021)
What: Missing security in design phase.
Prevention:
# Security design considerations
threat_modeling:
assets:
- User credentials
- Payment information
- Personal data
threats:
- Authentication bypass
- Data theft
- Privilege escalation
mitigations:
- MFA for sensitive operations
- Encryption at rest
- Audit logging
Checklist:
- Threat model created
- Security requirements documented
- Defense in depth applied
- Fail securely (safe defaults)
- Separation of duties
5. Security Misconfiguration (A05:2021)
What: Insecure settings, missing hardening.
Prevention:
// β Bad: Debugging enabled in production
app.use(express.errorHandler({ dumpExceptions: true }));
// β
Good: Production-safe error handling
if (process.env.NODE_ENV === 'production') {
app.use((err, req, res, next) => {
console.error(err); // Log internally
res.status(500).json({ message: 'Internal error' }); // Don't expose details
});
}
Checklist:
- Remove default credentials
- Disable debugging in production
- Remove unnecessary features/endpoints
- Security headers configured
- Error messages don't leak info
- File permissions correct
Security Headers:
app.use(helmet());
// Or manually:
app.use((req, res, next) => {
res.setHeader('X-Content-Type-Options', 'nosniff');
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('X-XSS-Protection', '1; mode=block');
res.setHeader('Strict-Transport-Security', 'max-age=31536000');
res.setHeader('Content-Security-Policy', "default-src 'self'");
next();
});
6. Vulnerable Components (A06:2021)
What: Using libraries with known vulnerabilities.
Prevention:
# Check for vulnerabilities
npm audit
pip-audit
dotnet list package --vulnerable
# Fix vulnerabilities
npm audit fix
pip-audit --fix
Checklist:
- Dependencies up to date
- Security advisories monitored
- Automated vulnerability scanning
- Remove unused dependencies
- Only use trusted sources
7. Authentication Failures (A07:2021)
What: Broken login, session management.
Prevention:
// Password requirements
const passwordPolicy = {
minLength: 12,
requireUppercase: true,
requireLowercase: true,
requireNumber: true,
requireSpecial: true,
preventCommon: true,
};
// Rate limiting login attempts
const loginLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 5, // 5 attempts
message: 'Too many login attempts'
});
// Session configuration
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // HTTPS only
httpOnly: true, // No JS access
sameSite: 'strict', // CSRF protection
maxAge: 3600000 // 1 hour
}
}));
Checklist:
- Strong password policy enforced
- Brute force protection (rate limiting)
- MFA available for sensitive accounts
- Secure password reset flow
- Sessions invalidated on logout
- Session timeout configured
8. Software Integrity Failures (A08:2021)
What: Insecure updates, CI/CD pipeline attacks.
Prevention:
# Verify package integrity
package-lock.json # Lock versions
npm ci # Install exact versions
# CI/CD security
ci_security:
- Verify source code integrity
- Sign releases
- Secure deployment pipeline
- Review third-party actions
Checklist:
- Lock file used and committed
- Packages verified (checksums)
- CI/CD pipeline secured
- Code signing for releases
9. Logging Failures (A09:2021)
What: Insufficient logging for security events.
Prevention:
// Security event logging
const securityLogger = {
loginSuccess: (userId: string, ip: string) => {
logger.info('LOGIN_SUCCESS', { userId, ip, timestamp: new Date() });
},
loginFailure: (email: string, ip: string, reason: string) => {
logger.warn('LOGIN_FAILURE', { email, ip, reason, timestamp: new Date() });
},
accessDenied: (userId: string, resource: string, ip: string) => {
logger.warn('ACCESS_DENIED', { userId, resource, ip, timestamp: new Date() });
},
suspiciousActivity: (details: object) => {
logger.error('SUSPICIOUS_ACTIVITY', { ...details, timestamp: new Date() });
}
};
// Log what to log
// β
Login attempts (success and failure)
// β
Access control failures
// β
Input validation failures
// β
Security configuration changes
// β
High-value transactions
// β Don't log
// Passwords
// Session tokens
// Credit card numbers
// Personal data (unless necessary)
Checklist:
- Security events logged
- Log format is parseable
- Logs protected from tampering
- Sensitive data not logged
- Alerting on suspicious patterns
10. SSRF (A10:2021)
What: Server-Side Request Forgery.
Prevention:
// β Bad: User-controlled URL
const response = await fetch(req.body.url);
// β
Good: Validate and restrict
const ALLOWED_DOMAINS = ['api.example.com', 'cdn.example.com'];
async function fetchUrl(userUrl: string) {
const parsed = new URL(userUrl);
if (!ALLOWED_DOMAINS.includes(parsed.hostname)) {
throw new Error('Domain not allowed');
}
if (parsed.protocol !== 'https:') {
throw new Error('HTTPS required');
}
return fetch(userUrl);
}
Checklist:
- Validate user-supplied URLs
- Use allow-lists for domains
- Block internal/private IPs
- Disable HTTP redirects (or limit)
Input Validation Patterns
Universal Validation
// Validation with Zod
const UserSchema = z.object({
email: z.string().email().toLowerCase().trim(),
password: z.string().min(12).max(128),
name: z.string().min(2).max(50).regex(/^[a-zA-Z\s]+$/),
age: z.number().int().min(13).max(120).optional(),
});
// Validation with class-validator
class CreateUserDto {
@IsEmail()
@Transform(({ value }) => value.toLowerCase().trim())
email: string;
@IsString()
@MinLength(12)
@MaxLength(128)
@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])/)
password: string;
@IsString()
@MinLength(2)
@MaxLength(50)
name: string;
}
XSS Prevention
// β Bad: Raw HTML output
element.innerHTML = userInput;
// β
Good: Text content only
element.textContent = userInput;
// β
Good: Sanitize if HTML needed
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(userInput);
Security Testing Checklist
security_tests:
authentication:
- Test login with invalid credentials
- Test brute force protection
- Test session timeout
- Test logout clears session
- Test password reset flow
authorization:
- Test accessing other users' data
- Test admin functions as normal user
- Test direct object references
- Test privilege escalation
input_validation:
- Test SQL injection payloads
- Test XSS payloads
- Test command injection
- Test path traversal
- Test file upload restrictions
configuration:
- Test HTTPS enforcement
- Test security headers present
- Test error messages sanitized
- Test debugging disabled
Guidelines
DO β
- Validate all input
- Use parameterized queries
- Hash passwords with bcrypt/argon2
- Log security events
- Keep dependencies updated
- Apply principle of least privilege
DON'T β
- Trust user input
- Store secrets in code
- Use weak cryptography
- Expose detailed errors
- Ignore security warnings
- Skip security testing
Success Criteria
Before considering code secure:
- OWASP Top 10 addressed
- Input validation complete
- Authentication/authorization tested
- Secrets managed properly
- Security headers configured
- Dependencies audited
- Security logging in place
- Code reviewed for security
Related Skills
skills/kilo-kit/development/backend/- For API securityskills/kilo-kit/quality/code-review/- For security reviewskills/kilo-kit/debugging/root-cause/- For security incident analysis
Security Best Practices Skill v1.0.0 β Security is everyone's job