본문으로 건너뛰기
페이지 목차
이 페이지에서 검색

EIS

이 페이지에 묻기

EIS · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.

생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.

EIS · SECURITY

EIS

생성 수정

정보보안기사의 시스템·네트워크·애플리케이션 보안과 암호·관리·실기 내용을 개념의 경계와 실습으로 연결합니다.

29개 문서 · 3 · 어플리케이션보안 · 17 / 29

16 · 어플리케이션 취약점 대응과 개발보안

지도 위치 : 3과목 어플리케이션 보안 · README 4장 ③ 영역(어플리케이션) — 공격을 "만들어지기 전에" 없애는 쪽 | 출제기준: 3. 어플리케이션 보안 취약점 > 1. 어플리케이션 보안취약점 대응, 2. 어플리케이션 개발 보안 | 이전: 15 전자상거래 보안 | 다음: 17 인증과 접근통제 출제 빈도 : ⭐ (회당 약 2.3문항 — 출제분석.md. 1.2 → 3.3) · 변화 ▲ (개발보안 0.8 → 3.2) · ⚠️ 신규 범위 포함 (시큐어 코딩 정의, 보안약점 진단가이드 항목, 개발보안 방법론) 세세항목 : 어플리케이션 보안취약점 유형 / 어플리케이션 보안 취약점 대응 기술 / 소프트웨어 개발 보안 개념 및 요구사항 / 소스코드 개발 보안(Secure Coding) / 개발보안 툴

이 노트를 다 읽으면

  1. 보안약점 ↔ 취약점 , 시큐어 코딩 ↔ 보안 테스트 를 정의(유 + 종차)로 구별할 수 있다.
  2. KISA 소프트웨어 보안약점 진단가이드의 7개 유형 을 말하고, 주어진 약점이 어느 유형인지 분류할 수 있다.
  3. 버퍼 오버플로를 일으키는 위험 함수와 안전한 함수 를 짝지을 수 있다.
  4. 입력값 검증 원칙(서버 측 · 화이트리스트 · 정규화)과 경로 조작 · OS 명령어 삽입 코드를 고칠 수 있다.
  5. 개발보안 생명주기와 방법론( MS-SDL · CLASP · Seven Touchpoints )을 구별할 수 있다.
  6. 정적 분석(SAST) ↔ 동적 분석(DAST) , 화이트박스 ↔ 블랙박스 테스트, 대표 도구를 구별할 수 있다.
  7. 코드 난독화 의 종류와 안드로이드 디컴파일 방지 설정을 말할 수 있다.

0. 이 노트의 판별 축

#축왼쪽 (0)오른쪽 (1)이 축으로 갈리는 것큰 축 (README 5장)
1언제 없애나개발 중 (설계 · 구현)운영 중 (패치 · WAF)시큐어 코딩 · 개발보안 ↔ 취약점 점검 · 보완④ 예방 ↔ 탐지 · 대응
2실행하고 보나실행하지 않고 코드를 봄실행하면서 동작을 봄정적 분석(SAST) ↔ 동적 분석(DAST)이 노트의 축
3내부 구조를 아는가내부 구조 기반입력 · 출력만 봄화이트박스 ↔ 블랙박스 테스트이 노트의 축
4무엇을 허용 기준으로 삼나나쁜 것만 막음 (블랙리스트)좋은 것만 허용 (화이트리스트)입력값 검증 방식⑦ 오용 ↔ 이상 탐지 (같은 구조)
5약점이 어디서 생기나외부 입력을 믿어서보안 기능을 잘못 써서입력데이터 검증 및 표현 ↔ 보안기능 (그 밖 5개 유형)이 노트의 축

