본문 바로가기

IT & AI

개발자 채용 과제에 숨은 악성코드, Git 훅부터 확인해야 해요

728x90

개발자 채용 과제에 숨은 악성코드, Git 훅부터 확인해야 해요

AI 뉴스 썸네일
AI 뉴스 썸네일

월 1만~1만 5천 달러를 제시한 원격 Python 개발자 채용 과제가 악성코드 전달 수단으로 쓰였어요. 겉으로는 FastAPI와 SQLAlchemy로 만든 평범한 프로젝트였지만, 숨겨진 Git 훅이 운영체제에 맞는 원격 페이로드를 실행하도록 짜여 있었어요. 1

핵심 요약

구분확인된 내용개발자가 볼 지점
접근 방식가짜 채용 담당자가 ZIP 파일과 과제 PDF를 보냈어요높은 보수와 지나치게 빠른 승인도 경고 신호가 될 수 있어요
실행 장치`.git/hooks/pre-commit`이 원격 스크립트를 조용히 실행했어요코드를 읽는 것만으로는 숨은 자동 실행 설정을 놓칠 수 있어요
후속 동작Linux에서는 Node.js와 난독화된 스크립트를 내려받아 백그라운드에서 실행했어요다운로드 주소, 프로세스 지속성, 의존성 목록을 함께 봐야 해요
다른 변종`.vscode` 설정을 이용해 폴더를 열 때 명령을 실행한 사례도 언급됐어요낯선 저장소는 주 작업 환경과 분리해서 검사하는 편이 안전해요

1. 정상적인 FastAPI 과제가 감염 경로로 바뀌었어요

제보자가 받은 압축 파일에는 기존 공개 저장소를 복제한 FastAPI 백엔드가 들어 있었어요. `requirements.txt`에서도 타이포스쿼팅이나 눈에 띄는 악성 패키지가 발견되지 않았어요. 공격자는 정상 코드 대부분을 유지하고 숨김 디렉터리에 자동 실행 장치만 더했어요. 평소처럼 의존성 파일과 애플리케이션 코드만 살폈다면 이상을 찾기 어려운 구성이에요. 2

숨김 파일까지 표시하는 `tree -a`로 프로젝트 구조를 확인하자 `.git/hooks` 아래에 미리 구성된 훅이 드러났어요. 그중 `pre-commit` 스크립트는 운영체제를 판별한 뒤 외부 서버에서 macOS, Linux, Windows용 명령을 받아 실행했어요. 출력은 버리고 프로세스는 백그라운드로 넘겨서 사용자가 눈치채기 어렵게 만들었어요.

728x90

과제 PDF가 Git 작업을 요구했다는 점도 중요해요. 지원자가 자연스럽게 커밋을 시도하면 숨겨진 훅이 작동할 수 있었어요. 공격자는 개발자가 익숙하게 수행하는 작업을 실행 버튼으로 바꿨어요. 별도의 수상한 실행 파일을 직접 열게 만드는 방식보다 경계심을 피하기 쉬워요.

Linux용 페이로드는 사용자 문서 경로에 2단계 스크립트를 저장하고 `nohup`으로 실행했어요. 이어 Node.js, 여러 npm 의존성, 심하게 난독화된 `parser.js`를 내려받아 백그라운드에서 구동했어요. 의존성에는 클립보드 접근과 파일 전송, 프로세스 제어, Ethereum 개발 도구가 포함됐어요. 다만 작성자는 최종 악성 목적을 확인하지 못했으므로 지갑 탈취나 채굴로 단정할 근거는 부족해요.

요청에 붙은 식별값을 바꾸자 다른 스크립트가 반환됐다는 관찰도 나왔어요. 피해자마다 다른 페이로드를 전달하거나 감염 대상을 구분했을 가능성이 있어요. 실제 추적 방식까지 확인된 것은 아니어서, 이 부분은 정황으로만 보는 게 맞아요.

낯선 채용 과제는 열기 전에 분리해서 검사해요

채용 담당자의 회사 이메일과 실제 재직 여부를 먼저 확인해요. 회사 공식 채용 페이지에 같은 공고가 있는지 보고, 과제 파일을 보낸 도메인도 비교해요. 높은 보수만으로 사기라고 볼 수는 없지만, 면담 전 고액 보수를 제시하고 이력서를 곧바로 승인한 뒤 압축 파일부터 보내면 검증 단계를 늘릴 이유가 충분해요.

압축을 푼 뒤에는 애플리케이션 코드보다 자동 실행 지점을 먼저 찾아보세요. `.git/hooks`, `.vscode`, 셸 초기화 파일, `package.json`의 scripts, `Makefile`, 컨테이너 시작 명령, 설치 스크립트를 확인하면 돼요. Git 훅의 실행 권한과 내용도 함께 보고, 외부 IP나 낯선 도메인에서 스크립트를 받아 셸로 바로 넘기는 명령이 있는지 살펴보세요.

처음 열 때는 개인 브라우저 프로필, SSH 키, 클라우드 자격 증명, 암호화폐 지갑이 없는 격리 환경을 쓰는 편이 좋아요. 네트워크를 끈 가상머신이나 일회용 컨테이너에서 정적 검사를 먼저 하고, 꼭 실행해야 한다면 네트워크 요청과 새 프로세스, 파일 변경을 기록해요. 의심되는 파일을 발견하면 실행하거나 공개 분석 서비스에 무심코 올리지 말고 회사 보안 담당자나 신뢰할 수 있는 침해 대응 창구에 전달해 주세요. 고객 코드나 비공개 과제가 섞였다면 외부 업로드가 계약을 어길 수도 있어요.

왜 중요한가요

개발자는 낯선 코드를 자주 내려받고 빌드 도구와 패키지 관리자를 실행해요. 공격자는 이 업무 습관을 이용해 커밋, 폴더 열기, 의존성 설치처럼 평범한 행동에 감염 단계를 숨길 수 있어요. 이번 사례에서는 코드 품질이나 패키지 이름보다 저장소 메타데이터와 에디터 설정이 더 중요한 단서였어요. 2

팀에서 과제형 면접을 운영한다면 지원자에게 ZIP 파일을 보내기보다 회사 소유 저장소와 검증 가능한 계정을 쓰는 편이 좋아요. 실행에 필요한 명령과 네트워크 접근 범위도 문서로 알려 주세요. 지원자가 과제의 출처를 확인할 수 있어야 공격자가 회사 이름을 빌려 쓰기 어려워져요.

지원자에게도 확인 기준이 필요해요. 저장소의 정상 코드가 많거나 커밋 이력이 오래됐다는 이유만으로 안전하다고 판단하면 안 돼요. 공개 프로젝트를 복제한 뒤 숨김 설정만 바꾸는 공격은 겉보기 신뢰도를 쉽게 만들어요. 첫 실행 전 자동 실행 지점, 외부 통신, 자격 증명 접근 가능성을 따로 검사해야 해요.

참고 자료

  1. 과제형 면접 프로젝트를 열어보니 조직적인 악성코드 작전이었다 — GeekNews
  2. I Inspected My Take-Home Interview Project. It Was a Whole Operation. — Appaji / CitizenDot
728x90