Skip to content

Security: ByteBrushStudios/SpikeGuard

Security

SECURITY.md

πŸ”’ Security Policy

πŸ›‘οΈ Supported Versions

We actively maintain and provide security updates for the following versions of SpikeGuard:

Version Supported Status
1.0.x βœ… Current Active security support

🚨 Reporting a Vulnerability

⚠️ Please DO NOT report security vulnerabilities publicly via GitHub Issues.

πŸ“§ Private Disclosure Process

  1. Email: Send details to security@bytebrush.dev
  2. PGP Key: Available at keybase.io/bytebrushstudios
  3. Response Time: We aim to respond within 48 hours
  4. Disclosure Timeline: Coordinated disclosure after fix is available

πŸ“‹ Vulnerability Report Template

Subject: [SECURITY] SpikeGuard Vulnerability Report

**Vulnerability Type:**
[ ] Code Injection
[ ] Privilege Escalation  
[ ] Information Disclosure
[ ] Denial of Service
[ ] Authentication Bypass
[ ] Other: ___________

**Component Affected:**
[ ] FXServer Lua Resource
[ ] Discord Bot
[ ] Configuration Files
[ ] Documentation
[ ] Other: ___________

**Severity Assessment:**
[ ] Critical (Remote code execution, data breach)
[ ] High (Privilege escalation, service disruption)
[ ] Medium (Information disclosure, local attacks)
[ ] Low (Minor information leakage)

**Description:**
[Detailed description of the vulnerability]

**Steps to Reproduce:**
1. [Step one]
2. [Step two]
3. [Step three]

**Proof of Concept:**
[Code, screenshots, or detailed explanation]

**Impact:**
[What an attacker could achieve]

**Suggested Fix:**
[If you have ideas for remediation]

