해커들의 공격 기법은 끊임없이 진화한다.
“실력 과시”와 “금전 획득” 등 해킹의 고전적인 목적 이외에도 개인과 개인, 조직과 조직, 더 나아가 국가와 국가간의 범죄, 이권 다툼, 전쟁의 수단으로 해킹(사이버 공격, 사이버 테러)이 이용되면서 다양한 소프트웨어와 시스템의 취약점이 끊임없이 발견되고 공격받고 있다.
그로 인해 소프트웨어나 웹사이트를 개발하는 개발자들의 발등에도 불이 떨어졌다. 사용자 인증과정이나 전송되는 데이터의 무결성과 암호화에만 신경쓰면 되었던 “소프트웨어 개발 보안”이 소프트웨어의 개발 전 과정과 시작에서 종료까지의 모든 소스코드상에 보안의 개념이 적용되기 시작하였다.
이러한 소프트웨어의 개발과정에서 적용되는 보안 기법을 “시큐어코딩(Secure Coding)”이라고 한다.
2012년 9월에 안행부(KISA)에서 발간한 시큐어코딩 가이드가 소프트웨어의 개발 시 지켜야할 시큐어코딩 지침을 담고 있다.
소프트웨어(SW) 개발보안의 정의
이 시큐어코딩 가이드에 보면 소프트웨어 개발 보안을 다음과 같이 정의하고 있다.
“SW 개발 과정에서 개발자의 실수, 코드의 논리적 오류 등으로 인해 SW가 갖고 있을 수 있는 보안취약점(vulnerability)의 원인, 즉 보안 약점(weakness)을 최소화하는 한편, 사이버 보안 위협에 대응할 수 있는 안전한 SW를 개발하기 위한 일련의 보안활동을 의미한다.넓은 의미(광의)로는 SW 개발생명주기(SDLC : Software Development Lifecycle)의 각 단계별로 요구되는 보안활동을 모두 포함하며, 좁은 의미(협의)로는 SW 개발 과정 중 소스코드 구현단계에서 보안 약점이 발생하는 것을 배제하기 위한 “시큐어코딩(secure coding)” 을 의미한다.”
위의 정의에서는 잘못된 코딩에 의한 “보안 약점”이 “취약점”의 원인이 된다고 서술되어 있다. 이는 소스코딩 시 보안을 고려하지 않는 코딩이 “약점”이 되고 이 “약점”이 “보안취약점”의 원인이 된다는 의미다. 보안을 고려하지 않고 코딩을 한다해서 무조건 “취약점”이 내재되지는 않는 사실을 반영하고 있는 듯 보인다.
아래 취약점 목록에도 있지만 “입력데이터 검증”을 하지 않는다 하여 무조건 취약점이 있는 것은 아니기 때문에 입력값 검증을 하지 않는 것은 “약점”이고 이 “약점”으로 인해 특정 입력값을 넣었을 때 권한의 탈취 또는 다른 명령어를 실행할 수 있거나 정보가 노출되면 그 “약점”은 “취약점”이 된다는 것이다.
시큐어 코딩의 정의에서 “약점”이라는 개념을 적용한 것은 아마도 소스코딩을 하면서 어떤 코드에서 “취약점”이 발생할지를 미리 예상하는 것이 매우 어렵기 때문이라고 생각된다. 사실 입력값 검증을 하지 않아도 되는 경우도 있고 에러 처리를 별도로 해주지 않아도 되는 경우가 있지만 어느 로직은 하지 않아도 되고 어느 로직은 해야하는지를 판단하는 것 보다는 일괄적으로 시큐어 코딩을 습관화하여 적용하는 것이 보다 효율적이고 보안 강화 효과가 크다고 보여진다.
시큐어코딩이 적용되어야 할 7대 취약점
취약점 |
내용 |
입력데이터 검증 및 표현 |
프로그램 입력값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식 지정으로 인해 발생할 수 있는 보안 약점
※ SQL 삽입, 자원 삽입, 크로스사이트 스크립트 등 26개 취약점 |
보안 기능 |
보안 기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 적절하게 구현하지 않았을 때 발생할 수 있는 보안 약점
※ 부적절한 인가, 중요정보 평문 저장(또는 전송) 등 24개 |
시간 및 상태 |
동시 또는 거의 동시 수행을 지원하는 병렬 시스템, 하나 이상의 프로세스가 동작하는 호나경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 보안 약점
※ 경쟁조건,, 제어문을 사용하지 않는 재귀함수 등 7개 |
에러 처리 |
에러를 처리하지 않거나, 불충분하게 처리하여 에러 메시지에 중요 정보(시스템 등)가 포함될 때 발생할 수 있는 보안 약점
※ 취약한 패스워드 요구조건, 오류 메시지를 통한 정보 노출 등 4개 |
코드 오류 |
타입 변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안 약점
※ 널 포인터 역참조, 부적절한 자원 해제 등 7가지 |
캡슐화 |
중요한 데이터 또는 기능성을 불충분하게 캡슐화하였을 때, 인가되지 않는 사용자에게 데이터 누출이 가능해지는 취약점
※제거되지 않고 남은 디버그 코드, 시스템 데이터 정보누출 등 8개 |
API 오용 |
의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안 약점
※ DNS Lookup에 의존한 보안결정, 널 매개변수 미조사 등 7개 |
보다 자세한 시큐어 코딩 가이드는 이곳(안행부전자정부국)을 방문해 다운로드 받으면 된다.