Without a Break

소프트웨어의 정적 분석과 동적 분석 본문

Software/소프트웨어보안

소프트웨어의 정적 분석과 동적 분석

와븨 2022. 10. 9. 18:20

정적 분석 vs 동적 분석

정적 분석 동적 분석
소프트웨어의 소스코드가 있을 때 분석이 가능

- 코드의 내용 속에서 취약성을 찾아냄
- 구문 에러 및 논리적 에러를 찾지는 못함
소프트웨어를 실행하여 가능한 모든 경우를 실행하도록 하여 오류가 있는지 확인

- 소스코드를 갖고 있지 않은 경우가 많음
- 소프트웨어 개발자가 제시하지 않은 use case를 고려 할 때도 있음
- 블랙 박스 테스트 vs 화이트 박스 테스트

+ 참고)

  • 동적 분석은 개발의 BUILD에서도 이뤄지지만 OPS의 OPERATE에서도 이루어짐

 

 

블랙 박스 테스트 vs 화이트 박스 테스트 (동적 분석)

블랙 박스 테스트

  • (소스코드를 포함) 소프트웨어의 내부 구조를 전혀 알지 못함
  • 소프트웨어를 다양한 각도로 실행하여 반응을 확인하는 형태로 소프트웨어를 테스트함
  • Test 시나리오(입출력 set)를 공격자의 경험에 의존

 

화이트 박스 테스트

  • 소스 코드, 기능 및 구조에 대해서 이해를 바탕으로 Test 진행
  • 소프트웨어의 소스코드 및 내부 구조에 대한 이해를 바탕으로 Test 시나리오 (입출력 set) 작성

 

 

정적 분석 예제 실습

void foo(char* str){
    char* buf = new char[8]; //8바이트 기억 장소 할당
    strcpy(buf, str); //str 변수 값 buf에 복사
    
    FILE* file = fopen("out.txt","w"); //out.txt 파일 쓰기모드로 열기
    if(!file) //파일 안열릴 때 대비한 예외처리
    	return; //foo에 속한 buf가 사라짐(buf의 메모리 누수)
       
    for(char* c = buf; *c; ++c)
    	fputc((int)*c, file);
        
    delete buf;
 }
  • new(동적)로 기억장소를 할당한 8바이트는 heap에 저장된다. (buf는 stack에 들어있음)
  • buf에 8바이트 이상 입력 시 overflow 발생
  • delete buf; 로는 동적으로 할당된 게 사라지지 않으므로 "delete[] buf" 형태로 바꿔주어 할당된 heap 공간을 지워야한다. (후에 "fclose(file);"로 파일도 닫아줘야 함)

 

void f2(){
    const char *p = NULL;
    for(int i = 0; str[i] != '\0'; i++){
        if (str[i] == ' '){
            p = str + i; //str에 저장된 문자열에서 빈칸의 바로 다음 문자를 가리킴
            break; //str 변수에 저장된 문자열에서 빈칸이 있을 시 빈칸 만나면 멈춤
        }
    }
    return p[1]; //p가 null일 시 오류
}
  • str변수에 "Hello world"라는 문자열이 저장되었다고 가정했을 때, p는 w를 가리킴
  • 만약 str이 아무것도 가리키고 있지 않다면 p는 그대로 NULL 값을 가지고 있으므로 다음값이 없기 때문에 p[1] 리턴 시 오류

 

void f3(int a){
    struct fred_t *p = NULL;
    if (a == 1)
        p = fred1;
    
    //if a is not 1 then p is NULL
    p->x = 0; //p가 가리키는 x에 0을 넣음. p가 NULL이면 오류
}
  • p->x = 0; 윗줄에 p가 NULL인지 점검하는 코드가 필요