20161006

시스템 보안 개론
* 함수를 호출하고 반환할 때, 호출한 지점 바로 뒤로 돌아가야 한다. Fine-grained CFI는 오버헤드가 커서 coarse-grained CFI를 쓰는데, fine-grained CFI도 깨질 수 있다.
* 객체 상속의 경우에 CFI의 corner case가 있다. 상속받은 경우에 자기 자신의 method를 호출할 수도 있지만, 상속받은 method를 호출할 수도 있기 때문이다.
* Static하게 CFI를 확인하는 경우에는 runtime state를 확인하지 못한다는 문제점이 있다. 반환 가능한 지점 중 하나로만 가면 되기 때문이다.
* Direct branch와 indirect branch의 차이점? Direct branch는 compile 시점에 호출할 지점을 코드 상에 넣는 것, indirect branch는 실행 시점에 호출할 지점이 정해지는 것(레지스터, 메모리 위치의 값 등).
* Indirect branch를 하는 경우에는 CFI를 검증하기 쉽지 않다.
* COTS binary의 CFI를 검증하기 위해서는 바이너리를 정적으로 분석하고 instrument해야 한다. Binary rewrite할 수도 있다.
* Branch regulation은 coarse-grained CFI를 하드웨어 지원을 얻어 수행하고자 하는 것. ret / jmp/ call이 발생할 때마다 CFI를 적용한다. stack에는 실행 바이너리가 리턴 주소를 삽입하고, shadow stack에는 하드웨어 모듈이 리턴 주소를 삽입한다. 반환할 때 두 주소를 비교해서 변조가 발생했는지 확인할 수 있다.
* stitching the gadget에 대한 설명.
* call site gadget은 함수 호출 이후의 블록으로 연결된 gadget. entry-point gadget은 함수 시작 부분으로 들어가는 gadget으로만 연결된 gadget(Out of Control: Overcoming Control-Flow Integrity).
* Control-Flow Bending: On the Effectiveness of Control-Flow Integrity 설명. dispatcher gadget이 있으면 coarse-grained CFI는 깨진다.
* Counterfeit Object-oriented Programming: 객체의 함수를 갖는 vtable을 조작해 gadget의 주소로 바꿔친다. 그리고 객체의 함수를 호출하는 방식으로 gadget을 실행할 수 있다. vptr의 integrity를 확인하고 실행하면 방어할 수 있을 것.

Advertisements
Tagged with: , , , , ,
Posted in 1) Memo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 93,229 hits
%d bloggers like this: