- 2025년 8월 3일 DrawAFish! 웹사이트에서 약 6시간 동안 대규모 보안 사고가 발생함
- 관리자 비밀번호 유출, 인증 누락 API, JWT 취약점 등 핵심 보안 취약점이 복합적으로 공격에 노출됨
- 결과적으로 모든 사용자명이 모욕적 표현으로 변경되고, 불쾌한 그림이 승인됨과 동시에 기존 안전한 그림이 삭제됨
- 수작업 복구, 인증 로직 수정, 백업의 확인 등으로 문제 해결을 진행함
- 주된 교훈은 빠른 개발(“vibe-coding”)과 테스트·코드 리뷰 부족이 보안상 심각한 결과를 야기할 수 있다는 점
DrawAFish.com 개요 및 2025년 8월 3일 사고 요약
- DrawAFish.com 은 사용자가 직접 물고기를 그리고 다른 사용자들과 함께 수조에서 수영시키는 재미 요소가 있는 웹사이트
- 2025년 8월 1일, Hacker News 1위에 오르며 큰 주목을 받았음. 개발자는 Copilot 등의 도구로 빠르게 기능을 구현하는 ‘vibe-coding’ 방식을 채택
- 그러나 2025년 8월 3일 새벽, 심각한 보안 사고가 발생함
- 약 6시간 동안 온갖 사용자명이 저속한 표현으로 변경되고, 부적절한 그림이 승인되는 등 무질서한 상황이 발생했음
- 결국 관리자가 수동으로 원복 작업을 수행함
취약점 상세 분석
1. 과거 유출된 6자리 관리자 비밀번호
- 개발자는 초기에 본인 어린 시절 ID와 비밀번호(6자리)를 관리자 계정에 사용함
- 이 비밀번호가 과거 Neopets 등 사이트 데이터 유출을 통해 이미 온라인에 공개되어 있었음
- 개발자는 이후 Google Auth를 사용했지만, 이전 비밀번호를 삭제하지 않아 공격자에게 취약점이 남아있었음
- 공격자는 데이터 유출된 정보를 이용해 관리자 인증에 성공했고, 모욕적 그림 승인 및 정상 그림 삭제 등의 악의적 행위를 함
2. 인증 없는 사용자명 변경 API
- 프로필 백엔드 개발 시 ‘빠른 개발’을 위해 인증 확인 기능 없이 사용자명 변경 API를 구현함
- 실질적으로 누구든 임의로 사용자명을 변경할 수 있었음
3. JWT 검증 미흡
- JWT 토큰 기반 인증에서, 토큰과 userId/email의 매칭 없이 관리자 작업이 수행 가능하게 구현함
- 즉, 공격자가 관리자 인증 정보로 발급된 토큰만 있으면 누구의 요청에도 관리자 권한으로 사용할 수 있었음
- 흥미롭게도, 한 Hacker News 유저가 이 취약점을 이용하여 침입자보다 먼저 부적절한 자료를 삭제하며 비상 대응에 기여함
복구 과정
- 개발자는 아침 7시 45분경 이상 상황을 인지해 즉시 데스크탑에서 대응을 시작함
- firebase 백업을 미설정 상태여서 백업에 의존하지 못했고, 코드를 신속하게 수정해 인증 강제 적용
- 모든 모더레이션 로그를 추적하여 악의적 작업을 취소하는 스크립트를 개발함 (이 역시 vibe-coding 방식으로 작성)
- 비상시에 관리자 권한을 사용한 제3자(Hacker News 유저)의 접근 계정도 차단 후 연락하여 코드베이스의 시큐리티 리팩터링 관련 피드백을 받고 추가 패치 진행함
개발 문화와 교훈
- 개발자는 “vibe-coding”, 즉 빠른 프로토타이핑과 최소한의 검토 문화가 재미와 높은 생산성을 주지만, 실제로는 심각한 보안 취약점으로 이어질 수 있음을 경험함
- LLM(Copilot)은 빠른 코드 생산에 매우 유용하나, 코드의 품질과 보안 책임은 개발자 본인에게 있음을 역설함
- 테스트, 인증 로직, 코드 리뷰 등 기본적인 보안 절차를 생략한 결과, 소규모 프로젝트에서도 외부 공격에 극도로 취약해질 수 있음을 입증한 사례임
결론 및 인사이트
- DrawAFish.com 사례는 실제 서비스 운영 환경에서 흔히 간과하는 기초 보안 조치의 중요성을 보여줌
- 오픈 소스 도구 및 빠른 개발 도구에 의존할 때에도, 반드시 테스트, 인증, 코드 리뷰, 비밀번호 관리 등 기본 이슈를 체크해야 함
- 예상치 못한 규모의 주목(예: Hacker News 상위 랭크)에 따라 공격 표면과 리스크가 급격히 확대될 수 있음
- Postmortem을 투명하게 기록함으로써, 향후 유사 스타트업이나 개인 개발자들에게 현실적인 보안 교훈을 전달함