mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 22:05:21 +00:00
fix BCH-01-004: rate-limit subscription-triggered announces
Adds rate-limiting to prevent device enumeration attacks via rapid subscription/disconnect cycles. Without this fix, an attacker could enumerate ~120 bitchat devices per minute by connecting, subscribing, capturing the announce packet, then disconnecting and moving to the next. Key changes: - Add per-central rate-limit tracking with exponential backoff - Minimum 2-second interval between announces per central - Exponential backoff (2x) up to 30 seconds for rapid reconnects - After 5 rapid attempts, suppress announces entirely (likely attack) - Clean up stale rate-limit entries after 60-second window - Clear rate-limit state during panic mode Configuration: - bleSubscriptionRateLimitMinSeconds: 2.0 - bleSubscriptionRateLimitBackoffFactor: 2.0 - bleSubscriptionRateLimitMaxBackoffSeconds: 30.0 - bleSubscriptionRateLimitWindowSeconds: 60.0 - bleSubscriptionRateLimitMaxAttempts: 5 Security audit reference: Cure53 BCH-01-004 (Medium severity) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -162,6 +162,14 @@ enum TransportConfig {
|
||||
static let blePostAnnounceDelaySeconds: TimeInterval = 0.4
|
||||
static let bleForceAnnounceMinIntervalSeconds: TimeInterval = 0.15
|
||||
|
||||
// BCH-01-004: Rate-limiting for subscription-triggered announces
|
||||
// Prevents rapid enumeration attacks by rate-limiting announce responses
|
||||
static let bleSubscriptionRateLimitMinSeconds: TimeInterval = 2.0 // Minimum interval between announces per central
|
||||
static let bleSubscriptionRateLimitBackoffFactor: Double = 2.0 // Exponential backoff multiplier
|
||||
static let bleSubscriptionRateLimitMaxBackoffSeconds: TimeInterval = 30.0 // Maximum backoff period
|
||||
static let bleSubscriptionRateLimitWindowSeconds: TimeInterval = 60.0 // Window for tracking subscription attempts
|
||||
static let bleSubscriptionRateLimitMaxAttempts: Int = 5 // Max attempts before extended cooldown
|
||||
|
||||
// Store-and-forward for directed packets at relays
|
||||
static let bleDirectedSpoolWindowSeconds: TimeInterval = 15.0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user