Skip to content

v1.3.0: Keystore AES-GCM 보안 강화, API 서버 인증, 리플렉션 제거 및 R8 최적화

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 10 Sep 13:41
· 65 commits to main since this release

Local LLM Android v1.3.0 Release Notes

Claude 및 ChatGPT 심층 코드 리뷰를 바탕으로 보안 취약점, 아키텍처 결함, 하드웨어 가속 미비점을 전면 개선한 메이저 업데이트입니다.

🔒 P0 — 보안 강화 및 데이터 무결성

  • Android Keystore 기반 AES-256-GCM 암호화 전환 (ChatCrypto):
    • 하드코딩된 마스터 시드를 제거하고 OS 보안 하드웨어(TEE/Keystore)에서 기기별 고유 키를 생성·보관
    • 암호화 실패 시 평문(Base64)으로 폴백하던 취약점 제거 -> SecurityException을 통한 안전하지 않은 저장 원천 차단
    • 이전 버전의 기존 대화 기록을 안전하게 읽어오는 하위 호환 마이그레이션 로직 탑재
  • API 서버 보안 강화 (OllamaApiServer):
    • 외부 노출 위험이 있던 0.0.0.0 바인딩 대신 127.0.0.1 (로컬 루프백) 기본 바인딩 적용 (설정에서 LAN 모드 선택 가능)
    • 랜덤 고강도 API 키(sk-local-...) 자동 발급 및 Authorization: Bearer <token> 헤더 인증 필수 적용
    • 브라우저 기반 무단 호출을 방지하기 위해 와일드카드 CORS(*) 제거 및 로컬호스트 검증
  • LlamaContext 리플렉션 의존성 제거:
    • wrapper의 private 필드에 몰래 접근하던 getDeclaredField("contexts") 리플렉션 완전 제거
    • LlmEngine이 네이티브 LlamaContext를 직접 소유·관리하여 ProGuard/R8 난독화 시의 크래시 가능성 원천 차단

⚡ P1 — 하드웨어 가속 및 진단 강화

  • Google LiteRT-LM GPU / NPU 하드웨어 가속 지원:
    • CPU 고정을 탈피하고 Backend.GPU() 및 Backend.NPU() 델리게이트 후보를 자동 시도
  • llama.cpp GPU 오프로딩 (n_gpu_layers):
    • 설정과 연동하여 GPU 가속 레이어 오프로딩 지원
  • 사전 메모리 진단:
    • 모델 로드 전 가용 RAM 대비 모델 크기를 대조하여 OOM 위험 조기 감지 및 로깅

🎯 P2 — 정확성 및 UX 개선

  • 실제 토크나이저 기반 속도 측정:
    • 글자 수 기반 추정치(length/3)를 폐기하고 네이티브 모델 토크나이저를 통한 정확한 promptSpeed 및 tps 산출
  • 스트리밍 추론 버퍼 상태머신 (ReasoningStreamParser):
    • DeepSeek-R1 등 추론 모델의 <think>, </think> 태그가 토큰 스트리밍 경계에서 쪼개질 때도 완벽 분리 처리

🏛️ P3 — 아키텍처 및 빌드 위생

  • 정식 애플리케이션 ID 적용: com.localllm.android (versionCode 13, versionName 1.3.0)
  • R8 / Minify 최적화 활성화: isMinifyEnabled = true 적용으로 약 20MB 용량 경량화 (99.9MB)
  • 타입 안전한 네비게이션: 문자열 라우팅을 AppScreen enum으로 교체하여 오타 방지
  • 모바일 친화적 네트워크 디스패처: 동시 요청 풀을 16/8로 조정하여 배터리 및 연결 안정성 확보
  • 단위 테스트 스위트 구축: 암호화, 스트리밍 상태머신, 프롬프트 포맷터 테스트 100% 통과
  • README 아키텍처 문서화: llama.cpp GGUF vs LiteRT-LM 이원화 아키텍처 기술