맨위로가기

소프트웨어 개발 보안

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

소프트웨어 개발 보안은 소프트웨어 개발 과정에서 발생할 수 있는 다양한 보안 취약점을 방지하기 위한 기술과 방법을 의미한다. 주요 보안 취약점으로는 버퍼 오버플로우, 형식 문자열 공격, 정수 오버플로우, 경로 탐색 등이 있으며, 각 취약점에 대한 예시와 방지 기법을 설명한다. 버퍼 오버플로우는 할당된 메모리 범위를 초과하여 데이터를 쓰면서 발생하는 문제로, C/C++ 언어에서 `strncpy` 함수 사용 또는 동적 메모리 할당을 통해 방지할 수 있다. 형식 문자열 공격은 `printf()`와 같은 함수에 악의적인 입력을 제공하여 스택에서 읽거나 쓰는 것을 포함하며, 입력값 검증을 통해 예방한다. 정수 오버플로우는 산술 연산의 결과가 표현 범위를 초과할 때 발생하며, 연산 전후의 값 비교를 통해 안전하게 처리할 수 있다. 경로 탐색은 신뢰할 수 없는 경로를 통해 파일 접근을 시도하는 공격으로, 입력값 검증을 통해 특수 문자를 필터링하여 방지한다.

더 읽어볼만한 페이지

  • 소프트웨어 개발 - 유스 케이스
    유스 케이스는 시스템과 액터 간 상호작용을 통해 시스템 목표 달성에 기여하는 동작들을 나타내는 요구 사항 캡처, 모델링, 명세 기법으로, 객체 지향 소프트웨어 공학에서 기능 요구 사항을 캡처하는 데 중요한 역할을 하며 다양한 분야에서 활용된다.
  • 소프트웨어 개발 - 사용자 경험 디자인
    사용자 경험 디자인은 인간 공학에 기반하여 제품 또는 서비스와 사용자 간의 상호작용을 설계하는 분야이며, 사용자 조사, 인터랙션 디자인, 사용성 테스트 등을 통해 효율적이고 만족스러운 경험을 제공하는 것을 목표로 한다.
  • 컴퓨터 보안 - 얼굴 인식 시스템
    얼굴 인식 시스템은 디지털 이미지나 비디오에서 사람 얼굴을 감지하고 식별하는 기술로, 다양한 알고리즘 발전을 거쳐 보안, 신원 확인 등에 활용되지만, 편향성, 개인 정보 침해, 기술적 한계와 같은 윤리적 문제도 야기한다.
  • 컴퓨터 보안 - 워터마크
    워터마크는 종이 제조 시 두께 차이를 이용해 만들어지는 표식으로, 위조 방지를 위해 지폐나 여권 등에 사용되며 댄디 롤 등의 제작 기법을 통해 만들어지고 컴퓨터 프린터 인쇄 기술로도 활용된다.
소프트웨어 개발 보안
소프트웨어 개발 보안
종류소프트웨어 개발 방법론
개요
정의소프트웨어 개발 주기 전반에 걸쳐 보안을 고려하는 방법론이다.
목표소프트웨어 개발 초기 단계부터 보안 취약점을 제거한다.
개발 비용을 절감하고, 소프트웨어의 안정성을 향상시킨다.
주요 활동
보안 요구 사항 정의소프트웨어가 충족해야 할 보안 요구 사항을 명확하게 정의한다.
위협 모델링잠재적인 위협을 식별하고, 공격 시나리오를 분석한다.
보안 설계보안 요구 사항을 충족하도록 소프트웨어를 설계한다.
보안 코딩보안 취약점을 유발할 수 있는 코딩 오류를 방지한다.
보안 테스트소프트웨어의 보안 취약점을 검증한다.
보안 배포안전하게 소프트웨어를 배포하고, 운영 환경을 보호한다.
장점
개발 비용 절감개발 초기 단계에서 보안 취약점을 제거함으로써, 수정 비용을 절감한다.
소프트웨어 품질 향상보안 취약점을 줄여, 소프트웨어의 안정성과 신뢰성을 높인다.
법규 준수개인 정보 보호 및 데이터 보안 관련 법규를 준수한다.
기업 이미지 제고안전한 소프트웨어 개발을 통해 기업의 신뢰도를 높인다.
방법론
주요 방법론애자일 개발 보안 강화
폭포수 모델 보안 강화
클린룸 소프트웨어 공학
기타 방법론다양한 보안 개발 방법론 존재
참고 자료
관련 서적Building Secure Software: How to Avoid Security Problems the Right Way (John Viega, Gary McGraw, 2001)
관련 논문Threading secure coding principles and risk analysis into the undergraduate computer science and information systems curriculum (Blair Taylor, Shiva Azadegan, 2006)
Secure Coding: Building Security into the Software Development Life Cycle (Russell L. Jones, 2004)

