HyperAI초신경
Back to Headlines

깃허브 '실수 커밋' 스캔해 2500만 원 상금 획득, 신규 오픈소스 도구 출시

2일 전

게스트 게시글: GitHub의 "실패 커밋"을 스캔하여 유출된 비밀을 찾아낸 방법 ◆ Truffle Security Co. 요약: GitHub Archive는 모든 공개 커밋을 기록하며, 개발자가 삭제하려고 시도한 커밋까지 포함합니다. 강제 푸시는 종종 기록을 리ライト하여 오타로 인해 유출된 자격 증명 등을 덮어쓰지만, GitHub는 이러한 잠정 커밋을 영구히 보관합니다. 이 글에서는 2020년 이후 모든 강제 푸시 이벤트를 스캔하여 유출된 비밀을 찾는 방법을 소개합니다. Truffle Security와 함께 이 과정을 오픈 소스화하여 조직의 GitHub 레포지토리에서 이러한 숨겨진 커밋을 스캔할 수 있는 새로운 도구를 출시했습니다. 저는 Sharon Brizinov입니다. 저의 주요 연구 분야는 IoT/OT 장치의 로우 레벨 취약점과 악용 방안이지만, 때때로 버그 바운티 사냥에도 참여합니다. 최근 저는 GitHub 레포지토리 내에 존재하는 잠정 블롭에서 숨겨진 비밀을 발견하는 방법을 다룬 블로그 포스트를 작성했으며, 이 포스트는 큰 관심을 받았습니다. Truffle Security의 CEO인 Dylan과 이 포스트를 통해 대화를 나누었고, 그는 저에게 대규모 비밀 사냥을 위한 새로운 방법들을 제안해주었습니다. 이 제안을 기반으로 저는 모든 삭제된 커밋을 접근할 수 있는 방법을 연구하고, 이를GitHub의 이벤트 API와 GitHub Archive 프로젝트를 활용하여 자동화했습니다. 삭제된 커밋이란? GitHub에서 커밋을 삭제한다는 것은 실제로 해당 커밋을 완전히 지우는 것이 아니라, 해당 브랜치에서의 참조를 제거하는 것을 의미합니다. 즉, git reset --hard HEAD~1 후 git push --force를 사용하면 커밋은 더 이상 정상적인 Git 네비게이션을 통해 접근할 수 없게 됩니다. 그러나 GitHub는 이러한 reflog를 보관하기 때문에, 커밋 해시를 알고 있다면 여전히 해당 커밋에 접근할 수 있습니다. 이를 증명하기 위해 제가 test-oops-commit 레포지토리를 사용한 예를 들어보겠습니다. 간단한 레포지토리 생성 (README.md 파일 하나만 포함) secret.txt 파일을 만들고, "my-password-is-iloveu"라는 비밀을 포함하여 커밋 및 푸시 git rev-list --all, git log 또는 GitHub 웹에서 확인하면, 새로운 커밋 9eedfa...가 추가된 것을 볼 수 있음 오타를 발견하고, 이전 커밋으로 HEAD를 이동하여 강제 푸시 (git reset --hard HEAD~1 후 git push --force) 로컬 레포지토리를 삭제하고 다시 클론하여 커밋 트리를 확인하면, 비밀이 삭제되었음을 확인 가능 그러나 GitHub 웹에서 커밋 해시를 사용하여 여전히 접근 가능 (9eedfa00983b7269a75d76ec5e008565c2eff2ef 또는 9eef) GitHub 이벤트 API GitHub 이벤트 API는 GitHub 내에서 발생하는 다양한 이벤트 정보를 검색할 수 있는 REST API의 일부입니다. 이 API를 활용하면 모든 GitHub 공개 레포지토리의 커밋 데이터를 모니터링하고 해시를 저장할 수 있습니다. 하지만 매 시간마다 수백만 건의 이벤트가 발생하므로, 과거 이벤트 데이터를 효과적으로 처리해야 합니다. 이때 GH Archive 프로젝트가 큰 도움이 됩니다. GH Archive는 GitHub의 이벤트 스트림을 청취하여 시스템적으로 아카이브하는 오픈 소스 프로젝트로, 2015년부터 현재까지의 모든 GitHub 공개 활동 데이터를 제공합니다. 강제 푸시로 인한 삭제된 커밋 찾기 강제 푸시 이벤트에서만 삭제된 커밋을 식별하기 위해, 커밋이 없는 푸시 이벤트(PushEvent Zero-Commit)를 찾습니다. 이러한 이벤트는 브랜치를 리셋하면서 HEAD를 이동시키는 강제 푸시를 나타냅니다. 예를 들어, 2015년 1월 1일 15시에 발생한 이벤트를 다운로드하고 검색하면, 커밋 배열이 비어 있는 이벤트를 발견할 수 있습니다. 그리고 "before" 커밋(HEAD 이동 전의 커밋)을 확인하면,GitHub가 10년 후에도 이 커밋을 보관하고 있음을 확인할 수 있습니다. 자동화 구축 우리는 모든 GitHub 이벤트 데이터를 가져오고, 모든 PushEvent Zero-Commit 이벤트를 검색하며, "삭제된" 커밋(이전 해시)을 가져와 TruffleHog를 사용하여 활성 비밀을 스캔할 수 있는 모든 요소를 갖추고 있습니다. 이 연구를 위해 Truffle Security와 함께 전체 GH Archive를 스캔하여 "Oops Commits"를 찾는 새로운 오픈 소스 도구를 출시했습니다. 이 도구는 Google Big Query 공용 데이터셋에서 GHArchive PushEvent 데이터를 스캔하여, 커밋을 가져오고 TruffleHog를 사용하여 비밀을 스캔합니다. 중요한 비밀 찾기 자동화 도구를 실행한 결과, 수천 개의 활성 비밀을 발견했습니다. 그러나 가장 중요한 비밀과 가장 영향력 있는 조직을 식별하기 위해 수작업 검사, 간단한 분류 도구, 그리고 AI를 활용하였습니다. 수작업 검사: 자동화 도구가 발견한 비밀은 잘 정리된 JSON 파일로 저장됩니다. 이를 직접 확인하며 일반 이메일 주소(gmail.com, outlook.com 등)로 커밋한 내용은 필터링하여 기업 이메일로 커밋한 내용에 집중했습니다. Vibe-Coded 분류 도구: Vercel v0를 이용해 비밀 검사를 확장할 수 있는 플랫폼을 구축했습니다. 이 플랫폼은 .zip 파일 형태로 스캐너가 생성한 JSON 파일을 받아, 쉽게 사용할 수 있는 표 형태로 제시하여 검사 과정을 효율화했습니다. AI 활용: 비밀 검사를 자동화하기 위해, 특히 버그 바운티나 영향력 있는 프로그램에 관련된 비밀을 식별하는데 AI를 활용하고자 합니다. 이를 위해 Moti Harmats와 함께 작업 중이며, 아직 완성되지 않았지만, 일부 예를 공개합니다. 사례 연구 - 대규모 공급망 해킹 방지 삭제된 커밋에서 발견한 GitHub Personal Access Token(PAT) 중 하나는 Istio 프로젝트의 모든 레포지토리에 대한 관리자 권한을 가지고 있었습니다. Istio는 마이크로서비스 아키텍처를 채택한 조직에서 널리 사용되는 오픈 소스 서비스 메시입니다. 이 비밀은 Istio의 환경 변수를 읽거나, 파이프라인을 변경하거나, 코드를 푸시하거나, 새로운 릴리스를 생성하거나, 심지어 전체 프로젝트를 삭제할 수 있는 권한을 제공했으므로, 대규모 공급망 공격의 잠재적 위험이 있었습니다. 닖�히도 Istio 팀은 문제를 신속히 해결하여 GitHub PAT를 회수했습니다. 결론 이 프로젝트는 매우 재미있었습니다. 알려진 발견을 결합하여 안전하게 삭제된 것이라고 생각했던 수천 개의 활성 비밀을 찾아내는 신뢰할 수 있는 자동화 시스템을 구축하였습니다. 또한, 이 과정에서 비밀을 찾아내는 플랫폼을 구축하여, 버그 바운티와 감사 과정에서 약 25,000달러의 보상을 얻었습니다. 커밋을 삭제한다고 해서 안전하다고 생각해서는 안 됩니다. 한 번 커밋된 비밀은 이미 유출된 것으로 간주되어 즉시 회수해야 합니다. 이는 git 블롭, git 커밋, 그리고 온라인에 업로드된 모든 정보에 해당합니다. 업계 전문가들에 따르면, 이 연구는 GitHub 사용자들이 커밋을 삭제할 때도 비밀이 유출될 수 있다는 인식을 제고하는 데 크게 기여할 것입니다. Truffle Security는 이러한 유출을 방지하는 데 도움이 되는 도구와 서비스를 제공하며, 앞으로도 계속 발전시켜 나갈 계획입니다.

Related Links