Security Disclosure
Last updated: 2026-05-14
1. 보고 채널
보안 취약점을 발견했을 때:
비공개 (권장)
- Telegram / Kakao 1:1: https://seunghan.xyz 의 Contact 섹션 채널로 DM
- 메시지 제목
[ainote security]로 시작 - 가능하면 PoC + 영향 범위 + 재현 단계 포함
GitHub Security Advisory (오픈소스 코드 취약점)
- https://github.com/seunghan91/ainote/security/advisories/new
- 비공개 draft 로 보고 → 협의 후 공개
절대 하지 말 것
- 공개 GitHub Issue 에 취약점 상세 공개 (조정 전)
- 제3자에게 취약점 정보 판매 / 공유
- 실 사용자 데이터에 대한 unauthorized access 시도
2. 응답 SLA (best-effort)
| 심각도 | 1차 응답 | 패치 목표 |
|---|---|---|
| Critical (실 사용자 데이터 유출 가능) | 24시간 | 7일 |
| High (인증 우회, 권한 상승) | 48시간 | 14일 |
| Medium (특정 조건 하 데이터 누설) | 7일 | 30일 |
| Low (정보 누설 없는 결함) | 14일 | 90일 |
운영자가 1인 (Dcode Labs / Seunghan Kim) 이므로 SLA 는 best-effort. 일정 지연 시 보고자에게 일정 공유.
3. 책임 있는 공개 (responsible disclosure)
- 보고자가 90일 이상 패치를 기다린 경우 공개 가능 — Google Project Zero 표준 따름
- 패치 배포 후 보고자 동의 하에 (또는 anonymously) credit
- 명예의 전당: GitHub README (계획)
4. Bug bounty
현재 공식 bug bounty 프로그램 없음. 상황에 따라 운영자가 임의 사례 가능.
5. 암호화 모델
Transit
- 모든 트래픽 HTTPS (Render Let's Encrypt 자동 발급)
- HSTS 헤더 (계획 — Phase 3)
- TLS 1.2+ 강제
At-rest
- PostgreSQL 디스크 암호화 (Render 인프라 레벨)
- 비밀번호 bcrypt (cost 12+)
- MCP key 발급 시 평문은 한 번만 노출 후 hash 저장
Client-side E2E (mcp category)
사용자의 ~/.claude.json 의 mcpServers 항목 + API key 들은 ainote 클라우드 동기화 시 age 로 클라이언트에서 암호화 후 업로드. 서버는 평문 모름.
- Age identity: 디바이스별 keypair, OS Keychain 저장
- Recipients: 사용자의 다른 디바이스 public key 들
- 디바이스 추가 시
sync add_recipient <PUBLIC>으로 갱신
→ age encryption 상세 (계획)
6. 의존성 보안
- npm 패키지
@ainote/mcp는npm audit자동 검사 - Rails gem 은
bundle audit정기 실행 - 알려진 CVE 영향 시 critical/high 는 7일 내 패치
- 의존성 lock files (package-lock.json, Gemfile.lock) commit
7. 인프라
- Render Singapore region (PostgreSQL + web service)
- Render 인프라 보안 정책: https://render.com/security
- 서비스 SSH 접근: 운영자 1명, hardware-backed key
- DB credentials: Render secret store, repo 에 commit 안 함
8. 취약점 카테고리별 안내
XSS / CSRF / SQLi
- Rails 8 의 built-in 방어 사용
- ContentSecurityPolicy (CSP) 헤더 (계획 — Phase 3)
Auth / Session
- Devise (web) + JWT (mobile / MCP)
- MCP key 는 단순 secret string, JWT 가 아님 — revocation 가능
- OAuth 2.1 + DCR (Phase 3 도입 예정) — 동적 client registration
Multi-tenancy
- 사용자별 격리: PostgreSQL row-level (
user_idforeign key) + 모든 query 에 scope - vault 격리: 사용자 본인 GitHub repo + ainote installation 권한만
Rate limit / DoS
- Phase 3 후 정식 도입 (
X-RateLimit-*headers,Retry-After) - 현재는 Render 인프라 레벨 보호
9. 이전 보안 이슈 (공개 가능 항목)
(현재 공개된 항목 없음)
10. Contact
- 비공개 보고 권장: https://seunghan.xyz 의 Telegram/Kakao 채널
- GitHub Security: https://github.com/seunghan91/ainote/security