Check Vulnerability/Report writing

소프트웨어 취약점 점검방법

D4tai1 2019. 8. 6.

1. 설계취약점

(1) Telnet이 평문으로 전송하는 것과 같이 만들 때 생긴 취약점입니다.

 

2. 구현취약점

(1) Telnet의 특정버전에서는 exit 후에도 환경변수가 유지되는 취약점입니다.

(2) 아니면 다른사용자로 로그인을 할 수 있거나...

 

3. 취약점 유형

(1) 입력에 따른 데이터 흐름

(2) 신뢰관계

(3) 가정 

(4) 인터페이스

(5) 환경

(6) 예외

 

조금 자세히 보면

 

(1) 입력에 따른 데이터 흐름(+버퍼오버플로우)

AAAAAAAAAAAAAAAAAAAA....AAAAAAAAAAAAA와 같이

제한없이 입력을 받을 경우

메모리 오염이 발생하고

입력된 데이터는 많은 컴포넌트를 지나면서 변경될 것이고

그 데이터에 의해 공격이 이루어 질 수도 있습니다.

 

결국 그 데이터가 어떻게 흘러가는지 파악하는 것!!!

데이터를 추적하는 과정은

설계와 구현을 검토하는데 있어서 중요합니다.

 

 

(2) 신뢰관계

두 컴포넌트 사이 인터페이스를

신뢰할 수 있다고 가정하는 것을 말합니다.

 

신뢰의 전이특성에 따라

만약 네트워크를 신뢰할 수 없다면

해당 소프트웨어는 공격에 노출이 되겠죠?

 

 

(3) 가정과 잘못된 신뢰

대부분의 개발자는 기호, 음수, 아스키 값이

아닌 데이터 등이 입력될 것이라고 생각하지 않습니다.

 

반면에 대부분의 공격자는

모든 입력가능한 데이터를 

find후 공격을 시도합니다.

 

이 경우 예상치 못한 변화가 생기게 되고

프로그램에 영향을 미치게 됩니다.

 

 

(4) 인터페이스

[1] 외부 공격자를 차단할 수 없는

노출된 인터페이스를 사용하는 경우

위협에 노출될 수 있습니다.

 

[2] OS에서 제공하는 서비스를 이용합니다.

이 경우 플랫폼 자체 취약점으로 인터페이스가 

제어당할 가능성이 있습니다.

(그러나 실제로 Windows의 경우 

취약점이 잘 발견되지 않습니다.)

 

API자체가 취약하게 설계된 경우 

취약한 API를 사용한 프로그램도 취약해지는

전이현상이 있습니다.

 

그래서

카이스트 대학원 연구팀에서

API에 대한 취약점 테스트도

진행을 한다고 하는데

정확하게 어떻게 하는지까지는

모르겠습니다.

 

[3] 인터페이스가 어려워서 

공격자가 접근하지 못할 것이라고

판단하기도 합니다.

 

[4] 암호화 및 내부 네트워크 프로토콜을

사용하는 경우도 있습니다,

이 경우는 리버싱을 통해서 

취약점을 찾을 수도 있겠죠?

 

 

(5) 환경공격

OS, H/W, File_System, DB, Network + User

여러가지 환경이 있으며,

개발자는 실행환경을 가정하지만,

예상치 못한 환경에서 실행해서

발생하는 취약점을 말합니다.

 

예를 들어 /tmp 디렉터리에

심볼릭링크로 자신의 경로에 프로그램을 생성하면?

프로그램 소유자의 권한으로 실행이 가능하다는

취약점이 있었습니다.

 

 

(6) 예외조건

비동기적으로 인터럽트가

발생해서 데몬을 리셋하기 전까지

취약한 부분이 생기는 것을 말합니다.

 

말이 조금 어려울 수 있겠네요.

 

예를 하나 들어보면

포트를 열은 프로그램이

정상적으로 종료되지 않았다면!!!!

 

프로그램이 종료된 이후에도

일정시간 포트가 열려있을 수 있다는 말입니다.

 

 

4. 소프트웨어 취약점

(1) 스택, 힙, 전역/정적

데이터 오버플로우가 있네요.

 

(2) 오염도 영향평가

[1] 메모리 내 버퍼위치와

덮어쓰기가 가능한지?

가능하다면 몇 바이트를 

덮어쓸 수 있는지?

 

[2] 오염시키는데 사용되는

데이터는 무엇인지?

 

[3] 공유되었다면

누가 사용하고 있는지?

 

 

(3) 어셈블리로 변환될 때 부정확하거나

일관성이 없게 변환되는 부분

 

컴파일러와 링킹은

일방향함수로 보아도 무방합니다.

 

그러기 때문에 

해석하는(기계어를 끊는) 방법에

다른 명령어가 되기도 하겠죠...

 

IDA PRO가 디컴파일러 기능이 있지만

완벽하게 원본소스가 복원되지 않는 이유는

아마도 이런 부분이겠죠?

 

IDA PRO는 휴리스틱을 사용하니까...

 

 

(4) 부호있는 정수와 부호없는 정수사이 연산

반환타입을 애매모호하게 작성해서 

취약하도록 할 수 있겠죠?

 

 

만약 

동적할당을 하기위해

할당할 데이터의 크기를 입력을 받는다고

가정을 해봅시다.

 

프로그램은 

100을 입력하면

안전하게

입력받은 크기에

40바이트만큼을 더해서

140바이트만큼

동적할당을 합니다.

 

나름 오버플로우까지 생각을 했군요!!

 

그러나 0xFFFFFFFF0을 

입력한 경우?

 

0xFFFFFFF0 + 0x28(10진수 40)

= 0x100000018이 되겠네요

앞자리는 표현가능하지 않으므로

0x18바이트만큼 할당이 되겠네요?

 

그러면 실제로 입력하려고 한 데이터의 길이보다

적게 동적할당이 되겠죠?

 

그렇다면 덮어쓰기가 가능하게 되겠죠...

저렇게 큰 수 입력할 필요없이

-16 이렇게 입력해도 보수를 취하기 때문에

저런 경우가 발생합니다.

 

(5) sizeof()와 같이 사이즈를 확인하는 함수에

주소(포인터)를 넣은 경우

 

(6) 문자열함수에 대한 이해

 

(7) 메타문자 제거, 필터링

 

등이 있겠네요..

 

 

댓글