이 노트가 답하는 질문은 "12~15번 노트의 공격은 결국 코드의 어떤 결함에서 나오고, 그 결함을 어떻게 미리 없애나" 입니다. 앞 노트들의 SQL Injection · XSS · 업로드 · 경로 조작(13번 노트)은 거의 전부 "외부 입력을 검증 없이 썼다" 는 하나의 결함으로 모입니다(축 5의 왼쪽). 앞에서 배운 버퍼 오버플로 · 포맷 스트링(03번 노트), 스택 가드 · ASLR(04번 노트), 분석 도구(05번 노트), 암호 알고리즘과 키 길이(19번 노트)가 이 노트에서 코드 한 줄 단위로 다시 나옵니다. 출제가 가장 빠르게 늘고 있는 영역입니다(0.8 → 3.2).


1. 개발보안의 기본 개념

1.1 ⭐ 용어 정의

용어정의 (유 + 종차)
보안약점 (Weakness)[소프트웨어 결함]인데, [ 보안 취약점의 원인이 될 수 있는 코드 · 설계상의 잠재적 결함 ]이라는 점에서 실제로 악용 가능한 상태인 취약점과 구별된다
보안취약점 (Vulnerability)[소프트웨어 결함]인데, [ 공격자가 실제로 악용할 수 있는 상태의 약점 ]이라는 점에서 잠재적 원인인 보안약점과 구별된다
소프트웨어 개발보안[보안 활동]인데, [ 개발 생명주기 전 단계(요구사항 · 설계 · 구현 · 테스트 · 배포)에서 보안약점을 최소화하는 활동 전체 ]라는 점에서 구현 단계만 다루는 시큐어 코딩과 구별된다
시큐어 코딩 (Secure Coding) ⚠️[개발보안 활동]인데, [ 구현(코딩) 단계에서 소스코드의 잠재적 보안약점을 제거하는 안전한 코딩 기법 ]이라는 점에서 완성된 프로그램을 실행해 찾는 보안 테스트와 구별된다

💡 관계: 개발보안 ⊃ 시큐어 코딩 . 시큐어 코딩은 개발보안의 구현 단계 부분입니다.

1.2 왜 개발 단계인가 · 제도

결함은 늦게 발견할수록 고치는 비용이 커집니다. 운영 중 WAF로 막는 것은 증상 차단이고, 코드에서 없애는 것은 원인 제거입니다(0절 축 1).

국내 공공 부문은 행정안전부의 「행정기관 및 공공기관 정보시스템 구축 · 운영 지침」에 따라 정보화사업에 소프트웨어 개발보안 적용 과 보안약점 진단 · 제거 를 요구합니다. 2012년 일정 규모 이상 사업부터 시작해 감리 대상 사업으로 단계적으로 확대됐습니다(확대 시점은 보도마다 차이가 있어 시험 전 지침 원문 확인 필요). 기준 문서는 KISA · 행정안전부의 「소프트웨어 개발보안 가이드」 와 「소프트웨어 보안약점 진단가이드」 (2021년판이 KISA 누리집에 공개)입니다. 2021년판 기준으로 설계 단계 보안설계 기준 20개, 구현 단계 보안약점 49개 입니다.

📝 기출 포인트 — " 소스코드의 잠재적 취약점을 제거하는 안전한 코딩 = 시큐어 코딩 "(2025 강사 "처음 등장" 언급 ⚠️). 출제분석.md의 관찰대로 이 영역은 보안약점 진단가이드가 출제 원천 이라, 가이드의 용어(예: "경로 조작 및 자원 삽입")가 그대로 보기에 나옵니다.


2. ⭐ 보안약점 7개 유형 — 분류가 곧 문제

KISA 소프트웨어 보안약점 진단가이드(2021) 구현 단계 기준입니다. 괄호의 항목 수는 2021년판 기준이며, 2019년판도 같은 7개 유형 구조입니다.

