무엇이 터졌나
2026년 6월, 보안 연구자 Tristan Madani가 SSH 클라이언트 라이브러리 libssh2에서 CVE-2026-55200을 보고했다. VulnCheck와 NVD 모두 CVSS 4.0 기준 9.2(치명적)로 평가했다. 1.11.1 이하 모든 버전이 영향받는다. Hacker News 보도에 따르면 6월 12일 머지된 패치는 6월 29일 보도 시점까지 정식 릴리스로 나오지 않아 배포판들이 자체 백포트하는 중이었다.
정수 오버플로가 힙 쓰기로 번진다
문제는 transport.c의 ssh2_transport_read()에 있다. 핸드셰이크 중 들어오는 SSH 패킷의 packet_length 필드를 읽을 때 1보다 작은 값만 걸렀고 상한은 검사하지 않았다. 공격자가 packet_length를 0xffffffff처럼 크게 채우면, 여기에 몇 바이트를 더하는 32비트 산술이 오버플로를 일으켜 아주 작은 숫자로 되감긴다. libssh2는 그 작은 숫자만큼만 버퍼를 할당한 뒤, 실제로는 훨씬 큰 원본 패킷을 그대로 써넣는다. 결과는 힙 메모리 손상(CWE-680)이며, VulnCheck·NVD·보도 매체 모두 이 경로가 원격 코드 실행으로 이어질 수 있다고 본다. 인증 이전 단계에서 사용자 개입 없이 트리거된다는 점도 세 출처가 일치한다.
”서버”가 아니라 “클라이언트”가 뚫린다
보통 SSH 사고는 서버 쪽 인증 우회를 떠올리게 하지만, libssh2는 클라이언트 라이브러리다. 뚫리는 쪽은 SSH 서버에 접속을 거는 프로그램이다. curl(libssh2 지원 빌드), Git, PHP, 백업 에이전트, 펌웨어 업데이터가 이를 가져다 쓴다. 신뢰할 수 없거나 탈취당한 SSH 서버에 접속하는 순간 공격 표면이 열린다. 정적 링크된 바이너리는 배포판 패키지를 업데이트해도 그대로 취약한 채 남는다는 점이 더 성가시다.
타임라인
| 날짜 | 사건 |
|---|---|
| 2026-06-12 | 패치 PR #2052 머지 |
| 2026-06-17 | CVE-2026-55200 공개, CVSS 9.2 |
| 2026-06-하순 | PoC 코드가 exploitarium 저장소에 공개 |
| 2026-06-29 | 보도 시점까지 정식 릴리스 미출시 |
PoC는 로컬 검증 트리거와 RCE 하네스 수준이라 Hacker News는 이를 “즉시 쓸 수 있는 원격 익스플로잇은 아니다”라고 짚었다.
지금 확인할 것
curl -V출력에libssh2가 있는지 확인한다. 있다면 curl이 이 라이브러리로 빌드된 것이다.- Git, PHP(ssh2 확장) 등이 libssh2를 정적으로 번들했는지 점검한다. 패키지 매니저 목록만으로는 안 잡힌다.
- 패치 커밋(
97acf3df, PR #2052)이 반영된 빌드로 교체하거나, 신뢰할 수 없는 SSH 서버 접속을 제한하고 호스트 키 검증을 강제한다. - 같은 시기 공개된 CVE-2026-55199(인증 전 CPU 소모 DoS)도 함께 확인한다.
처음이 아니다
같은 계열의 정수 오버플로는 낯설지 않다. libssh2는 2019년에도 거의 같은 유형의 버그(CVE-2019-3855)를 전송 읽기 경로에서 고친 적이 있다. 7년 뒤 같은 코드 영역에서 같은 클래스의 버그가 다시 나왔다는 사실은, 경계값 검증이 코드 리뷰에서 반복해서 새는 지점임을 보여준다. 외부 입력으로 크기를 계산할 때는 하한뿐 아니라 상한도 명시적으로 막아야 한다는 원칙을, 이 라이브러리는 두 번째로 증명한 셈이다.
이 글에 대한 의견은 아래 댓글로 남겨주세요 (GitHub 계정 필요). 로그인 없이 남기고 싶다면