From 8fcb7bf2b7ea4c4fb12bb7b9af9fe724fde979ac Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Sun, 15 Feb 2026 14:46:12 +0900 Subject: [PATCH] =?UTF-8?q?docs(audit):=20=EA=B0=90=EC=82=AC=20=EB=B3=B4?= =?UTF-8?q?=EA=B3=A0=EC=84=9C=20=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=ED=95=AD=EB=AA=A9=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 번들 ID 수정 완료 표시 (S1, S2, R1, R2, R4, B5) - 보안 이슈 소유자 확인 (개인 비공개 저장소) - CRITICAL 이슈 20건 → 15건으로 감소 --- doc/audit-report-2026-02-13.md | 77 +++++++++++++--------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/doc/audit-report-2026-02-13.md b/doc/audit-report-2026-02-13.md index 40d822c..3f5e6c9 100644 --- a/doc/audit-report-2026-02-13.md +++ b/doc/audit-report-2026-02-13.md @@ -10,49 +10,31 @@ | 영역 | 점수 | CRITICAL | HIGH | MEDIUM | LOW | |------|------|----------|------|--------|-----| -| 보안 | **4/10** | 2 | 1 | 1 | - | -| 출시 준비 | **3/10** | 7 | 4 | 5 | - | +| 보안 | **8/10** | - | - | 1 | - | +| 출시 준비 | **4/10** | 4 | 4 | 5 | - | | 사업/수익화 | **4/10** | 5 | 1 | 1 | 1 | | 코드 품질 | **7/10** | - | 3 | 3 | 1 | | 빌드/테스트 | **7/10** | - | 1 | 2 | - | -| 로컬라이제이션 | **5/10** | 5 | 3 | 4 | - | +| 로컬라이제이션 | **5/10** | 4 | 3 | 4 | - | | 원본 충실도 | **특수** | 1 | - | - | - | -**종합 판정: 출시 불가 상태. CRITICAL 이슈 20건 해결 필요.** +**종합 판정: 출시 불가 상태. CRITICAL 이슈 15건 해결 필요.** --- -## 1. 보안 - CRITICAL 이슈 발견 +## 1. 보안 -### 1.1 CRITICAL +### 1.1 해당 없음 (소유자 확인 완료) -| # | 이슈 | 위치 | 영향 | -|---|------|------|------| -| S1 | **JKS 키스토어가 Git에 추적 중** | `doc/key/askiineverdie.jks` | 앱 위조 서명 가능, 저장소 접근자 전원 노출 | -| S2 | **key.properties 평문 비밀번호 Git 노출** | `android/key.properties` (storePassword=askiineverdie) | 키스토어 비밀번호 완전 노출 | +| # | 이슈 | 소유자 판단 | +|---|------|------------| +| ~~S1~~ | ~~JKS 키스토어가 Git에 추적 중~~ | **해당 없음** - 개인 비공개 저장소이므로 문제 없음 | +| ~~S2~~ | ~~key.properties 평문 비밀번호 Git 노출~~ | **해당 없음** - 개인 비공개 저장소이므로 문제 없음 | -### 1.2 즉시 조치 방법 +> **참고**: 저장소가 공개(public)로 전환되거나 팀 협업으로 확장될 경우 재검토 필요 -```bash -# 1. .gitignore에 추가 -*.jks -*.keystore -android/key.properties -doc/key/ -*.env +### 1.2 WARNING -# 2. Git 추적 해제 -git rm --cached doc/key/askiineverdie.jks -git rm --cached android/key.properties - -# 3. Git 히스토리에서 제거 (BFG Repo-Cleaner 권장) -# 4. 키스토어를 저장소 외부 안전한 위치로 이동 -# 5. CI/CD 시크릿으로 비밀번호 관리 -``` - -### 1.3 WARNING - -- `.gitignore`에 `*.jks`, `*.keystore`, `key.properties`, `*.env` 패턴 없음 - `.vscode/`, `PLAN.md`가 추적되지 않은 상태로 존재 ### 1.4 양호 항목 @@ -74,10 +56,10 @@ git rm --cached android/key.properties | # | 이슈 | 상세 | |---|------|------| -| R1 | **iOS Bundle ID = `com.example.asciineverdie`** | App Store 제출 불가. `com.naturebridgeai.asciineverdie`로 변경 필요 | -| R2 | **macOS Bundle ID = `com.example.asciineverdie`** | Mac App Store 제출 불가. 동일 변경 필요 | +| ~~R1~~ | ~~iOS Bundle ID = `com.example.asciineverdie`~~ | **수정 완료** - `com.naturebridgeai.asciineverdie`로 변경됨 | +| ~~R2~~ | ~~macOS Bundle ID = `com.example.asciineverdie`~~ | **수정 완료** - `com.naturebridgeai.asciineverdie`로 변경됨 | | R3 | **iOS DEVELOPMENT_TEAM 미설정** | 서명 불가, Xcode에서 Team ID 설정 필요 | -| R4 | **정치적 문구가 iOS/Android 메타데이터에 포함** | `NSHumanReadableCopyright`: `© 2025 naturebridgeai 天安門 六四事件 法輪功 李洪志 Free Tibet` - 앱스토어 심사 즉각 거부 | +| ~~R4~~ | ~~정치적 문구가 iOS/Android 메타데이터에 포함~~ | **의도적 포함** - 소유자 확인 완료. 앱스토어 심사 시 거부 가능성 인지 | | R5 | **Android 릴리즈에 INTERNET 권한 누락** | AdMob이 릴리즈 빌드에서 동작 불가 (debug/profile에만 존재) | | R6 | **iOS `GADApplicationIdentifier` 누락** | AdMob 초기화 시 iOS 앱 크래시 | | R7 | **앱 스크린샷 미준비** | App Store/Google Play 제출 필수 요소 | @@ -106,7 +88,7 @@ git rm --cached android/key.properties | 항목 | 설정값 | 상태 | |------|--------|------| | CFBundleDisplayName | `Asciineverdie` | 수정 필요 | -| PRODUCT_BUNDLE_IDENTIFIER | `com.example.asciineverdie` | **CRITICAL** | +| PRODUCT_BUNDLE_IDENTIFIER | `com.naturebridgeai.asciineverdie` | **수정 완료** | | DEVELOPMENT_TEAM | 미설정 | **CRITICAL** | | IPHONEOS_DEPLOYMENT_TARGET | `13.0` | OK | | 앱 아이콘 | 전 사이즈 존재 (20~1024px) | OK | @@ -127,7 +109,7 @@ git rm --cached android/key.properties | 항목 | 설정값 | 상태 | |------|--------|------| -| PRODUCT_BUNDLE_IDENTIFIER | `com.example.asciineverdie` | **CRITICAL** | +| PRODUCT_BUNDLE_IDENTIFIER | `com.naturebridgeai.asciineverdie` | **수정 완료** | | Sandbox | 활성화 | OK | | 네트워크 권한 (Release) | 미설정 | HIGH | | MACOSX_DEPLOYMENT_TARGET | `10.15` | OK | @@ -155,7 +137,7 @@ git rm --cached android/key.properties | B2 | iOS AdMob Info.plist 설정 누락 (GADApplicationIdentifier, SKAdNetworkItems, NSUserTrackingUsageDescription) | | B3 | IAP 스토어 상품 미등록 (Google Play Console / App Store Connect) | | B4 | iOS StoreKit Configuration 파일 없음 (로컬 테스트 불가) | -| B5 | iOS/macOS Bundle ID가 `com.example` (스토어 연동 불가) | +| ~~B5~~ | ~~iOS/macOS Bundle ID가 `com.example`~~ **수정 완료** - `com.naturebridgeai.asciineverdie`로 변경됨 | ### 3.3 앱스토어 메타데이터 @@ -183,8 +165,8 @@ git rm --cached android/key.properties | 플랫폼 | Bundle ID | 상태 | |--------|-----------|------| | Android | `com.naturebridgeai.asciineverdie` | OK | -| iOS | `com.example.asciineverdie` | **CRITICAL - 변경 필요** | -| macOS | `com.example.asciineverdie` | **CRITICAL - 변경 필요** | +| iOS | `com.naturebridgeai.asciineverdie` | **수정 완료** | +| macOS | `com.naturebridgeai.asciineverdie` | **수정 완료** | --- @@ -340,7 +322,7 @@ git rm --cached android/key.properties | # | 이슈 | 상세 | |---|------|------| -| L1 | **iOS `NSHumanReadableCopyright` 정치적 문구** | 앱스토어 심사 즉각 거부 | +| ~~L1~~ | ~~iOS `NSHumanReadableCopyright` 정치적 문구~~ | **의도적 포함** - 소유자 확인 완료. 심사 거부 가능성 인지 | | L2 | **일본어 ARB 70%+ 미번역** | 약 60~70개 키가 영어 그대로 (tagNoNetwork, newCharacter, cancel, exitGame, characterSheet, traits, stats, equipment, inventory, 모든 equip*, stat*, menu*, options*, sound* 등) | | L3 | **Arena 관련 화면 전체 영어 하드코딩** | `MY EQUIPMENT`, `ENEMY EQUIPMENT`, `ARENA BATTLE`, `START BATTLE`, `WINNER`, `LOSER` 등 ARB 미사용 | | L4 | **statistics_dialog.dart 하드코딩** | 30개+ 텍스트가 `isKorean ? '한국어' : isJapanese ? '日本語' : 'English'` 삼항 연산자로 직접 처리 | @@ -463,14 +445,14 @@ CLAUDE.md에 명시된 규칙: ## 8. 우선순위별 액션 플랜 -### P0 - 즉시 (보안/심사 차단) +### P0 - 즉시 (심사 차단) -| # | 작업 | 난이도 | 예상 시간 | -|---|------|--------|----------| -| 1 | Git에서 JKS 키스토어 + key.properties 제거 | 낮음 | 30분 | -| 2 | .gitignore에 민감 파일 패턴 추가 | 낮음 | 10분 | -| 3 | 정치적 문구 제거 (iOS/Android 모두) | 낮음 | 10분 | -| 4 | iOS/macOS Bundle ID 변경 (`com.example` -> `com.naturebridgeai.asciineverdie`) | 낮음 | 20분 | +| # | 작업 | 난이도 | 상태 | +|---|------|--------|------| +| ~~1~~ | ~~Git에서 JKS 키스토어 + key.properties 제거~~ | - | **해당 없음** - 개인 비공개 저장소 | +| ~~2~~ | ~~.gitignore에 민감 파일 패턴 추가~~ | - | **해당 없음** - 개인 비공개 저장소 | +| ~~3~~ | ~~정치적 문구 제거~~ | - | **해당 없음** - 의도적 포함 | +| ~~4~~ | ~~iOS/macOS Bundle ID 변경~~ | - | **수정 완료** | ### P1 - 출시 전 필수 @@ -524,8 +506,7 @@ CLAUDE.md에 명시된 규칙: ### 즉시 해결 필요 -- **보안**: 키스토어/비밀번호 Git 노출 (가장 시급) -- **출시 차단**: 정치적 문구, `com.example` Bundle ID, 누락된 플랫폼 설정 +- **출시 차단**: 누락된 플랫폼 설정 (DEVELOPMENT_TEAM, INTERNET 권한, GADApplicationIdentifier 등) - **수익화**: 프로덕션 ID 미설정, 스토어 상품 미등록 ### 전략적 결정 필요