최종 업데이트 07:57
소개 검색
SEOUL AI PRESS

AI와 기술을, 사실부터

강좌 강좌

커밋 해시 입문: 검토한 코드 한 순간을 지정하는 식별값

커밋 해시는 코드를 모아 두는 저장소에서 한 순간의 코드를 지정하는 긴 문자열입니다. AI 코딩 도구에서 보고된 보안 결함은 이 값을 적어 두기만 하고 '대조하지 않을 때' 무슨 일이 생기는지 보여 줍니다.

한 문장으로 이해하기

커밋 해시는 코드의 정확한 스냅샷을 식별하는 긴 문자열입니다. 스냅샷은 사진처럼 한순간을 그대로 떠낸 상태를 뜻합니다. 이 강좌에서는 ‘지문’이라는 비유를 쓰지만, 이는 이해를 돕기 위한 비유일 뿐이며 정확히는 ‘식별값’입니다. 식별값이 있다는 것과 받은 코드를 그 값과 대조하는 절차가 있다는 것은 다른 이야기입니다.

이 강좌를 마치면 세 가지를 할 수 있습니다. 첫째, 커밋 해시가 무엇을 식별하는지 자기 말로 설명하기. 둘째, 지정한 코드를 받았는지 확인하려면 어떤 절차가 필요한지 단계로 나누어 말하기. 셋째, 해시 지정과 실제 코드 대조를 구분하고 보고된 브랜치 수법의 적용 조건과 한계를 설명하기. 사전지식은 따로 없으며, 필요한 말은 나올 때마다 풀어서 설명합니다.

용어를 몇 개 먼저 풀어 둡니다. 저장소는 플러그인 코드를 받아 오는 보관 장소입니다. 호스트는 그런 저장소를 제공하는 서비스를 뜻합니다. 자료에서 커밋 해시를 가리킬 때 SHA라는 표기도 함께 쓰이며, 이 강좌에서 SHA는 커밋 해시와 같은 것을 가리키는 표기로만 이해하면 됩니다. AI 코딩 에이전트는 이 사례에서 플러그인을 저장소에서 받아 설치하는 AI 코딩 도구를 뜻합니다. 플러그인(또는 스킬)은 그런 도구에 기능을 더해 주는 확장 단위입니다. 마켓플레이스는 확장 기능을 모아 두고 사용자가 골라 설치하게 하는 장터입니다.

왜 필요한가

필요성은 실제로 쓰인 방식에서 바로 드러납니다. 입력 자료에 따르면 AI 코딩 도구의 마켓플레이스는 검토한 플러그인 버전을 하나의 커밋 해시로 고정합니다. 여러 상태 중에서 ‘검토를 거친 그 스냅샷’을 지정하기 위해 커밋 해시를 쓰는 것입니다.

여기서 주의할 점이 있습니다. 마켓플레이스가 한 버전을 검토해 해시로 적어 두었다는 사실이, 그 코드에 문제가 없다는 보증은 아닙니다. 해시가 하는 일은 ‘어떤 코드를 쓸지 지정하는 것’까지입니다. 나머지는 그 지정이 실제로 지켜졌는지 대조하는 절차에 달려 있습니다.

어떻게 이루어지는가

아래는 모든 도구가 실제로 이렇게 한다는 설명이 아닙니다. 입력 자료에서 드러난, 지정한 코드를 제대로 받았는지 확인하려면 필요한 절차를 단계로 정리한 것입니다. 특히 마지막 단계는 정상적으로 수행된 사실이 아니라, 입력 자료가 누락됐다고 지적한 검증 단계입니다.

  1. 마켓플레이스가 검토한 플러그인 스냅샷을 가리키도록 그 커밋 해시를 기록해 둡니다.
  2. 사용자가 플러그인을 설치하면, 도구가 저장소에 그 해시 값을 요청합니다.
  3. 저장소가 요청에 해당하는 코드를 내려 줍니다.
  4. 도구가 실제로 받은 코드를 요청한 해시와 대조해 일치하는지 확인합니다.

영향을 받은 에이전트에서 빠진 것이 바로 이 마지막 대조 단계입니다. 보안 기업 에어는 네 종류의 AI 코딩 에이전트가 요청한 스냅샷을 가져온 뒤 실제로 받은 코드가 지정된 해시와 일치하는지 확인하지 않았다고 밝혔습니다. 4단계가 빠지면 1단계의 지정은 이름만 남습니다.

하나의 예시로 따라가기

가상 예시로 따라가 봅니다. ‘표 정리 도우미’라는 플러그인이 있고, 마켓플레이스가 검토한 스냅샷을 가리키도록 그 커밋 해시를 기록해 두었다고 합시다. 이름은 가상이지만 작동 구조는 입력 자료가 설명한 그대로입니다.

1단계는 그대로 진행됩니다. 문제는 저장소 소유자가 악의를 가질 때 생깁니다. 브랜치는 저장소에서 이름이 붙은 코드의 흐름입니다. 커밋 해시처럼 보이는 브랜치 이름을 허용하는 호스트에서는, 소유자가 기록된 해시와 똑같이 생긴 이름의 브랜치를 만들고 그 이름이 다른 코드를 가리키게 할 수 있습니다.

