2.9 KiB
2.9 KiB
10. Fix VoicePrint resource exhaustion via unbounded audio upload
meta: id: security-fixes-10 feature: security-fixes priority: P1 depends_on: [] tags: [implementation, tests-required, medium-severity]
objective:
- Prevent memory exhaustion by enforcing maximum payload size on VoicePrint audio endpoints
deliverables:
maxLengthconstraint onAnalyzeAudioSchemainweb/src/server/api/schemas/voiceprint.ts- Request body size limit middleware for audio endpoints
- Size validation in
voiceprint.service.tsbefore base64 decoding - Unit tests for size limits
steps:
- Examine
AnalyzeAudioSchemaatweb/src/server/api/schemas/voiceprint.ts:8-10andanalyzeAudio()atweb/src/server/services/voiceprint.service.ts:135-140 - Add
maxLengthto the audio schema:- Calculate a reasonable limit: A 60-second mono 16kHz WAV is ~1.2MB raw, ~1.6MB base64
- Set
maxLengthto ~2MB base64 (~1.5MB raw) as a safe default - Consider making it configurable via an environment variable
- Add a request body size limit in the tRPC middleware or at the HTTP layer:
- Reject requests with body size > configured limit before processing
- Return a clear error message to the client
- Add a pre-decode size check in
analyzeAudio():- Calculate the decoded size from the base64 string length (
base64Length * 0.75) - Reject if the decoded size exceeds the configured memory limit
- Calculate the decoded size from the base64 string length (
- Update
protectedProcedurerate limit for voiceprint endpoints if not already covered by task 04
tests:
- Unit:
AnalyzeAudioSchemarejects payloads exceedingmaxLength - Unit:
analyzeAudio()rejects base64 strings that would decode to > configured memory limit - Unit: Valid audio payloads within the limit are accepted
- Integration: Sending a 100MB base64 payload to the audio endpoint is rejected with a size error
- Integration: Sending a valid 30-second audio recording succeeds
acceptance_criteria:
- Audio schema enforces
maxLengthon the base64 payload - Request body size limit middleware rejects oversized requests before processing
- Pre-decode size check prevents memory exhaustion from valid-length but high-entropy payloads
- Clear error messages are returned when size limits are exceeded
- Valid audio recordings within the size limit are processed normally
validation:
cd web && bun test— all tests pass- Send a base64 payload exceeding the maxLength and verify it is rejected
- Send a valid audio recording and verify it is processed correctly
- Verify the rate limit for voiceprint endpoints is appropriate (task 04)
notes:
- Finding p8-010: A 100MB base64 payload consumes 300MB+ memory per request
- The
protectedProcedurerate limit (100/min) is insufficient — at 100 requests/min with 100MB payloads, that's 10GB/min of memory pressure - Consider streaming or chunked upload for large audio files instead of base64 in the request body
- The maxLength should account for realistic use cases: voice biometrics typically need 3-30 seconds of audio