secure coding(1)

강혜인·2024년 7월 20일
0

Security

목록 보기
1/12

Secure Coding

secure coding?

소프트웨어 개발 시 안전한 코드를 제작하는 것을 의미
사이버 공격의 대상이 될 수 있는 소프트웨어의 보안 약점을 개발 단계에서 사전에 제거하는 보안 활동

정부의 secure coding 기준

목적)
전자정부 서비스 보안 강화를 위해 정보 시스템 개발 및 유지보수시 SW 보안 취약점을 점검 및 제거하기 위한 것

대상)
행정기관 및 공공기관의 정보시스템 감리 대상 정보화 사업
추후 모든 정보화 사업에 의무적으로 적용

범위)
소스코드
-> 신규 개발 전체 or 유지보수로 변경된 부분

기준)
소프트웨어 보안 약점(SQL Injection 등 47개 항목)

사업자/개발자)

  • 개발 인력 대성, 소프트웨어 개발 보안 관련 교육 싨히
  • 소프트웨어 개발 보안 가이드를 참조하여 개발
  • 자체적으로 SW 보안 약점 진단 및 제거

이러한 정부의 기준은 시큐어 코딩의 사내 기준이 없는 기업들에게 일종의 지침서 or 표준 기준이 되었음

secure coding의 유형

  1. 입력 데이터 검증 및 표현
    프로그램의 입력값에 대한 부적절한 검증으로 발생 가능한 보안 취약점
    (SQL Injection, XSS 등)

  2. 보안 기능
    인증, 접근 제어, 권환 관리 등을 적절치 않게 구현 할 경우 발생 가능한 보안 취약점
    (부적절한 인가 허용, 중요 정보 평문 저장, 하드 코딩된 패스워드 등)

  3. 시간 및 상태
    멀티 프로세스 동작 환경에서 부적절한 시간 및 상태 관리로 인해 발생 가능한 보안 취약점
    (경쟁조건(TOCTOU), 제어문을 사용하지 않는 재귀 함수 등)

  4. 에러 처리
    불충분한 에러 처리로 인해 중요 정보가 에러 정보에 포함되어 발생 가능한 보안 취약점
    (오류 상황 대응 부재, 오류 메시지를 통한 정보 노출 등)

  5. 코드 오류
    개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안 약점
    (Null 포인터 역참조, 부적절한 자원 해제 등)

  6. 캡슐화
    불충분한 캡슐화로 인가되지 않는 사용자에게 데이터가 노출될 수 있는 보안 정책
    (제거 되지 않고 남은 디버거 코드, 시스템 데이터 정보 노출 등)
    ** 캡슐화(Encapsulation)?
    객체 지향 프로그래밍의 특징 중 하나
    어떠한 목적을 수행하기 위해 필요한 필드(데이터 구조)와 메소드(데이터를 다루는 행위)를 한 곳에 응집시켜 놓은 뒤 이에 대한 내부 로직은 정보 은닉을 통해 감추는 객체 지향 설계 원칙
    -> 응집도를 높여주고 결합도를 낮춰주는 객체 지향 설계 원칙

  7. API 오용
    부적절하거나 보안에 취약한 API 사용으로 발생할 수 있는 보안 약점
    (DNS 조회에의존한 보안 결정 등)

[예시]
1) 입력 데이터 검증 및 표현
비정상적 데이터 입력으로 인해 시스템에 손상을 주거나, 정보를 수정/탈취하지 못하도록 방지

SQL Injection 공격 방지 코딩등이 있음

SQL Injection 방지 코딩

# sqli python code example
from django.shortcuts import render

def update_board(request):
	......
	with dbconn.cursor() as curs:
		# 외부로부터 입력받은 값을 검증 없이 사용할 경우 안전하지 않음
		name = request.POST.get('name', '')
		content_id = request.POST.get('content_id', '')
		
		# 사용자의 검증되지 않은 입력으로부터 동적으로 쿼리문 생성
		sql_query = "update board set name='" + name + "' where content_id='"+ content_id+"'"
		# 외부 입력값이 검증 없이 쿼리로 수행되어 안전하지 않음
		curs.execute(sql_query)
		curs.commit()
		return render(request, '/success.html')

-> content_id 값으로 'a' or 'a' = 'a'와 같은 공격 문자열을 입력하게 될 경우, 조건절이 content_id = 'a'or'a' = 'a'로 바뀌고, 그 결과 board 테이블 전체 레코드의 name 칼럼이 공격자로부터 입력받은 name값으로 바뀌게 됨

이를 안전한 코드로 바꾸면,

# 안전하게 고친 코드
from django.shortcuts import render

def update_board(request):
	......
	with dbconn.cursor() as curs:
		name = request.POST.get('name', '')
		content_id = request.POST.get('content_id', '')
		
		# 외부 입력값으로부터 안전한 매개 변수회된 쿼리 생성
		sql_query = 'update board set name =%s where content_id=%s'
		# 사용자의 입력 값을 매개변수로 지정된 쿼리에 바인딩하여 실행되므로 안전
		curs.execute(sql_query, (name, content_id))
		curs.commit()
		return render(request, '/success.html')

XSS(Cross Site Scripting) 공격 방지 코드

XSS는 공격자가 악성 스크립트가 포함된 글을 취약한 웹 사이트에 게시하면, 웹 서버를 통해 해당 게시물을 저장하는 DB에 저장이 되고, 일반 사용자는 동일 사이트에 접속해 해당 게시물을 조회하게 되면서 보안상 취약한 자바 스크립트를 포함한 스크립트를 수행하게 되면서, 해당 사용자의 브라우저 정보를 공격자의 서버로 전송하거나, 브라우저 활동 자체에서 예상치못한 악성 행위를 수행하게 하는 원리임

1.
<h1> XSS 취약점 예제 </h1>
<% 
	String name = request.getParameter("name");
%>
<p> NAME : <% =name %> </p>

-> 파라미터 name 변수 값을 그대로 페이지 변수로 사용해 아무런 검증 없이
	웹 페이지에 출력하게 하고 있음
2.
<h1>XSS 취약점 예제 </h1>
<%
	String name = request.getParameter("name");
	if(name != null)
	{
		name = name.replaceAll("<", "&lt;");
		name = name.replaceAll(">", "&gt;");
		name = name.replaceAll("&", "&amp;");
		name = name.replaceAll("\", "&quot;");
	}
	else {return;}
	%>
	<p> NAME: <% =name %> </p>

첫 번째 코드를 xss 공격에 사용될 수 있는 의심스러운 문자들을 그대로 출력하지 않고, HTML 상의 코드로 변경하도록 수정해서 두 번째 코드처럼 바꾸면, 공격자가 입력한 자바스크립트 명령등의 실행을 무력화 시킬 수 있다.

0개의 댓글