공든탑앱 열기

시큐어 코딩과 보안 약점

정보처리기사 · 소프트웨어 개발 보안 · 약 15분

쉽게 말하면

시큐어 코딩은 해킹당하지 않도록 처음부터 안전하게 코드를 짜는 거예요. 가장 많이 당하는 건 사용자 입력을 그대로 믿는 경우예요. 로그인 칸에 SQL 조각을 넣어 데이터베이스를 조작하는 SQL 삽입, 게시글에 스크립트를 숨겨 다른 사용자 브라우저에서 실행시키는 XSS가 대표적이에요. 그래서 입력값은 항상 검증하고, SQL은 입력을 문장에 직접 붙이지 말고 매개변수로 넘겨야 해요.

시험용 정의

정보 보안 3요소는 기밀성(인가된 사람만 열람), 무결성(인가된 사람만 수정), 가용성(필요할 때 사용 가능)이다. 시큐어 코딩은 보안 약점을 없애도록 코드를 작성하는 것이고, 소프트웨어 개발 보안 가이드의 보안 약점 7가지 유형은 입력 데이터 검증 및 표현, 보안 기능, 시간 및 상태, 에러 처리, 코드 오류, 캡슐화, API 오용이다. 대표 약점: SQL 삽입, XSS(크로스 사이트 스크립팅, 악성 스크립트를 웹 페이지에 삽입), CSRF(사이트 간 요청 위조, 사용자가 원치 않는 요청을 보내게 함), 경로 조작, 운영체제 명령어 삽입, 버퍼 오버플로(할당된 메모리 범위를 넘쳐 다른 영역을 덮어씀). 버퍼 오버플로 대응은 스택 가드(카나리 값), 스택 실드, ASLR(주소 공간 배치 무작위화)이다. Secure SDLC는 생명 주기 전 단계에 보안을 넣는 것으로 방법론에 CLASP, SDL(마이크로소프트), Seven Touchpoints가 있다.

비유로 이해하기

택배 보관함에 비유하면, 입력값 검증은 들어오는 상자를 엑스레이로 검사하는 것이다. SQL 삽입은 '이 상자 주인: 아무나'라고 적힌 쪽지를 넣어 모든 보관함을 열게 만드는 수법이다.

자세히

먼저 알아 둘 말

말뜻
보안 약점해킹에 악용될 수 있는 코드의 결함
입력값 검증사용자 입력의 형식·길이·문자를 확인하고 걸러 내는 것
매개변수화 질의SQL 문과 입력값을 분리해 전달하는 방식 (PreparedStatement)
세션로그인 후 서버가 사용자를 기억하는 상태 정보
스택함수 호출 정보와 지역 변수를 저장하는 메모리 영역

보안 약점 7가지 유형

유형예
입력 데이터 검증 및 표현SQL 삽입, XSS, 경로 조작, 운영체제 명령어 삽입, 위험한 파일 업로드
보안 기능적절한 인증 없는 중요 기능 허용, 하드코딩된 비밀번호, 취약한 암호 알고리즘
시간 및 상태경쟁 조건(TOCTOU), 종료되지 않는 반복문·재귀
에러 처리오류 메시지로 시스템 정보 노출, 오류 상황 대응 부재
코드 오류널 포인터 역참조, 해제된 자원 사용, 초기화하지 않은 변수
캡슐화잘못된 세션으로 정보 노출, 디버그 코드 남김
API 오용DNS 조회 결과에 의존한 보안 결정, 취약한 API 사용

웹 공격 비교

공격방식대응
SQL 삽입입력값으로 SQL 문 조작PreparedStatement, 입력 검증, 특수 문자 필터
XSS게시판 등에 스크립트를 넣어 다른 사용자 브라우저에서 실행출력 시 HTML 이스케이프(< → &lt;), 입력 필터
CSRF로그인한 사용자가 모르게 공격자가 원하는 요청을 보내게 함CSRF 토큰, 재인증, Referer 확인

버퍼 오버플로 대응

  • 스택 가드: 복귀 주소 앞에 카나리 값을 두고 바뀌었는지 검사
  • 스택 실드: 복귀 주소를 별도 영역에 복사해 두고 비교
  • ASLR: 메모리 주소를 실행할 때마다 무작위로 배치
  • 안전한 함수 사용 (strcpy 대신 strncpy)

기출에서 더 나온 것

말뜻
자원 삽입외부 입력 값을 검증 없이 파일·소켓 같은 자원 식별자로 써서 자원을 함부로 쓰게 하는 보안 약점
SQL 삽입 대응DBMS마다 공격 문법이 조금씩 다르므로 입력 검증과 매개변수화된 쿼리로 막는다
OWASP웹 보안 취약점을 연구해 상위 10대 취약점 목록을 발표하는 오픈 소스 프로젝트

시험에 이렇게 나와요

확인 문제

Q1. 로그인 입력란에 ' OR '1'='1 같은 문자열을 넣어 인증을 우회하는 공격은?

  1. 버퍼 오버플로
  2. CSRF
  3. XSS
  4. SQL 삽입
정답 보기

4번 SQL 삽입

SQL 삽입(SQL Injection)은 입력값으로 SQL 문을 조작한다. 입력을 문자열로 이어 붙이지 말고 PreparedStatement(매개변수화 질의)를 쓰고 입력을 검증해 막는다.

Q2. 게시판에 악성 스크립트를 넣어 이를 열람한 다른 사용자의 브라우저에서 실행되게 하는 공격은?

  1. SQL 삽입
  2. 스니핑
  3. XSS
  4. CSRF
정답 보기

3번 XSS

Cross Site Scripting.

Q3. 소프트웨어 개발 보안의 보안 약점 7가지 유형이 아닌 것은?

  1. 성능 최적화
  2. 입력 데이터 검증 및 표현
  3. 에러 처리
  4. 캡슐화
정답 보기

1번 성능 최적화

입력 검증, 보안 기능, 시간 및 상태, 에러 처리, 코드 오류, 캡슐화, API 오용.

Q4. 메모리 주소 공간 배치를 실행할 때마다 무작위로 바꿔 버퍼 오버플로 공격을 어렵게 하는 기법은?

  1. 스택 가드
  2. DRM
  3. ASLR
  4. NAT
정답 보기

3번 ASLR

Address Space Layout Randomization.

Q5. 정보 보안 3요소 중 '인가된 사용자만 정보를 수정할 수 있어야 한다'는 것은?

  1. 부인 방지
  2. 기밀성
  3. 가용성
  4. 무결성
정답 보기

4번 무결성

무결성이다. 기밀성은 인가된 사람만 볼 수 있게, 가용성은 필요할 때 쓸 수 있게 하는 것이다.

헷갈리기 쉬운 O·X

SQL 삽입을 막으려면 사용자 입력을 SQL 문자열에 그대로 이어 붙여야 한다.

정답 보기

X 매개변수화 질의로 입력과 SQL을 분리해야 한다.

CSRF는 사용자가 의도하지 않은 요청을 공격자 뜻대로 서버에 보내게 하는 공격이다.

정답 보기

O

오류 메시지에 데이터베이스 구조를 자세히 보여 주는 것은 보안상 바람직하다.

정답 보기

X 에러 처리 약점. 시스템 정보 노출로 이어진다.

함께 보면 좋은 개념