소스코드보안약점진단 개요
개요
최근 발생되는 인테넷상의 공격시도의 약 75%는 SW보안취약점을 악용하는 것으로, 특히 외부에 공개되어 불특정다수를 대상으로 사용자 정보를 처리하는 웹 애플리케이션의 취약점으로 인해 중요정보가 유출되는 침해사고가 빈번하게 발생되고 있어, 보안 강화를 위하여 SW개발과정에서 개발자의 실수, 논리적 오류 등으로 인해 발생될 수 있는 보안 취약점, 보안약점들을 최소화하여 사이버 보안위협에 대응할 수 있는 안전한 SW 개발을 지원하는 컨설팅 서비스
목적
- 취약점 진단과 모의해킹을 통해 주요 정보시스템의 기술적 취약점을 파악
- 도출된 위협에 대한 보호 대책을 제시하여 침해 사고 발생 위협을 감소
- 보안 수준을 향상하고 정보자원의 기밀성, 무결성, 가용성을 유지
기대효과
- 해킹 발생 가능성 최소화
- 보안 코딩 방안 제시를 통해 조직의 개발자, 운영자의 업무 능력 향상 효과
- 원시 코드상의 보안 취약점을 점검 및 예방하여 안정성 높은 시스템 구축
- 프로그램 소스코드 품질 향상
SW 개발 보안 기준 및 절차
SW 개발 보안 기준
구분 |
내용 |
비고 |
대상 |
|
‘전자정부법 시행령 제71조 제1항’ 참조 |
범위 |
- 설계 단계 산출물·소스코드
(신규개발 전체, 유지보수로 변경된 부분)
|
상용SW 제외 |
기준 |
- 설계단계 보안설계 기준(총 20개 항목)
- 구현단계 보안약점 제거 기준(총 47개 항목)
※ 행정기관 및 공공기관 정보시스템 구축·운영 지침 ‘별표3’
※ 정보시스템 감리기준(제10조 제1항 세부검사항목)에 포함
|
진단기준 |
기타 |
- 감리법인이 진단도구 사용시, 국정원장이 인증한 도구 사용
※ 정보보호시스템 평가·인증 지침
|
|
- 감리법인은 SW보안약점 진단시, 진단원을 우선적으로 배치
※ 감리대상外 사업은 자체적으로 SW보안약점 진단·제거결과 확인
※ 행정기관 및 공공기관 정보시스템 구축·운영 지침 ‘별표4
|
진단원 활용 |
소스코드 보안 약점 진단 절차
소스코드 보안 약점 제거 기준
입력데이터 검증 및 표현
프로그램 입력값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식지정으로 인해 발생할 수 있는 보안약점
번호 |
보안약점 |
설 명 |
1 |
SQL 삽입 |
검증되지 않은 외부 입력값이 SQL 쿼리문 생성에 사용되어 악의적인 쿼리가 실행될 수 있는 보안약점 |
2 |
경로 조작 및 자원 삽입 |
검증되지 않은 외부 입력값이 시스템 자원 접근경로 또는 자원제어에 사용되어 공격자가 입력값을 조작해 공격할 수 있는 보안약점 |
3 |
크로스사이트 스크립트 |
검증되지 않은 외부 입력값에 의해 사용자 브라우저에서 악의적인 스크립트가 실행될 수 있는 보안약점 |
4 |
운영체제 명령어 삽입 |
검증되지 않은 외부 입력값이 운영체제 명령문 생성에 사용되어 악의적인 명령어가 실행될 수 있는 보안약점 |
5 |
위험한 형식 파일 업로드 |
파일의 확장자 등 파일형식에 대한 검증없이 업로드를 허용하여 발생할 수 있는 보안약점 |
6 |
신뢰되지 않는 URL 주소로 자동접속 연결 |
검증되지 않은 외부 입력값이 URL 링크 생성에 사용되어 악의적인 사이트로 자동접속될 수 있는 보안약점 |
7 |
XQuery 삽입 |
검증되지 않은 외부 입력값이 XQuery 쿼리문 생성에 사용되어 악의적인 쿼리가 실행될 수 있는 보안약점 |
8 |
XPath 삽입 |
검증되지 않은 외부 입력값이 XPath 쿼리문 생성에 사용 되어 악의적인 쿼리가 실행될 수 있는 보안약점 |
9 |
LDAP 삽입 |
검증되지 않은 입력값이 LDAP 명령문 생성에 사용되어 악의적인 명령어가 실행될 수 있는 보안약점 |
10 |
크로스사이트 요청 위조 |
검증되지 않은 외부 입력값에 의해 브라우저에서 악의적인 스크립트가 실행되어 공격자가 원하는 요청(Request)이 다른 사용자(관리자 등)의 권한으로 서버로 전송되는 보안약점 |
11 |
HTTP 응답분할 |
검증되지 않은 외부 입력값이 HTTP 응답헤더에 삽입되어 악의적인 코드가 실행될 수 있는 보안약점 |
12 |
정수형 오버플로우 |
정수를 사용한 연산의 결과가 정수값의 범위를 넘어서는 경우, 프로그램이 예기치 않게 동작될 수 있는 보안약점 |
13 |
보안기능 결정에 사용 되는 부적절한 입력값 |
검증되지 않은 입력값이 보안결정(인증, 인가, 권한부여 등)에 사용되어 보안 메커니즘 우회 등을 야기할 수 있는 보안약점 |
14 |
메모리 버퍼 오버플로우 |
메모리 버퍼의 경계값을 넘어서 메모리값을 읽거나 저장 하여 예기치 않은 결과를 발생시킬 수 있는 보안약점 |
15 |
포맷 스트링 삽입 |
printf 등 외부 입력값으로 포맷스트링을 제어할 수 있는 함수를 사용하여 발생할 수 있는 보안약점 |
보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한 관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점
번호 |
보안약점 |
설 명 |
1 |
적절한 인증 없는 중요기능 허용 |
적절한 인증없이 중요정보(금융정보, 개인정보, 인증정보 등)를 열람(또는 변경)할 수 있게 하는 보안약점 |
2 |
부적절한 인가 |
적절한 접근제어 없이 외부 입력값을 포함한 문자열로 중요자원에 접근할 수 있는 보안약점 |
3 |
중요한 자원에 대한 잘못된 권한 설정 |
중요자원(프로그램 설정, 민감한 사용자 데이터 등)에 대한 적절한 접근권한을 부여하지 않아, 인가되지 않은 사용자 등에 의해 중요정보가 노출·수정되는 보안약점 |
4 |
취약한 암호화 알고리즘 사용 |
중요정보(금융정보, 개인정보, 인증정보 등)의 기밀성을 보장할 수 없는 취약한 암호화 알고리즘을 사용하여 정보가 노출될 수 있는 보안약점 |
5 |
중요정보 평문저장 |
중요정보(비밀번호, 개인정보 등)를 암호화하여 저장하지 않아 정보가 노출될 수 있는 보안약점 |
6 |
중요정보 평문전송 |
중요정보(비밀번호, 개인정보 등) 전송시 암호화하지 않거나 안전한 통신채널을 이용하지 않아 정보가 노출될 수 있는 보안약점 |
7 |
하드코드된 비밀번호 |
소스코드내에 비밀번호가 하드코딩되어 소스코드 유출시 노출 우려 및 주기적 변경 등 수정(관리자 변경 등)이 용이하지 않는 보안약점 |
8 |
충분하지 않은 키 길이 사용 |
데이터의 기밀성, 무결성 보장을 위해 사용되는 키의 길이가 충분하지 않아 기밀정보 누출, 무결성이 깨지는 보안약점 |
9 |
적절하지 않은 난수 값 사용 |
예측 가능한 난수사용으로 공격자로 하여금 다음 숫자 등을 예상하여 시스템 공격이 가능한 보안약점 |
10 |
하드코드된 암호화 키 |
소스코드내에 암호화키가 하드코딩되어 소스코드 유출시 노출 우려 및 키 변경이 용이하지 않는 보안약점 |
11 |
취약한 비밀번호 허용 |
비밀번호 조합규칙(영문, 숫자, 특수문자 등) 미흡 및 길이가 충분하지 않아 노출될 수 있는 보안약점 |
12 |
사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출 |
쿠키(세션 ID, 사용자 권한정보 등 중요정보)를 사용자 하드디스크에 저장함으로써 개인정보 등 기밀정보가 노출될 수 있는 보안약점 |
13 |
주석문 안에 포함된 시스템 주요정보 |
소스코드내의 주석문에 인증정보 등 시스템 주요정보가 포함되어 소스코드 유출시 노출될 수 있는 보안약점 |
14 |
솔트 없이 일방향 해쉬 함수 사용 |
공격자가 솔트없이 생성된 해쉬값을 얻게 된 경우, 미리 계산된 레인보우 테이블을 이용하여 원문을 찾을 수 있는 보안약점 |
15 |
무결성 검사없는 코드 다운로드 |
원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고 이를 실행하는 경우, 공격자가 악의적인 코드를 실행할 수 있는 보안약점 |
16 |
반복된 인증시도 제한 기능 부재 |
인증시도의 수를 제한하지 않아 공격자가 무작위 인증 시도를 통해 계정접근 권한을 얻을 수 있는 보안약점 |
시간 및 상태
동시 또는 거의 동시 수행을 지원하는 병렬 시스템, 하나 이상의 프로세스가 동작되는 환경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 보안약점
번호 |
보안약점 |
설 명 |
1 |
경쟁조건: 검사 시점과 사용 시점(TOCTOU) |
멀티 프로세스 상에서 자원을 검사하는 시점과 사용하는 시점이 달라서 발생하는 보안약점 |
2 |
종료되지 않는 반복문 또는 재귀 함수 |
종료조건 없는 제어문 사용으로 반복문 또는 재귀함수가 무한히 반복되어 발생할 수 있는 보안약점 |
에러처리
에러를 처리하지 않거나, 불충분하게 처리하여 에러정보에 중요정보(시스템 등)가 포함될 때 발생할 수 있는 보안약점
번호 |
보안약점 |
설 명 |
1 |
오류 메시지를 통한 정보 노출 |
개발자가 생성한 오류메시지에 시스템 내부구조 등이 포함되어 민감한 정보가 노출될 수 있는 보안약점 |
2 |
오류 상황 대응 부재 |
시스템에서 발생하는 오류상황을 처리하지 않아 프로그램 실행정지 등 의도하지 않은 상황이 발생할 수 있는 보안약점 |
3 |
부적절한 예외 처리 |
예외에 대한 부적절한 처리로 인해 의도하지 않은 상황이 발생될 수 있는 보안약점 |
코드오류
타입변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩오류로 인해 유발되는 보안약점
번호 |
보안약점 |
설 명 |
1 |
Null Pointer 역참조 |
Null로 설정된 변수의 주소값을 참조했을 때 발생하는 보안약점 |
2 |
부적절한 자원 해제 |
사용된 자원을 적절히 해제 하지 않으면 자원 누수 등이 발생하고, 자원이 부족하여 새로운 입력을 처리할 수 없게 되는 보안약점 |
3 |
해제된 자원 사용 |
메모리 등 해제된 자원을 참조하여 예기치 않은 오류가 발생될 수 있는 보안약점 |
4 |
초기화되지 않은 변수 사용 |
변수를 초기화하지 않고 사용하여 예기치 않은 오류가 발생될 수 있는 보안약점 |
캡슐화
중요한 데이터 또는 기능성을 불충분하게 캡슐화 하였을 때, 인가되지 않은 사용자에게 데이터 누출이 가능해지는 보안약점
번호 |
보안약점 |
설 명 |
1 |
잘못된 세션에 의한 데이터 정보 노출 |
잘못된 세션에 의해 인가되지 않은 사용자에게 중요정보가 노출될 수 있는 보안약점 |
2 |
제거되지 않고 남은 디버그 코드 |
디버깅을 위해 작성된 코드를 통해 인가되지 않은 사용자에게 중요정보가 노출될 수 있는 보안약점 |
3 |
시스템 데이터 정보노출 |
사용자가 볼 수 있는 오류 메시지나 스택 정보에 시스템 내부 데이터나 디버깅 관련 정보가 공개되는 보안약점 |
4 |
Public 메소드부터 반환된 Private 배열 |
Private로 선언된 배열을 Public으로 선언된 메소드를 통해 반환(return)하면, 그 배열의 레퍼런스가 외부에 공개되어 외부에서 배열이 수정될 수 있는 보안약점 |
5 |
Private 배열에 Public 데이터 할당 |
Public으로 선언된 데이터 또는 메소드의 인자가 Private로 선언된 배열에 저장되면, Private 배열을 외부에서 접근할 수 있게 되는 보안약점 |
API 오용
의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안약점
번호 |
보안약점 |
설 명 |
1 |
DNS lookup에 의존한 보안결정 |
DNS는 공격자에 의해 DNS 스푸핑 공격 등이 가능함으로 보안결정을 DNS 이름에 의존할 경우, 보안결정 등이 노출되는 보안약점 |
2 |
취약한 API 사용 |
취약하다고 알려진 함수를 사용함으로써 예기치 않은 보안위협에 노출될 수 있는 보안약점 |