Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-46595-proof — golang.org/x/crypto/ssh의 CVE-2026-46595를 시연하는 Go 개념 증명으로, 스트립된 바이너리의 심볼 검사와 이미지 스캔을 사용하여 취약한 NewServerConn 사용을 검증합니다. | Kitploit
도구/GitHubGitHub/sdodson/cve-2026-46595-proof
Static AnalysisVulnerability ScannersContainer SecurityVulnerability AnalysisCode AnalysisBinary AnalysisSupply Chain Security
GitHubsdodson/cve-2026-46595-proof

CVE-2026-46595-proof

golang.org/x/crypto/ssh의 CVE-2026-46595를 시연하는 Go 개념 증명으로, 스트립된 바이너리의 심볼 검사와 이미지 스캔을 사용하여 취약한 NewServerConn 사용을 검증합니다.

저장소 보기
12일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-46595 proof

https://www.cve.org/CVERecord?id=CVE-2026-46595 는 https://pkg.go.dev/vuln/GO-2026-5023 이며, 두 번째 링크에 명시된 대로 golang.org/x/crypto/ssh 의 NewServerConn 심볼에 존재하는 취약점입니다.

이 저장소에는 취약점 양성 검사를 보여주는 간단한 프로그램이 포함되어 있습니다.

x/crypto v0.51.0(< v0.52.0)에 고정된 최소한의 golang.org/x/crypto/ssh 서버로, 스트립되지 않은 바이너리에 대해 go tool nm 을 실행하면 양성 및 음성 검사가 모두 가능함을 보여주기 위해 사용됩니다.

빌드 및 스캔

root@kitploit:~
go mod tidy
go build ./...

취약한 심볼을 알고 있으니 이를 검사합니다. 현재는 스트립되지 않은 바이너리이지만, 심볼 테이블을 제거한 뒤에도 취약한 심볼이 출력에 남아 있음을 증명하기 위해 스트립할 것입니다.

root@kitploit:~
file cve-2026-46595-proof
cve-2026-46595-proof: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=kUaZmGWICI6Buw0K_I7t/L4jXRd3fy2BJy8zNlSYd/lB1_6wYHZLaOLsG0tE26/-FieQlhThdl7AkRj7rl0, BuildID[sha1]=c7ac1dd881dfcaef88a2dd180a8ccb3c5e751e32, with debug_info, not stripped

strings cve-2026-46595-proof | grep golang.org/x/crypto/ssh.NewServerConn
golang.org/x/crypto/ssh.NewServerConn

# ok, now strip it and repeat
strip cve-2026-46595-proof
file cve-2026-46595-proof 
cve-2026-46595-proof: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=kUaZmGWICI6Buw0K_I7t/L4jXRd3fy2BJy8zNlSYd/lB1_6wYHZLaOLsG0tE26/-FieQlhThdl7AkRj7rl0, BuildID[sha1]=c7ac1dd881dfcaef88a2dd180a8ccb3c5e751e32, stripped

strings cve-2026-46595-proof | grep -E 'ssh\.(Dial|NewServerConn|NewClientConn|NewControlClientConn)'
golang.org/x/crypto/ssh.NewServerConn

이제 OpenShift 페이로드 이미지에 포함된 바이너리들을 확인해 봅시다.

이미지에서 /usr/bin 을 추출합니다. --only-files 가 필요합니다. 그렇지 않으면 oc image extract 가 /usr/bin/ld.so 와 같은 심볼릭 링크를 만났을 때 레이어 중간에서 중단됩니다.

root@kitploit:~
IMG=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b4dde8227fb99134f71b50f0707eb7f695cfade43b017da3cbc486c2db854fe1
mkdir -p /tmp/cveimg
oc image extract "$IMG" --path /usr/bin/:/tmp/cveimg/ --only-files
ls -laS /tmp/cveimg | head

이 다이제스트의 경우 4.21 cluster-config-operator 이미지입니다:

root@kitploit:~
-rw-r-----. 1 sdodson sdodson 117899168 Feb 24  2026 cluster-config-operator
-rw-r-----. 1 sdodson sdodson  10639741 Feb 24  2026 cluster-config-operator-tests-ext.gz

어떤 버전의 x/crypto 에 대해 빌드되었는지 확인합니다:

root@kitploit:~
$ go version -m /tmp/cveimg/cluster-config-operator | grep -E 'go1|x/crypto'
/tmp/cveimg/cluster-config-operator: go1.24.13 (Red Hat 1.24.13-1.el9_6) X:strictfipsruntime
	dep	golang.org/x/crypto	v0.40.0

