diff --git a/deploy/CI.md b/deploy/CI.md index aeb3160..637192e 100644 --- a/deploy/CI.md +++ b/deploy/CI.md @@ -83,6 +83,23 @@ CI가 통과해야 하는 관문이 아래처럼 늘었다. **로컬에서 먼 > 커버리지 바닥(30%/40%)은 "지금보다 나빠지지 마라"는 **래칫(ratchet)**이다. > 테스트를 늘리면 이 숫자도 함께 올려 바닥을 끌어올리는 게 건강한 흐름. +## 의존성 취약점 스캔 (라이브러리 CVE) + +우리가 직접 쓴 코드뿐 아니라 "가져다 쓰는 라이브러리"에도 취약점이 생긴다. CI가 이를 훑는다. + +| 대상 | 도구 | 방식 | +|---|---|---| +| 프론트(npm) | `npm audit --omit=dev --audit-level=high` | 온디맨드(대용량 DB 없음) | +| 백엔드(Maven) | OSV-Scanner v2.4.0, `scan source -r backend` | osv.dev 온디맨드 질의 | + +**둘 다 비차단(`continue-on-error`)으로 "보고 전용" 시작한다.** 이유: 이 스캔은 "코드"가 +아니라 "외부 권고 DB 상태"에 결합돼, 우리가 한 줄도 안 고쳐도 새 CVE가 공개되면 차단형이면 +무관한 PR까지 전부 CI가 붉어진다. 팀이 수용목록(allow-list) 운영에 익숙해지면 차단으로 승격한다. + +> ⚠️ **첫 스캔이 이미 값어치를 증명했다**: 백엔드 OSV 스캔이 Spring Boot 3.4.2의 +> 누적 CVE(tomcat-embed-core·spring-security-* 등, 일부 CVSS 9점대)를 다수 찾아냈다. +> 대부분 **Spring Boot 패치 버전 업그레이드로 한 번에 해결**된다 — 별도 후속 티켓 권장. + ## main 브랜치 보호 (PR 워크플로) `main`은 보호 규칙이 걸려 있다(Gitea → 저장소 설정 → 브랜치): diff --git a/frontend/public/docs/ticket-pool.html b/frontend/public/docs/ticket-pool.html index 81d7f05..58c954c 100644 --- a/frontend/public/docs/ticket-pool.html +++ b/frontend/public/docs/ticket-pool.html @@ -438,7 +438,7 @@
-
SEC-02

민감 PII 작업 감사로그

1일
+
SEC-02

민감 PII 작업 감사로그 ✅ 구현됨

1일
무엇을전체 인적사항 CSV 다운로드·멘토 비번 재설정·명단 조회에 "행위자(멘토)+대상 학생 id+시각"을 log.info로 남긴다. 세션 Authentication에서 행위자를 얻는다.
찾는 법백엔드 log.* 호출은 LoginAttemptService·TelegramNotifier뿐. mentor/auth/profile 경로엔 감사로그가 전무 — 누가 전체 명단을 받았는지 추적 불가.
@@ -448,7 +448,7 @@
-
SEC-03

공개 쓰기 엔드포인트 레이트리밋

★★2일
+
SEC-03

공개 쓰기 엔드포인트 레이트리밋 ✅ 구현됨

★★2일
무엇을이미 있는 LoginAttemptService 패턴(IP+창시간)을 재사용해 POST /api/auth/signupPUT /api/profile/me에 분당 상한을 건다.
찾는 법signup은 무인증으로 DB에 계정을 쓰고 성공마다 텔레그램 알림까지 쏜다 — 남용 시 가짜계정·알림 폭주 표면.
@@ -458,7 +458,7 @@
-
SEC-04

개인정보 열람·내보내기 접근 로그

0.5일
+
SEC-04

개인정보 열람·내보내기 접근 로그 ✅ 구현됨 (SEC-02에 통합)

0.5일
무엇을/api/mentor/students(전체 인적사항)와 /export.csv에 접근 한 줄(사용자·행위·시각) 로그를 남긴다. SEC-02와 짝.
찾는 법두 경로 모두 누가·언제 접근했는지 기록이 0. 유출 시 추적 근거가 없다.