유형한 줄 정의대표 항목
① 입력데이터 검증 및 표현 (17)외부 입력을 검증하지 않고 쓸 때 생기는 약점SQL 삽입, 코드 삽입, 경로 조작 및 자원 삽입 , 크로스사이트 스크립트, 운영체제 명령어 삽입 , 위험한 형식 파일 업로드 , 신뢰되지 않는 URL 자동접속 연결, XML 외부 개체 참조, XML 삽입, LDAP 삽입, 크로스사이트 요청 위조, 서버사이드 요청 위조, HTTP 응답분할, 정수형 오버플로, 보안기능 결정에 쓰이는 부적절한 입력값, 메모리 버퍼 오버플로 , 포맷 스트링 삽입
② 보안기능 (16)인증 · 접근제어 · 암호화 같은 보안 기능을 빠뜨리거나 잘못 구현적절한 인증 없는 중요 기능 허용, 부적절한 인가, 잘못된 권한 설정, 취약한 암호화 알고리즘 사용 , 암호화되지 않은 중요정보, 하드코드된 중요정보 , 충분하지 않은 키 길이 , 적절하지 않은 난수, 취약한 비밀번호 허용, 부적절한 전자서명 · 인증서 검증, 쿠키를 통한 정보 노출, 주석문 안의 시스템 정보, 솔트 없는 일방향 해시 , 무결성 검사 없는 코드 다운로드, 반복 인증시도 제한 부재
③ 시간 및 상태 (2)동시 · 반복 실행 의 시간 차이로 생기는 약점경쟁조건: 검사 시점과 사용 시점(TOCTOU) , 종료되지 않는 반복문 · 재귀
④ 에러처리 (3)오류를 잘못 처리하거나 너무 많이 알려 줌오류 메시지 정보 노출 , 오류상황 대응 부재, 부적절한 예외 처리
⑤ 코드오류 (5)타입 · 자원 · 메모리를 잘못 다루는 개발 실수Null Pointer 역참조, 부적절한 자원 해제, 해제된 자원 사용, 초기화되지 않은 변수, 신뢰할 수 없는 데이터의 역직렬화
⑥ 캡슐화 (4)중요한 데이터 · 기능을 충분히 감추지 못함잘못된 세션에 의한 정보 노출, 제거되지 않고 남은 디버그 코드 , Public 메소드가 반환하는 Private 배열, Private 배열에 Public 데이터 할당
⑦ API 오용 (2)API를 잘못 쓰거나 취약한 API를 씀DNS lookup에 의존한 보안 결정, 취약한 API 사용

(출처: KISA 「소프트웨어 보안약점 진단가이드(2021)」. 항목 수는 공개된 분석 자료의 분류와 대조했으며, 세부 항목 명칭은 시험 전 원문 확인 권장.)

분류 요령 — 두 질문으로 대부분 풀립니다.

  1. 원인이 "외부 입력을 믿었다"인가? → ① 입력데이터 검증 및 표현 (파일 업로드 · 다운로드, 버퍼 오버플로, 포맷 스트링도 여기)
  2. 원인이 "보안 기능(인증 · 권한 · 암호 · 비밀번호)을 잘못 만들었다"인가? → ② 보안기능 (키 길이, 취약 알고리즘, 하드코드 비밀번호)
  3. 둘 다 아니면 이름으로: 동시성 → ③, 예외 → ④, 메모리 · 자원 실수 → ⑤, 숨김 실패 → ⑥, API → ⑦

⚠️ 반례: "버퍼 오버플로"는 코드오류가 아니라 입력데이터 검증 및 표현 입니다(입력 길이를 검사하지 않은 것이 원인). "취약한 암호 알고리즘(SHA-1 · DES)"은 입력이 아니라 보안기능 입니다.

📝 기출 포인트 — " 파일 업로드 · 다운로드(입력 검증)와 불충분한 키 길이(보안기능)의 분류 차이 "(2024), "SW 보안약점 중 보안기능 유형 구분"(2014), 경로 조작 및 자원 삽입 (2024 · 2025), 코드 삽입(eval) , 메모리 버퍼 오버플로 약점, 운영체제 명령어 삽입(Runtime.exec) , 취약한 암호 알고리즘(SHA-1) (2025) — 진단가이드 항목명이 그대로 출제됩니다.