그러면 2단계에서 도구가 해시 값을 요청할 때, 같은 이름의 브랜치가 그 요청에 응답할 수 있습니다. 오픈AI는 공개한 수정 설명에서, 저장소를 다루는 프로그램인 깃이 요청된 커밋 SHA를 브랜치 이름으로 해석해 고정한 것과 다른 커밋을 가져올 수 있었다고 밝혔습니다. 3단계에서 다른 코드가 내려오고, 4단계 대조가 없으므로 도구는 그 코드를 설치한 뒤에도 지정된 버전을 쓰고 있다고 봅니다.

결과가 가벼운 문제가 아닌 이유가 있습니다. 에어에 따르면 바꿔치기된 플러그인 코드는 사용자의 파일, 저장된 인증 정보, 그리고 사용자가 접속할 수 있는 시스템에 접근할 수 있습니다. 또 배경 자동 업데이트가 켜져 있으면 이미 설치해 쓰던 플러그인이 사용자 동작 없이 교체될 수 있습니다.

언제 쓰고 언제 쓰지 않는가

먼저 오해를 정리합니다. 해시를 적어 두는 것 자체로는 요청한 코드가 실제로 설치됐는지 알 수 없습니다. 대조 절차는 받은 코드가 지정한 스냅샷과 같은지 확인하는 데 필요합니다. 이 확인이 통과해도 그것은 지정이 지켜졌다는 뜻이며, 그 코드 자체가 안전하다는 뜻은 아닙니다. 입력 자료는 이 확인이 마켓플레이스가 아니라 사용자 컴퓨터의 에이전트에서 수행되므로, 수정이 에이전트 자체에 적용돼야 한다고 설명합니다.

적용 조건도 좁게 보아야 합니다. 저장소 호스트인 깃허브는 커밋 해시처럼 보이는 브랜치 이름을 허용하지 않으므로, 해시 모양 브랜치를 이용하는 이 수법은 깃허브 저장소에서 작동하지 않습니다. 에어는 그런 이름을 허용하는 비트버킷이나 직접 운영하는 저장소 서버에서는 작동한다고 밝혔습니다. 다만 깃허브 저장소라는 사실이 전체 면제를 뜻하지는 않습니다. 제미나이의 명령줄 도구, 즉 글자 명령으로 쓰는 형태의 도구에는 기본 브랜치 이름을 FETCH_HEAD로 지정하는 별도 수법이 보고됐습니다. 차단되는 것은 특정 수법이지, 결함 전체가 아닙니다.

정리하면 커밋 해시는 어떤 코드를 쓸지 지정하는 수단으로 쓰고, 대조 없이도 지정이 지켜졌다는 보증으로 쓰지 않는 것이 정확한 사용법입니다.

핵심 정리와 확인문제

커밋 해시는 코드의 특정 스냅샷을 지정하는 식별값이며, 받은 것과 대조하는 절차가 없으면 지정한 코드가 실제로 쓰인다는 보장이 없습니다. 제품별 수정 상태는 9월 18일 기준으로 읽어야 합니다. 더해이커뉴스와 시큐리티위크의 설명에 따르면 클로드 코드와 코덱스에는 수정이 배포됐지만 코파일럿에는 수정이 없었고, 제미나이 명령줄 도구의 해당 결함은 수정되지 않을 예정이었습니다. 즉 이 기준일에 네 도구의 문제가 모두 해결된 상태는 아니었습니다. 더해이커뉴스는 같은 날 기준 실제 공격에 이용됐다는 징후가 없다고 보도했습니다.

  1. 커밋 해시가 식별하는 것은 무엇입니까?

  2. 해시로 버전을 지정했는데도 다른 코드가 설치될 수 있었던 이유는 무엇입니까?

  3. 깃허브가 차단하는 것은 어떤 수법입니까?

  4. 정답은 코드의 정확한 스냅샷입니다. 해설하면, 입력 자료는 커밋 해시를 코드의 정확한 스냅샷을 식별하는 긴 문자열로 설명하며, 마켓플레이스는 검토한 버전을 이 값으로 고정했습니다.

  5. 정답은 도구가 실제로 받은 코드를 요청한 해시와 대조하지 않았기 때문입니다. 해설하면, 같은 이름의 브랜치가 요청에 응답해 다른 커밋이 내려올 수 있었고, 대조 절차가 없어 그 코드가 지정된 버전처럼 쓰였습니다.

  6. 정답은 커밋 해시처럼 보이는 브랜치 이름을 만드는 수법입니다. 해설하면, 깃허브는 그런 이름을 허용하지 않아 이 수법이 통하지 않습니다. 그러나 제미나이의 명령줄 도구에는 기본 브랜치 이름을 FETCH_HEAD로 지정하는 별도 수법이 보고됐으므로, 깃허브 저장소라는 이유만으로 안전하다고 단정할 수 없습니다.

참고자료