홈으로 돌아가기

Git의 악의적 병합: merge commit에 악성코드

이 기사는 Git의 악의적 병합을 통한 공격을 설명합니다: merge commit에 난독화된 코드 주입. 페이로드가 블록체인을 C2로 사용. 자동 저장소 스캔을 위한 Go 탐지기 제시.

악성 악의적 병합: 코드에 3.5개월
Advertisement 728x90

악성 머지: Git 머지 커밋에 숨겨진 악성 코드

프로젝트의 vite.config.js 파일에서 악성 난독화 코드가 발견되었습니다. 이 코드는 풀 리퀘스트(PR)에서 도입된 것이 아니라, 충돌 해결 과정에서 머지 커밋 내부에 직접 삽입되었습니다. GitHub의 PR 뷰는 기능 브랜치의 차이점만 표시하며, 머지 커밋 자체에서 이루어진 변경사항은 무시합니다. git log를 사용한 분석 결과, 동일한 부모 커밋을 가지지만 파일 내용이 변경된 머지 커밋이 발견되었습니다.

부모 커밋의 MD5 해시값이 일치했습니다:

  • 부모 1: aa82acb0c335430d8300b6cb306dc824 (정상)
  • 부모 2: aa82acb0c335430d8300b6cb306dc824 (정상)
  • 머지: 2a54754defae4d13aab39f256738dbbf (변경됨)

3-way 머지에서 Git은 부모 파일이 동일할 때 변경되지 않은 결과를 생성해야 합니다. 차이점이 있다면 머지 과정에서 수동 편집이 이루어졌음을 의미합니다.

Google AdInline article slot

주입 및 난독화 메커니즘

악성 페이로드는 서로 다른 모듈의 두 파일에 주입되었습니다. 기여자가 PR에서 머지 버튼을 클릭할 때 페이로드를 추가했습니다. 이 코드는 npm run devnpm run build 실행 중 3.5개월 동안 실행되었습니다.

난독화 기법에는 다음이 포함되었습니다:

  • 숫자 시드를 사용해 require, module, constructor 같은 문자열을 재구성
  • 정적 분석을 우회하기 위해 eval 대신 Function 사용
  • 문자 치환 테이블을 사용한 맞춤형 디코더

페이로드에는 URL이나 IP 주소가 포함되지 않았습니다. 대신 다음과 같은 작업을 수행했습니다:

Google AdInline article slot
  • TRON 지갑의 최신 거래 조회
  • BSC 거래 해시 추출
  • BSC 노드에 JSON-RPC eth_getTransactionByHash 호출
  • 거래의 input 필드에서 코드를 XOR 디코딩

TRON을 사용할 수 없는 경우 Aptos가 대체 수단으로 사용되었습니다. 실행은 detached: truestdio: 'ignore' 옵션을 가진 child_process.spawn을 사용했으며, 감시 모드 탐지를 방지하기 위해 30초 타이머가 설정되었습니다.

발견되지 않은 이유

  • GitHub는 PR에서 머지 커밋의 차이점을 표시하지 않습니다.
  • git log는 변경사항을 보여주지 않으며, git diff <parent1>..<merge>가 필요합니다.
  • 코드는 공백을 사용해 200번째 열 너머로 이동되었습니다.
  • SAST 도구는 시그니처 부족으로 실패했습니다: eval, URL, base64가 없었습니다.

이 기법은 악성 머지로 알려져 있습니다 — 어느 부모에도 존재하지 않는 변경사항을 도입하는 머지입니다(gitglossary(7)). Git 관리자가 2013년에 설명했지만, 탐지 도구는 거의 존재하지 않습니다.

악성 머지 탐지기: 자동화된 스캐너

Go로 작성된 탐지기는 예상되는 3-way 머지 결과(공통 조상을 통해)와 실제 머지 커밋을 비교합니다. 불일치는 수동 편집을 나타냅니다.

Google AdInline article slot

사용법:

evilmerge scan /path/to/repo

옵션:

  • --format=sarif GitHub 코드 스캐닝용
  • 심각도 수준: 충돌 없는 편집 대 수동 충돌 해결

통합:

  • GitHub 액션:

```yaml

- uses: fimskiy/Evil-merge-detector@v1

with:

fail-on: warning

```

  • GitHub 앱: PR 검사 및 과거 기록 스캔
  • GitLab, Bitbucket 및 자체 호스팅 설정용 템플릿(pre-receive 훅)

완화 조치 및 워크플로우 취약점

기여자 접근을 통한 공격: 합법적인 커밋 후 머지 중 주입. PR 자체는 깨끗하게 유지됩니다.

권장사항:

  • 선형 히스토리 사용(squash/rebase)
  • 서버에 pre-receive 훅 구현
  • GitHub: "오래된 리뷰 무시" 활성화하여 PR 브랜치 변경 시 재검토 요구

GitHub는 이 의도적인 설계임을 확인했으며, 향후 제한 가능성을 언급했습니다. 현재 조치는 탐지가 아닌 예방에 초점을 맞추고 있습니다.

핵심 요약

  • 악성 머지는 머지 커밋에서 수동 편집을 위한 공식 용어입니다.
  • 페이로드는 URL/IP 없이 블록체인(TRON/BSC/Aptos)을 사용해 명령 및 제어를 수행합니다.
  • Go 기반 탐지기는 히스토리를 스캔하고 CI/CD에 통합됩니다.
  • CI와 코드 리뷰가 있는 프로젝트에서 3.5개월간 탐지되지 않은 활동.
  • GitHub는 머지 워크플로우 변경에 대한 즉각적인 계획이 없습니다.

— Editorial Team

Advertisement 728x90

다음 읽기