카네기 멜런 대학교의 새 프리프린트는 서명 키 없이도 동일한 트리와 메타데이터, 유효한 서명, 그리고 GitHub의 "Verified" 배지를 가진 서로 다른 GitHub 커밋을 만들어낼 수 있다고 주장한다.
Git은 모든 객체를 그 내용의 해시로 식별하며, 커밋의 경우 그 해시는 트리, 메타데이터, 메시지, 그리고 모든 서명의 원시 바이트를 포함합니다. 공급망 도구의 상당수는 그 해시를 특정한 서명된 콘텐츠를 가리키는 고유하고 불변의 이름으로 취급합니다. 지속적 통합 파이프라인은 그것에 고정하고, 의존성 관리자는 그것에 잠그며, 사고 대응 담당자는 그것으로 차단하거나 되돌립니다.
카네기 멜런 대학교의 Jacob Ginesin이 작성한 새로운 프리프린트는 이러한 가정이 깨진다고 주장합니다. 논문에 따르면, 어떤 서명된 커밋이 주어지더라도 서명 키를 갖고 있지 않은 공격자가 동일한 트리, 동일한 메타데이터, 유효한 서명, 그리고 GitHub 같은 포지에서의 "Verified" 배지를 가진 두 번째의 서로 다른 커밋을 만들어낼 수 있습니다. 바뀌는 것은 커밋 해시뿐입니다. 각 커밋은 부모를 해시로 가리키기 때문에 이 변화는 체인 아래로 연쇄적으로 퍼지며, 저자는 이를 "해시 체인 가변성"이라고 부릅니다.
이 메커니즘은 깨진 해시 함수가 아니라 서명 가변성입니다. 논문은 하나의 해시를 서로 다른 두 콘텐츠가 공유하는 사례를 보이지 않는다고 명확히 밝히므로, 이 발견은 Git이 이동 중인 SHA-1의 충돌 저항성이나 SHA-256 마이그레이션과는 무관합니다. 대신, 하나의 논리적 커밋은 바이트 수준에서는 서로 다르지만 똑같이 유효한 많은 서명된 직렬화를 허용하며, 각각은 서로 다른 값으로 해시됩니다.
논문은 세 가지 경로를 설명하며, 이를 합치면 GitHub가 검증하는 모든 GPG 기반 방식이 포괄됩니다. ECDSA의 경우, 서명 를 똑같이 유효한 로 바꾸는 고전적인 대수적 대칭성을 사용합니다. 이 기법에 강한 RSA와 EdDSA의 경우에는 OpenPGP 서명 패킷의 해시되지 않은 영역에, 형식은 올바르지만 무시되는 서브패킷을 추가하는데, RFC 4880은 이 영역이 서명으로 보호되지 않는다고 규정합니다. S/MIME의 경우에는 CMS 구조 내부의 길이 필드를 비정규 형식으로 다시 인코딩하는데, 이는 엄격한 DER에서는 유효하지 않지만 여전히 BER로는 받아들여집니다.
논문에 따르면, 이것들이 로컬한 흥밋거리에서 공급망 우려로 바뀌는 이유는 GitHub의 서버 측 동작입니다. 연구에 따르면 GitHub는 검증 전에 서명 컨테이너를 정규화하지 않기 때문에 ECDSA 반전, OpenPGP 서브패킷 삽입, 그리고 비정규 S/MIME 인코딩을 받아들이고, 그 결과로 생긴 각 커밋에 대해 커밋 해시를 키로 하는 고유하고 지속적인 "Verified" 기록을 발급합니다. GitHub 자체 문서도 그 기반 기능을 확인합니다. 즉, 커밋은 나중에 서명 키가 폐기되거나 만료되더라도, 검증 시점에 생성된 기록에 따라 검증 상태를 유지합니다. 논문은 엄격한 로컬 검증은 더 혼재되어 있다고 지적합니다. 이에 따르면 git verify-commit은 두 가지 OpenPGP 경로는 받아들이지만, GitHub는 받아들이는 비정규 S/MIME 인코딩은 거부합니다.
International Cyber Digest
출처 중심의 사이버 뉴스, OSINT 메모, 침해 업데이트, 그리고 분석을 구독하세요. 증거나 제보가 있나요? ICD로 보내주세요.
ICD 뉴스레터 받기: 사이버 뉴스, OSINT 메모, 출처, 그리고 분석.
성공
좋습니다! 받은편지함을 확인하고 링크를 클릭하세요
오류
유효한 이메일 주소를 입력해 주세요!