Ce document décrit les mesures de sécurité en place et les procédures pour signaler des vulnérabilités dans Electrum Overlay.
This security policy is also available in English.
- 🛡️ Versions supportées
- 🚨 Signaler une vulnérabilité
- 🔐 Mesures de sécurité
⚠️ Bonnes pratiques- 🔧 Configuration sécurisée
- 🔍 Audit de sécurité
- 📚 Ressources
Nous fournissons des mises à jour de sécurité pour les versions suivantes :
| Version | Support | Statut |
|---|---|---|
| 1.x.x | ✅ Supportée | Stable |
| < 1.0 | ❌ Non supportée | EOL |
Note : Seule la dernière version majeure reçoit des correctifs de sécurité.
Pour signaler une vulnérabilité de sécurité, NE CRÉEZ PAS d'issue publique. Contactez-nous directement :
- Email sécurisé : [sécurité à signaler via GitHub]
- GitHub Security Advisory : Créer un advisory privé
- Délai de réponse : 48-72 heures maximum
Votre rapport doit contenir :
**Type de vulnérabilité**
[OWASP Top 10, CWE, CVE, etc.]
**Description**
Description claire et concise de la vulnérabilité.
**Impact**
Quel est l'impact potentiel de cette vulnérabilité ?
**Étapes de reproduction**
1. Configuration nécessaire
2. Étapes détaillées pour reproduire
3. Commandes/URLs utilisées
4. Résultat observé
**Environnement**
- Version d'Electrum Overlay: [e.g. v1.0.0]
- Node.js: [e.g. v18.17.0]
- OS: [e.g. Windows 11, Ubuntu 22.04]
- Configuration: [e.g. production, développement]
**Preuve de concept**
Code ou captures d'écran démontrant la vulnérabilité.
**Solution suggérée**
Si vous avez une idée de correction.| Délai | Action |
|---|---|
| 72h | Accusé de réception et évaluation initiale |
| 7 jours | Analyse complète et classification |
| 14 jours | Développement du correctif |
| 30 jours | Publication du correctif et advisory |
- App Access Token : Utilisé pour les API publiques
- User Access Token : Nécessaire pour EventSub et données sensibles
- Rotation automatique : Tokens régénérés si expirés
- Scopes minimaux : Seuls les scopes nécessaires sont demandés
// Scopes requis minimaux
const REQUIRED_SCOPES = [
'user:read:chat', // Lecture messages chat
'user:bot', // Actions bot utilisateur
'channel:bot', // Actions bot sur la chaîne
'channel:read:subscriptions', // Lecture abonnements
'moderator:read:followers' // Lecture followers
];- ❌ Jamais de tokens dans le code source
- ✅ Variables d'environnement ou fichiers de config
- ✅ Gitignore pour
src/config/config.js - ✅ Exemple de configuration fourni
// Validation des messages WebSocket
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
validateWebSocketMessage(data);
} catch (error) {
ws.close(1003, 'Invalid message format');
}
});- Rate limiting sur les connexions WebSocket
- Validation stricte des messages JSON
- Timeout automatique des connexions inactives
- Origine vérifiée pour les connexions cross-origin
// Vérification de signature Twitch EventSub
const hmac = crypto
.createHmac('sha256', webhookSecret)
.update(message)
.digest('hex');
const isValid = crypto.timingSafeEqual(
Buffer.from(`sha256=${hmac}`),
Buffer.from(signature)
);- Signature HMAC obligatoire en production
- Rate limiting sur
/eventsub - Logs détaillés des tentatives d'accès
- Validation stricte des headers Twitch
- Localhost uniquement par défaut (127.0.0.1)
- Ports non-privilégiés (8080, 8081)
- CORS désactivé pour les origines externes
- Firewall recommandé en production
// Pas d'exposition d'informations sensibles
app.use((error, req, res, next) => {
console.error('Internal error:', error);
res.status(500).json({
error: 'Internal server error'
});
});// ❌ MAUVAIS
const config = {
clientSecret: "abc123secret", // Token en dur
webhookSecret: "secret123" // Secret faible
};
// ✅ BON
const config = {
clientSecret: process.env.TWITCH_CLIENT_SECRET,
webhookSecret: crypto.randomBytes(32).toString('hex')
};- Environnement séparé pour développement/production
- Secrets forts (32+ caractères aléatoires)
- Rotation régulière des secrets
- Backup sécurisé des configurations
# Sécurisation ngrok
ngrok http 8080 --auth="user:password" --bind-tls=true# Configuration Nginx sécurisée
server {
listen 443 ssl;
server_name overlay.votre-domaine.com;
# Rate limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req zone=api burst=20 nodelay;
# Headers de sécurité
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location /eventsub {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}- Sources locales uniquement (
http://localhost:8080) - Pas d'URLs publiques dans les Browser Sources
- Refresh sécurisé des sources entre les streams
- Backup de la configuration OBS
- VLAN séparé pour le streaming si possible
- Firewall applicatif activé
- Monitoring des connexions réseau
- VPN pour l'accès distant
src/config/
├── config.example.js # ✅ Versionné (template)
├── config.js # ❌ Gitignore (secrets)
└── .env.example # ✅ Template environnement
// src/config/config.js (ne pas versionner)
const crypto = require('crypto');
module.exports = {
server: {
PORT: parseInt(process.env.PORT) || 8080,
WS_PORT: parseInt(process.env.WS_PORT) || 8081,
HOST: process.env.HOST || '127.0.0.1', // Localhost uniquement
},
twitch: {
CLIENT_ID: process.env.TWITCH_CLIENT_ID,
CLIENT_SECRET: process.env.TWITCH_CLIENT_SECRET,
BROADCASTER_ID: process.env.TWITCH_BROADCASTER_ID,
USER_ACCESS_TOKEN: process.env.TWITCH_USER_TOKEN,
WEBHOOK_URL: process.env.WEBHOOK_URL,
WEBHOOK_SECRET: process.env.WEBHOOK_SECRET || crypto.randomBytes(32).toString('hex'),
REDIRECT_URI: process.env.REDIRECT_URI || 'http://localhost:8080/auth-callback',
SCOPES: [
'user:read:chat',
'user:bot',
'channel:bot',
'channel:read:subscriptions',
'moderator:read:followers'
]
},
security: {
ENABLE_HMAC_VERIFICATION: process.env.NODE_ENV === 'production',
RATE_LIMIT_WINDOW: 15 * 60 * 1000, // 15 minutes
RATE_LIMIT_MAX: 100, // Requêtes par fenêtre
SESSION_TIMEOUT: 30 * 60 * 1000, // 30 minutes
}
};# .env (ne pas versionner)
NODE_ENV=production
TWITCH_CLIENT_ID=your_client_id_here
TWITCH_CLIENT_SECRET=your_client_secret_here
TWITCH_BROADCASTER_ID=your_broadcaster_id_here
TWITCH_USER_TOKEN=your_user_token_here
WEBHOOK_URL=https://your-tunnel-url.ngrok.io/eventsub
WEBHOOK_SECRET=your_32_char_random_secret_here
PORT=8080
WS_PORT=8081
HOST=127.0.0.1- Tokens Twitch configurés et valides
- Secrets forts (32+ caractères)
- Gitignore configuré pour les secrets
- Variables d'environnement utilisées
- HMAC activé en production
- Serveur local uniquement (127.0.0.1)
- Ports non-privilégiés utilisés
- Tunnel sécurisé pour webhooks
- Rate limiting configuré
- Headers de sécurité ajoutés
- Validation des entrées utilisateur
- Gestion sécurisée des erreurs
- Logs sans informations sensibles
- Timeouts configurés
- Dependencies à jour
# Audit de sécurité npm
npm audit
# Vérification des vulnérabilités
npm audit --audit-level high
# Mise à jour automatique (patch)
npm audit fix
# Mise à jour manuelle (breaking changes)
npm audit fix --force# Connexions suspectes
grep "403\|401\|429" server.log
# Tentatives d'accès webhook
grep "webhook" server.log
# Erreurs d'authentification
grep "❌.*auth" server.log
# WebSocket anormales
grep "WebSocket.*error" server.log- Taux d'erreur des webhooks (< 1%)
- Latence WebSocket (< 100ms)
- Connexions simultanées (monitoring)
- Rate limiting activations
# Scan de vulnérabilités
npm install -g npm-audit-resolver
npm install -g snyk
# Analyse statique
npm install -g eslint-plugin-security
npm install -g jshint
# Monitoring
npm install helmet # Headers de sécurité
npm install express-rate-limit # Rate limiting
npm install cors # CORS sécuriséThis document describes the security measures in place and procedures for reporting vulnerabilities in Electrum Overlay.
We provide security updates for the following versions:
| Version | Support | Status |
|---|---|---|
| 1.x.x | ✅ Supported | Stable |
| < 1.0 | ❌ Not supported | EOL |
Note: Only the latest major version receives security patches.
To report a security vulnerability, DO NOT CREATE a public issue. Contact us directly:
- Secure Email: [security to be reported via GitHub]
- GitHub Security Advisory: Create a private advisory
- Response Time: 48-72 hours maximum
Your report should contain:
**Vulnerability Type**
[OWASP Top 10, CWE, CVE, etc.]
**Description**
Clear and concise description of the vulnerability.
**Impact**
What is the potential impact of this vulnerability?
**Reproduction Steps**
1. Required configuration
2. Detailed steps to reproduce
3. Commands/URLs used
4. Observed result
**Environment**
- Electrum Overlay Version: [e.g. v1.0.0]
- Node.js: [e.g. v18.17.0]
- OS: [e.g. Windows 11, Ubuntu 22.04]
- Configuration: [e.g. production, development]
**Proof of Concept**
Code or screenshots demonstrating the vulnerability.
**Suggested Solution**
If you have an idea for a fix.| Timeline | Action |
|---|---|
| 72h | Acknowledgment and initial assessment |
| 7 days | Complete analysis and classification |
| 14 days | Fix development |
| 30 days | Fix release and advisory publication |
- App Access Token: Used for public APIs
- User Access Token: Required for EventSub and sensitive data
- Automatic rotation: Tokens regenerated if expired
- Minimal scopes: Only necessary scopes are requested
- ❌ Never tokens in source code
- ✅ Environment variables or config files
- ✅ Gitignore for
src/config/config.js - ✅ Configuration example provided
- Rate limiting on WebSocket connections
- Strict validation of JSON messages
- Automatic timeout for inactive connections
- Origin verification for cross-origin connections
- HMAC signature mandatory in production
- Rate limiting on
/eventsub - Detailed logs of access attempts
- Strict validation of Twitch headers
- Localhost only by default (127.0.0.1)
- Non-privileged ports (8080, 8081)
- CORS disabled for external origins
- Firewall recommended in production
- Separate environment for development/production
- Strong secrets (32+ random characters)
- Regular rotation of secrets
- Secure backup of configurations
- Use authentication when possible
- Enable HTTPS/TLS only
- Monitor access logs
- Local sources only (
http://localhost:8080) - No public URLs in Browser Sources
- Secure refresh of sources between streams
- Backup OBS configuration
// src/config/config.js (do not version)
module.exports = {
server: {
PORT: process.env.PORT || 8080,
HOST: '127.0.0.1', // Localhost only
},
twitch: {
CLIENT_ID: process.env.TWITCH_CLIENT_ID,
CLIENT_SECRET: process.env.TWITCH_CLIENT_SECRET,
// ... other secure configuration
},
security: {
ENABLE_HMAC_VERIFICATION: process.env.NODE_ENV === 'production',
RATE_LIMIT_WINDOW: 15 * 60 * 1000,
RATE_LIMIT_MAX: 100,
}
};- Twitch tokens configured and valid
- Strong secrets (32+ characters)
- Gitignore configured for secrets
- Environment variables used
- HMAC enabled in production
- Local server only (127.0.0.1)
- Non-privileged ports used
- Secure tunnel for webhooks
- Rate limiting configured
- Security headers added
- User input validation
- Secure error handling
- Logs without sensitive information
- Timeouts configured
- Dependencies up to date
# npm security audit
npm audit
# Check for vulnerabilities
npm audit --audit-level high
# Automatic update (patches)
npm audit fix# Vulnerability scanning
npm install -g npm-audit-resolver
npm install -g snyk
# Static analysis
npm install -g eslint-plugin-security
# Security middleware
npm install helmet
npm install express-rate-limit
npm install corsMerci de nous aider à maintenir Electrum Overlay sécurisé ! 🔒✨
Thank you for helping keep Electrum Overlay secure! 🔒✨