메뉴
gitmoru
한국어

덮어써도 원래 커밋은 남아 있어요

브랜치는 포스트잇이에요

브랜치는 커밋 더미 어딘가에 붙어서 "여기가 최신" 이라고 가리킬 뿐이에요.

공격자가 강제로 덮어쓴 건 커밋을 지운 게 아니라 포스트잇을 다른 데로 옮긴 겁니다. 원래 커밋은 그대로 있고, 주소를 잃어버렸을 뿐이에요.

그런데 GitHub 은 푸시가 들어올 때마다 옮기기 직전에 어디를 가리켰는지 적어둡니다.

GitHub 활동 기록
before:  7f3a91c   <- 잃어버린 주소
head:    9d2b04e

되돌리기도 여기서 나와요. 포스트잇을 원래 자리에 도로 붙이면 됩니다.

순서

  1. 01

    시간대 안의 활동을 모아요

    푸시로 대상을 좁히고, 비공개였다가 공개로 바뀐 저장소도 같이 봐요. 그건 푸시가 하나도 없어도 일어나거든요.

  2. 02

    공격 직전 트리와 지금 트리를 맞대요

    어떤 파일이 생기고, 바뀌고, 사라졌는지 나옵니다.

  3. 03

    바뀐 파일을 전부 모아요

    여기가 결과물이에요. 규칙과 무관하게 다 남습니다.

  4. 04

    먼저 볼 것에 형광펜을 칩니다

    판정이 아니라 순서예요.

  5. 05

    사람이나 AI 가 읽고 판단해요

    이 도구는 여기까지 안 옵니다.

한계도 여기서 나와요

GitHub 활동 기록은 90일, 300건까지만 남습니다. 그 밖으로 밀려나면 주소를 못 찾아요.

그래서 사고가 나면 빨리 봐야 하고, 도구도 이걸 화면에서 말해줍니다. 훑은 기록을 파일로 남기는 것도 같은 이유예요.

공격 직전 파일과 지금 파일을 좌우로 비교하는 화면

먼저 볼 것을 고르는 방식

전부 실제로 당한 공격에서 나왔어요. 여기 안 걸렸다고 괜찮다는 뜻이 아닙니다.

  • 크기 급증

    설정 파일 뒤에 공백을 길게 넣고 그 뒤에 코드를 숨기는 수법이 있어요. 이름은 그대로라 눈에 안 띄는데 크기는 정직하게 늘어납니다.

  • 저장소 간 같은 파일

    도구로 여러 저장소를 덮어쓰면 완전히 같은 내용이 여기저기 들어가요. 내용의 해시가 같으면 같은 파일입니다.

  • 커밋 위조

    author 이름과 날짜는 바꿀 수 있어요. 그런데 committer 날짜는 실제로 커밋이 만들어진 시각이라 어긋난 자국이 남습니다.

  • 도구 흔적

    자동화 도구는 작업용 임시 파일을 만들고, 그게 커밋에 안 섞이게 .gitignore 에 적어둬요. 그 줄이 그대로 지문입니다.

  • 서명이 끊김

    서명하던 브랜치에서 서명이 빠졌는지 봐요. 원래 서명을 안 쓰던 곳에서는 안 뜹니다. 하던 걸 안 하게 된 것만 사실이에요.

  • 액션 고정 풀림

    uses 가 커밋 해시에서 태그로 바뀌면 남이 그 태그를 옮길 수 있게 돼요. 2025년에 널리 쓰이던 액션 하나가 그렇게 털렸습니다.

  • 워크플로가 연 문

    남의 PR 코드가 비밀을 들고 돌게 됐는지, PR 제목이 명령이 될 수 있게 됐는지 봐요. 이번 푸시로 생긴 것만요.

켜보기 →