🇰🇷 한글 설명
Apache bRPC의 Redis 프로토콜 구현에서 인라인 명령어를 파싱할 때, CRLF 종료 문자가 확인되기 전에 전체 연결 버퍼를 할당하고 복사하는 취약점이 발견되었습니다. 공격자가 종료 문자가 없는 긴 인라인 입력을 전송할 경우 메모리 사용량과 CPU 복사 오버헤드가 급증하여 서비스 거부(DoS) 상태를 유발할 수 있습니다.
💡 쉬운 설명
Redis 통신 방식을 사용하는 서비스에서 끝맺음 표시가 없는 아주 긴 데이터를 보내면, 서버가 이를 처리하려다 메모리와 CPU를 과도하게 사용하여 서버가 멈출 수 있는 문제입니다. 마치 끝이 없는 문장을 읽으려고 계속 종이를 붙여나가는 것과 같습니다.
🇺🇸 원문 (English)
The Redis protocol implementation in Apache bRPC allowed inline command parsing to allocate and copy the full connection buffer before a complete CRLF-terminated command was available. A remote attacker with access to a Redis-protocol bRPC service could send long inline inputs without a terminating CRLF to increase memory usage and CPU copy overhead, potentially causing denial of service.
Root Cause:
The Redis inline command parser allocated memory based on the current input buffer size and copied the entire buffer before determining the current inline command boundary. The existing redis_max_allocation_size limit was applied to RESP bulk strings and arrays, but not effectively to the inline command path before allocation.
Affected Scenarios:
Use Apache bRPC server with Redis protocol enabled and reachable by untrusted clients.
How to Fix:
1. Upgrade Apache bRPC to version 1.18.0, which fixes this issue.
2. Apply the patch from PR https://github.com/apache/brpc/pull/3363 .
Note:
The fix applies redis_max_allocation_size to Redis inline command lines and scans for CRLF before allocating parser arena memory. Inline command lines exceeding this limit are rejected.
📍 영향받는 시스템
Redis 프로토콜이 활성화된 Apache bRPC 서버 (1.18.0 미만 버전)
⚔️ 공격 벡터
Redis 프로토콜을 사용하는 서비스에 CRLF 종료 문자가 없는 긴 인라인 입력을 전송
🛡️ 대응 방법
Apache bRPC를 1.18.0 버전으로 업그레이드하거나 관련 패치(PR #3363)를 적용
🔧 검증 코드
출력된 bRPC 버전이 1.18.0 이상인지 확인하여 취약 여부를 판단합니다.
brpc --version 2>/dev/null || echo 'Version check required'