291 Intercept: 당사 인프라에서 노출된 Git 저장소 탐색이 두 배 이상 증가
10월 19일 주간, 당사의 인터넷에 노출된 인프라에서 방치된 소스 코드 저장소를 탐색한 출처 수가 직전 2주 주간 평균보다 137% 증가했습니다. 하위 폴더의 .env 파일, 클라우드 키 파일, 백업을 찾는 스캐너도 늘었습니다.
291 Intercept를 소개합니다
291 Intercept는 291 Group이 새로 선보이는 주간 시리즈입니다. 온라인에 있는 모든 조직과 마찬가지로, 당사의 인터넷에 노출된 인프라도 열린 채 방치된 문을 찾는 자동화 스캐너의 탐색을 매일 받습니다. 노출된 비밀번호 파일, 잊힌 백업, 패치되지 않은 관리자 페이지 같은 것들입니다. 각 호에서는 한 주 동안 이러한 스캐너가 당사 인프라에서 무엇을 노렸는지 보고합니다. 다른 시스템 관리자와 기업이 자사 시스템에서 같은 항목을 점검할 수 있도록 하기 위해서입니다.
매주 다루는 내용은 당사 인프라에서 눈에 띈 패턴과 전주 대비 변화, 트래픽의 출처, 그리고 각자의 서버에서 점검할 항목을 담은 짧은 목록입니다. 모든 데이터는 집계된 형태로 제공합니다. 개별 주소나 시스템은 절대 밝히지 않으며, 여러 개별 출처에서 관찰된 패턴만 포함합니다. 각 호는 게시일 기준으로 최소 7일 전에 끝난 주를 다룹니다.
10월 19일부터 25일까지 약 240개 출처가 웹 서버에 남아 있는 소스 코드 저장소를 찾기 위해 당사의 인터넷에 노출된 인프라를 탐색했습니다. 직전 2주 주간 평균보다 137% 많은 수치입니다. 이들은 /.git/config, /.git/index, /.svn/entries 같은 파일을 요청했습니다. 이번 주 당사 인프라에서 소스 코드보다 많은 스캐너가 몰린 대상은 WordPress뿐이었습니다.
같은 시기에 당사 사이트를 겨냥한 관련 탐색도 늘었습니다. 클라우드 키 파일을 찾는 출처는 51%, 백업과 데이터베이스 덤프를 요청하는 출처는 75% 증가했습니다. 이전에는 관심이 훨씬 적었던 하위 폴더의 .env 파일들을 집중적으로 노리는 스캐너도 확인되었습니다. 이 대상들은 어느 것도 소프트웨어 버그가 아닙니다. 모두 누군가 공개 서버에서 내리는 것을 잊은 파일입니다.
이번 주 요약
고유 출처는 약 660개로, 같은 기준선 대비 28% 증가했습니다. 가장 많은 출처가 몰린 대상은 WordPress 로그인, XML-RPC, 플러그인 경로로 전체 출처의 56%를 차지했습니다. 비밀 정보 및 설정 파일은 32%였습니다. /info.php 같은 진단 페이지를 찾는 출처는 33%, /actuator/env 같은 애플리케이션 내부를 탐색하는 출처는 37% 증가했습니다.
당사에 도달한 출처 중 88%는 일반 브라우저로 위장한 user-agent 문자열을 사용했고, 64%는 임대 서버에서 접속했습니다. 출처가 가장 많은 국가는 미국, 독일, 네덜란드, 싱가포르, 인도 순이었습니다.
노출된 .git 폴더가 사이트를 드러내는 방식
대부분의 소프트웨어 팀은 Git으로 코드 변경 사항을 관리하며, 모든 Git 프로젝트는 숨겨진 .git 폴더에 이력을 보관합니다. 프로젝트 폴더 전체를 웹 서버에 복사하는 방식으로 사이트를 배포하면 이 숨김 폴더까지 함께 복사될 수 있고, 그러면 해당 파일을 요청하는 누구나 내용을 읽을 수 있습니다.
/.git/config는 당사의 인터넷에 노출된 인프라에 가장 많이 요청된 소스 코드 경로 중 하나였습니다. 이 파일에는 코드를 가져온 저장소가 기록되어 있으며, 배포에 사용한 자격 증명이 들어 있는 경우도 있습니다. 스캐너들은 /.git/head, /.git/logs/head, /.git/index도 요청했는데, 이 파일들을 보면 더 깊이 파고들 수 있을 만큼 폴더를 읽을 수 있는지 알 수 있습니다. 폴더가 노출되어 있으면 공격자가 전체 소스 코드와 커밋 이력을 복원할 수 있는 경우도 있습니다.
이는 흔한 실수입니다. 2026년 2월에 보도된 한 연구는 Git 메타데이터를 노출한 공개 웹 서버 약 4.96백만 대를 찾아냈습니다. 그중 252,733대에서는 config 파일에 배포 자격 증명이 들어 있었으며, 같은 보고서는 이것이 저장소 탈취와 공급망 공격으로 이어질 수 있다고 경고합니다.
예상치 못한 폴더 속 비밀 정보
스캐너들은 당사 사이트의 루트에서 /.env를 요청했지만, 이번 주에는 하위 폴더를 뒤지는 경우도 많았습니다. /mailer/.env는 40개 출처가 요청해 이전 평균의 7.8배를 기록했습니다. /live/.env, /mail/.env, /v3/.env, /sitemaps/.env, /releases/.env, /exapi/.env도 각각 40개 출처가 요청해 이전 평균의 약 6~7배에 달했습니다. 당사에서 처음 관측된 경로도 4개 있었으며, 각각 약 10개 출처가 요청했습니다. /core/database/.env, /.changeset/config.json, /secrets, /settings/credentials입니다.
공격자 입장에서 이 파일들은 공들일 가치가 있습니다. 웹 앱은 API 키, 데이터베이스 비밀번호, 클라우드 액세스 키를 .env 파일에 보관합니다. 2026년 4월 한 대량 스캐너를 조사한 결과, 침해된 900개 이상 기업에서 .env 파일을 수집한 사실이 드러났으며, 2026년 4월 10일부터 21일 사이에 수집된 고유 .env 파일명은 30,000개가 넘었습니다. 탈취된 비밀 정보는 AI, 클라우드, 결제, 메시징 서비스 전반에 걸쳐 있었습니다.
클라우드 자격 증명에서도 같은 패턴이 나타났습니다. /application_default_credentials.json은 40개 출처가 요청해 이전 평균의 6.2배를 기록했습니다. 스캐너들은 /service-account.json과 /.config/gcloud/application_default_credentials.json도 요청했습니다. 이 파일은 클라우드 명령줄 도구로 로그인할 때 생성되며, 제공업체의 공식 가이드에 따르면 암호화되지 않은 상태로 저장되고, 이 파일을 가진 사람은 누구나 액세스 토큰을 무기한 요청할 수 있습니다. 사본이 웹 루트에 들어가 있다면, 이를 찾아낸 공격자는 해당 자격 증명이 폐기될 때까지 접근 권한을 유지합니다.
한 번의 스윕, 여러 개의 표적
여러 조직적인 출처 집단이 같은 목록을 당사의 인터넷에 노출된 인프라에 대해 실행했습니다. 그중 한 집단에서는 7개국의 20개 출처가 /.git/config, /.env, /info.php, /config.json, /actuator/env, /server-status를 포함한 동일한 8개 경로를 요청했습니다. 대부분은 서로 60시간 이내에 탐색을 시작했습니다. 각각 약 10개 출처로 이루어진 더 작은 두 집단은 210개와 158개 경로로 구성된 훨씬 긴 목록을 사용했습니다. 두 목록 모두 /.git/config, /.env.old와 /.env.development 같은 .env 변형, 그리고 클라우드 키 파일을 포함하고 있었습니다.
/actuator/env 경로도 같은 계열에 속합니다. Java 앱의 Spring Boot Actuator 엔드포인트에 로그인 없이 접근할 수 있으면 앱의 환경 변수와 설정이 그대로 반환되며, 여기에는 데이터베이스 자격 증명과 클라우드 키가 포함될 수 있습니다. 방치된 phpinfo 페이지 역시 환경 변수를 노출할 수 있으며, 당사 인프라에서 /admin/phpinfo.php 요청은 이전 평균의 5.9배로 늘었습니다. 실제 사례로, 한 WordPress 플러그인은 누구나 열 수 있는 phpinfo.php를 포함한 채 배포되었습니다.
당사 사이트에서는 WordPress를 겨냥한 별도 캠페인도 관찰되었습니다. 7개국의 20개 출처가 /xmlrpc.php와 함께 /blog/wp-includes/wlwmanifest.xml, /wordpress/wp-includes/wlwmanifest.xml처럼 추측한 폴더 아래의 wlwmanifest.xml 사본을 요청했습니다. 같은 파일을 여러 폴더 이름으로 요청하면 사이트가 WordPress를 사용하는지, 사용한다면 어느 위치에서 실행하는지 빠르게 파악할 수 있습니다. 공격자는 XML-RPC를 이용해 단 한 번의 요청으로 수백에서 수천 개의 비밀번호를 시도할 수 있습니다.
이번 주 조치 사항
- 외부에서 확인하세요. 자사 네트워크가 아닌 곳에서 각 사이트의
/.git/config와/.env를 요청해 보세요. 둘 중 하나라도 실제 내용이 반환된다면 이미 누군가 읽었다고 가정해야 합니다. - 작업 폴더가 아닌 빌드 결과물을 배포하세요. 사이트에 필요한 파일만 배포하고, .git, .env 및 기타 숨김 파일에 대한 웹 접근을 차단하세요.
- 유출된 자격 증명은 모두 교체하세요. .git이나 .env 파일을 읽을 수 있는 상태였다면 그 안에 들어 있던 자격 증명과 키를 변경하세요. 파일을 삭제해도 누군가 이미 만들어 둔 사본은 되돌릴 수 없습니다.
- 비밀 정보는 웹 루트 밖에 두세요. .env와 클라우드 자격 증명 파일은 공개되는 폴더 밖에 보관하세요. 자격 증명 파일이 한 번이라도 노출된 적이 있다면 폐기하세요.
- 남은 파일을 정리하세요.
/wp-config.php.bak,/database.sql같은 백업을 삭제하고, phpinfo 페이지와 디버그 페이지를 제거하세요. - 관리 엔드포인트를 닫으세요. Actuator 엔드포인트는 인증 뒤에 두고, XML-RPC를 사용하지 않는 WordPress 사이트에서는 XML-RPC를 비활성화하세요.
관측 데이터 안내
이 보고서는 291 Group의 보안 모니터링 시스템인 291 Heat Seeker One이 생성하며, 이 시스템은 당사 독자 보안 운영 플랫폼인 291 Crossband에서 실행됩니다. 보고서는 291 Group 자체의 인터넷에 노출된 인프라로 향한 트래픽만 다룹니다.
수치는 반올림한 값입니다. 비율과 증감은 요청 수가 아닌 개별 출처 수를 기준으로 산출했으며, 최소 20개의 개별 출처에서 관찰된 패턴만 포함했습니다.