.env 파일과 디버그 로그가 공개 인터넷에서 접근 가능한 상태로 방치된 결과, 669개 업체로부터 1,033개의 활성 상태인 Stripe 비밀 키가 유출되었습니다. 이 키를 이용하면 누구나 결제를 생성하고, 인보이스를 조회하며, 고객 정보를 탈취할 수 있습니다. 이는 단 몇 분 만에 자금을 고갈시키고 기업의 평판을 실추시킬 수 있는 심각한 침해 사고입니다.

유출의 원인

개발자들은 데이터베이스 비밀번호, API 토큰, Stripe 비밀 키와 같은 설정 데이터를 .env라는 파일에 정기적으로 저장합니다. 이 파일은 소스 코드와 함께 존재하며, 코드베이스에 비밀 정보를 남기지 않기 위해 런타임 시에 읽힙니다. 이 방식은 서버가 점(.)으로 시작하는 파일을 절대 제공하지 않을 때만 유효합니다. 이번 사례에서는 설정이 잘못된 웹 서버(Nginx 및 Apache 모두)가 “/.env”, “/.env.example”, “/.git/HEAD” 및 커스텀 “/debug” 엔드포인트에 대한 요청을 허용하여, 200 OK 상태와 함께 원본 파일을 그대로 반환했습니다.

이번 유출은 Stripe 플랫폼의 취약점이나 특정 이커머스 플러그인의 결함으로 인해 발생한 것이 아닙니다. 이는 세상에 공개되어서는 안 될 파일들이 그대로 노출된 결과였습니다.

노출이 위험한 이유

Stripe 비밀 키는 사실상 가맹점 결제 시스템의 마스터 비밀번호와 같습니다. 키를 보유한 사람은 누구나 다음을 수행할 수 있습니다:

  • 저장된 카드로 임의의 결제 생성
  • 인보이스 및 정산 내역 조회
  • 개인 정보(이름, 이메일, 전화번호, 집 주소, IP 주소) 탈취
  • 무료 또는 할인 구매를 위한 프로모션 코드 사용

유출된 데이터 세트에는 위 항목뿐만 아니라 각 업체가 얼마나 벌었는지 보여주는 정산 세부 정보도 포함되었습니다. 기업 입장에서 즉각적인 위험은 차지백(chargeback)을 유발하는 사기 거래, 고객 신뢰 상실, 그리고 PCI-DSS, GDPR 또는 기타 데이터 프라이버시 규정에 따른 잠재적 벌금입니다. 장기적인 비용은 훨씬 더 클 수 있습니다: 법적 비용, 복구 비용, 그리고 다시 회복하기 어려울 수 있는 브랜드 이미지 훼손.

빠른 테스트: .env가 노출되어 있나요?

터미널을 열고 yourdomain.com을 실제 호스트 이름으로 바꿉니다:

for p in "/.env" "/.env.example" "/.git/HEAD" "/debug"; do
  echo -n "$p -> "
  curl -s -o /dev/null -w "%{http_code}\n" "https://yourdomain.com$p"
done

모든 라인은 403(Forbidden) 또는 404(Not Found)를 반환해야 합니다. 200 응답이 나온다면 해당 파일이 공개적으로 읽기 가능한 상태임을 의미하며, 이는 즉각적인 조치가 필요한 심각한 보안 사고입니다.

즉각적인 조치 단계

1. 웹 서버에서 점(dot) 파일 차단

  • Nginx – 점(.)으로 시작하는 파일에 대한 모든 요청을 거부하는 location 블록을 추가합니다.
  • Apache.htaccess에서 FilesMatch 지시어를 사용하여 점(.)으로 시작하는 파일에 대해 403을 반환하도록 설정합니다.

2. Docker 워크플로우 강화

  • .env.dockerignore에 추가하여 파일이 이미지로 복사되지 않도록 합니다.
  • 비밀 정보가 포함된 파일에 대해서는 COPY 명령 사용을 피하십시오.

3. 유출된 모든 키 교체(Rotation)

  • Stripe 대시보드 로그인 → Developers → API keys로 이동합니다.
  • 새 비밀 키를 생성하고 기존 키를 즉시 폐기하십시오.

4. 최소 권한 키 사용

  • 모든 작업에 단일 비밀 키를 사용하는 것을 중단하십시오.
  • 필요한 작업만 허용하는 제한된 키(restricted keys)를 생성하십시오. 예: 결제 서비스는 결제 의도(payment intents)를 생성할 권한은 필요하지만, 환불을 발행하거나 정산 내역을 볼 권한은 필요하지 않을 수 있습니다.

5. 기존 키의 모든 복사본 제거

  • CI/CD 로그, 빌드 아티팩트 및 백업 아카이브를 스캔합니다.
  • Git 히스토리를 대상으로 Gitleaks 또는 TruffleHog와 같은 비밀 정보 스캔 도구를 실행합니다.

유출된 키는 서버에서 파일을 삭제한다고 해서 사라지지 않습니다. 키를 다운로드한 사람의 손에 영원히 남게 됩니다. 키를 교체하는 것만이 탈취된 데이터를 무용지물로 만드는 유일한 방법입니다.

해결책 그 이상: 더 안전한 파이프라인 구축

  • 자동 스캔 – 모든 풀 리퀘스트(PR)와 CI 작업에 비밀 정보 탐지 기능을 통합합니다.
  • 설정 관리 – 비밀 정보를 정적 파일에 의존하는 대신 전용 볼트(예: HashiCorp Vault, AWS Secrets Manager)에 저장하고 런타임 시에 주입합니다.
  • 액세스 검토 – 어떤 Stripe 키가 활성화되어 있는지, 어떤 권한을 가지고 있는지 정기적으로 감사합니다.

이러한 관행은 단 하나의 설정 오류가 전체 결제 인프라를 노출시킬 위험을 줄여줍니다.

향후 주목해야 할 사항

보안 커뮤니티는 이미 동일한 방법론을 사용하여 추가로 노출된 키를 찾고 있습니다. 자동 스캐너가 Stripe 토큰이 포함된 “/.env” 파일을 찾기 위해 웹을 크롤링함에 따라 더 많은 유출 사례가 보고될 것으로 예상됩니다. Stripe는 키 교체 주기(cadence)에 대한 추가 지침을 제공하거나 고위험 작업에 대해 제한된 키 사용을 권장할 수 있습니다.

시사점

브라우저를 통해 dotfile을 가져올 수 있다면, 귀하의 결제 시스템은 이미 침해된 것입니다. 사기가 장부에 기록되기 전에 파일을 차단하고, 키를 교체하며, 비밀 정보 처리 워크플로우를 재설계하십시오.