[보안/SER-004] 웹취약점 점검 조치 5건 — 휴면해제·CSRF·난수·하드코딩·보안헤더 #1
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "feature/privacy-access-control-policy"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
개요
2026 문화품앗이 개인정보보호 기능개선 사업 SER-004(시큐어코딩·웹취약점 점검) 조치. 신규·변경 기능 대상 웹취약점 점검(OWASP ZAP + 수동)에서 확인된 5건을 조치하고 로컬에서 실증 검증했다.
조치 내역
a085956d75c0daa085956,e82e0616b575206b57520검증
배포 주의
🤖 Generated with Claude Code
관리자 메뉴 9100045(업무유형 매핑 관리)·9100046(로그인 접속기록) 두 화면을 폐기하고 관련 5계층·sqlMap·JSP를 제거했다. 접속기록은 PERSONAL_DATA_ACCESS_LOG 경로로 일원화한다. - JobMapping 5계층(Controller/DAO/Service/Impl/Resolver/SearchVO)과 ConectLog 5계층, PersonalDataLogAspect 제거 - PrivacyJobMapping_SQL_{Mysql,Oracle}.xml 제거 + sql-map-config 등록 라인 삭제 - left.jsp의 9100045/9100046 분기와 상위 하이라이트 조건 제거 - 메뉴 폐기 DML 신설(권한매핑→메뉴→프로그램 순, 멱등) — 종전 등록 DML 2건 대체. JSP와 반드시 동반 배포해야 URL 직접 접근 경로가 남지 않는다 - privacy.install_mysql.sql에 PART 4(뷰 GNR 컷오버) 반영, 메뉴 번호 갱신 - MemberNmCryptoController 신설 — 회원 이름 암호화 백필 트리거 - SessionPolicyInterceptor에 stampLogin/clearLoginStamp 추가 (EgovLoginController가 참조 — 이게 없으면 컴파일되지 않는다) - pom: mysql-connector를 5.1.17로 고정(8.0.20 비활성화). 배포 환경의 WEB-INF/lib 실측값과 일치시켜 WAR 배포 시 드라이버가 바뀌는 지뢰를 제거 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>제안요약서 slide15 "로그 조회 및 감사 기능"의 구성요소 중 "관리자 알림". 종전에는 무결성 위반을 에러 로그로만 남겨서, 로그를 들여다보지 않으면 아무도 모르는 상태였다 — 탐지해 놓고 알리지 않으면 탐지의 의미가 없다. · PrivacyAdminAlertService + Impl 신설 - 무결성 위반 탐지 시(해시체인 검증 배치) - 이상행위 탐지 시(정기점검 배치, 0건인 달은 보내지 않음) 매달 "0건" 메일이 오면 곧 아무도 열지 않는다. · 채널은 메일 — 다만 문서 근거는 없다 RFP·제안서 어디에도 알림 채널이 명시돼 있지 않다("관리자 알림" 네 글자뿐). ACCOUNT_MNG_POLICY.ADMIN_EMAIL 이 이미 있고 휴면 사전알림이 그 주소로 메일을 보내고 있어 같은 경로를 재사용했다. 운영에서 메일 장애를 한 곳에서 확인할 수 있어야 한다는 이유도 있다. SMS 는 문자발송모듈 연동규격이 미확정이라(SFR-003 과 같은 블로커) 붙일 수 없다. → 채널 확정은 발주기관 협의 항목으로 남긴다. · 메일에 개인정보 본문을 담지 않는다 건수·기간·취급자 계정ID·요약만 넣고 상세는 화면에서 보게 한다. 메일함이 개인정보 저장소가 되면 안 된다. · 배치를 막지 않는다 발송 실패·수신주소 미설정 모두 로그만 남기고 배치는 계속한다. 다만 미설정은 WARN 으로 구분해 남긴다 — "알림이 안 왔다"와 "보낼 주소가 없다"는 다른 문제다. 검증: mvn compile EXIT=0, 로컬 반영 후 재기동 정상(빈 생성 오류 0건 — privacyAdminAlertService/sndngMailRegistService/accountMngDAO 배선 확인), frt/main.do 200. 실제 발송은 월 1회 배치라 이번에 실행하지 못했다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>· 테스트 발송 버튼 — [계정 관리 정책] 화면의 관리자 수신 이메일 옆 실제 알림은 월 1회 배치에서만 나가서, 수신 주소를 바꾼 관리자가 그것이 맞는지 한 달을 기다려야 확인할 수 있었다. 같은 발송 경로(수신주소 조회 → 메일 모듈 적재·발송)를 그대로 타는 테스트를 눌러 즉시 결과를 본다. 경로가 다르면 테스트가 통과해도 실제 알림은 실패할 수 있으므로 반드시 같은 경로여야 한다. - 성공·실패 모두 서버가 준 사유를 그대로 화면에 띄운다. "실패했습니다"만 뜨면 주소 미설정인지 메일서버 문제인지 구분할 수 없다. - 메일 모듈이 예외 없이 false 를 반환하는 경우도 실패로 잡는다 (insertSndngMail 은 적재 후 곧바로 전송하고 실패 시 결과코드를 'F' 로 갱신한다. 예외가 없다고 발송된 것이 아니다). - 상태를 바꾸지는 않지만 외부로 메일이 나가므로 POST·동일출처만 받는다. · 발주기관 확인 항목.txt 신규 제안요청서·제안서만으로 결정할 수 없어 발주기관 확인이 필요한 항목을 근거 문구·현재 구현 상태·미확정 시 영향과 함께 정리했다. A(개발 완료 조건) / B(운영정보 필요) / C(문서에 명시 없음) / D(사업관리)로 나눴고, 확인 없이 진행한 값은 근거를 명시해 [참고] 절에 따로 적었다. 검증: mvn compile EXIT=0, JSP Jasper 오류 0건, 로컬 반영·재기동 정상 (빈 생성 오류 0건), 정책화면 302→로그인. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>웹취약점 점검(SER-004)에서 확인된 휴면계정 관련 취약점 2건 조치. 1) 인증 없는 휴면계정 해제 (CWE-306, 긴급) - actionDiapause.do 가 요청 파라미터 mber_id 만으로 즉시 deleteDiapause 실행 → 아이디만 알면 제3자가 임의 계정의 휴면을 해제할 수 있었음(로컬 PoC 실증). - 파라미터를 신뢰하지 않고, ID/PW 인증 성공 시에만 세션에 적재되는 diapauseVO 의 mber_id 로만 해제. 세션 부재 시 resCode=002 거부, 성공 시 1회성 소거. - 정상 경로 releaseDiapauseAjax(토큰 검증)와 동일 원칙. 정상 사용자는 원래도 세션값(${sessionScope.diapauseVO.mber_id})을 보냈으므로 결과 동일(회귀 없음). - mbl/EgovDiapause.jsp: resCode 분기로 거부 시 재로그인 안내. 2) 예측 가능한 난수 (CWE-330, 중) - 휴면 활성화 메일 토큰(20자) 생성을 java.util.Random → SecureRandom 으로 교체. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AbEjijyQdS54xso1d2ks3u1) 계정정보 하드코딩 (CWE-798) - SmsBasicDBUtil 의 JDBC URL/USER/PASSWORD 소스 하드코딩 제거 → EgovProperties(Globals.sms.jdbc.url/username/password)로 외부화. ※ globals-*.properties 는 .gitignore 대상(자격증명 미추적)이므로, 배포 환경마다 아래 키를 별도 설정해야 한다: Globals.sms.jdbc.url / .username / .password 2) 보안 응답 헤더 (CWE-693 등) - web.xml 에 Tomcat HttpHeaderSecurityFilter 추가. X-Frame-Options: SAMEORIGIN(관리자 iframe 사용 → DENY 아님), X-Content-Type-Options: nosniff. HSTS 는 HTTP 환경 오작동 방지로 off(운영 HTTPS 시 on). - 쿠키 HttpOnly 는 Tomcat 기본 적용 확인(추가 조치 불요). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AbEjijyQdS54xso1d2ks3uCheckout
From your project repository, check out a new branch and test the changes.