DEV Community

JustJinoIT
JustJinoIT

Posted on

6개 프로젝트 보안 감사: 25개 이슈 발견 수정 기록

Published on: 2026-06-06

Reading time: 8 min

Tags: #security #python #audit #devops

개요

3개월에 걸쳐 개발한 6개 Python 프로젝트(3개 봇 + 3개 라이브러리)를 종합 감사했습니다. 25개 보안/코드 이슈를 발견했고, 23개를 즉시 수정했습니다.

  • 감사 대상: FastAPI + Telegram Bot + LLM 통합 시스템
  • 총 파일: 91개 Python 파일
  • 발견 이슈: 25개 (심각 5개, 중간 18개, 경미 2개)
  • 수정율: 92% (23/25)

심각도 높음 - 5개 이슈

1. API 키가 Git 히스토리에 노출됨 🔴

문제: Anthropic, Supabase, Telegram API 키가 .env 파일로 커밋됨

# ❌ 노출된 상태 (git log에서 확인 가능)
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxx
SUPABASE_KEY=sb_publishable_xxxxxxxxxx
Enter fullscreen mode Exit fullscreen mode

위험도: 누구든 이전 커밋으로 API 키 접근 가능 → 리소스 도용, 데이터 침해

해결책:

# 1. BFG로 히스토리 정리
bfg --delete-files ".env" --no-blob-protection .

# 2. Git에서 제거
git rm --cached .env
echo ".env" >> .gitignore

# 3. API 키 로테이션 (필수)
# - Anthropic: console.anthropic.com/account/keys
# - Supabase: app.supabase.com → Settings → API
# - Telegram: @BotFather → /token
Enter fullscreen mode Exit fullscreen mode

2. SSL 검증 비활성화 (MITM 공격 위험) 🔴

문제: requests 호출에 verify=False 사용 (10곳)

# ❌ 위험한 코드
response = requests.get(url, verify=False)

# ✅ 안전한 코드
response = requests.get(url, verify=True)  # 기본값
Enter fullscreen mode Exit fullscreen mode

영향: HTTPS 중간자 공격(MITM) 가능 → 민감한 데이터 도청

수정: contest-agent, supabase-async 전체 10곳 제거

3. 광범위한 예외 처리 🔴

문제: except Exception 으로 모든 오류를 무시 (114곳)

# ❌ 버그 추적 불가
try:
    result = await db_select("contests")
except Exception:
    print("failed")  # 어떤 오류인지 알 수 없음

# ✅ 구체적인 처리
try:
    result = await db_select("contests")
except requests.HTTPError as e:
    logger.error(f"DB error: {e}", exc_info=True)
    raise
Enter fullscreen mode Exit fullscreen mode

영향: 버그 원인 파악 불가 → 프로덕션 문제 대응 시간 증가

4. 라이브러리 __init__.py 부실

문제: llm-router, supabase-async, telegram-agent의 __init__.py 비어있음

# ❌ 기존 (빈 파일)
# __init__.py
# (아무것도 없음)

# ✅ 수정 후
from llm_router import LLMRouter
__version__ = "0.1.0"
__all__ = ["LLMRouter"]
Enter fullscreen mode Exit fullscreen mode

영향: PyPI 설치 후 import 실패

from llm_router import LLMRouter  # ❌ ImportError
Enter fullscreen mode Exit fullscreen mode

5. 문법 오류 (try-except 들여쓰기)

ai-insight-curator의 processor.py에서 DB 작업이 try 블록 밖에 있었음 → 예외 처리 안 됨

심각도 중간 - 18개 이슈

의존성 버전 불일치

  • Anthropic: 0.25.0 / 0.34.0 혼재 → 0.34.0으로 통일
  • Supabase: 2.0.0 / 2.4.0 혼재 → 2.4.0으로 통일
  • Python: 3.9 / 3.11 혼재 → 3.11로 통일 (3.9 EOL: 2025-10)

입력 검증 부재

  • /contests?status=invalid&limit=999 같은 잘못된 입력 허용
  • 해결: status enum, limit 1-100 범위 검증 추가

README와 코드 불일치

  • ai-insight-curator README에 FastAPI 언급 → 실제로는 순수 Telegram Bot
  • 구현 상태 명시 누락

통계

변경 내역

항목 수치
신규 커밋 15개
수정 파일 22개
삭제된 코드 347줄
추가된 코드 200줄

테스트 결과

✅ 91개 파일 Python 문법 검증 통과
✅ 라이브러리 import 테스트 3/3 통과
✅ 프로젝트 구조 검증 3/3 통과
Enter fullscreen mode Exit fullscreen mode

배운 점

  1. 초기부터 보안: .env는 처음부터 .gitignore에 넣기
  2. 버전 관리: 모든 패키지를 명시적으로 고정 (>=는 피하기)
  3. 구체적인 예외: Exception 대신 HTTPError, ValueError 등 구체적으로
  4. 정기 감사: 3-6개월마다 보안 감사 실행

다음 단계

  1. API 키 로테이션 (필수)
  2. 모니터링 설정 (로그 수집, 알림)
  3. 자동 테스트 (pytest 70% 커버리지)
  4. CI/CD 강화 (GitHub Actions lint + test)

실행 체크리스트

위험도별 즉시 조치:

  • [ ] 긴급 (24시간): API 키 로테이션
  • [ ] 높음 (1주): SSL 검증 활성화 확인
  • [ ] 중간 (2주): 예외처리 감사 (특정 예외로 변경)
  • [ ] 진행: 정기 감사 일정 (분기별)

결론

3개월 개발 = 23개 이슈 발견 + 수정

초기부터 보안을 제대로 했다면:

  • 감사 시간: 0시간
  • 수정 비용: $0
  • 배포 지연: 0일

지금이라도 시작하면:

  • 향후 감사는 훨씬 빠름
  • 버그 감소 → 운영 비용 절감
  • 채용 시 신뢰도 향상

가장 중요한 건 "지금 시작하기"입니다.

Top comments (0)