**Credit:**
[How you'd like to be credited in advisories]

πŸ” Security Considerations by Component

🎯 FXServer Lua Resource

Potential Risk Areas:

  • File Operations: Status file writing and profiler dumps
  • HTTP Requests: GitHub API version checking
  • Console Commands: Admin command execution
  • Memory Access: Performance data collection

Built-in Protections:

-- Safe file operations with validation
local function SafeWriteFile(path, data)
    if not path or type(path) ~= "string" then
        return false, "Invalid file path"
    end
    
    -- Validate path to prevent directory traversal
    if string.find(path, "%.%.") then
        return false, "Path traversal detected"
    end
    
    local success, result = pcall(function()
        return SaveResourceFile(GetCurrentResourceName(), path, data, -1)
    end)
    
    return success, result
end

-- Rate limiting for HTTP requests
local function CheckRateLimit()
    local currentTime = GetGameTimer()
    if currentTime - VersionManager.LastCheck < VersionManager.CheckCooldown then
        return false
    end
    return true
end

Configuration Security:

  • No sensitive data stored in configuration
  • All HTTP requests use HTTPS
  • File operations restricted to resource directory
  • Console commands require appropriate permissions

πŸ€– Discord Bot

Potential Risk Areas:

  • Bot Token Exposure: Configuration file security
  • Command Injection: User input in commands
  • Data Validation: FXServer status data processing
  • Permission Escalation: Role and channel access

Built-in Protections:

// Input sanitization
function sanitizeServerName(input) {
    if (!input || typeof input !== 'string') {
        return 'Unknown Server';
    }
    
    // Remove potential injection characters
    return input.replace(/[<>@#&]/g, '').substring(0, 100);
}

// Safe embed creation
function createSafeEmbed(data) {
    const embed = new EmbedBuilder()
        .setTitle(sanitizeServerName(data.serverName))
        .setDescription(`Performance: ${parseFloat(data.memory || 0).toFixed(2)}MB`)
        .setTimestamp();
    
    return embed;
}

// Rate limiting
const rateLimits = new Map();
function checkRateLimit(userId, limit = 5, window = 60000) {
    const now = Date.now();
    const userLimit = rateLimits.get(userId) || { count: 0, resetTime: now + window };
    
    if (now > userLimit.resetTime) {
        userLimit.count = 0;
        userLimit.resetTime = now + window;
    }
    
    userLimit.count++;
    rateLimits.set(userId, userLimit);
    
    return userLimit.count <= limit;
}

Configuration Security:

  • Bot token stored in separate config file
  • Config file included in .gitignore
  • Environment variable support for production
  • Minimal required permissions requested

πŸ” Security Best Practices

🏭 Production Deployment

FXServer Resource:

-- Production configuration
Config = {
    -- Disable debug logging in production
    debug = false,
    
    -- Restrict profiler dump frequency
    profilerCooldown = 300000, -- 5 minutes
    
    -- Limit status file size
    maxStatusFileSize = 1048576, -- 1MB
    
    -- Secure file paths
    statusPath = "data/status.json", -- No absolute paths
}

Discord Bot:

// Production environment variables
const config = {
    token: process.env.DISCORD_TOKEN,
    clientId: process.env.CLIENT_ID,
    guildId: process.env.GUILD_ID,
    
    // Security headers for webhooks
    webhookTimeout: 5000,
    maxEmbedLength: 2048,
    
    // Rate limiting
    commandCooldown: 3000,
    globalRateLimit: 100
};

πŸ”’ Access Control

FXServer Permissions:

  • Console commands require command.spikeguard ace permission
  • File operations restricted to resource directory
  • No external network access except GitHub API
  • Read-only access to server performance metrics

Discord Bot Permissions:

// Minimal required permissions
const requiredPermissions = [
    PermissionFlagsBits.SendMessages,
    PermissionFlagsBits.EmbedLinks,
    PermissionFlagsBits.AttachFiles,
    PermissionFlagsBits.ReadMessageHistory
];

// Avoid these dangerous permissions
const dangerousPermissions = [
    PermissionFlagsBits.Administrator,
    PermissionFlagsBits.ManageGuild,
    PermissionFlagsBits.ManageRoles,
    PermissionFlagsBits.ManageChannels
];

πŸ“Š Data Privacy

Data Collection:

  • Performance Metrics: Memory usage, hitch detection, player count
  • System Information: Server uptime, resource count
  • No Personal Data: No player names, IPs, or personal information

Data Storage:

  • Local Only: All data stored locally on FXServer
  • Temporary Files: Profiler dumps auto-cleaned after analysis
  • No External Storage: No data sent to external services except GitHub API for version checking

Data Retention:

-- Automatic cleanup configuration
Config.Cleanup = {
    profilerRetentionDays = 7,
    statusFileMaxAge = 86400, -- 24 hours
    performanceHistoryLimit = 100 -- entries
}

🚫 Known Security Limitations

⚠️ Current Limitations

  1. Version Checking: Relies on GitHub API availability
  2. File System: Limited to FXServer resource directory
  3. Network Requests: Only HTTPS to api.github.com
  4. Console Access: Requires server console access for commands

πŸ”„ Mitigation Strategies

  • Graceful Degradation: System continues working if version check fails
  • Input Validation: All user inputs are sanitized
  • Error Handling: Comprehensive error catching prevents crashes
  • Rate Limiting: Prevents abuse of HTTP requests and commands

πŸ“ Security Changelog

Version 1.0.0 (2025-07-25)

  • Added: Comprehensive input validation for all user inputs
  • Added: Rate limiting for GitHub API requests
  • Added: Safe file operations with path validation
  • Added: Error handling for all external operations
  • Security: Initial security audit completed
  • Security: No known vulnerabilities at release

πŸ… Security Credits

We thank the following researchers for responsible disclosure:

  • No reports yet - be the first to help secure SpikeGuard!

πŸ“ž Security Contact

πŸ”— Additional Resources


πŸ›‘οΈ Security is a shared responsibility. Thank you for helping keep SpikeGuard secure!

Last updated: July 25, 2025

There aren’t any published security advisories