Week 11 — ISO 27001 보안 컨설팅 보고서 (DNA Lab)
전체 보고서 및 데이터 파일은 GitHub에서 확인할 수 있습니다. hojjang98 / skshielders-rookies-28 — projects/week_11
프로젝트 개요
| 항목 | 내용 |
|---|---|
| 클라이언트 | DNA Lab (유전자 검사 헬스케어 스타트업) |
| 컨설팅사 | SK Shields 보안 컨설팅팀 |
| 평가 기간 | 2026-01-04 ~ 2026-01-11 |
| 목표 | ISO 27001 인증 취득을 위한 취약점 분석 및 개선 로드맵 제시 |
이 프로젝트는 Week 10 DNA Lab Security Scanner 로 수집한 스캔 결과를 ISO 27001:2022 통제항목 과 직접 매핑하여 실무 수준의 보안 컨설팅 보고서를 작성한 작업이다.
배경 시나리오
DNA Lab 은 고객의 민감한 유전 정보와 의료 데이터를 다루는 헬스케어 스타트업이다. 최근 Series B 투자 유치 에 성공하고, 대형 병원·보험사와 B2B 계약을 추진 중이다.
문제는 계약 조건으로 ISO 27001 인증 을 요구받았다는 것이다. 내부 보안팀의 자체 스캔 결과 심각한 취약점이 다수 발견되어, 6개월 내 인증 취득을 목표로 외부 컨설팅을 의뢰하였다.
보안 개선은 단순한 비용이 아닌, 기업 가치를 높이고 B2B 계약을 성사시키는 투자다.
주요 발견사항 — 취약점 통계
총 취약점 27개 / 총 발견사항 102개 / 평균 CVSS 7.10
심각도별 분포:
┌──────────┬──────┬─────────────────────────────────────────────────┐
│ 심각도 │ 수 │ 대표 취약점 │
├──────────┼──────┼─────────────────────────────────────────────────┤
│ CRITICAL │ 4 │ SQL Injection (CVSS 9.8), OS Command Injection │
│ │ │ 쿠키 변조 (CVSS 9.1), 파일 전송 취약점 │
├──────────┼──────┼─────────────────────────────────────────────────┤
│ HIGH │ 12 │ XSS, CSRF, IDOR, SSRF │
│ │ │ OS 보안 설정 미흡, 불필요한 서비스 활성화 │
├──────────┼──────┼─────────────────────────────────────────────────┤
│ MEDIUM │ 10 │ 로깅 미흡, 보안 정책 부재, 파일 권한 문제 │
├──────────┼──────┼─────────────────────────────────────────────────┤
│ LOW │ 1 │ 에러 핸들링 미흡 │
└──────────┴──────┴─────────────────────────────────────────────────┘
Critical + High 합산 비율 => 59.3%
Critical 취약점 4종 상세
WEB-002 SQL Injection (CVSS 9.8)
- 발견 지점 28개 — MyBatis XML 전체에서
${}파라미터 바인딩 사용 - 영향: 고객 유전자 정보 및 개인정보 전체 유출 가능, GDPR / 개인정보보호법 위반 소지
- 예상 피해액: 수십억 원 (데이터 유출 시 과징금 + 손해배상 포함)
WEB-003 OS Command Injection (CVSS 9.8)
- Java
Runtime.getRuntime().exec()에 사용자 입력 직접 전달 - 영향: 서버 OS 명령 실행 가능 => 시스템 전체 제어권 탈취
WEB-009 쿠키 기반 권한 관리 취약점 (CVSS 9.1)
- 쿠키 값 변조로 관리자 권한 상승 가능
- 발견 지점 3개
WEB-010 파일 업로드 취약점 (CVSS 9.8)
- 확장자 / MIME 타입 검증 없음 => 웹쉘 업로드 가능
- 발견 지점 2개 => 내부망 침투 경로 제공, 랜섬웨어 감염 위험
ISO 27001:2022 Gap Analysis
14개 통제항목을 평가한 결과, 단 하나도 완전 준수 상태가 아니었다.
준수 상태 분포:
Compliant : 0개 (0%)
Partially Compliant: 10개 (71%)
Non-Compliant : 2개 (14%)
Critical Gap : 2개 (14%)
Critical Gap 통제항목
A.8.3 — 정보 접근 제한 (9개 취약점 연결)
- IDOR, 권한 상승, 세션 관리 취약점이 집중적으로 연결됨
- 현재 상태: 접근 제어 로직이 일관되게 적용되지 않음
A.8.16 — 모니터링 활동 (7개 취약점 연결)
- 보안 이벤트 로깅 체계 자체가 부재
- 현재 상태: 비정상 접근 탐지 불가, 침해 후 추적 불가
Non-Compliant 통제항목
A.8.8 — 기술적 취약점 관리 (4개 취약점)
- 취약점 식별 및 패치 프로세스 미수립
A.5.17 — 인증 정보 관리 (4개 취약점)
- 비밀번호 정책 미흡, 계정 잠금 미설정
핵심 취약점 개선 예시
Before / After — SQL Injection (WEB-002)
기존 코드 — MyBatis XML ${} 사용 (문자열 직접 삽입):
SELECT * FROM users
WHERE username = '${username}'
AND password = '${password}'
=> 공격자 입력: admin' OR '1'='1 --
=> 실행 쿼리: WHERE username='admin' OR '1'='1' --' AND password='...'
=> 비밀번호 검증 완전 우회
개선 코드 — #{} 로 전환 (Prepared Statement 자동 적용):
SELECT * FROM users
WHERE username = #{username}
AND password = #{password}
=> 동일 입력: admin' OR '1'='1 --
=> 문자열 전체가 하나의 파라미터 값으로 바인딩
=> SQL 구문으로 해석 불가 => 공격 차단
Before / After — OS Command Injection (WEB-003)
기존 코드 — 사용자 입력을 OS 명령에 직접 연결:
@PostMapping("/ping")
public String ping(@RequestParam String host) {
String command = "ping " + host; // 명령 삽입 가능
Runtime.getRuntime().exec(command);
return "success";
}
=> 공격자 입력: 8.8.8.8; rm -rf /var/www/html
=> 실행: ping 8.8.8.8; rm -rf /var/www/html (서버 파일 삭제)
개선 코드 — 화이트리스트 검증 + ProcessBuilder 인수 분리:
@PostMapping("/ping")
public String ping(@RequestParam String host) {
// 숫자와 점(.)만 허용하는 화이트리스트 검증
if (!host.matches("^[0-9.]+$")) {
throw new IllegalArgumentException("Invalid host");
}
// 인수를 배열로 분리 => 명령 삽입 원천 차단
ProcessBuilder pb = new ProcessBuilder("ping", "-c", "4", host);
pb.start();
return "success";
}
6개월 개선 로드맵
Phase 1 — Quick Win (즉시, 1주 이내)
4개 Critical 취약점 긴급 패치:
- SQL Injection 28개 지점 전체 제거 (MyBatis
${}=>#{}전환) - OS Command Injection 차단 (Runtime.exec() 제거, ProcessBuilder + 화이트리스트)
- 쿠키 기반 권한 관리 전면 재구축 (JWT 또는 서버 세션 기반으로 전환)
- 파일 업로드 보안 강화 (화이트리스트 확장자 + Magic Bytes 검증)
Phase 2 — Short-term (1 ~ 2개월)
12개 High 취약점 해결:
- 접근 제어 강화 (IDOR 방어, 모든 리소스에 소유자 검증 추가)
- 세션 관리 개선 (세션 고정 공격 방어, 로그아웃 시 서버 세션 삭제)
- OS 보안 설정 강화 (비밀번호 복잡도 정책, 계정 잠금 임계치 설정)
- 불필요한 서비스 비활성화 (NFS,익명 FTP, r 계열 서비스 등)
Phase 2 완료 시점 (약 3개월) => ISO 27001 인증 신청 가능
Phase 3 — Mid-term (2 ~ 4개월)
10개 Medium 취약점 해결:
- 로깅 및 모니터링 체계 구축 (SIEM 연동, 보안 이벤트 실시간 감지)
- 보안 정책 수립 및 배포 (취약점 관리 절차, 사고 대응 플레이북)
- 파일 권한 전수 정비 (서버 전체 SUID/SGID 점검)
Phase 4 — Long-term (4 ~ 6개월)
지속적 개선 체계 수립:
- 전직원 보안 인식 교육 프로그램 운영
- 정기 취약점 진단 체계 확립 (분기 1회 이상)
- 에러 핸들링 표준화 (내부 오류 정보 외부 노출 제거)
예상 비용 및 인력
투입 인력 계획
보안 엔지니어 : 2명 (전담)
백엔드 개발자 : 3명 (파트타임)
인프라 엔지니어: 1명 (파트타임)
외부 컨설턴트 : 1명 (주간 리뷰)
단계별 예상 비용
| 단계 | 기간 | 비용 |
|---|---|---|
| Phase 1 — 긴급 패치 | 1주 | 약 3,000만 원 |
| Phase 2 — High 해결 | 1~2개월 | 약 5,000만 원 |
| Phase 3~4 — 중장기 | 2~6개월 | 약 4,000만 원 |
| 합계 | 6개월 | 약 1억 2,000만 원 |
산출물 구성
| 파일 | 형식 | 대상 독자 |
|---|---|---|
| executive_summary.txt | 텍스트 | 경영진 — 비즈니스 리스크 + 비용 + 일정 중심 |
| technical_report.txt | 텍스트 | 기술팀 — Before/After 코드 + 구체적 수정 방안 |
| all_vulnerabilities.csv | CSV | 분석용 — 27개 취약점 전체 원본 데이터 |
| gap_analysis.csv | CSV | 감사용 — ISO 27001 통제항목별 준수성 평가 |
| remediation_roadmap.csv | CSV | PM용 — 단계별 개선 작업 계획 |
| vulnerability_analysis.png | PNG | 시각화 — 심각도 분포, CVSS 히스토그램, 취약점 유형 비율 |
데이터 분석 프로세스
1. 취약점 데이터 구조화
Week 10 스캔 결과 => CSV / DataFrame 변환
2. CVSS 스코어링 및 심각도 분류
각 취약점에 CVSS v3.1 기준 점수 산정
3. ISO 27001:2022 통제항목 매핑
취약점 => 관련 통제항목(A.5.x, A.8.x) 연결
4. Gap Analysis
현재 상태 vs ISO 27001 요구사항 비교
=> Compliant / Partially Compliant / Non-Compliant / Critical Gap 분류
5. 우선순위 기반 로드맵 생성
CVSS 점수 + 비즈니스 영향도 조합으로 처리 순서 결정
6. 시각화 및 이중 보고서 작성
경영진용 Executive Summary + 기술팀용 Technical Report
학습 성과 정리
| 영역 | 학습 내용 |
|---|---|
| 컨설팅 프로세스 | 진단 결과 => ISO 표준 매핑 => Gap Analysis => 로드맵 도출 전체 흐름 |
| ISO 27001 | 통제항목(A.5.x, A.8.x) 구조 및 실제 취약점과의 연결 관계 |
| 리스크 커뮤니케이션 | 기술적 취약점을 비즈니스 언어(예상 피해액, 계약 리스크)로 전환 |
| 보고서 이중화 | 경영진용(Executive Summary)과 기술팀용(Technical Report) 분리 작성 |
| 데이터 기반 분석 | Pandas + Matplotlib 으로 취약점 분포 시각화 |