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인지 점검하는 코드가 필요