Skip to content

Security Guidelines

This document outlines security considerations for Tuulbelt tool development.

Core Principles

1. Zero External Dependencies

The primary security benefit of Tuulbelt tools is no external runtime dependencies.

  • No node_modules in production
  • No supply chain attacks via compromised packages
  • No transitive dependency vulnerabilities

2. Input Validation

All tools must validate input at system boundaries:

typescript
// Good: Validate at entry point
export function process(input: unknown): Result {
  if (typeof input !== 'string') {
    throw new TypeError('Input must be a string');
  }
  if (input.length > MAX_INPUT_SIZE) {
    throw new RangeError('Input exceeds maximum size');
  }
  // ... process validated input
}

3. No Secrets in Code

  • Never hardcode API keys, passwords, or tokens
  • Use environment variables for configuration
  • Document required environment variables in README
typescript
// Good: Read from environment
const apiKey = process.env.API_KEY;
if (!apiKey) {
  throw new Error('API_KEY environment variable required');
}

// Bad: Hardcoded secret
const apiKey = 'sk-1234567890abcdef';

4. Safe File Operations

When tools read or write files:

typescript
import { resolve, normalize } from 'path';

// Prevent path traversal
function safePath(userPath: string, baseDir: string): string {
  const resolved = resolve(baseDir, userPath);
  const normalized = normalize(resolved);

  if (!normalized.startsWith(baseDir)) {
    throw new Error('Path traversal detected');
  }

  return normalized;
}

5. Command Injection Prevention

Never pass user input directly to shell commands:

typescript
import { execFile } from 'child_process';

// Good: Use execFile with arguments array
execFile('git', ['status', '--porcelain'], (error, stdout) => {
  // ...
});

// Bad: String interpolation in exec
exec(`git status ${userInput}`, (error, stdout) => {
  // Vulnerable to command injection
});

Tool-Specific Guidelines

CLI Tools

  • Validate all command-line arguments
  • Use allowlists for flag values when possible
  • Exit with appropriate error codes (non-zero for errors)

File Processing Tools

  • Limit file sizes to prevent resource exhaustion
  • Validate file formats before processing
  • Clean up temporary files

Network Tools

  • Validate URLs and hostnames
  • Use timeouts for all network requests
  • Handle connection failures gracefully

Reporting Security Issues

If you discover a security vulnerability in a Tuulbelt tool:

  1. Do not open a public GitHub issue
  2. Email the maintainer directly (see CODEOWNERS)
  3. Include:
    • Tool name and version
    • Description of the vulnerability
    • Steps to reproduce
    • Potential impact

Security Review Checklist

Before releasing a tool:

  • [ ] No hardcoded secrets
  • [ ] All user input validated
  • [ ] No shell command injection vectors
  • [ ] File paths sanitized (no path traversal)
  • [ ] Network requests have timeouts
  • [ ] Error messages don't leak sensitive information
  • [ ] Dependencies reviewed (dev-only, TypeScript compiler)

See Also

Released under the MIT License.