본문으로 건너뛰기

© 2026 Molayo

GeekNews헤드라인2026. 05. 26. 00:48

내 최소 메모리 안전 Go rsync가 취약점을 피하는 방법

요약

rsync에서 발견된 주요 보안 취약점(CVE-2024-12084, CVE-2026-43618, CVE-2026-43620)의 원인과 해결 방법을 분석합니다. Go 언어의 메모리 안전성이 이러한 취약점을 어떻게 완화하는지, 그리고 gokrazy/rsync가 이를 어떻게 방어하고 있는지 설명합니다.

핵심 포인트

  • 힙 버퍼 오버플로 취약점은 Go의 런타임 경계 검사를 통해 panic으로 안전하게 처리됨
  • TOCTOU 경쟁 상태는 os.Root API와 유사한 보안 API 사용으로 해결 가능
  • 정수 오버플로를 이용한 메모리 유출은 압축 토큰 디코더의 카운터 검증 부재로 발생
  • 범위 밖 읽기로 인한 서비스 거부는 일관되지 않은 가드 조건 적용이 원인

초기에는 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의 영향을 받지 않음

AI 자동 생성 콘텐츠

본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0