블라인드 리턴 지향 프로그래밍
Blind return oriented programming![]() |
BROP(Blind Return Oriented Programming)는 공격자가 타겟바이너리를 소유하고 있지 않은 경우에도 부정 이용을 정상적으로 작성할 수 있는 악용 기법입니다.Bitau 등에 의해 나타난 BROP 공격.는 64비트 시스템에서 주소 공간 레이아웃 랜덤화(ASLR)와 스택카나리아를 물리쳤습니다.
ROP 이력
현재 OS 보안과 하드웨어, Linux PAX 프로젝트와 같은 보안 기능이 향상됨에 따라 코드 주입은 불가능하게 되었습니다.그 후 보안 연구자들은 NX(Non-Executable) 메모리를 물리치기 위해 반환 지향 프로그래밍이라는 새로운 공격을 고안했습니다.이 공격은 스택, 특히 리턴 주소를 제어함으로써 프로그램흐름에 영향을 줍니다.가젯이 이 공격의 기본 단위입니다.가젯은 스택의 특정 상태와 함께 반환 명령으로 끝나는 명령 시퀀스의 그룹입니다.가젯은 메모리에서 레지스터로 워드를 로드하거나 조건부 점프와 같은 보다 복잡한 연산을 실행할 수 있다.충분히 큰 타깃 바이너리로 튜링 완전 가젯 컬렉션을 구성할 수 있으며, 이는 셸 코드를 실행하기에 충분합니다.ROP의 전제 중 하나는 공격자가 타깃바이너리를 소유하고 있기 때문에 가젯의 주소를 사전에 알고 있다는 것입니다.
BROP 시나리오
BROP와 관련될 수 있는 새로운 시나리오가 3가지 있습니다.다음과 같은 것이 있습니다.
- 폐쇄형 바이너리 서비스의 경우 퍼즈나 침투 테스트 등의 기술을 사용해야 하는 취약성을 발견합니다.
- 오픈 소스 라이브러리의 알려진 취약성은 이를 사용하는 전용 바이너리가 폐쇄 소스인 경우에도 악용될 수 있습니다.
- 또한 바이너리를 알 수 없는 오픈 소스 서버를 해킹하는 데도 사용할 수 있습니다.
이 공격에서는 서버에 기존의 스택 취약성이 있는 서비스가 존재하며 크래시 시 서비스가 재시작되어야 한다고 가정합니다.
공격 단계
스택 읽기
반환 명령 포인터는 일반적으로 스택 카나리에 의해 보호됩니다.스택 카나리는 버퍼 오버런에 의해 값이 변경되면 프로그램을 크래시시킵니다.BROP 공격 모델에서는 버퍼 오버런이 바이트 단위로 전송됩니다.오버런을 시도할 때마다 프로그램 크래시가 발생하거나 실행이 계속됩니다.프로그램 크래시는 스택 값이 잘못 추측되었음을 의미하므로 256회(평균 케이스는 128회)에 스택 값을 추정할 수 있습니다.64비트 머신에서는 canari를 리크하기 위해 4개의 스택 판독이 필요합니다.카나리아가 누출되면 리턴 명령 포인터도 같은 방법으로 교란될 수 있습니다.그러나 스택 카나리의 추정은 정확하지만 반환 명령 주소에 대해서는 동일하다고 말할 수 없다는 점에 유의하십시오.공격자는 주소 공간의 텍스트세그먼트 내의 임의의 주소를 누설할 수 있으면 만족합니다.
블라인드 ROP
이 단계가 공격의 핵심이다.이 단계의 목적은 쓰기 시스템 호출을 시작하여 공격자에게 바이너리 덤프를 보내는 것입니다.쓰기 시스템 콜에는 소켓, 버퍼 및 길이의 3가지 파라미터가 있습니다.x86-64 호출 규칙에서는 파라미터를 레지스터를 통해 전달해야 하므로 쓰기 시스템 호출 인수를 설정하려면 rsi, rdi 및 rdx에 대한 적절한 팝 명령이 필요합니다.이 점에서는 pop rdi, ret 등의 명령 시퀀스가 도움이 됩니다.쓰기 시스템 호출의 간단한 ROP 버전은 다음과 같습니다.
pop rdi; ret (socket)
pop rsi; ret (buffer)
pop rdx; ret (length)
pop rax; ret (write syscall number)
syscall
이 방법론의 한 가지 문제는 스택 상의 주소를 반환한 후 주소 공간에서 유용한 가젯이 발견되더라도 높은 확률로 실행 불가능한 스택이 발생한다는 것입니다.이를 해결하기 위해 BROP 제안자들은 스톱 가젯을 고안했다.정지 가젯은 무한 루프 또는 차단 시스템 호출(sleep 등)과 같이 프로그램을 차단하는 원인이 되는 모든 것입니다.또, 공격의 영향을 받는 워커 프로세서가 무한 루프 상태가 되어, 공격자가 공격을 계속할 수 있게 됩니다.
위에서 설명한 것은 공격의 기본 수법입니다.실제로는 공격을 효율적으로 수행하는 데 도움이 되는 몇 가지 최적화를 수행할 수 있습니다.그 중에서도 시스템콜 번호를 syscall 함수에 전달하는 대신 Procedure Linker Tables(PLT; 프로시저 링커테이블)를 사용하여 시스템콜을 추적하는 것이 가장 중요합니다.기타로는 strcmp를 사용하여 RDX 레지스터를 채우는 방법이 있습니다.팝 RDX에서는 ret 명령 시퀀스가 극히 드물기 때문입니다.
악용의 구축
PLT에서 쓰기가 발견되면 공격자는 대상 바이너리의 내용을 덤프하여 더 많은 가젯을 찾을 수 있습니다.공격자는 기존의 ROP 가젯 검색 기술을 사용하여 충분한 정보를 수집하고 셸 코드를 만들 수 있습니다.셸 코드를 취득하면 루트 액세스에 의해 악용된 시스템을 완전히 제어할 수 있습니다.
BROP 방지
BROP 공격에서는 크래시 발생 후 서버가 재시작되고 재시작 시 주소 공간이 랜덤화되지 않는 것이 가장 큰 전제입니다.따라서 시작 시 주소 공간의 랜덤화를 활성화하면 BROP에 대한 거의 완벽한 보호를 제공할 수 있습니다.NetBSD와 Linux에서 사용되는 또 다른 기술은 크래시 시 sleep입니다.이것에 의해, 공격의 속도가 큰폭으로 저하해, 시스템 관리자는 의심스러운 액티비티를 조사할 수 있습니다.ROP 스타일의 제어 플로우 하이잭 공격에 대한 기존의 보호와는 별도로 Control Flow Integrity는 입증 가능한 방지 기능을 제공하지만 상당한 성능 오버헤드가 발생합니다.
유사한 공격
BROP와 유사한 다른 공격으로는 JIT(Just-In-Time)-ROP, 즉 JIT-ROP가 있습니다.또, 정보 공개에 근거하는 공격으로서 주소 공간 레이아웃의 랜덤화에도 대응할 수 있습니다.BROP와 JIT-ROP는 모두 ROP 공격을 개시하기 위해 바이너리상의 가젯을 검출하려고 합니다.이 공격에서는 데이터 누출을 부정 이용하는 것이 목적입니다.단, BROP와 달리 JIT-ROP는 인터랙티브한 공격이 아니라 크래시/크래시 없는 상황에 적응하기 위해 공격자가 가젯을 검출하는 스크립트를 전송한 후 전달을 위한 공격을 생성합니다.또한 JIT-ROP에는 공격 전에 알려진2개의 다른 취약성(히프와 스택 모두)이 필요합니다.BROP에서는 스택의 [2]취약성만 인식하면 됩니다.
레퍼런스
- ^ "Blind Return Oriented Programming (BROP)". Stanford Secure Computer Systems group. Retrieved 2016-02-24.
- ^ Keener, Lawrence (December 2015). "Evaluating the Generality and Limits of Blind Return-Oriented Programming Attacks" (PDF). Calhoun: The NPS Institutional Archive: 26. Retrieved 28 February 2016.
- 해킹블라인드, Andrea Bitau, Adam Belay, Ali Mashitizadeh, David Mazieres, Dan Boneh
- Return Oriented Programming, Hovav Shacham 등
- http://www.scs.stanford.edu/brop/
- http://www.scs.stanford.edu/brop/bittau-brop.pdf
- http://ytliu.info/blog/2014/05/31/blind-return-oriented-programming-brop-attack-yi/