'Security/소프트웨어 보안약점'에 해당하는 글 3건


구현단계 보안약점 중 SQL Injection에 대해 다뤄보고자 합니다.

구현단계 보안약점 유형 및 세부항목 소개( http://jwprogramming.tistory.com/262?category=682224 )


1. SQL Injection

1) SQL이란?

- 관계형 데이터베이스(MySQL, Oracle, Maria DB 등) 관리 시스템의 데이터를 관리하기 위해 설계된 프로그래밍 언어입니다.


그렇다면, 이 SQL Injection 공격은 무엇일까요?


대부분의 정보시스템은 데이터베이스를 사용하여 어떠한 데이터(사용자 ID, P/W, 시스템 관련 데이터 등)를 저장하고 있을 것입니다. 이렇게 DB운영자가 데이터베이스 시스템을 사용하기 위해서는 위의 SQL 구문을 이용하여 데이터베이스에 접근하여 데이터를 조회, 삽입, 삭제, 업데이트 등 일련의 행동을 할 것입니다.


예를 들어, SQL을 통해 아래와 같이 items 테이블로부터 사용자의 이름 등의 정보를 조회한다고 가정합니다.

string userName = request.getParameter("username");

string query = "SELECT * FROM items where owner = '"+ userName + "'"; 

위에서 userName은 외부에서 입력받아서 데이터베이스에 접근하게 되는 데이터일 것입니다.

만약 이 userName로 입력받는 값에 대하여 적절한 검증이 이루어지지 않은 채로 아래의 값이 들어오면 어떻게 될까요?

name' OR 'a'='a

해당 SQL Query는 참으로 인식하여, 데이터베이스에 허가되지 않은 사용자가 접근할 수 있게 됩니다. 

간단한 입력값만으로도 데이터베이스의 정보를 조작하거나 열람, 심지어 삭제해버릴 수도 있는 무서운 공격이 됩니다.


따라서, SQL Query에 사용되는 외부 입력값의 경우에는 1) preparedStatement를 이용하여 DB에 컴파일된 쿼리문을 전달하는 방법을 사용하거나, 2) 외부입력값에 대해 필터링하는 구문을 앞단에서 작성해주어야 합니다.

- [preparedStatement를 사용하는 경우]

string userName = request.getParameter("username");

string query = "SELECT * FROM items where owner = '" + userName + "'";

PreparedStatement s_username = con.prepareStatement(query);

s_username.setString(1, userName);

ResultSet rs = s_username.executeQuery();


SQL Injection은 개발자의 개발습관에 따라 쉽게 막을 수 있는 공격이지만,

보안대책을 적절히 구현하지 못하였을 시에는 무서운 공격이 될 수도 있으므로 개발 시에 DB에 접근하는 Query문의 경우에 검증하는 로직을 필히 구현하시기 바랍니다.


WRITTEN BY
SiriusJ

,

소프트웨어 보안약점은 지난번 포스팅(http://jwprogramming.tistory.com/261)에서 소개를 해드렸습니다.


더불어, 현재 공공 정보화사업 대상으로 지침에 의무화 되어 있는 소프트웨어 보안약점 기준(구현단계)은 무엇이 있는지 살펴보고자 합니다.


해당 지침에서는 구현단계에서 확인 및 제거해야 하는 보안약점 유형을 7개로 분류하고 해당 유형별 세부항목을 47개로 아래와 같이 정의하고 있습니다.

------------------------------------------------------------------------------------------------------------------------

유형 1. 입력데이터 검증 및 표현 : 사용자, 프로그램 입력 데이터에 대한 유효성 검증 체계를 갖추고, 실패 시 처리할 수 있도록 설계

- 1) SQL 삽입

- 2) 경로 조작 및 자원 삽입

- 3) 크로스사이트 스크립트

- 4) 운영체제 명령어 삽입

- 5) 위험한 형식 파일 업로드

- 6) 신뢰되지 않는 URL 주소로 자동접속 연결

- 7) XQuery 삽입

- 8) XPath 삽입

- 9) LDAP 삽입

- 10) 크로스사이트 요청 위조

- 11) HTTP 응답분할

- 12) 정수형 오버플로우

- 13) 보안기능 결정에 사용되는 부적절한 입력값

- 14) 메모리 버퍼 오버플로우

- 15) 포맷 스트링 삽입


유형 2. 보안기능 : 인증, 접근통제, 권한관리, 비밀번호 등의 정책이 적절하게 반영될 수 있도록 설계

- 1) 적절한 인증 없는 중요기능 허용