2. 버퍼 오버플로우 방지

버퍼 오버플로우는 프로그램이 할당된 메모리 버퍼의 경계를 초과하여 데이터를 쓰려고 할 때 발생하는 취약점이다. 예를 들어, 항목을 저장할 슬롯이 8개 있는데 9개의 항목을 저장하려고 하면 문제가 발생한다. 컴퓨터 메모리에서 오버플로된 데이터는 다음 위치의 데이터를 덮어쓸 수 있으며, 이로 인해 보안 취약점(스택 스매싱) 또는 프로그램 종료(세그멘테이션 오류)가 발생할 수 있다.[1]

버퍼 오버플로우에 취약한 C 프로그램의 예는 다음과 같다.

```c++

int vulnerable_function(char * large_user_input) {

char dst[SMALL];

strcpy(dst, large_user_input);

}

```

사용자 입력이 대상 버퍼보다 크면 버퍼 오버플로우가 발생한다.

이 안전하지 않은 프로그램을 수정하려면 strncpy를 사용하여 발생 가능한 버퍼 오버플로우를 방지한다.

```c++

int secure_function(char * user_input) {

char dst[BUF_SIZE];

// 최대 BUF_SIZE 바이트 복사

strncpy(dst, user_input, BUF_SIZE);

// 버퍼의 마지막 문자를 NUL로 설정

dst[BUF_SIZE -1] = '\0';

}

```

또 다른 안전한 대안은 malloc을 사용하여 힙에 동적으로 메모리를 할당하는 것이다.

```c++

char * secure_copy(char * src) {

size_t len = strlen(src);

char * dst = (char *) malloc(len + 1);

if (dst != NULL) {

strncpy(dst, src, len);

// 널 종결자 추가

dst[len] = '\0';

}

return dst;

}

```

위 코드 조각에서 프로그램은 '''''src'''''의 내용을 '''''dst'''''에 복사하려고 시도하는 동시에 malloc의 반환 값을 확인하여 대상 버퍼에 충분한 메모리를 할당할 수 있는지 확인한다.

2. 1. C/C++ 코드 예제

버퍼 오버플로우는 프로세스가 고정 길이 버퍼의 크기를 초과하여 데이터를 저장하려고 할 때 발생하는 흔한 소프트웨어 보안 취약점이다.[1] 예를 들어 8개의 슬롯에 9개의 항목을 저장하려고 하면 문제가 발생하며, 오버플로된 데이터는 메모리에서 다음 위치의 데이터를 덮어써 보안 취약점이나 프로그램 종료를 유발할 수 있다.[1]

C/C++ 에서는 안전하지 않은 `strcpy` 함수 대신 `strncpy`를 사용하거나 `malloc`을 이용한 동적 메모리 할당을 통해 버퍼 오버플로우를 방지할 수 있다.

버퍼 오버플로우에 취약한 C 프로그램의 예는 다음과 같다.



int vulnerable_function(char * large_user_input) {

char dst[SMALL];

strcpy(dst, large_user_input);

}



사용자 입력이 대상 버퍼보다 크면 버퍼 오버플로우가 발생한다.

`strncpy`를 사용하여 버퍼 오버플로우를 방지하는 방법은 아래와 같다.



int secure_function(char * user_input) {

char dst[BUF_SIZE];

// 최대 BUF_SIZE 바이트 복사

strncpy(dst, user_input, BUF_SIZE);

// 버퍼의 마지막 문자를 NUL로 설정

dst[BUF_SIZE -1] = '\0';

}



