초기에는 rsync 서버만 있었지만 현재는 모든 방향을 지원하며, Go 프로그램에 링크할 수 있는 rsync 기본 기능으로 여러 gokrazy/rsync 서버에서 사용 중임
2025년 1월 취약점
CVE-2024-12084: 힙 버퍼 오버플로, 심각도 9.8
rsync는 네트워크에서 받은 체크섬 길이를 MAX_DIGEST_LEN과 비교했지만, 내부 자료구조는 항상 16바이트 버퍼 char sum2[SUM_LENGTH]를 사용함
MAX_DIGEST_LEN은 SHA256 또는 SHA512 체크섬 지원으로 컴파일되면 더 커질 수 있어, 공격자가 sum2 버퍼 한계를 최대 48바이트 넘겨 쓸 수 있었음
문제는 SHA256/SHA512 체크섬 지원을 추가한 2022년 9월 commit ae16850에서 도입됨
upstream 수정은 sum2를 동적 할당되는 sum2_array로 바꾸고, 전송 알고리듬의 체크섬 길이인 xfer_sum_len으로 할당·검사하도록 고침
Go에서는 잘못된 경계 검사가 힙 버퍼 오버플로로 이어지지 않고 런타임 경계 검사로 panic이 발생함
gokrazy/rsync에도 sum header 검증 누락이 있었지만 크기 혼동은 아니었고, ChecksumLength를 512로 바꾸면 Go 런타임이 panic: runtime error: slice bounds out of range [:512] with length 16을 발생시킴
use chroot = no로 설정된 rsync daemon은 parent path component에 대한 time-of-check/time-of-use 경쟁에 노출됨
모듈에 쓰기 접근 권한이 있는 로컬 공격자는 receiver의 검사와 open() 사이에 parent directory component를 심볼릭 링크로 바꿔, 읽기에서는 basis-file disclosure를, 쓰기에서는 module 밖 file overwrite를 유발할 수 있음
기본값인 use chroot = yes는 노출되지 않음
upstream 수정은 Go의 os.Root API와 유사한 secure_relative_open()을 사용함
gokrazy/rsync는 sender와 receiver를 순회 저항 os.Root API로 전환하기 전까지 취약했음
CVE-2026-43618: 정수 오버플로로 원격 메모리 유출, 심각도 8.1
rsync 수신자의 압축 토큰 디코더가 32비트 부호 있는 카운터를 오버플로 검사 없이 누적해, 악의적 송신자가 프로세스 메모리 내용을 유출할 수 있음
유출 대상에는 환경 변수, 비밀번호, 힙과 라이브러리 포인터가 포함될 수 있으며, ASLR을 약화하고 추가 익스플로잇을 쉽게 만들 수 있음
영향 범위는 압축이 활성화된 인증된 데몬 연결이며, 프로토콜 30 이상에서 양쪽 피어가 압축을 광고하면 기본값으로 활성화됨
gokrazy/rsync는 압축을 구현하지 않아 취약하지 않으며, 압축 지원이 단순해 보이지만 비자명한 이유는 gokrazy/rsync issue #35에 정리돼 있음
CVE-2026-43620: 범위 밖 읽기 이후 서비스 거부, 심각도 6.5
2025년에 send_files()에 추가된 parent_ndx<0 가드가 시각적으로 동일한 recv_files() 블록에는 적용되지 않아 발생함
악의적 rsync 서버가 CF_INC_RECURSE 호환성 플래그와 잘못 구성된 flist를 보내면 수신자가 dir_flist->files[-1]을 읽고 역참조해 결정적 SIGSEGV로 이어질 수 있음
영향 범위는 공격자가 제어하는 URL에서 일반 pull을 수행하는 모든 rsync 클라이언트이며, 프로토콜 30 이상의 기본값인 inc_recurse 때문에 피해자 쪽 특수 옵션이 필요 없음
클라이언트에서 --no-inc-recursive를 사용하는 것이 우회책이며, upstream 수정은 recv_files()에도 parent_ndx<0 가드를 추가함
gokrazy/rsync는 --inc-recursive증분 재귀 모드를 구현하지 않아 CVE-2024-12087과 마찬가지로 영향을 받지 않음
CVE-2026-43619: 추가 심볼릭 링크 경쟁 조건, 심각도 6.3
수신자의 open() 호출에 대한 심볼릭 링크 경쟁 조건 수정(CVE-2026-29518)이 chmod, lchown, utimes, rename, unlink, mkdir, symlink, mknod, link, rmdir, lstat 등 다른 경로 기반 시스템 호출에는 적용되지 않았음
use chroot = no로 구성된 rsync 데몬에서 로컬 공격자가 수신자의 검사와 시스템 호출 사이에 부모 디렉터리 구성요소를 심볼릭 링크로 바꿔 내보낸 모듈 밖으로 리디렉션할 수 있음
기본값인 use chroot = yes는 노출되지 않음
upstream 수정은 Linux 5.6+의 openat2, FreeBSD 13+와 macOS 15+의 O_RESOLVE_BENEATH, 그 외 환경의 구성요소별 O_NOFOLLOW 순회처럼 커널이 강제하는 제한 아래 열린 부모 dirfd를 통해 영향을 받는 경로 기반 시스템 호출을 처리함
gokrazy/rsync는 Go의 os.Root API를 전반적으로 사용하기 때문에 영향을 받지 않음
CVE-2026-43617: 호스트명 기반 ACL 우회, 심각도 4.8
전역 daemon chroot = /X rsyncd.conf 설정이 있는 rsync 데몬에서 접속 클라이언트의 역방향 DNS 조회가 데몬이 /X로 chroot한 뒤 수행됐음
/X에 glibc 해석에 필요한 /etc/resolv.conf, /etc/nsswitch.conf, /etc/hosts, NSS 서비스 모듈이 없으면 조회가 실패하고 접속 호스트명이 "UNKNOWN"으로 설정됨
hosts deny = *.evil.example 같은 호스트명 기반 deny 규칙이 매칭되지 않아, PTR 레코드를 제어하는 공격자가 관리자가 차단하려던 호스트명에서 접속할 수 있음
IP 기반 ACL은 영향을 받지 않고, 모듈별 use chroot 설정은 이 취약점과 무관함
악의적 클라이언트 송신자는 SSH를 통한 command mode 같은 환경에서 패치되지 않은 원격 rsync가 대상 트리 밖의 파일, 예를 들어 /etc/shadow 시스템 비밀번호 데이터베이스를 열게 만들 수 있음
데몬 모드에서는 서버가 추가 경로 정규화(path sanitization)를 활성화해 이 공격을 막음
Symlink Path Traversal 취약점(CVE-2024-12087)도 “malicious server”라고 표현하지만, 정확히는 클라이언트 또는 서버 어느 쪽이든 될 수 있는 악의적 송신자임
OpenBSD openrsync와 비교
OpenBSD 프로젝트는 보안에 집중하는 것으로 알려져 있으며, openrsync는 체크섬 길이를 검증하고 체크섬 크기/알고리듬으로 MD4 하나만 지원해 Heap Buffer Overflow(CVE-2024-12084)와 Stack Info Leak(CVE-2024-12085)의 영향을 받지 않음
openrsync는 gokrazy/rsync처럼 관련 기능을 구현하지 않아 CVE-2024-12086, CVE-2024-12087, CVE-2024-12088의 영향을 받지 않음