Why should I know this?

Shuffler Fast and Deployable Continuous 본문

Study

Shuffler Fast and Deployable Continuous

die4taoam 2023. 2. 5. 15:42

소개글.

Shuffle이란 단어는 카드 게임에서 카드를 섞을 때 사용되는 단어이다. shuffle을 ‘섞다’라고 한다면 Shuffler는 ‘섞는자’ 라고 하면 될까? Shuffler는 Control Flow Integrity와 동일한 Code-reuse attack = ‘실행 흐름의 변조/위조’ 를 방지하는 기술로 ROP, JOP와 같은 exploit 기법의 방어 기제에 대한 연구이다.

Shuffler 요약.

CFI기술은 compile 시 혹은 binary rewriting으로 실행 흐름에 무결성을 확보하기 위한 코드를 주입한다. 이를 통해 Control Flow의 변경 시(Call, Jmp 등) 목적지가 정당한 지를 검증하는 방식을 일반적으로 취하게 된다. 단점은, 그로 인해 CPU의 Branch Prediction을 방해하고 결과적으로 예측 성능을 크게 하락시킨다. 이런 문제를 해결하고자 CFI는 MS와 INTEL과 같은 대형 벤더의 협의를 통해 CPU 기능으로 추가하는 추세이다. 하지만 해당 기능이 CPU에 추가되기 전까지 그리고 해당 CPU세대로 세대교체가 이뤄지기 전까지 CFI는 널리 사용하기 어려운 기술이다.

Shffler는 CFI와 같이 무결성 수준의 높은 보장을 하지는 않지만, 대신 현실적으로 공략 불가능한 방법을 대안으로 제안한다. ROP 기법은 Gadget으로 사용되는 코드들의 주소가 일정하다는 전제가 필요하다. 이에 대해 간단히 언급하자면 ROP은 다수의 주소를 stack에 삽입해 이들로 ret하면서 shellcode를 생성하는 작업을 진행한다. 때문에 ASLR과 같은 보안 기법이 적용된 경우 사용하기 위해 전제가 필요한 기법이다.

Shuffler는 실행 시에 링킹되는 외부 모듈(Shared Object)들의 주소를 일정 주기로 변경하며, 이들을 리스트 화 한다. 그리고 이들을 참조하는 Control Flow 변경 코드들을 변경하여 해당 리스트를 참조하도록 redirect 시킨다. 이는 마치 ASLR이 주기적으로 외부 모듈들의 주소를 재배치하는 것과 유사하여 1차로 ROP을 사용하기 어렵게 만든다. 또한 모든 실행흐름 변경의 코드들이 Shuffler에 의해 생성된 리스트에서 참조되도록 만들기 때문에 2차로 ROP을 사용하기 어렵게 만드는 것이다.

부가적으로 리스트화 된 주소 리스트를 암호화하여 정보유출 등을 완화하는 기능 등이 있지만 주 기능은 위의 두 가지이다.

Shuffler의 장점은?

Shuffler는 CFI처럼 무결성 검증 코드를 추가로 삽입하지 않는다. 그렇기 때문에 기 존재하는 ELF binary에 적용하는 것이 아주 수월하다. 해당 논문에서도 Shared Object를 LD_PRELOAD하는 방식을 취하여 SO파일들을 주입시키는 것 만으로 다른 ELF파일들에 적용할 수 있었다고 말한다. 이것은 보안 측면에서 보안 기술을 개발자들에게 강제하는 것이 아닌, 외부 솔루션이나 모듈로 존재할 수 있게 만든다.

그리고 Shuffle의 주기를 조절하여 주기를 길게 할 수록 CFI에 비해 성능 향상이 이뤄질 수 있다. 실제 사용 시에 Shuffle을 1회로 적용하면 성능을 희생하지 않아도 된다.

Shuffler의 단점은?

Shuffler의 일부를 쉽게 예를 들면, 주소를 변경하고 해당 주소를 기입한 웹사이트들을 모두 변경해서 택배나 우편이 제대로 오게 만드는 방식이다. 이 때문에 주소가 기입되어 있는 곳들을 리스트 화 할 수 있어야 하고 해당 주소를 모두 변경해야 하는 두 작업이 가능해야 한다. 하지만 보통 많이 사용되는 컴파일 옵션으로는 주소지가 기입된 곳들을 리스트화 하는 것이 어렵다. 특히 정적인 방법으로는 100%는 거의 불가능하다. 때문에 해당 논문은 ‘-Wl,-q’ 옵션을 사용하여 링킹 시에 관련 정보를 남겨달라고 컴파일러에 요청하고 있다.

Shuffler 결론.

Shuffler는 CFI처럼 컴파일 시에 주입 혹은 Binary를 Rewriting하는 방식으로 무결성이라는 높은 보안 수준을 구현하고자 하지는 않는다. 하지만 현실적으로 사용 가능한 수준에서, ASLR처럼 주소를 Randomize하게 Shuffle하는 것을 일정 시간 간격으로 수행해 Control Flow에 관련된 공격 기법(ROP 등)을 방어할 수 있음을 보여줬다. 또한 논문의 제목대로 Diploy가능한 방식이므로 외부 모듈 혹은 솔루션으로 적용할 수 있는 기법이었고, 또한 CFI에 비해 희생해야 할 것이 없다시피 하기 때문에 매우 만족스러운 논문이었다.

Comments