본문 바로가기

어느날 git pull이 무서운 보안 오류를 내뿜었다

기술적인 이야기/잡다한 기술적인 이야기 2023. 3. 24.
반응형

어느 날 업무로 Git을 통해 특정 저장소를 Pull 했는데 아래와 같은 스샷의 오류가 떴다.

개인정보를 조금 제거한 터미널 스크린샷

좀 더 읽기 편하게 (개인정보와 해시키를 제거한) 텍스트로 정리하면 아래와 같다.

$ git pull
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:.....(긴 해시 키 문자열)......
Please contact your system administrator.
Add correct host key in /foo/bar/.ssh/known_hosts to get rid of this message.
Offending RSA key in /foo/bar/.ssh/known_hosts:1
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

의미상으로 보자면 원격 호스트 고유 증명이 바뀌었고 뭔가 문제가 있다, 누군가 중간자 공격(man-in-the-middle attack)을 하는 것일 수도 있다는 등 제법 위험해 보이는 메시지다. 처음 봤을 땐 심장이 약간 철렁하는 느낌을 받았다.

반응형

설마 해킹당했나?

일단 해결법은 아래로 미뤄두고, 정말 해킹인지 파악을 해야 할 것 같다. 일명 중간자 공격(man-in-the-middle attack)이라는 것은 중간에 누군가가 접속하려는 호스트를 흉내 내며 접속을 가로챈 경우를 말하기 때문에 그냥 넘기긴 힘드니 말이다.

위의 오류 메시지에서 known_hosts:1 이라고 표기된 부분이 눈에 뜨이는데 known_hosts 파일의 첫 줄에 명시된 호스트가 문제라는 의미다. 내 경우는 해당 파일의 첫 줄이 github.com이라는 것을 확인할 수 있었다.

그렇다면 누가 내 GitHub 저장소나 프로젝트 소스코드를 가로채려는 것일까? 이 부분은 전문지식이 필요한 분야라서 개인적으로도 모른다.

하지만 이 글을 쓰는 시점에 한해서는 별로 걱정을 할 필요가 없는 것 같다. GitHub 측에서 RSA Host Key가 바뀌었다는 블로그를 2023년 3월 23일 개제했다. 내용에서 보안 문제로 2023년 3월 24일 5:00(UTC) 시각을 기준으로 원격지 증명이 바뀌었다는 점을 알 수 있다. 따라서 해킹일 가능성이 낮다는 의미다.

물론 주의는 필요하니 최근에 어둠의 경로 등을 통해 설치하거나 사용한 것이 무엇인가가 있는지 잘 생각해 보자.

728x90

이제 해결해 보자

해결법은 단순하다. 위 메시지에도 적혀있다시피 .ssh/known_hosts에서 관련된 내용을 갱신해 주면 된다.

갱신 방법은 여러 가지가 있는데 아래 커맨드가 일반적일 것 같다. 일단 해킹이 아님을 확인한 후 ssh-keygen 명령을 아래와 같이 입력해 주자.

ssh-keygen -R github.com

이번의 경우는 GitHub 측의 문제였기에 해당 호스트인 github.com을 입력했다. 결과적으로 아래와 같은 식의 응답을 얻었다.

$ ssh-keygen -R github.com
# Host github.com found: line 1
/foo/bar/.ssh/known_hosts updated.
Original contents retained as /foo/bar/.ssh/known_hosts.old

사실 이 커맨드는 known_hosts 파일을 일단 백업한 후 해당 호스트가 적힌 줄을 그냥 날려버리는 방식이다. 따라서 에디터로 ~/.ssh/known_hosts 파일을 열어서 해당 줄을 삭제하고 저장해도 동일한 조치가 가능하다. 만약 아예 다른 호스트 정보를 유지할 필요가 없다면 ~/.ssh/known_hosts 파일을 rm 명령으로 지워버려도 된다.

이런 식으로 조치 후 다시 Git으로 Pull을 시도해 보니 아래와 같이 GitHub의 새로운 인사에 적응(?)하는 식으로 동작하기 시작했다.

$ git pull
The authenticity of host 'github.com (foo.bar.qwe.rty)' can't be established.
ED25519 key fingerprint is SHA256:...(긴 해시 키)....
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

yes를 입력해 주면 신규로 접속하는 호스트처럼 뭔가의 메시지가 뜬 후 정상적으로 Pull을 마칠 수 있었다.

주의사항

이번에는 해킹 여부를 외부 소식을 통해 대충 확인하긴 했지만 만약 제대로 확인하지 않고 위의 해결법을 썼다면 상황에 따라 낭패를 당할 수 있다. 이런 조치로 ssh 자격 증명이 엉뚱하게 해킹 서버로 갱신되는 등의 실수가 될 수도 있다. 물론 그 이전에 이미 잘못된 호스트 증명을 사용하고 있었을 수도 있기에 차라리 갱신하는 게 더 나을지도 모르겠지만 새로 접속하는 호스트를 무조건 신뢰할 수 있을지는 알 수가 없다. 어쨌거나 중요한 것은 해킹을 당했는지 파악하는 건데 쉬운 일이 아니니 더 문제다.

물론 어둠의 경로를 쓰지 않는다면 크게 걱정할 필요는 아마도 없을 것이다. 애초에 이런 이벤트가 자주 발생하는 것도 아니니 말이다. 그리고 개인서버의 경우라면 수시로 바뀌는 것도 일상적으로 보일 수도 있다.

728x90
반응형

댓글