malloc을 사용하여 힙에 동적으로 메모리를 할당하는 방법은 아래와 같다.



char * secure_copy(char * src) {

size_t len = strlen(src);

char * dst = (char *) malloc(len + 1);

if (dst != NULL) {

strncpy(dst, src, len);

// 널 종결자 추가

dst[len] = '\0';

}

return dst;

}



위 코드에서 프로그램은 '''''src'''''의 내용을 '''''dst'''''에 복사하고 malloc의 반환 값을 확인하여 대상 버퍼에 충분한 메모리를 할당할 수 있는지 확인한다.

3. 형식 문자열 공격 방지

형식 문자열 공격은 악의적인 사용자가 printf()와 같은 서식 지정 기능을 수행하는 함수에 인수로 입력될 특정 입력을 제공하는 경우에 발생한다. 이 공격은 공격자가 스택에서 읽거나 쓰는 것을 포함한다.

C 언어의 `printf` 함수는 표준 출력(stdout)에 출력을 쓴다. `printf` 함수의 매개변수가 제대로 형식이 지정되지 않은 경우 여러 보안 버그가 발생할 수 있다.

다음은 형식 문자열 공격에 취약한 C 코드 예제이다.

```c++

int vulnerable_print(char * malicious_input) {

printf(malicious_input);

}

```

프로그램에 전달된 악의적인 인수는 "%s%s%s%s%s%s%s"와 같을 수 있으며, 이는 부적절한 메모리 읽기로 인해 프로그램을 충돌시킬 수 있다.

3. 1. C 코드 예제

형식 문자열 공격은 악의적인 사용자가 `printf()`와 같은 서식 지정 기능을 수행하는 함수에 인수로 입력될 특정 입력을 제공하는 경우에 발생한다. 이 공격은 공격자가 스택에서 읽거나 쓰는 것을 포함한다.

C 언어의 `printf` 함수는 표준 출력(stdout)에 출력을 쓴다. `printf` 함수의 매개변수가 제대로 형식이 지정되지 않은 경우 여러 보안 버그가 발생할 수 있다.

다음은 형식 문자열 공격에 취약한 C 코드 예제이다.

```c++

int vulnerable_print(char * malicious_input) {

printf(malicious_input);

}

```

프로그램에 전달된 악의적인 인수는 "%s%s%s%s%s%s%s"와 같을 수 있으며, 이는 부적절한 메모리 읽기로 인해 프로그램을 충돌시킬 수 있다.

4. 정수 오버플로우 방지

정수 오버플로는 산술 연산의 결과가 사용 가능한 공간 내에서 표현할 수 없을 정도로 큰 정수가 될 때 발생한다. 정수 오버플로를 제대로 확인하지 않는 프로그램은 잠재적인 소프트웨어 버그 및 악용을 유발한다.

다음은 x와 y의 합이 정의된 값 MAX보다 작거나 같은지 확인하려는 C++의 함수이다.

```cpp

bool sumIsValid_flawed(unsigned int x, unsigned int y) {

unsigned int sum = x + y;

return sum <= MAX;

}

```

이 코드의 문제는 덧셈 연산에서 정수 오버플로를 확인하지 않는다는 것이다. x와 y의 합이 `unsigned int`의 최대 가능 값보다 크면 덧셈 연산이 오버플로되어 x와 y의 합이 MAX보다 큼에도 불구하고 MAX보다 작거나 같은 값이 발생할 수 있다.

다음은 합이 x와 y보다 크거나 같은지 확인하여 오버플로를 확인하는 함수이다. 합이 오버플로되면 합은 x보다 작거나 y보다 작을 것이다.