3. 입력값 검증과 대표 약점 코드

3.1 ⭐ 입력값 검증 원칙

입력값 검증 — [보안 대응 기술]인데, [ 외부에서 들어온 모든 값을 신뢰하지 않고 형식 · 길이 · 범위 · 문자 집합을 서버 측에서 확인 한다]는 점에서 출력 직전에 특수문자를 바꾸는 출력 인코딩과 구별된다(둘 다 필요).

원칙이유
서버 측에서 검증클라이언트(JavaScript) 검증은 프록시 도구로 우회됨. 클라이언트 검증은 편의용
화이트리스트 우선블랙리스트는 인코딩 · 대소문자 · 새 패턴으로 우회됨(0절 축 4)
정규화 후 검증%2e%2e%2f, 유니코드 등을 디코딩 · 정규화한 뒤 검사
용도별 처리SQL → 바인드 변수, HTML 출력 → 엔티티 인코딩, OS 명령 → 허용 명령 목록, 경로 → 허용 디렉터리 검사
자동화 입력 차단반복 가입 · 로그인 대입 같은 자동화 요청에는 CAPTCHA (사람 ↔ 컴퓨터 구분, 13번 노트)

3.2 운영체제 명령어 삽입 (Java)

// 약점: 외부 입력을 그대로 OS 명령에 붙임
String dir = request.getParameter("dir");
Runtime.getRuntime().exec("cmd.exe /c dir " + dir);     // dir = "C:\ & del /q C:\data\*"

// 개선: 허용 값 목록에서만 고름 (화이트리스트)
String[] allowed = {"report", "upload"};
if (!Arrays.asList(allowed).contains(dir)) throw new IllegalArgumentException();
Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "dir", "C:\\app\\" + dir});

🔍 읽는 포인트 : & | ; 같은 명령 연결 문자 가 입력에 섞이면 두 번째 명령이 실행됩니다. 셸 호출 자체를 피하고, 불가피하면 허용 목록 으로 제한합니다.

3.3 경로 조작 및 자원 삽입 (Java)

// 약점
String name = request.getParameter("file");
File f = new File("/var/app/files/" + name);           // name = "../../../etc/passwd"

// 개선: 경로 문자 제거 + 정규화 후 허용 디렉터리 안인지 확인
name = name.replaceAll("[/\\\\]|\\.\\.", "");
File f2 = new File("/var/app/files/", name);
if (!f2.getCanonicalPath().startsWith("/var/app/files/")) throw new SecurityException();

🔍 읽는 포인트 : 13번 노트의 디렉터리 트래버설을 코드 쪽에서 본 것입니다. "자원 삽입"은 입력으로 포트 · 소켓 같은 자원 식별자 를 조작하는 경우까지 포함하는 이름입니다.

3.4 SQL 삽입과 취약한 암호 (Java)

// SQL 삽입 개선: 바인드 변수
PreparedStatement ps = con.prepareStatement("SELECT * FROM member WHERE id = ?");
ps.setString(1, request.getParameter("id"));

// 취약한 암호화 알고리즘 사용 (보안기능)
MessageDigest md = MessageDigest.getInstance("SHA-1");    // → "SHA-256" 이상

🔍 읽는 포인트 : 앞에서 배운 대로(19 · 20번 노트) MD5 · SHA-1 · DES는 취약 알고리즘입니다. KISA 암호 이용 안내 기준으로 AES 128비트 이상, RSA 2048비트 이상, SHA-256 이상 을 씁니다. 비밀번호 저장에는 솔트를 붙인 일방향 해시 를 씁니다.

📝 기출 포인트 — 입력값 검증 미흡으로 생기는 취약점 유형(2016), 특수문자 필터링이 필요한 OS 명령 실행 (2022), 출력 필터링 코드가 막는 것 = XSS (2022), 안전한 암호 알고리즘 · 키 길이 선택 (2022).


4. ⭐ 버퍼 오버플로 · 포맷 스트링 — 안전한 함수

