보안 공부/소스코드 보안약점 진단

소스코드 보안약점 진단 - 취약한 API 사용

H.J.World 2022. 2. 16. 10:10
728x90
반응형

소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.

SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.

해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.

 

제 7절 API 오용

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


2. 취약한 API 사용

가. 개요

취약한 API는 보안상 금지된(banned) 함수이거나, 부주의하게 사용될 가능성이 많은 API를 의미 한다. 이들 범주의 API에 대해 확인하지 않고 사용할 때 보안 문제를 발생시킬 수 있다. 금지된 API 의 대표적인 예로는 스트링 자료와 관련된 strcat(), strcpy(), strncat(), strncpy(), sprintf() 등이 있다. 또한 보안상 문제가 없다 하더라도 잘못된 방식으로 함수를 사용할 때도 역시 보안 문제를 발생 시킬 수 있다.

나. 보안대책

보안 문제로 인해 금지된 함수는 이를 대체할 수 있는 안전한 함수를 사용한다. 그 예로, 위에 언급된 API 대신에 strcat_s(), strcpy_s(), strncat_s(), strncpy_s(), sprintf_s()과 같은 안전한 함수를 사용하 는 것이 권장된다. 또한 금지된 API는 아니지만 취약한 API의 예시로, 문자열을 정수로 변환할 때 사용하는 strtol()과 같은 함수는 작은 크기의 부호 있는 정수인 int, short, char와 같은 자료형 변환 에 사용하면 범위 제한 없이 값을 평가할 수 있다.

취약한 API의 분류는 일반적인 것은 아니지만 개발 조직에 따라 이를 명시한 경우가 있다면1) 반드시 준수한다.

다. 코드예제

아래 예제에서 gets() 함수는 크기와 상관없이 입력값을 버퍼에 저장하기 때문에 버퍼 오버플로우를 유발할 수 있다.

- 안전하지 않은 코드의 예 C -

1: #include <stdio.h>
2: void requestString()
3: {
4: char str[100];
5: //gets() 함수는 문자열 길이를 제한 할 수 없어 안전하지 않다.
6: gets(str);
7: }

 

- 안전한 코드의 예 C -

아래 예제와 같이 gets_s() 또는 fgets()함수를 사용하여 입력값의 크기를 제한하여 사용해야 한다.

1: #include <stdio.h>
2: void requestString()
3: {
4: char str[100];
5: //gets_s() 함수는 문자열 길이 제한이 가능하다.
6: gets_s(str, sizeof(str));
7: }

 

라. 진단방법

취약한 API의 리스트를 작성하고 검사하고자 하는 프로그램에서 해당 API를 사용하는지 확인한다. 해당 API를 사용하는 경우 프로그램에 예기치 않은 문제가 발생할 수 있으므로 취약한 것으로 판단 한다. 만약 취약한 API를 대체할 수 있는 API가 없을 경우, 해당 API의 인자와 반환 값에 대한 검사 가 이루어 지는지 확인한다.

다음 예제는 함수의 매개변수를 버퍼에 복사하는 코드이다. 예제에서 버퍼에 값을 복사하기 위해 사용한 strcpy() 함수는 보안에서 취약한 대표적인 API중 하나로, 만약 매개 변수의 길이가 지정된 버퍼의 크기보다 클 경우 예기치 못한 문제가 발생 할 수가 있다. 따라서 해당 코드는 보안약점이 존재한다고 진단할 수 있다.

1: void manipulate_string(char * string)
2: {
3: char buf[24];
4: strcpy(buf, string);
5: …
6: }

 

- 정탐코드의 예 -

아래 예제는 J2EE 프로그램에서 System.exit()를 사용하고 있다. System.exit() 메소드를 호출 하는 경우 웹 애플리케이션을 실행하고 있는 컨테이너를 종료할 수 있다.

1: public class U382 extends HttpServlet {
2: public void doPost(HttpServletRequest request, HttpServletResponse response)
3: throws ServletException, IOException {
4: try {
5: do_something(logger);
6: } catch (IOException ase) {
7: System.exit(1); /* J2EE 프로그램에서 System.exit()을 사용하고 있음 */
8: }
9: .......

 

728x90
반응형