```cpp

bool sumIsValid_secure(unsigned int x, unsigned int y) {

unsigned int sum = x + y;

return sum >= x && sum >= y && sum <= MAX;

}

4. 1. C++ 코드 예제

cpp

정수 오버플로는 산술 연산 결과가 표현 가능한 범위를 초과하는 큰 정수가 될 때 발생한다. 정수 오버플로를 제대로 확인하지 않으면 소프트웨어 버그 및 악용될 소지가 있다.

다음은 x와 y의 합이 정의된 값 MAX보다 작거나 같은지 확인하려는 C++ 함수이다.



bool sumIsValid_flawed(unsigned int x, unsigned int y) {

unsigned int sum = x + y;

return sum <= MAX;

}



위 코드의 문제는 덧셈 연산에서 정수 오버플로를 확인하지 않는다는 것이다. x와 y의 합이 `unsigned int`의 최대 가능 값보다 크면 덧셈 연산이 오버플로되어, x와 y의 합이 MAX보다 큼에도 불구하고 MAX보다 작거나 같은 값이 발생할 수 있다.

다음은 합이 x와 y보다 크거나 같은지 확인하여 오버플로를 확인하는 함수이다. 합이 오버플로되면 합은 x보다 작거나 y보다 작을 것이다.



bool sumIsValid_secure(unsigned int x, unsigned int y) {

unsigned int sum = x + y;

return sum >= x && sum >= y && sum <= MAX;

}


5. 경로 탐색 방지

경로 탐색은 신뢰할 수 없는 소스에서 제공된 경로가 무단 파일 액세스를 가능하게 하는 취약점이다.

예를 들어, 파일 이름을 가져와 스크립트가 읽고 파싱하는 방식으로 기사를 가져오는 스크립트를 생각해 볼 수 있다. 이러한 스크립트는 다음과 같은 가상의 URL을 사용하여 개 사료에 대한 기사를 검색할 수 있다.

https://www.example.net/cgi-bin/article.sh?name=dogfood.html

스크립트에 입력 검사가 없고 파일 이름이 항상 유효하다고 신뢰하는 경우, 악의적인 사용자는 웹 서버에서 구성 파일을 검색하기 위해 URL을 위조할 수 있다.

https://www.example.net/cgi-bin/article.sh?name=../../../../../etc/passwd

스크립트에 따라 이는 /etc/passwd 파일을 노출할 수 있으며, 이는 유닉스 계열 시스템에서 사용자 ID, 로그인 이름, 홈 디렉토리 경로 및 셸 등을 포함한다. (유사한 공격에 대해서는 SQL 주입을 참조). 입력값 검증을 통해 `../`와 같은 특수 문자를 필터링하여 경로 조작을 방지해야 한다.

5. 1. URL 예제

경로 탐색은 신뢰할 수 없는 소스에서 제공된 경로가 무단 파일 액세스를 가능하게 하는 취약점이다.

예를 들어, 파일 이름을 가져와 스크립트가 읽고 파싱하는 방식으로 기사를 가져오는 스크립트를 생각해 볼 수 있다. 이러한 스크립트는 다음과 같은 가상의 URL을 사용하여 개 사료에 대한 기사를 검색할 수 있다.

https://www.example.net/cgi-bin/article.sh?name=dogfood.html

스크립트에 입력 검사가 없고 파일 이름이 항상 유효하다고 신뢰하는 경우, 악의적인 사용자는 웹 서버에서 구성 파일을 검색하기 위해 URL을 위조할 수 있다.

https://www.example.net/cgi-bin/article.sh?name=../../../../../etc/passwd

스크립트에 따라 이는 /etc/passwd 파일을 노출할 수 있으며, 이는 유닉스 계열 시스템에서 사용자 ID, 로그인 이름, 홈 디렉토리 경로 및 셸 등을 포함한다. (유사한 공격에 대해서는 SQL 주입을 참조). 입력값 검증을 통해 `../`와 같은 특수 문자를 필터링하여 경로 조작을 방지해야 한다.

6. 한국의 정보보호 정책 및 동향

6. 1. 관련 법률 및 규제

6. 2. 주요 정책

참조

[1] 서적 Building Secure Software: How to Avoid Security Problems the Right Way MAddison-Wesley Professional
[2] 서적 Proceedings of the 3rd annual conference on Information security curriculum development Association for Computing Machinery 2006-09-22
[3] 간행물 Secure Coding: Building Security into the Software Development Life Cycle https://www.proquest[...] 2004-12
[4] 뉴스 시큐어코딩, 하반기에 `날개` http://www.dt.co.kr/[...] 디지털타임스 2013-07-22



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com