4.1 위험 함수 ↔ 안전한 함수

void copy(char *input) {
    char buf[16];
    strcpy(buf, input);             // 길이 검사 없음 → 16바이트를 넘으면 스택의 리턴 주소까지 덮음
}
/* 개선 */
strncpy(buf, input, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';        // strncpy는 널 종료를 보장하지 않으므로 직접 넣음

🔍 읽는 포인트 : 위험 함수의 공통점은 "목적지 버퍼 크기를 인자로 받지 않는다" 입니다. 안전한 함수는 길이(크기)를 인자로 받습니다.

위험 함수 (길이 검사 없음)안전한 함수 (길이 지정)
strcpy()strncpy() (또는 strlcpy(), strcpy_s())
strcat()strncat() (또는 strlcat())
gets()fgets()
sprintf()snprintf()
vsprintf()vsnprintf()
scanf("%s", buf)scanf("%15s", buf) 처럼 폭 지정 또는 fgets()
printf(user_input)printf("%s", user_input) — 포맷 문자열을 고정

4.2 포맷 스트링

포맷 스트링 취약점 — [입력데이터 검증 약점]인데, [ 사용자 입력이 printf 계열 함수의 포맷 문자열 자리에 그대로 들어가 %x · %s로 메모리를 읽고 %n으로 메모리에 쓰게 된다 ]는 점에서 버퍼 크기를 넘쳐 쓰는 버퍼 오버플로와 구별된다.

직접 위험 ⭕관계없는 것 ❌ (보기 함정)
스택 · 메모리 내용 노출 (%x, %s)네트워크 트래픽 도청
메모리 값 변조 (%n) → 리턴 주소 덮어쓰기 → 임의 코드 실행암호 키 길이 부족
잘못된 주소 참조로 프로그램 비정상 종료세션 고정

운영 · 컴파일 대응 (04번 노트에서 배운 것): 스택 가드(카나리), ASLR , 실행 불가 스택(NX/DEP), 컴파일러 경고 활성화.

📝 기출 포인트 — 안전한 함수 · strncpy 는 A3.2 최다(4회 + 위험 함수 5회): "BOF 방지를 위해 피해야 할 C 함수", " gets ↔ fgets, strcpy ↔ strncpy 짝짓기 "(2024), " 취약하지 않은 함수 고르기 "(2019 · 2025), strcpy 코드의 스택 오버플로(2025). 포맷 스트링의 직접 위험이 아닌 것 (2018 · 2019).


5. 개발보안 생명주기와 방법론

5.1 생명주기별 활동과 산출물

단계보안 활동대표 산출물
요구사항 분석보안 요구사항 정의(법 · 규제, 중요정보 식별)요구사항 정의서
설계위협 모델링, 보안설계 기준(20개) 반영설계서(아키텍처 · DB 설계)
구현시큐어 코딩 , 정적 분석소스코드, 코드 진단 결과
테스트동적 분석 · 침투 테스트, 보안약점 진단테스트 결과서
배포 · 운영보안 설정, 패치 · 취약점 대응운영 매뉴얼, 사고 대응 절차

📝 기출 포인트 — "개발 단계별 산출물( 분석 단계 = 요구사항 정의서 )"(2025).

5.2 ⚠️ 개발보안 방법론

방법론만든 곳핵심 특징
MS-SDL (Security Development Lifecycle)마이크로소프트교육 → 요구사항 → 설계 → 구현 → 검증 → 배포 → 대응의 단계별 필수 보안 활동
CLASPSecure Software가 개발 → OWASP 에 기증역할(Role) 기반 활동 과 여러 관점(개념 · 역할 · 활동 평가 · 활동 구현 · 취약점)으로 구성, 이미 운영 중인 조직에 적용하기 쉬움
Seven Touchpoints게리 맥그로(Gary McGraw)개발 산출물에 붙이는 7가지 보안 접점 — 코드 검토, 아키텍처 위험 분석, 침투 테스트, 위험 기반 보안 테스트, 악용 사례, 보안 요구사항, 보안 운영

📝 기출 포인트 — CLASP · MS-SDL · Seven Touchpoints 구분 (2025). "마이크로소프트 = SDL", "OWASP = CLASP", "7개 접점 = Touchpoints"로 이름과 출처를 짝지으세요.


6. 개발보안 툴 — 분석과 테스트

6.1 ⭐ 정적 분석 ↔ 동적 분석

정적 분석 (SAST)동적 분석 (DAST)
정의실행하지 않고 소스 · 바이너리를 분석실행 중인 프로그램에 입력을 넣어 동작 관찰
시점구현 단계 부터 (빌드 전)테스트 · 운영 단계 (실행 환경 필요)
강점코드 위치까지 정확히 지적, 모든 경로 검사실제 악용 가능성 확인, 설정 · 환경 문제도 발견
약점오탐 이 많음, 런타임 · 설정 문제 못 봄실행되지 않은 경로는 못 봄, 위치 특정 어려움
대표 도구FindBugs(SpotBugs) · PMD · SonarQube , 상용 코드 진단 도구OWASP ZAP, Burp Suite 같은 웹 스캐너, 퍼징 도구

(실행 중 앱 내부에 센서를 심어 둘을 결합한 방식을 IAST 라 부릅니다.)

⚠️ 반례: Jenkins는 정적 분석 도구가 아니라 CI(지속적 통합) 서버 입니다. 정적 분석 도구를 파이프라인에서 돌려 주는 역할입니다(2025 기출 보기).

테스트기준예
화이트박스내부 구조(코드 · 분기)를 알고 설계구문 · 분기 · 조건 커버리지, 코드 리뷰
블랙박스입력 · 출력(명세)만 보고 설계동등 분할, 경곗값 분석, 침투 테스트

💡 축 2(실행하나)와 축 3(구조를 아나)은 다른 축 입니다. 정적 분석은 화이트박스이지만, 화이트박스 테스트가 모두 정적인 것은 아닙니다(커버리지 측정은 실행이 필요).

📝 기출 포인트 — " 정적 분석 ↔ 동적 테스트 구분 "(2017), " 내부 구조 기반 = 화이트박스 "(2019 · 2025), " 소스 정적 분석 도구(FindBugs · PMD · SonarQube)와 Jenkins 구분 "(2025), 포맷 스트링 점검 도구와 패킷 도구 구분(2016).

6.2 난독화 — 분석을 어렵게

난독화 (Obfuscation) — [역공학 방지 기법]인데, [ 프로그램의 기능은 그대로 두고 코드를 사람이 이해하기 어렵게 바꾼다 ]는 점에서 내용을 키 없이는 못 읽게 만드는 암호화와 구별된다.

분류내용
소스코드 난독화소스 단계에서 변환 (스크립트 · JavaScript 등)
바이너리 난독화컴파일된 결과물(바이트코드 · 기계어)을 변환 → 디스어셈블 · 디컴파일 방해
기법식별자(이름) 변환 , 제어 흐름 난독화 (분기 · 의미 없는 코드로 흐름을 꼬음), 문자열 암호화, 클래스 암호화, API 호출 은닉
// 안드로이드 app/build.gradle
buildTypes {
    release {
        minifyEnabled true          // 코드 축소 · 난독화(R8/ProGuard) 활성화
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

🔍 읽는 포인트 : 난독화는 release 빌드 타입 에서 minifyEnabled true로 켭니다. 디버그 빌드는 보통 끕니다. APK를 풀어 보는 도구( dex2jar , jadx, apktool 등)는 디컴파일 도구 이지 난독화 도구가 아닙니다.

📝 기출 포인트 — 난독화는 2023~2025에 매년(5회): 앱 디컴파일 방지 , 디스어셈블 방지, 소스코드 ↔ 바이너리 난독화 , 제어 흐름 난독화 , release에서 minify 활성화 , dex2jar = 디컴파일 도구 .


7. 실기 연결

관련 수행준거 : 2-2-5 WEB/WAS 서버 설정 점검(입력 검증 미흡에 대한 보완), 2-4-2 주요 서비스 보안점검 내용 · 도구 · 발견 취약점 · 보완사항 기록. 최근 강의에서 KISA 보안약점 진단가이드가 실기에서도 출제 원천으로 언급됩니다.

예상 질문답안 핵심어
시큐어 코딩 정의구현 단계, 소스코드의 잠재적 보안약점 제거 , 안전한 코딩 기법
코드의 보안약점 이름과 수정약점명(진단가이드 명칭 그대로), 원인(외부 입력 미검증), 수정 코드(바인드 변수 · 화이트리스트 · 정규화 · 길이 제한 함수)
strcpy가 위험한 이유와 대안길이 검사 없음 → 버퍼 오버플로 , strncpy + 널 종료
정적 · 동적 분석 비교실행 여부, 시점, 오탐 · 미탐 특성, 도구 예
입력값 검증 원칙서버 측 · 화이트리스트 · 정규화 후 검증 , 용도별 인코딩

코드 진단 기록표 예시

위치보안약점(유형)근거조치
FileDown.java:42경로 조작 및 자원 삽입 (입력데이터 검증 및 표현)file 파라미터를 경로에 직접 연결경로 문자 제거, 정규화 후 허용 디렉터리 검사
Login.java:18하드코드된 중요정보 (보안기능)DB 비밀번호 문자열 상수외부 설정 · 암호화 저장
Util.c:77메모리 버퍼 오버플로 (입력데이터 검증 및 표현)gets(buf)fgets(buf, sizeof(buf), stdin)
Error.jsp오류 메시지 정보 노출 (에러처리)스택 트레이스 출력공통 오류 페이지

8. 확인 문제

1. 시큐어 코딩에 대한 설명으로 가장 적절한 것은? ① 운영 중인 웹서버 앞에 WAF를 두는 것 ② 구현 단계에서 소스코드의 잠재적 보안약점을 제거하는 코딩 기법 ③ 완성된 프로그램을 실행하며 공격을 시도하는 테스트 ④ 배포 후 보안 패치를 적용하는 절차

2. KISA 소프트웨어 보안약점 진단가이드의 분류에서 유형이 나머지와 다른 하나는? ① 경로 조작 및 자원 삽입 ② 위험한 형식 파일 업로드 ③ 충분하지 않은 키 길이 사용 ④ 운영체제 명령어 삽입

3. 버퍼 오버플로 방지를 위한 함수 대체로 옳지 않은 것은? ① gets → fgets ② strcpy → strncpy ③ sprintf → snprintf ④ strncat → strcat

4. 다음 중 포맷 스트링 취약점의 직접적인 결과로 보기 어려운 것은? ① 스택 메모리 내용 노출 ② %n을 이용한 메모리 값 변조 ③ 프로그램 비정상 종료 ④ 네트워크 구간의 평문 도청

5. 정적 분석에 대한 설명으로 틀린 것은? ① 프로그램을 실행하지 않고 소스코드를 분석한다 ② 구현 단계부터 적용할 수 있다 ③ 실행 환경의 설정 오류까지 정확히 찾아낸다 ④ FindBugs · PMD · SonarQube가 대표 도구다

6. 마이크로소프트가 만든, 교육부터 대응까지 단계별 필수 보안 활동을 정의한 개발보안 방법론은? ① CLASP ② Seven Touchpoints ③ MS-SDL ④ OWASP Top 10

7. 안드로이드 앱의 디컴파일 분석을 어렵게 하기 위한 조치로 옳은 것은? ① dex2jar를 앱에 포함한다 ② release 빌드에서 minifyEnabled를 true로 둔다 ③ 디버그 코드를 남겨 둔다 ④ 문자열 상수에 키를 하드코드한다

정답과 해설

#정답해설 (판별 축)
1②축 1(언제): 시큐어 코딩은 구현 단계 예방 . ①④는 운영 단계, ③은 동적 테스트
2③축 5: 키 길이는 보안기능 . ①②④는 외부 입력 미검증 = 입력데이터 검증 및 표현
3④방향이 반대. strcat은 길이 검사 없는 위험 함수
4④포맷 스트링은 메모리 읽기 · 쓰기 · 종료 . 도청은 스니핑(09번 노트)
5③축 2: 실행하지 않으므로 런타임 · 설정 문제는 동적 분석 의 몫
6③CLASP = OWASP · 역할 기반, Touchpoints = 맥그로의 7접점, OWASP Top 10은 위험 목록
7②난독화는 release에서 활성화. dex2jar는 디컴파일 도구 , ③④는 캡슐화 · 보안기능 약점

부록 A. 스스로 확인하기

#질문답이 있는 곳
1보안약점과 취약점, 개발보안과 시큐어 코딩의 차이는?1.1
22021 가이드의 설계 · 구현 단계 항목 수는?1.2
3보안약점 7개 유형의 이름은?2
4버퍼 오버플로 · 파일 업로드는 어느 유형인가? 키 길이 · SHA-1은?2
5입력값 검증의 네 원칙은?3.1
6Runtime.exec 약점의 원인과 개선은?3.2
7경로 조작을 막는 코드의 두 단계는?3.3
8위험 함수 여섯과 대체 함수는? strncpy 사용 시 주의점은?4.1
9포맷 스트링의 직접 위험 세 가지는?4.2
10개발 단계별 보안 활동과 산출물은?5.1
11MS-SDL · CLASP · Seven Touchpoints의 출처와 특징은?5.2
12SAST와 DAST의 강점 · 약점, 대표 도구는? Jenkins는?6.1
13화이트박스와 블랙박스의 기준은?6.1
14소스코드 · 바이너리 · 제어 흐름 난독화란? 안드로이드에서 켜는 설정은?6.2

부록 B. 자주 하는 실수 · 함정

실수바로잡기
"시큐어 코딩 = 개발보안 전체"⚠️ 시큐어 코딩은 구현 단계 부분. 개발보안이 더 넓음
"보안약점 = 취약점"❌ 약점은 잠재적 원인 , 취약점은 악용 가능한 상태
"버퍼 오버플로는 코드오류 유형"❌ 입력데이터 검증 및 표현
"파일 업로드 약점은 보안기능 유형"❌ 입력데이터 검증 및 표현
"충분하지 않은 키 길이는 입력 검증 유형"❌ 보안기능
"클라이언트에서 검증했으니 안전"❌ 우회 가능. 서버 측 검증
"블랙리스트 필터가 더 안전"❌ 화이트리스트 우선
"strncpy를 쓰면 끝"⚠️ 널 종료 보장 안 됨 → 마지막 바이트에 '\0'
"strncat · fgets는 위험 함수"❌ 길이를 받는 안전한 쪽
"정적 분석은 오탐이 없다"❌ 오탐이 많은 편
"Jenkins는 정적 분석 도구"❌ CI 서버
"dex2jar는 난독화 도구"❌ 디컴파일 도구
"난독화 = 암호화"❌ 기능은 그대로, 읽기 어렵게 만 함

부록 C. AI · NotebookLM 복습 프롬프트

이 16번 노트(취약점 대응과 개발보안)만 근거로 4지선다 7문제를 내줘. 노트 밖 내용은 쓰지 마.
시큐어 코딩 정의, 보안약점 7개 유형 분류(입력데이터 검증 vs 보안기능), 위험 함수와 안전한 함수 짝, 경로 조작 코드, SAST/DAST, 개발보안 방법론, 난독화는 반드시 포함해줘.
내가 답하면 채점하고, 오답 보기가 0절의 어느 축 반대편인지 절 번호와 함께 설명해줘.