🇰🇷 한글 설명
Apache ZooKeeper의 `deleteContainer` OpCode가 호출자의 ACL 권한을 검증하지 않아 발생하는 권한 우회 취약점입니다. 인증되지 않은 클라이언트라도 TCP 세션을 통해 특정 OpCode를 직접 전송하면 ACL 제한을 무시하고 빈 영구 znode를 삭제할 수 있습니다.
💡 쉬운 설명
보안 규칙을 무시하고 특정 명령어를 직접 보내면, 허가받지 않은 사용자도 중요한 데이터를 마음대로 삭제할 수 있는 결함입니다. 마치 열쇠가 없는 사람도 특수 명령어를 통해 금고를 열 수 있는 것과 같습니다.
🇺🇸 원문 (English)
The `deleteContainer` opcode (0x14/20) is processed without verifying the caller's ACL permissions, allowing any authenticated client to delete specific znodes in the data tree regardless of the ACL restrictions on the znode or its parent. This opcode is considered internal-only and the official client doesn't have API for it, but a client that can open a plain TCP session on the ZooKeeper client port (2181 by default) - with NO authentication and NO ACL permissions - can delete any empty persistent znode (including regular persistent nodes, container nodes, and TTL nodes) by issuing the raw protocol OpCode deleteContainer (20). The deleteContainer request path completely skips both the session check and the DELETE ACL check that are enforced by the regular delete (OpCode 2) path. This is an authorization bypass / ACL enforcement bug.
This issue affects Apache ZooKeeper: from 3.9.0 through 3.9.5, from 3.8.0 through 3.8.6.
Users are recommended to upgrade to version 3.9.6 or 3.8.7, which fixes the issue.
📍 영향받는 시스템
Apache ZooKeeper 3.9.0 ~ 3.9.5, 3.8.0 ~ 3.8.6
⚔️ 공격 벡터
ZooKeeper 클라이언트 포트(2181)를 통해 인증 없이 raw TCP 세션을 열고 `deleteContainer` OpCode(20)를 직접 전송
🛡️ 대응 방법
Apache ZooKeeper를 3.9.6 또는 3.8.7 이상의 버전으로 업그레이드
🔧 검증 코드
명령어 결과에 취약한 버전 범위(3.9.0-3.9.5 또는 3.8.0-3.8.6)가 출력되면 취약한 상태입니다.
zkServer.sh version 2>/dev/null | grep -E '3\.(9\.[0-5]|8\.[0-6])'