SW개발보안 (Secure Coding)
1. SW 개발 보안의 필요성
"SW 개발보안"이란 SW 개발 과정에서 개발자 실수, 논리적 오류 등으로 인해 SW에 내재된 보안취약점을 최소화하는 한편, 해킹 등 보안위협에 대응할 수 있는 안전한 SW를 개발하기 위한 과정을 의미한다. 넓은 의미에서 SW 생명주기 각 단계별로 요구되는 보안활동을 모두 포함하며, 좁은 의미로는 SW 개발과정에서 소스코드를 작성하는 구현단계 보안취약점을 배제하기 위한 시큐어 코딩을 의미한다.
2. 시큐어 코딩의 개요
가. 시큐어 코딩(Secure Coding)의 정의
- 서비스의 안정성과 신뢰성 확보를 위해 IT 시스템 개발 단계에서 주요 보안 취약점을 고려하여 소스코드 레벨에서 위험요소를 사전에 제거하여 안전한 소프트웨어를 개발하는 기법
- SW개발부터 보안을 염두 해두고 프로그래밍을 하는 것으로 코드에 결함이나 오류가 있을 경우 사이버 공격을 유발한 가능성이 있으므로 예방 차원에서 프로그래밍을 할 때 지켜야 할 코딩규칙과 소스코드 취약성 목록, 보안 규칙 등을 제시한 가이드라인
- 소프트웨어 보안약점(Weakness): 소프트웨어 결함, 오류 등으로 해킹 등 사이버공격을 유발할 가능성이 있는 잠재적인 보안취약점
- 소프트웨어 개발보안(Secure Coding): 해킹 등 사이버공격의 원인인 보안약점을 개발단계에서 사전에 제거하여 안전한 소프트웨어를 개발하는 기법
나. 시큐어 코딩의 목적
목적 | 시큐어 코딩의 목적 |
사이버 공격 예방 | 사이버 공격의 75%가 응용 프로그램의 취약점을 악용한 것(가트너 발표) |
웹 어플리케이션 취약점 개선 | 사이트 교차 접속 스크립팅(XSS), SQL인젝션 공격 등의 웹 응용 프로그램에 내재된 보안 취약점을 이용한 고객 정보 유출 사고 발생 |
취약점 수정 비용 절감 | 설계 과정에서 발생한 결함이 개발 완료 후에 발견, 조치되는 경우, 설계 단계에서 결함을 수정하는 비용 대비 30배 비용 발생 |
보안취약점 대응 | 최근의 사이버 공격의 진화에 따라 사전에 정보처리시스템의 보안취약점을 사전에 대응 Zero Day공격, SQL인젝션 취약점, 침입차단시스템 등 보안장비의 우회 등 |
전자정부 서비스확대 | ICT 신기술을 활용한 전자정부 서비스가 확대되고, 대부분의 행정서비스가 인터넷을 통해 제공되면서, 전자정부 서비스의 보안취약점을 지속적으로 진단, 제거에 효율적 관리 방안 |
안정성 및 신뢰성 확보 | 전자정부 서비스의 안정성 및 신뢰성 확보를 위해 정보시스템의 개발단계부터 개념 및 소스코드 레벨에서의 대응조치를 제안하여 전자정부 서비스의 보안 정책을 강화 |
- 보안 취약점 제거는 운영단계보다 개발단계가 훨씬 효율적
- 소스코드 레벨의 보안 취약점 잔존 최소화가 목적
3. 정보처리시스템의 보안성 강화를 위한 시큐어 코딩의 적용대상 및 적용범위
가. SW개발보안 적용대상 및 범위 기준
대상 | 내용 |
의무 대상 | - 2012년 12월부터(본 지침 고시 후 6개월 경과한 날부터) 행정기관 등에서 추진하는 개발비 40억원 이상 정보화 사업에 소프트웨어 개발보안 적용을 의무화 - 단계적으로 의무 대상을 확대하여 ‘15년에는 감리대상 전 정보화 사업에 소프트웨어 개발보안을 적용함. |
적용 제외 | 상용 소프트웨어는 소프트웨어 개발보안 적용 대상에서 제외됨. |
적용 범위 | 소프트웨어 개발 사업자가 반드시 제거해야 할 보안약점은 SQL 삽입, 크로스사이트스크립트(XSS) 등 43개 존재. |
감리 영역 | - 감리법인은 정보시스템 감리 시 검사 항목에 보안약점 제거여부를 반드시 포함 - 감리법인은 효과적인 보안약점 진단을 위해 진단도구를 사용할 경우 국정원장이 인증한 보안약점 진단도구를 사용 |
나. CWE(Common Weakness Enumeration)의 7 Pernicious Kingdoms 분류
범위 | 설명 | 예제 |
입력 데이터 검증 및 표현 | 프로그램 입력 값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식지정으로 인해 발생할 수 있는 보안취약점 | XSS, SQL삽입, 버퍼 오버플로우, OS 명령어 삽입공격 등 |
보안기능 | 보안기증(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 적절하지 않게 구현 시 발생할 수 있는 보안취약점 | 중요 정보 평문 저장, 하드코드 된 패스워드 등 |
시간 및 상태 | 병렬 시스템, 프로세스나 쓰레드 환경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 보안취약점 | DeadLock, 자원에 대한 경쟁 조건, 세션 고착 |
에러처리 | 에러를 처리하지 않거나, 불충분하게 처리하여 에러정보에 중요정보가 포함될 때 발생할 수 있는 보안취약점 | 에러처리 루틴 누락, 에러처리 통한 정보 노출 등 |
코드품질 | 복잡한 소스코드로 인해 관리성, 유지보수성, 가독성 저하가 발생하여 코딩 오류로 인해 유발되는 보안취약점 | 널 포인터 역 참조, 부적절한 자원 해제 등 |
캡슐화 | 중요한 데이터 또는 기능성을 불충분하게 캡슐화 하였을 때 인가되지 않은 사용자에게 데이터 누출이 가능해지는 보안약점 | 제거되지 않고 남은 디버거 코드, 시스템 데이터 정보 노출 등 |
API 악용 | 의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안약점 | DNS Lookup에 의존한 보안결정 |
4. 소프트웨어 개발기준의 시큐어코딩의 적용 범위
가. 입력데이터 검증 및 표현
보안약점 | 설명 |
SQL 삽입 | 사용자의 입력 값 등 외부 입력 값이 SQL쿼리에 삽입되어 공격자가 쿼리를 조작해 공격할 수 있는 보안 약점 |
자원 삽입 | 외부 입력 값에 대한 검증이 없거나 혹은 잘못된 검증을 거쳐서 시스템 자원에 접근하는 경로 등의 정보로 이용될 때 발생하는 보안 약점 |
크로스사이트 스크립트 | 검증되지 않은 외부 입력 값에 의해 브라우저에서 악의적인 코드가 실행되는 보안약점 |
운영체제 명령어 삽입 | 운영체제 명령어를 구성하는 외부 입력 값이 적절한 필터링을 거치지 않고 쓰여져서 공격자가 명령어를 조작할 수 있는 보안 약점 |
위험한 형식 파일 업로드 | 파일의 확장자 등 파일의 형식에 대한 검증 없이 파일 업로드를 허용하여 발생하는 보안약점 |
신뢰되지 않는 URL주소 자동접속 연결 | 사용자의 입력 값 등 외부 입력 값이 링크 표현에 사용되고, 이 링크를 시용하여 악의적인 사이트로 redirect되는 보안약점 |
XQuery 삽입 | 사용자의 입력 값 등 외부 입력 값이 XQuery 표현에 삽입되어 악의적인 쿼리가 실행되는 보안약점 |
XPath 삽입 | 사용자의 입력 값 등 외부 입력 값이 XPath표현에 삽입되어 악의적인 쿼리가 실행되는 보안약점 |
LDAP 삽입 | 검증되지 않은 입력에 의해 동적으로 생성된 LDAP문에 의해 악의적인 LDAP 명령이 실행되는 보안 약점 |
크로스사이트 요청 위조 | 검증되지 않은 외부 입력 값에 의해 브라우저에서 악의적인 코드가 실행되어 사용자 요청정보가 서버에 보내지는 보안 약점 |
디렉토리 경로조작 | 지정된 경로 밖의 경로에 접근하게 되는 보안 약점 |
HTTP 응답 분할 | 사용자의 입력 값 등 외부 입력 값이 HTTP응답헤더에 삽입되어 악의적인 코드가 실행되는 보안약점 |
정수 오버플로우 | 정수를 사용한 연산의 결과가 정수값의 범위를 넘어서는 경우 프로그램이 예기치 않은 동작도리 수 있는 보안약점 |
보호 메커니즘을 우회할 수 있는 입력 값 변조 | 사용자에 의해서 변경될 수 있는 값을 사용하여 보안결정(인증/인가/권한부여 등)을 수행하여 보안 메커니즘이 우회될 수 있는 보안약점 |
나. 보안기능
보안약점 | 설명 |
적절한 인증 없는 중요 기능 허용 | 적절한 인증 없이 중요정보(계좌이체 정보, 개인정보 등)을 열람(또는 변경) 할 수 있게 하는 보안 약점 |
부적절한 인가 | 적절한 접근제어 없이 외부 입력 값을 포함한 문자열로 서버자원에 접근(혹은 서버실행인가)을 할 수 있게 하는 보안약점 |
중요한 자원에 대한 잘못된 권한 설정 | 중요자원(프로그램 설정, 민감한 사용자 데이터 등)에 대한 적절한 접근권한을 부여하지 않아, 의도하지 않는 사용자에 의해 중요정보가 노출, 수정되는 보안 약점 |
취약한 암호화 알고리즘 사용 | 중요 정보(패스워드, 개인정보 등)의 기밀성을 보장 할 수 없는 취약한 암호화 알고리즘을 사용하여 정보가 노출될 수 있는 보안약점 |
사용자 중요정보 평문 저장(또는 전송) | 중요 정보(패스워드, 개인정보 등) 저장(또는 전송)시 암호화 하지 않아 공격자에게 노출될 수 있는 보안약점 |
하드코드된 패스워드 | 소스코드 내에 비밀번호를 하드코딩함에 따라 관리자 비밀번호가 노출되거나, 주기적 변경 등 수정(관리자 변경 등)이 용이하지 않는 보안약점 |
충분하지 않은 키 길이 사용 | 데이터의 기밀성, 무결성 보장을 위해 사용되는 키의 길이가 충분하지 않아 기밀정보 누출, 무결성이 깨지는 보안약점 |
적절하지 않은 난수 값 사용 | 예측 가능한 난수 사용으로 공격자로 하여금 다음 숫자 등을 예상하여 시스템 공격이 가능한 보안약점 |
패스워드 평문 저장 | 기밀 정보인 비밀번호를 암호화하지 않아 노출 될 수 있는 보안약점 |
하드코드된 암호화 키 | 소스코드 내에 암호화 키를 하드코딩 하는 경우, 향후 노출될 수 있으며, 키 변경 등 수정이 용이하지 않는 보안약점 |
취약한 패스워드 허용 | 비밀번호 조합규칙(영문, 숫자, 특수문자 등)및 길이가 충분하지 않아 노출 될 수 있는 보안 약점 |
사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출 | 쿠키(세션ID, 사용자 권한정보 등 중요정보)를 사용자 하드디스크에 저장 함으로써 개인정보 등 기밀정보가 노출될 수 있는 보안약점 |
보안 속성 미적용으로 인한 쿠키 노출 | 쿠키에 보안속성을 적용하지 않을 경우, 쿠키에 저장된 중요데이터가 공격자에 노출될 수 있는 보안약점 |
주석문 안에 포함된 패스워드 등 시스템 주요정보 | 소스코드내의 주석문에 비밀번호가 하드코딩 되어 비밀번호가 노출될 수 있는 보안약점 |
솔트없이 일방향 해쉬함수 사용 | 공격자가 솔트 없이 패스워드만 해쉬한 값을 얻게 된 경우, 공격자는 가능한 모든 패스워드에 대해 해쉬값을 미리 계산한 레인보우 테이블을 이용하여 패스워드를 찾을 수 있는 보안약점 |
무결성 검사 없는 코드 다운로드 | 원격으로부터 소스코드 또는 실행 파일을 무결성 검사 없이 다운로드 받고 이를 실행하는 경우 공격자가 악의적인 코드를 실행 할 수 있는 보안약점 |
다. 시간 및 상태
보안약점 | 설명 |
경쟁조건: 검사시점 과 사용 시점(TOCTOU) | 멀티 프로세스 상에서 자원을 검사하는 시점과 사용하는 시점이 달라서 발생하는 보안약점 |
제어문을 사용하지 않는 재귀 함수 | 적절한 제어문 사용이 없는 재귀함수에서 무한재귀가 발생하는 보안약점 |
라. 에러처리
보안약점 | 설명 |
오류메시지 통한 정보 노출 | 개발 시 활용을 위한 오류정보의 출력메시지를 배포될 버전의 SW에 포함시킬 때 발생하는 보안약점 |
오류상황 대응 부재 | 시스템에서 발생하는 오류 상황을 처리하지 않아 프로그램 다운 등 의도하지 않은 상황이 발생할 수 있는 보안약점 |
적절하지 않은 예외처리 | 예외에 대한 부적절한 처리로 인해 의도하지 않은 상황이 발생될 수 있는 보안약점 |
마. 코드오류
보안약점 | 설명 |
널 포인터 역 참조 | NULL로 설정된 변수의 주소 값을 참조했을 때 발생하는 보안약점 |
부적절한 자원해제 | 사용된 자원을 적절히 해제 하지 않으면 자원의 누수 등이 발생하고, 자원이 모자라 새로운 입력에 처리 못하게 되는 보안약점 |
바. 캡슐화
보안약점 | 설명 |
잘못된 세션에 의한 데이터 정보 노출 | 잘못된 세션에 의해 권한 없는 사용자에게 데이터 노출이 일어날 수 있는 보안약점 |
제거되지 않고 남은 디버그 코드 | 디버깅을 위해 작성된 코드를 통해 권한 없는 사용자 인증우회(또는 중요중보)접근이 가능해지는 보안약점 |
시스템 데이터 정보노출 | 사용자가 볼 수 있는 오류 메시지나 스택 정보에 시스템 내부 데이터나 디버깅 관련 정보가 공개되는 보안약점 |
Public 메소드부터 반환된 Private배열 | Private로 선언된 배열을 Public으로 선언된 메소드를 통해 반환하면, 그 배열의 레퍼런스가 외부에 공개되어 외부에서 배열이 수정될 수 있는 보안약점 |
Private 배열에 Public 데이터 할당 | Public으로 선언된 데이터 또는 베소드의 파라미터가 Private 선언된 배열에 저장되면, Private배열을 외부에서 접근할 수 있게 되는 보안약점 |
사. API오용
보안약점 | 설명 |
DNS lookup에 의존한 보안결정 | DNS는 공격자에 의해 DNS 스푸핑 공격 등이 가능함으로 보안결정을 DNS 이름에 의존할 경우, 보안결정 등이 노출되는 보안약점 |
* 출처: C 시큐어코딩 가이드, 소프트웨어 개발보안 가이드 (행정안전부)














