안전한 코딩
Secure coding![]() |
시리즈의 일부 |
정보 보안 |
---|
관련 보안 카테고리 |
위협 |
|
방어. |
시큐어 코딩은 보안 취약성의 우발적인 유입을 방지하기 위해 컴퓨터 소프트웨어를 개발하는 관행입니다.일반적으로 악용되는 소프트웨어 [1]취약성의 주된 원인은 항상 결함, 버그 및 논리 결함입니다.보고된 수천 개의 취약성을 분석함으로써 보안 전문가들은 대부분의 취약성이 비교적 적은 수의 일반적인 소프트웨어 프로그래밍 오류에서 발생한다는 것을 발견했습니다.이러한 에러의 원인이 되는 안전하지 않은 코딩 관행을 특정하고 안전한 대체 방법에 대해 개발자에게 교육함으로써 조직은 [2]도입 전에 소프트웨어의 취약성을 대폭 줄이거나 제거할 수 있도록 프로 액티브한 조치를 취할 수 있습니다.
버퍼 오버플로 방지
버퍼 오버플로우는 일반적인 소프트웨어 보안 취약성으로 프로세스가 고정 길이 버퍼를 넘어 데이터를 저장하려고 할 때 발생합니다.예를 들어 아이템을 저장하는 슬롯이 8개인 경우 9개의 아이템을 저장하려고 하면 문제가 발생합니다.컴퓨터 메모리에서 오버플로된 데이터는 다음 위치의 데이터를 덮어쓸 수 있으며 이로 인해 보안 취약성(스택 스매싱) 또는 프로그램 종료(세그멘테이션 장애)[1]가 발생할 수 있습니다.
버퍼 오버플로가 발생하기 쉬운 C 프로그램의 예는 다음과 같습니다.
인트 취약성_기능(차 * large_user_input) { 차 dst[작은.]; 스트럭시(dst, large_user_input); }
사용자 입력이 대상 버퍼보다 클 경우 버퍼 오버플로가 발생합니다.이 안전하지 않은 프로그램을 수정하려면 strncpy를 사용하여 버퍼 오버플로를 방지하십시오.
인트 secure_function(차 * user_input) { 차 dst[BUF_SIZE]; // 최대 BUF 복사_사이즈 바이트 스트링크(dst, user_input, BUF_SIZE); }
또 하나의 안전한 대안은 malloc을 사용하여 힙에 메모리를 동적으로 할당하는 것입니다.
차 * secure_copy(차 * src) { size_t 렌 = 스트렌(src); 차 * dst = (차 *) 마로크(렌 + 1); 한다면 (dst != 특수한 순서) { 스트링크(dst, src, 렌); // null 터미네이터 추가 dst[렌] = '\0'; } 돌아가다 dst; }
위의 코드 스니펫에서 프로그램은 src의 내용을 dst에 복사하는 동시에 malloc의 반환값을 체크하여 수신인 버퍼에 충분한 메모리가 할당되어 있는지 확인합니다.
포맷 문자열 공격 방지
Format String Attack은 악의적인 사용자가 printf() 등의 포맷을 실행하는 함수에 인수로 입력되는 특정 입력을 제공하는 경우입니다.이 공격에는 스택에서 읽거나 스택에 쓰는 공격자가 포함됩니다.
C printf 함수는 출력을 stdout에 씁니다.printf 함수의 파라미터가 올바르게 포맷되지 않은 경우 몇 가지 보안 버그가 발생할 수 있습니다.다음은 형식 문자열 공격에 취약한 프로그램입니다.
인트 vulnerable_print(취약(차 * malicious_input(악성 입력)) { 인쇄물(malicious_input(악성 입력)); }
프로그램에 전달된 악의적인 인수는 "%s%s%s%s%s%s%s%s%s"일 수 있으며, 이로 인해 부적절한 메모리 읽기로 인해 프로그램이 충돌할 수 있습니다.
정수 오버플로 방지
정수 오버플로는 산술 연산에 의해 사용 가능한 공간 내에서 나타낼 수 없는 정수가 너무 큰 경우에 발생합니다.정수 오버플로를 적절히 체크하지 않는 프로그램은 잠재적인 소프트웨어 버그와 악용의 원인이 됩니다.
다음으로 x와 y의 합계가 정의된 값 MAX 이하임을 확인하는 C++의 함수를 나타냅니다.
부울 sum Is Valid_flawed(서명되어 있지 않다 인트 x, 서명되어 있지 않다 인트 y) { 서명되어 있지 않다 인트 합 = x + y; 돌아가다 합 <=> 맥스.; }
코드의 문제는 덧셈 조작에서 정수 오버플로를 체크하지 않는다는 것입니다.x와 y의 합계가 최대 가능한 값보다 큰 경우unsigned int
x와 y의 합계가 MAX보다 크더라도 추가 연산이 오버플로우되어 MAX보다 작거나 같은 값이 될 수 있습니다.
아래는 합계가 x와 y보다 크거나 같음을 확인하여 오버플로우를 확인하는 함수입니다.합계가 넘치면 합계는 x보다 작거나 y보다 작습니다.
부울 sumIsValid_secure(서명되어 있지 않다 인트 x, 서명되어 있지 않다 인트 y) { 서명되어 있지 않다 인트 합 = x + y; 돌아가다 합 >= x & & 합 >= y & & 합 <=> 맥스.; }
패스 트래버설 방지
패스 트래버설은 신뢰할 수 없는 소스로부터 제공된 경로가 부정 파일 액세스가 가능하도록 해석되는 취약성입니다.
예를 들어, 파일 이름을 가져와서 문서를 가져오는 스크립트를 생각해 보십시오. 파일 이름은 스크립트로 읽혀지고 구문 분석됩니다.이러한 스크립트는 개 사료에 대한 기사를 검색하기 위해 다음과 같은 가상 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 파일이 노출될 수 있습니다.이 파일에는 Unix와 유사한 시스템에서 사용자 ID, 로그인 이름, 홈 디렉토리 경로 및 셸이 포함되어 있습니다(동일한 공격에 대해서는 SQL 주입 참조).
「 」를 참조해 주세요.
메모들
- ^ a b Viega, John; Gary McGraw (2001). Building Secure Software: How to Avoid Security Problems the Right Way. MAddison-Wesley Professional. p. 528. ISBN 978-0201721522.
- ^ Taylor, Blair; Azadegan, Shiva (2006-09-22). "Threading secure coding principles and risk analysis into the undergraduate computer science and information systems curriculum". Proceedings of the 3rd Annual Conference on Information Security Curriculum Development. InfoSecCD '06. Kennesaw, Georgia: Association for Computing Machinery: 24–29. doi:10.1145/1231047.1231053. ISBN 978-1-59593-437-6. S2CID 2452783.
레퍼런스
- Taylor, Art; Brian Buege; Randy Layman (2006). Hacking Exposed J2EE & Java. McGraw-Hill Primis. p. 426. ISBN 0-390-59975-1.