{
  "rulesets" : [ {
    "id" : "MOIS",
    "name" : "행안부 소프트웨어 개발보안 가이드(2021 개정판)",
    "description" : "행정안전부·KISA 「소프트웨어 개발보안 가이드」 구현단계 보안약점 49개 전체 (공공기관 정보화사업 의무 기준)",
    "ruleCount" : 49,
    "automatedCount" : 42
  }, {
    "id" : "OWASP_TOP10",
    "name" : "OWASP Top 10 (2021)",
    "description" : "OWASP Top 10 2021에 대응하는 행안부 보안약점 항목만 선별 검사",
    "ruleCount" : 37,
    "automatedCount" : 34
  }, {
    "id" : "CWE_TOP25",
    "name" : "CWE Top 25",
    "description" : "CWE Top 25 최위험 소프트웨어 약점에 대응하는 항목만 선별 검사",
    "ruleCount" : 16,
    "automatedCount" : 14
  } ],
  "rules" : [ {
    "id" : "IN-01",
    "name" : "SQL 삽입",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-89",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "검증되지 않은 외부 입력값이 SQL 질의문에 문자열 연결로 삽입되면 공격자가 질의 구조를 조작할 수 있다.",
    "guidance" : "문자열 연결 대신 PreparedStatement 바인딩(?)을 사용하고, MyBatis에서는 ${} 대신 #{}을 사용한다. 동적 정렬컬럼 등 바인딩 불가 값은 화이트리스트로 검증한다."
  }, {
    "id" : "IN-02",
    "name" : "코드 삽입",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-94",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "외부 입력값이 동적으로 해석·실행되는 코드(스크립트, 표현식)에 삽입되면 임의 코드 실행이 가능하다.",
    "guidance" : "eval 계열 API에 외부 입력을 전달하지 않는다. 불가피하면 실행 가능한 값 목록을 화이트리스트로 제한한다."
  }, {
    "id" : "IN-03",
    "name" : "경로 조작 및 자원 삽입",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-22",
    "owasp" : "A01:2021 Broken Access Control",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "외부 입력값으로 파일 경로나 자원 식별자를 조작하면 임의 파일 접근(../ 상위 이동 등)이 가능하다.",
    "guidance" : "입력값에서 경로 문자열(.., /, \\\\)을 제거·검증하고, 허용된 파일명 화이트리스트나 정규화 후 기준 디렉터리 검사(getCanonicalPath startsWith)를 적용한다."
  }, {
    "id" : "IN-04",
    "name" : "크로스사이트 스크립트(XSS)",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-79",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "검증되지 않은 외부 입력값이 HTML/스크립트로 출력되면 사용자 브라우저에서 악성 스크립트가 실행된다.",
    "guidance" : "출력 시 HTML 이스케이프를 적용한다. JSP는 <c:out>/fn:escapeXml, Thymeleaf는 th:text(기본 이스케이프)를 사용하고 th:utext·escapeXml=false 사용을 피한다."
  }, {
    "id" : "IN-05",
    "name" : "운영체제 명령어 삽입",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-78",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "외부 입력값이 OS 명령 문자열에 포함되면 임의 시스템 명령 실행이 가능하다.",
    "guidance" : "외부 입력으로 명령을 조립하지 않는다. 불가피하면 실행 가능 명령 화이트리스트로 제한하고 인자를 배열로 분리 전달한다(쉘 경유 금지)."
  }, {
    "id" : "IN-06",
    "name" : "위험한 형식 파일 업로드",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-434",
    "owasp" : "A04:2021 Insecure Design",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "확장자·크기·타입 검증 없이 업로드를 허용하면 서버측 실행파일(JSP 등) 업로드로 원격 코드 실행이 가능하다.",
    "guidance" : "확장자 화이트리스트·MIME 타입·크기 제한을 검증하고, 저장 파일명은 무작위로 재생성하며, 업로드 디렉터리는 웹루트 밖 또는 실행권한 제거 상태로 둔다."
  }, {
    "id" : "IN-07",
    "name" : "신뢰되지 않는 URL 주소로 자동접속 연결",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "중",
    "cwe" : "CWE-601",
    "owasp" : "A01:2021 Broken Access Control",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "외부 입력값으로 리다이렉트 대상을 결정하면 피싱 사이트로 자동 연결(오픈 리다이렉트)에 악용될 수 있다.",
    "guidance" : "리다이렉트 대상 URL을 화이트리스트로 관리하거나, 내부 경로만 허용하도록 검증한다."
  }, {
    "id" : "IN-08",
    "name" : "부적절한 XML 외부개체 참조(XXE)",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-611",
    "owasp" : "A05:2021 Security Misconfiguration",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "외부 엔티티 처리가 허용된 XML 파서로 신뢰할 수 없는 XML을 파싱하면 서버 파일 노출·SSRF가 가능하다.",
    "guidance" : "XML 파서 팩토리에 DTD/외부엔티티 비활성 설정(disallow-doctype-decl 등)을 적용한다."
  }, {
    "id" : "IN-09",
    "name" : "XML 삽입(XPath/XQuery)",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-91",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "외부 입력값이 XPath/XQuery 질의에 문자열 연결로 삽입되면 질의 구조를 조작할 수 있다.",
    "guidance" : "XPath 변수 바인딩(XPathVariableResolver)을 사용하거나 입력값의 특수문자(' \" [ ] 등)를 검증한다."
  }, {
    "id" : "IN-10",
    "name" : "LDAP 삽입",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-90",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "외부 입력값이 LDAP 검색 필터에 삽입되면 필터 구조를 조작해 인증 우회·정보 노출이 가능하다.",
    "guidance" : "LDAP 필터 특수문자( * ( ) \\\\ NUL )를 이스케이프하고, Spring LdapTemplate 은 Filter API 로 조립한다."
  }, {
    "id" : "IN-11",
    "name" : "크로스사이트 요청 위조(CSRF)",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "중",
    "cwe" : "CWE-352",
    "owasp" : "A01:2021 Broken Access Control",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "요청 위조 방지 토큰 없이 상태변경 요청을 처리하면 사용자 의도와 무관한 요청이 위조 실행될 수 있다.",
    "guidance" : "Spring Security CSRF 보호를 활성 상태로 유지하고(disable 금지), 상태변경은 POST/PUT/DELETE + CSRF 토큰으로 처리한다."
  }, {
    "id" : "IN-12",
    "name" : "서버사이드 요청 위조(SSRF)",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-918",
    "owasp" : "A10:2021 SSRF",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "외부 입력값으로 서버가 요청할 URL을 결정하면 내부망 자원에 대한 임의 요청이 가능하다.",
    "guidance" : "요청 가능한 호스트/URL을 화이트리스트로 제한하고, 내부 IP 대역·메타데이터 주소로의 요청을 차단한다."
  }, {
    "id" : "IN-13",
    "name" : "HTTP 응답분할",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "중",
    "cwe" : "CWE-113",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "외부 입력값의 CR/LF 문자가 응답 헤더에 삽입되면 응답을 분할해 캐시 오염·XSS에 악용될 수 있다.",
    "guidance" : "헤더·쿠키에 외부 값을 넣기 전에 \\r, \\n 문자를 제거한다."
  }, {
    "id" : "IN-14",
    "name" : "정수형 오버플로우",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "중",
    "cwe" : "CWE-190",
    "owasp" : null,
    "rulesets" : [ "MOIS", "CWE_TOP25" ],
    "description" : "외부 입력 기반 산술 연산 결과가 자료형 범위를 초과하면 예상 밖 동작(음수 크기, 무한루프 등)이 발생한다.",
    "guidance" : "외부 입력을 수치로 변환한 뒤 유효 범위를 검증하고, 큰 연산은 Math.addExact/multiplyExact 또는 long/BigInteger 를 사용한다."
  }, {
    "id" : "IN-15",
    "name" : "보안기능 결정에 사용되는 부적절한 입력값",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "중",
    "cwe" : "CWE-20",
    "owasp" : "A04:2021 Insecure Design",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "쿠키·히든필드·헤더 등 사용자가 변조 가능한 값으로 인증·권한을 결정하면 권한 상승이 가능하다.",
    "guidance" : "권한·인증 상태는 서버 세션/토큰 검증 결과로만 판단하고, 요청 파라미터·쿠키 값을 신뢰하지 않는다."
  }, {
    "id" : "IN-16",
    "name" : "메모리 버퍼 오버플로우",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "상",
    "cwe" : "CWE-119",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "버퍼 경계 밖 읽기/쓰기(주로 C/C++). Java 는 배열 경계검사로 대부분 방지되며 JNI·직접버퍼 사용부가 대상이다.",
    "guidance" : "JNI 네이티브 코드와 ByteBuffer 직접 조작부에서 인덱스·길이를 검증한다. (Java 웹 애플리케이션은 일반적으로 수동 점검 대상)"
  }, {
    "id" : "IN-17",
    "name" : "포맷 스트링 삽입",
    "category" : "입력데이터 검증 및 표현",
    "severity" : "중",
    "cwe" : "CWE-134",
    "owasp" : "A03:2021 Injection",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "외부 입력값이 포맷 문자열로 사용되면 예외 유발·정보 노출이 가능하다.",
    "guidance" : "포맷 문자열은 상수로 두고, 외부 입력은 포맷 인자로만 전달한다."
  }, {
    "id" : "SF-01",
    "name" : "적절한 인증 없는 중요기능 허용",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-306",
    "owasp" : "A07:2021 Identification and Authentication Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "인증 확인 없이 중요기능(개인정보 조회·변경, 관리기능 등)에 접근을 허용하면 비인가 사용이 가능하다.",
    "guidance" : "중요기능 진입 전 서버측 인증 상태를 확인하고, Spring Security 접근규칙에서 permitAll 남용을 피한다. 비밀번호 변경 등은 재인증을 요구한다."
  }, {
    "id" : "SF-02",
    "name" : "부적절한 인가",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-285",
    "owasp" : "A01:2021 Broken Access Control",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "인증 후 자원 소유자·권한 검증을 누락하면 식별자 변조만으로 타인 데이터 접근(IDOR)이 가능하다.",
    "guidance" : "데이터 조회·수정 시 요청 식별자의 소유자가 현재 사용자와 일치하는지 서버에서 검증한다. (정적 탐지 한계로 수동 점검 항목)"
  }, {
    "id" : "SF-03",
    "name" : "중요한 자원에 대한 잘못된 권한 설정",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-732",
    "owasp" : "A01:2021 Broken Access Control",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "설정파일·키·로그 등 중요 자원에 모든 사용자 접근 권한을 부여하면 정보 노출·변조가 가능하다.",
    "guidance" : "자원 권한은 최소권한 원칙으로 설정한다(소유자 전용 등). setReadable/setWritable(true, false)·chmod 777 을 금지한다."
  }, {
    "id" : "SF-04",
    "name" : "취약한 암호화 알고리즘 사용",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-327",
    "owasp" : "A02:2021 Cryptographic Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "DES·RC4·MD5·SHA-1 등 안전성이 깨진 알고리즘이나 ECB 모드를 사용하면 암호화가 무력화될 수 있다.",
    "guidance" : "대칭키는 AES-256(GCM 권장), 해시는 SHA-256 이상, 비밀번호 저장은 BCrypt/PBKDF2/Argon2 를 사용한다."
  }, {
    "id" : "SF-05",
    "name" : "암호화되지 않은 중요정보",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-311",
    "owasp" : "A02:2021 Cryptographic Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "비밀번호·개인정보를 평문으로 저장·전송하거나 로그에 남기면 유출 시 그대로 노출된다.",
    "guidance" : "중요정보는 저장 시 암호화(비밀번호는 일방향 해시)하고, 전송은 TLS(https)로 하며, 로그에는 중요정보를 기록하지 않는다."
  }, {
    "id" : "SF-06",
    "name" : "하드코드된 중요정보",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-798",
    "owasp" : "A07:2021 Identification and Authentication Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "비밀번호·암호키를 소스코드에 상수로 포함하면 배포물 역컴파일 등으로 그대로 노출된다.",
    "guidance" : "비밀번호·키는 환경변수·보호된 설정저장소(Vault 등)에서 주입하고, 소스와 저장소에는 placeholder 만 남긴다."
  }, {
    "id" : "SF-07",
    "name" : "충분하지 않은 키 길이 사용",
    "category" : "보안기능",
    "severity" : "중",
    "cwe" : "CWE-326",
    "owasp" : "A02:2021 Cryptographic Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "짧은 암호키(RSA 2048 미만 등)는 연산력 증가로 해독될 수 있다.",
    "guidance" : "RSA ≥ 2048, ECC ≥ 224, 대칭키 ≥ 128비트를 사용한다."
  }, {
    "id" : "SF-08",
    "name" : "적절하지 않은 난수 값 사용",
    "category" : "보안기능",
    "severity" : "중",
    "cwe" : "CWE-330",
    "owasp" : "A02:2021 Cryptographic Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "java.util.Random·Math.random 은 예측 가능하므로 세션토큰·인증번호 등 보안목적에 사용하면 안 된다.",
    "guidance" : "보안 용도 난수는 SecureRandom 을 사용한다."
  }, {
    "id" : "SF-09",
    "name" : "취약한 비밀번호 허용",
    "category" : "보안기능",
    "severity" : "중",
    "cwe" : "CWE-521",
    "owasp" : "A07:2021 Identification and Authentication Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "비밀번호 길이·조합 정책 없이 짧고 단순한 비밀번호를 허용하면 무차별 대입에 취약하다.",
    "guidance" : "KISA 기준(영문 대/소문자·숫자·특수문자 조합, 최소 8~10자 이상)의 비밀번호 정책 검증을 회원가입·변경 로직에 구현한다. (수동 점검 항목)"
  }, {
    "id" : "SF-10",
    "name" : "부적절한 전자서명 확인",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-347",
    "owasp" : "A08:2021 Software and Data Integrity Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "서명 검증 없이(또는 잘못 검증하고) 데이터·토큰을 신뢰하면 위조 데이터가 수용된다.",
    "guidance" : "JWT 는 서명 검증 API(parseClaimsJws/parseSignedClaims)를 사용하고 alg:none 을 거부한다. Signature.verify 결과를 반드시 확인한다."
  }, {
    "id" : "SF-11",
    "name" : "부적절한 인증서 유효성 검증",
    "category" : "보안기능",
    "severity" : "상",
    "cwe" : "CWE-295",
    "owasp" : "A07:2021 Identification and Authentication Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "TLS 인증서 검증을 무력화(모든 인증서/호스트명 허용)하면 중간자 공격에 노출된다.",
    "guidance" : "신뢰 저장소 기반 기본 검증을 사용하고, TrustManager/HostnameVerifier 무력화 코드를 제거한다."
  }, {
    "id" : "SF-12",
    "name" : "사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출",
    "category" : "보안기능",
    "severity" : "중",
    "cwe" : "CWE-539",
    "owasp" : "A07:2021 Identification and Authentication Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "중요정보를 영속 쿠키에 저장하면 디스크에 남아 노출될 수 있다.",
    "guidance" : "중요정보는 쿠키에 저장하지 않고 서버 세션에 보관한다. 쿠키에는 Secure·HttpOnly 속성을 설정하고 만료를 최소화한다."
  }, {
    "id" : "SF-13",
    "name" : "주석문 안에 포함된 시스템 주요정보",
    "category" : "보안기능",
    "severity" : "하",
    "cwe" : "CWE-615",
    "owasp" : "A05:2021 Security Misconfiguration",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "주석에 계정·비밀번호·내부 IP 등이 남아 있으면 소스 유출 시 그대로 노출된다.",
    "guidance" : "배포 전 주석의 계정정보·키·내부정보를 제거한다."
  }, {
    "id" : "SF-14",
    "name" : "솔트 없이 일방향 해쉬함수 사용",
    "category" : "보안기능",
    "severity" : "중",
    "cwe" : "CWE-759",
    "owasp" : "A02:2021 Cryptographic Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "솔트 없는 해시는 레인보우 테이블 공격으로 원문(비밀번호) 복원이 가능하다.",
    "guidance" : "비밀번호는 솔트를 결합한 해시 또는 BCrypt/PBKDF2/Argon2 를 사용한다."
  }, {
    "id" : "SF-15",
    "name" : "무결성 검사 없는 코드 다운로드",
    "category" : "보안기능",
    "severity" : "중",
    "cwe" : "CWE-494",
    "owasp" : "A08:2021 Software and Data Integrity Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "원격에서 받은 코드를 무결성 검증 없이 로드·실행하면 변조된 코드가 실행될 수 있다.",
    "guidance" : "원격 코드 로드는 지양하고, 불가피하면 서명·해시 검증 후 로드한다. 평문 HTTP 로드는 금지한다."
  }, {
    "id" : "SF-16",
    "name" : "반복된 인증시도 제한 기능 부재",
    "category" : "보안기능",
    "severity" : "중",
    "cwe" : "CWE-307",
    "owasp" : "A07:2021 Identification and Authentication Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "로그인 실패 횟수 제한이 없으면 무차별 대입 공격이 가능하다.",
    "guidance" : "일정 횟수 인증 실패 시 계정 잠금·지연·캡차를 적용한다. (수동 점검 항목)"
  }, {
    "id" : "TS-01",
    "name" : "경쟁조건: 검사시점과 사용시점(TOCTOU)",
    "category" : "시간 및 상태",
    "severity" : "중",
    "cwe" : "CWE-367",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "자원 검사와 사용 사이에 상태가 바뀔 수 있는 병렬 환경에서 검사 결과를 신뢰하면 오동작·권한 문제가 생긴다.",
    "guidance" : "공유자원 접근은 동기화 구간에서 검사와 사용을 함께 수행하고, 파일은 exists 검사 대신 원자적 API(Files.createFile 등)를 사용한다. (수동 점검 항목)"
  }, {
    "id" : "TS-02",
    "name" : "종료되지 않는 반복문 또는 재귀함수",
    "category" : "시간 및 상태",
    "severity" : "중",
    "cwe" : "CWE-674",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "종료조건 없는 루프·재귀는 자원 고갈(서비스 거부)로 이어질 수 있다.",
    "guidance" : "루프·재귀에 명확한 종료조건과 최대 반복 횟수를 둔다. 외부 입력이 반복 횟수를 결정하지 않게 한다."
  }, {
    "id" : "EH-01",
    "name" : "오류 메시지 정보노출",
    "category" : "에러처리",
    "severity" : "중",
    "cwe" : "CWE-209",
    "owasp" : "A05:2021 Security Misconfiguration",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "스택트레이스·시스템 정보가 사용자 화면에 노출되면 공격에 필요한 내부 구조 정보를 제공하게 된다.",
    "guidance" : "예외는 로거로 기록하고 사용자에게는 일반화된 메시지만 보여준다. printStackTrace 사용을 금지하고 공통 오류페이지를 설정한다."
  }, {
    "id" : "EH-02",
    "name" : "오류 상황 대응 부재",
    "category" : "에러처리",
    "severity" : "중",
    "cwe" : "CWE-390",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "예외를 잡고 아무 처리도 하지 않으면 오류 상황이 은폐되어 비정상 상태로 계속 실행된다.",
    "guidance" : "catch 블록에서 최소한 로깅과 적절한 복구/전파를 수행한다."
  }, {
    "id" : "EH-03",
    "name" : "부적절한 예외 처리",
    "category" : "에러처리",
    "severity" : "하",
    "cwe" : "CWE-755",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "광범위한 예외(Exception/Throwable)를 하나로 처리하면 상황별 적절한 대응이 어렵다.",
    "guidance" : "구체적인 예외 타입별로 catch 하여 상황에 맞게 처리한다."
  }, {
    "id" : "CE-01",
    "name" : "Null Pointer 역참조",
    "category" : "코드오류",
    "severity" : "중",
    "cwe" : "CWE-476",
    "owasp" : null,
    "rulesets" : [ "MOIS", "CWE_TOP25" ],
    "description" : "null 을 반환할 수 있는 값을 검사 없이 사용하면 NullPointerException 으로 비정상 종료된다.",
    "guidance" : "null 가능 반환값(getParameter, getSession(false), map.get 등)은 사용 전 null 검사를 한다. 문자열 비교는 상수를 앞에 둔다."
  }, {
    "id" : "CE-02",
    "name" : "부적절한 자원 해제",
    "category" : "코드오류",
    "severity" : "중",
    "cwe" : "CWE-404",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "열린 스트림·커넥션을 해제하지 않으면 자원 누수로 장애가 발생할 수 있다.",
    "guidance" : "try-with-resources 를 사용하거나 finally 에서 확실히 close 한다."
  }, {
    "id" : "CE-03",
    "name" : "해제된 자원 사용",
    "category" : "코드오류",
    "severity" : "중",
    "cwe" : "CWE-416",
    "owasp" : null,
    "rulesets" : [ "MOIS", "CWE_TOP25" ],
    "description" : "이미 close 한 자원을 다시 사용하면 예외·비정상 동작이 발생한다.",
    "guidance" : "자원의 해제 시점을 명확히 하고, try-with-resources 범위 밖에서 자원을 사용하지 않는다. (수동 점검 항목)"
  }, {
    "id" : "CE-04",
    "name" : "초기화되지 않은 변수 사용",
    "category" : "코드오류",
    "severity" : "하",
    "cwe" : "CWE-457",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "초기화 전 변수를 사용하면 의도하지 않은 값으로 동작할 수 있다. (Java 는 컴파일러가 대부분 차단)",
    "guidance" : "변수는 선언 시 초기화하고, 분기별 할당 누락이 없는지 확인한다. (수동 점검 항목)"
  }, {
    "id" : "CE-05",
    "name" : "신뢰할 수 없는 데이터의 역직렬화",
    "category" : "코드오류",
    "severity" : "상",
    "cwe" : "CWE-502",
    "owasp" : "A08:2021 Software and Data Integrity Failures",
    "rulesets" : [ "MOIS", "OWASP_TOP10", "CWE_TOP25" ],
    "description" : "외부에서 온 데이터를 검증 없이 역직렬화하면 원격 코드 실행 등 심각한 공격이 가능하다.",
    "guidance" : "자바 기본 직렬화 수신을 피하고 JSON 등 데이터 전용 포맷을 사용한다. 불가피하면 ObjectInputFilter 로 허용 클래스를 제한한다."
  }, {
    "id" : "EC-01",
    "name" : "잘못된 세션에 의한 데이터 정보 노출",
    "category" : "캡슐화",
    "severity" : "중",
    "cwe" : "CWE-488",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "싱글턴 빈(Controller/Service)의 가변 멤버 필드에 요청별 데이터를 저장하면 세션 간 데이터가 섞여 노출된다.",
    "guidance" : "요청별 데이터는 지역변수·요청 스코프로 관리하고, 싱글턴 빈의 멤버 필드는 무상태(불변/주입 빈)로 유지한다."
  }, {
    "id" : "EC-02",
    "name" : "제거되지 않고 남은 디버그 코드",
    "category" : "캡슐화",
    "severity" : "하",
    "cwe" : "CWE-489",
    "owasp" : "A05:2021 Security Misconfiguration",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "배포 코드에 디버그 출력·테스트 진입점이 남으면 내부 정보 노출·인증 우회 경로가 될 수 있다.",
    "guidance" : "System.out 디버그 출력은 로거로 교체하고, 웹 클래스의 main 메서드·디버그 플래그를 제거한다."
  }, {
    "id" : "EC-03",
    "name" : "Public 메소드부터 반환된 Private 배열",
    "category" : "캡슐화",
    "severity" : "하",
    "cwe" : "CWE-495",
    "owasp" : "A01:2021 Broken Access Control",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "private 배열을 그대로 반환하면 외부에서 내부 상태를 직접 수정할 수 있다.",
    "guidance" : "배열은 clone() 등 복사본으로 반환한다."
  }, {
    "id" : "EC-04",
    "name" : "Private 배열에 Public 데이터 할당",
    "category" : "캡슐화",
    "severity" : "하",
    "cwe" : "CWE-496",
    "owasp" : "A01:2021 Broken Access Control",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "외부에서 받은 배열 참조를 private 필드에 그대로 저장하면 외부 수정이 내부 상태에 반영된다.",
    "guidance" : "전달받은 배열은 clone() 복사본을 저장한다."
  }, {
    "id" : "AM-01",
    "name" : "DNS lookup에 의존한 보안결정",
    "category" : "API 오용",
    "severity" : "중",
    "cwe" : "CWE-350",
    "owasp" : null,
    "rulesets" : [ "MOIS" ],
    "description" : "역DNS 조회 결과(호스트명)는 위조 가능하므로 인증·권한 결정에 사용하면 안 된다.",
    "guidance" : "보안 결정은 IP 검증·인증 토큰 등 신뢰 가능한 수단으로 수행한다."
  }, {
    "id" : "AM-02",
    "name" : "취약한 API 사용",
    "category" : "API 오용",
    "severity" : "중",
    "cwe" : "CWE-676",
    "owasp" : "A06:2021 Vulnerable and Outdated Components",
    "rulesets" : [ "MOIS", "OWASP_TOP10" ],
    "description" : "금지·위험 API(Thread.stop, System.exit, 쉘 실행 등)는 예측 불가한 동작·서비스 중단을 유발한다.",
    "guidance" : "위험 API 를 안전한 대체 API 로 교체한다. 웹 애플리케이션에서 System.exit 호출을 금지한다."
  } ],
  "count" : 49
}