본문 바로가기

[☩ Security ☩]

보안성을 고려한 프로그래밍 기법 & 25가지 위험한 프로그래밍 실수들

사용자 삽입 이미지

사람이라는게 처음부터 완벽하게 일을 할수 없기에 개발시에도 보안을 고려하지 않는 프로그래밍으로 크래킹, 리버싱등을 당하는 경우가 허다 합니다.

또한 알고 있다고 해도 시간과 금전적인 문제로 넘겨버리는 경우도 많습니다.

1. 소스코드 작성시 고려사항

- 바이너리 파일에서 심벌 정보 제거.
- 메모리와 프로세스 시간과 같은 자원의 소비를 자체제어.
- 개발시 사용했던 불필요한 설정파일이나 임시파일은 삭제.
- 모든 사용자 입력 문자열을 문자별로 점검.
- 변수와 버퍼에 올바른 초기값을 할당하고 설정.
- 파일에 암호화되지 않은 패스워드나 암호키 저장금지.
- 항상 리턴 코드를 점검.
- 프로그램이 core dump를 생성하지 않고 정상 종료하도록 유도.
- 경계값 검사나 예외처리 루틴을 반드시 포함.

2. 표준 C언어 입출력에 관한 API 보안 취약성

strcpy, wcscpy, lstrcpy, _tcspy, _mbscpy.
- 하고자 하는 목적지 버퍼의 크기를 검사하지 않음.
- ll 값이나 유효하지 않은 포인터에 대한 값을 검사하지 않음.
- 버퍼가  null로 끝나지 않은 경우, 예상보다 큰 버퍼의 내용이 목적지에 복사됨.
- 것 보다 n시리즈가 붙은 api를 사용하는 것이 좋음.
- 버퍼의 초기화 여부를 검사하지 않음.

strcat, wcscat, lstrcat, _tcscat, _mbscat
- 지 버퍼의 주소를 검사하지 않음.
- ll값이나 유효하지 않은 포인터에 대한 값을 검사하지 않음.
- 버퍼가 null로 끝나지 않은 경우, 목적지에 복사되는 버퍼의 양은 알수 없음.
- 것 보다 n시리즈가 붙은 api를 사용하는 것이 좋음.

strncpy, wcsncpy, lstrcpyn, _tcsncpy, _mbsnbcpy
-null 값이나 유효하지 않은  포인터에 대한 값을 검사하지 않음.
- 목적지 버퍼가 null로 끝난다는 보장을 할수 없으므로 예기치 못한 스트링을 가질수 있음

strncat, wcsncat, lstrncat, _tcsncat, _mbsnbcat
- 목적지 쪽의 버퍼의 크기를 고려하지 않고 소스쪽의 버퍼애 남아있는 문자의 크기또는 복사할 개수에 의존하여 데이터가 덧 붙여짐

memcpy, CopyMemory
- 이 파라미터의 정보에서 명시된 크기만큼의 버퍼가 마련되어 있어야 함.
- 특정한 캐릭터만 복사하기 위해서는 _memccpy API를 사용하는 것이 더 권장.

sprintf, swprintf
- null로 끝나지 않은 목적지 버퍼의 경우, 비정상 동작.
- 필드폭 지정 연산자를 정확하게 사용하지 않은 경우, 보안취약성을 가질 수 있음.
- 사용하지 않은 것이 바람직함.

_snprintf, _snwprintf
- counter 값이 목적지 버퍼의 크기보다 같은경우, null이 복사되지 않을 수 있음.
- 플랫폼 별로, 종료형태가 다름.

printf, _sprintf, _snprintf, _vprintf, vsprintf
- 사용자가 정의 문자열은 포맷 스트링으로 간주되지 않음에 주의.
- %s를 사용하요 2바이트 이상의 문자를 단일 바이트로 변환하는 경우, 입력한 문자보다 적은 문자를 갖는 문자열
  을 제공할수 있으며 이 문제를 해결하기 위해서는 multi-byte 처리가 가능한 API를 사용해야함.
- 복사할 갯수를 지정하는 n시리즈가 붙은 API를 사용해야함.

strlen, _tcslen, _mbslen, wcslen
- null로 끝나지 않은 매우 큰 버퍼에 대한 정상적인 처리 곤란.
- 버퍼오퍼플로우의 위험성은 낮지만, 허가되자 않은 영역에 대한 접근위반의 가능성이 있음.
- 신뢰된 소스로부터 데이터를 읽으려고 하는지 검사해야함.

gets
- 목적지 버퍼의 크기를 고려하지 않고 복사하는 심각한 문제점
- 대용으로 fgets를 사용하는 것이 바람직

scanf, _tscanf, wscanf
- gets와 마찬가지로, 목적지 버퍼의 크기를 고려하지 않음
- 필드폭 지정 연산자를 정확하게 사용하는것이 중요

3. 원도우즈 관련 API 보안 취약성

CreateProcess, CreateProcessAsUser, CreateProcessWithLogon, WinExec, ShellExecute
- 첫번째 파라미터는 응용프로그램의 경로이고, 두번째 파라미터는 커맨드라인
- 첫번째 파라리터가 null이고 두번째가 파라미터가 응용프로그램의 경로에 공백을 갖고 있을때, 의도하지 않은 으
  용프로그램이 수행될수 있음.
- 경로를 나타내는 파라미터에는 이중 따옴표를 사용하여 예방.

RpcImpersonateClient, ImpersonateLoggedOnUser, CoImpersonateClient, ImpersonateNamedPipeClient, ImpersonateDdeClientWindow, ImpersonateSecurityContext, SetThreadToken
- Impersonation API가 실행도중 버퍼오버플로우 등의 이유로 실패하거나 실행이 가로채어지는 경우 클라이언트 SYSTEM의 ADMIN권한을 획득할수 있음.

SetSecurityDescriptorDacl
- 경로 검색에 따라 동일한 파일명을 작는 불법 DLL을 높은 우선순위의 경로에 놓은 경우, 메모리에 적재가능.

저자 : 프로그램심의조정위원회 - 신동명 박사


글에 새로 추가한 사항입니다.

25가지 위험한 프로그래밍 실수들 발표자는 제목 그대로~~~

2009 CWE/SANS Top 25 Most Dangerous Programming Errors
http://cwe.mitre.org/top25/index.html