릴리즈 후 Flutter 앱의 메모리 누수 (출시 전에 잡는 방법)
Source: Dev.to

몇 달 동안 Flutter 앱을 만들었습니다. QA를 통과했고, 사용자들은 앱을 좋아합니다. 이제 프로덕션에 배포합니다.
그런데 보안 연구원에게서 메일이 옵니다: “앱에 Firebase 키가 하드코딩돼 있는 걸 발견했어요.”
빌드된 Flutter 앱에서 공격자가 보는 것
Flutter 앱을 컴파일하면 최종 패키지에 UI 코드 외에도 여러 정보가 포함됩니다. 누출될 수 있는 항목은 다음과 같습니다:
하드코딩된 비밀
- Dart 코드에 삽입된 API 키
- Firebase 인증 정보(데이터베이스 URL, API 키, 프로젝트 ID)
- OAuth 클라이언트 시크릿
- 서드파티 서비스 토큰
이들은 컴파일 후에도 남아 최종 빌드에 포함되며, 앱을 디컴파일하는 사람이라면 누구나 읽을 수 있습니다.
Firebase 설정 오류
- 제한 없는 데이터베이스 규칙
- 공개 스토리지 버킷
- 인증 요구사항 누락
- 클라이언트 코드에 포함된 Admin SDK 인증 정보
위험한 권한
INTERNET (필수이지만 위험한 권한과 함께 사용되는 경우가 많음)
READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE (정당한 이유 없이)
ACCESS_FINE_LOCATION (불필요할 때)
CAMERA / MICROPHONE (프라이버시 플래그 발생)
프로덕션에 포함된 디버그 빌드
AndroidManifest.xml에debuggable=true남겨두기- 개발용 엔드포인트 노출
- 스택 트레이스가 포함된 상세 오류 메시지
- 리버스 엔지니어링을 쉽게 하는 디버그 심볼
이런 문제가 발생하는 이유
Flutter의 컴파일 과정:
- Dart 코드 → 네이티브 코드로 컴파일
- 에셋, 설정, 매니페스트 → 그대로 번들링
- 문자열, URL, 키 → 종종 읽을 수 있는 형태로 남음
- 트리‑쉐이킹(Tree‑shaking)으로 하드코딩된 비밀은 제거되지 않음
코드가 컴파일되었더라도 디컴파일 도구를 사용하면 다음을 추출할 수 있습니다:
- 에셋 파일
- Android 매니페스트 권한
- 컴파일된 문자열 리터럴
- 리소스 파일 및 설정
릴리즈 전에 이를 잡는 방법
사전 릴리즈 보안 체크리스트
- 비밀을 절대 하드코딩하지 않기 – 환경 변수나 보안 금고 사용.
- Firebase 규칙 감사 (키가 공개된다고 가정).
AndroidManifest.xml검토 – 디버그 플래그와 과도한 권한 확인.- 프로덕션 빌드에서 디버그 심볼 제거.
- 디컴파일 도구로 직접 앱 테스트.
자동 스캔
저는 FlutterGuard 를 만들었습니다. (Firebase 키를 프로덕션에 배포한 뒤(실제 사건) 보안 연구원이 발견했기 때문입니다.) 이 도구는 Flutter 앱을 디컴파일하고 공격자가 보는 내용을 정확히 보여줍니다:
- 하드코딩된 비밀 / URL / Firebase 설정
- 위험한 권한 및 디버그 빌드
- 약 3분 안에 제공되는 명확하고 실행 가능한 보고서
제공: 하루에 3회 무료 스캔, 카드 정보 필요 없음.
사용해 보시고 개선할 점을 한 가지 알려 주세요—당일에 바로 수정해 드립니다.
안전하게 개발하고, 보안 있게 배포하세요. 🔒