v0.40.0 은 모든 수정 버전보다 낮으므로 모듈 버전 스캐너가 이를 플래그합니다. 이제 심볼 검사를 적용합니다. GO-2026-5023 외에도 v0.55.0 및 v0.56.0 에서 수정된 다른 golang.org/x/crypto 취약점들이 있으므로, 이들의 취약한 심볼을 한 번에 모두 검사합니다:

GO-2026-5023 => ssh.NewServerConn GO-2026-6303 => ssh.NewServerConn again GO-2026-6354 => ssh.Dial ssh.NewClientConn ssh.NewControlClientConn ssh.NewServerConn GO-2026-6355 => ssh.Dial ssh.NewClientConn ssh.NewControlClientConn ssh.NewServerConn

tests-ext 바이너리는 gzip 으로 압축되어 제공되므로 먼저 압축을 해제하고 둘 다 검사합니다:

root@kitploit:~
gzip -dc /tmp/cveimg/cluster-config-operator-tests-ext.gz > /tmp/cveimg/cluster-config-operator-tests-ext
strings /tmp/cveimg/cluster-config-operator{,-tests-ext} \
  | grep -E 'ssh\.(Dial|NewServerConn|NewClientConn|NewControlClientConn)'

출력이 없습니다, 취약점이 없네요! grep 이 매치할 심볼이 없다는 지루한 이유로 조용한 것이 아닌지 확인합니다:

root@kitploit:~
$ go tool nm /tmp/cveimg/cluster-config-operator | wc -l
150240
$ go tool nm /tmp/cveimg/cluster-config-operator | grep -c golang.org/x/crypto/ssh
0
$ go tool nm /tmp/cveimg/cluster-config-operator-tests-ext | wc -l
24607
$ go tool nm /tmp/cveimg/cluster-config-operator-tests-ext | grep -c golang.org/x/crypto
39

즉, x/crypto 는 실제로 링크되어 있지만, 아무것도 이를 참조하지 않기 때문에 링커가 x/crypto/ssh 전체를 제거한 것입니다.

이는 다른 페이로드 이미지에서도 반복 가능해야 합니다. 이미지별로 달라지는 것은 바이너리가 위치한 경로와 위의 -tests-ext.gz 처럼 압축되어 있는지 여부뿐입니다.

*-tests-ext 와 같은 테스트 바이너리는 어떤 실행 경로에도 없음에도 불구하고 이미지에 포함되어 제공된다는 점에 유의하십시오. 이들이 x/crypto/ssh 를 끌어오는 경우 (kubernetes 의 k8s-tests-ext 는 e2e SSH 헬퍼를 위해 ssh.NewClientConn 을 링크합니다) 에도 여전히 실행 중인 컴포넌트의 실행 경로 밖에 있습니다. 그럼에도 불구하고 테스트 바이너리는 이미지를 더 크게 만들고 이미지 풀과 같은 작업을 느리게 하므로 이미지에서 제거하기 위해 노력할 것입니다.

다음은 양성 테스트 케이스 바이너리를 생성할 때 Claude 가 생성한 것으로, 증명에는 필요하지 않지만 남겨두었습니다.

서버 실행

취약점이 존재함을 증명하는 데는 필요하지 않습니다. 위에서 이미 이를 입증했지만, 이것도 자유롭게 해보십시오.

root@kitploit:~
go run . -addr 127.0.0.1:2222 -user demo -password demo

그런 다음 다른 터미널에서:

root@kitploit:~
ssh -p 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [email protected]

비밀번호는 demo 입니다. 세션은 인사말을 출력하고 입력을 되돌려 에코합니다. 매 시작 시 새로운 ed25519 호스트 키가 생성되므로 디스크에 아무것도 기록되지 않습니다.

예상 결과

v0.51.0 에서 govulncheck 는 golang.org/x/crypto/ssh 에서 10개의 도달 가능한 취약점을 보고하며, 모두 main.go → ssh.NewServerConn 을 통해 추적됩니다 (GO-2026-5018 은 ssh.NewSignerFromKey 를 통해서도 추적됩니다).

수정 확인

root@kitploit:~
go get golang.org/x/[email protected]
go mod tidy
govulncheck ./...

v0.52.0 은 대부분을 해결하지만, 세 개는 더 새로운 릴리스가 필요합니다: GO-2026-6303 은 v0.55.0 에서 수정되었고, GO-2026-6354 / GO-2026-6355 는 v0.56.0 에서 수정되었습니다. v0.56.0 에서 스캔하면 깨끗하게 나와야 합니다.

도구 다운로드