- 2) 부적절한 인가

- 3) 중요한 자원에 대한 잘못된 권한 설정

- 4) 취약한 암호화 알고리즘 사용

- 5) 중요정보 평문저장

- 6) 중요정보 평문전송

- 7) 하드코드된 비밀번호

- 8) 충분하지 않은 키 길이 사용

- 9) 적절하지 않은 난수값 사용

- 10) 하드코드된 암호화 키

- 11) 취약한 비밀번호 허용

- 12) 사용자 하드디스크에 저장되는 쿠키를 통한 정보노출

- 13) 주석문 안에 포함된 시스템 주요정보

- 14) 솔트없이 일방향 해쉬함수 사용

- 15) 무결성 검사없는 코드 다운로드

- 16) 반복된 인증시도 제한 기능 부재


유형 3. 시간 및 상태 : 동시 또는 거의 동시 수행을 지원하는 병렬 시스템, 하나 이상의 프로세스가 동작되는 환경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 보안약점

- 1) 경쟁조건: 검사 시점과 사용 시점(TOCTOU)

- 2) 종료되지 않는 반복문 또는 재귀 함수


유형 4. 에러처리 : 에러를 처리하지 않거나 불충분하게 처리하여 중요정보(시스템 등)가 포함될 때 발생할 수 있는 보안약점

- 1) 오류 메시지를 통한 정보노출

- 2) 오류 상황 대응 부재

- 3) 부적절한 예외 처리


유형 5. 코드오류 : 타입변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안약점

- 1) Null Pointer 역참조

- 2) 부적절한 자원 해제

- 3) 해제된 자원 사용

- 4) 초기화 되지 않은 변수 사용


유형 6. 캡슐화 : 중요한 데이터 또는 기능성을 불충분하게 캡슐화 하였을 때, 인가되지 않은 사용자에게 데이터 누출이 가능해지는 보안약점

- 1) 잘못된 세션에 의한 데이터 정보 노출

- 2) 제거되지 않고 남은 디버그 코드

- 3) 시스템 데이터 정보노출

- 4) Public 메소드로부터 반환된 Private 배열

- 5) Private 배열에 Public 데이터 할당


유형 7. API 오용 : 의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안약점

- 1) DNS lookup에 의존한 보안결정

- 2) 취약한 API 사용

------------------------------------------------------------------------------------------------------------------------

과 같이 분류되고 있습니다.


자세한 내용은 '행정기관 및 공공기관 정보시스템 구축.운영 지침' 에서 참고할 수 있습니다. 


WRITTEN BY
SiriusJ

,

일반적으로 소프트웨어를 개발할 때, 보안을 신경쓰면서 개발하는 분들은 많지 않을 것입니다.


하지만 우리가 C, JAVA 등의 언어를 이용하여 개발할 때, 수많은 보안약점들이 내재되어 있다고 봐도 무방합니다.


이 보안약점이란 무엇일까요?


'소프트웨어 보안약점' 이란 소프트웨어 개발 시, 소프트웨어에 결함이 될 수 있는 논리적인 오류나 버그, 실수 등 이후 취약점으로 발생될 수 있는 근본 원인을 뜻합니다.


그렇다면 '소프트웨어 보안취약점' 이란 무엇일까요?

'소프트웨어 보안취약점' 이란 정보시스템(소프트웨어)에 실제로 내재되어있는 위험요소들로, 공격자가 이를 악용해서 해당 시스템의 정상적인 작동을 방해하거나 정보유출, 권한 상승 등을 일으킬 수 있는 것입니다.

> 소프트웨어 보안약점과 소프트웨어 보안취약점은 용어는 비슷해보이나, 소프트웨어의 보안사고를 대비하기 위해서는 원천적인 소프트웨어 보안약점을 제거하는 것이 필요합니다.


현재는 행정안전부에서 '행정기관 및 공공기관의 정보시스템 구축.운영 지침' 을 통하여 개발자가 구현(개발)단계에서 확인해야 하는 47개의 보안약점을 정의하고 있습니다.

(지금은 행정기관이나 공공기관 등의 공공 정보화 사업에서 의무화 되어 지키도록 강제하고 있지만, 민간에서도 해당 지침을 참고하여, 보다 안전한 소프트웨어를 개발하는 것이 필요하다고 생각합니다.)


크게 7개의 보안약점 유형으로 분류되고 있고, 각 유형별 세부 항목들로는 47개로 정의하고 있으며 이에 대한 자세한 설명은 다음 포스팅에서 다루도록 하겠습니다.


WRITTEN BY
SiriusJ

,