UEFI 스터디 9차 - 기드라를 사용한 드라이버 정적분석 스크립트 작성 (3)
Published:
사소하게 처리된 것
- 이전 주차 스크립트에 실행 자동화 측 요구사항에 맞게 json을 뱉어주는 코드 추가. -> 진행상 필요하신분은 해당 스크립트와 사용한 드라이버 드림
이전 코드 로직에 DFA 적용해보기.
이전 코드의 문제점
기존 방식은 4*x*y 형태의 연산이 사용된 모든 곳을 찾기 + 함수 내 x,y에 대한 크기 비교 pcodeOP가 없다면 취약점 탐지.
- 오버플로우 유발 연산이 실제 메모리 할당 부분에 (gBS -> allocate?)에 도달하는지 알수 없다 => where is sink?
- 오버플로우 유발 연산에 실제 외부에서 도달가능한지 알 수가 없다 => wher is source?
개선된 로직
[step 1]. 사실상 gBS-> allocate* 과 동일한 함수 찾기.
edk2 표준에 있기도하고, 벤더 자체적으로 만드는 버퍼 할당용의 함수의 인자로 전달되어도 바로 “아 이건 싱크와 연결된다”
라고 알고 싶음.
=> 먼저 allocatepool 과 allocatepage찾기 (pcode의 임시레지스터 + 두함수의 오프셋을 사용하는 부분은 다 해당 함수로 취급) => 콜체인을 따라서 최대 3번 위에까지의 함수는 gBS-> allocate*와 동일 취급.[step 2]. 4*x*y 형태의 연산 모두 찾기. (사실상 이전 스크립트와 동일)
=> 전체 pcode에서 4를 곱하거나, 좌로 2 쉬프트 하는 모든 곳 찾기.
=> 이 형태가 나타난 함수에서 사용된 경우 변수 x,y가 해당함수의 인수에 도달하는지 살피고, 해당 인수에대한 크기검사가 있는지 살피기 => 하나의 변수라도 없다면 취약접 후보![step 3]. (위 두개 통합) step2에서 찾은 값이 인수로 전달되는 함수가 step1의 함수에 속하면 취약점 후보!
[step 4]. 오버플로 유발 연산에서 콜체인을 타고 올라가서, 마지막에 있는 함수가 해당 프로토콜 구조체의 함수에 등록되어있고, 해당 함수의 인수에 도달가능하다면 취약점!!
하면서 어려움을 겪었던 부분들.
진짜 source는 어디??
오염분석에서 다른 조원이 언급했던 source는 주로 gRT -> getVariable.
그러나 해당 드라이버의 어느 곳에도 gRT -> getVaribale의 오프셋이 보이질 않는다!
그렇게 entry 초기화 함수를 들어갔다.

여기를 확인하면 이전 게시물의 entry 모습이 그대로 있지만, 애초에 gRT를 위한 전역변수가 없다!
-> 해당 프로토콜은 타 프로토콜에서 이미지를 가져온 후 불러서 이용하는 프로토콜 이구나…
locateprotocol 이 있는 만큼 해당 드라이버를 못찾을 것은 없으나.. 여러 드라이버에서의 taint analysis는 아직 좀 이르거니와
검증 쪽에서 아마 뒷목을 잡을 듯해서.. 일단 이런 경우도 있다는걸 보여주고 싶었다!
undefinedfunction??
오염분석을 하기전에 실제 문제가 있었던곳에서 Xref를 따라 이동하면 당연하게도 해당 프로토콜 함수의 제일 처음 진입점으로 이동가능할 것. 그런데, 
undefinedfunction은 뭐지??
디스어셈블하였으나, 함수로는 확정 짓지 못하고, 어셈블리 형태를 보고 휴리스틱하게 보니 함수같다.
해당함수는 프로토콜의 구조체에 함수 주소가 저장되어있을 것.
그런데 호출된 적이 없으니, 유일한 XRef인 구조체에 함수 저장하는 부분이,
디컴파일러 입장에서는 함수 저장인지, 아니면 단순히 8byte 정수를 집어넣는건지 구별이 불가..
=> 우리는 이게 프로토콜의 전형적이 형태임을 앎므로 함수로 바꿔서 처리하자.
(listing에서 우클릭 -> createFunction하면 디컴파일된 코드에도 함수로 인식된다.)
참고로 해당 undefinedfunction의 Xref를 따라가면
.data의 영역이 나온다. (프로토콜 구조체에 저장됨)
잘 드러나지 않는 오염경우
여기서 오염된 변수는 좀 특이함. decompile 하면 두변수 모두 local_860 배열의 원소이다.
근데 로컬 변수를 초기화 하는 부분이 내부엔 안보인다??

여기 함수 내부에서 로컬 변수들과함께 들어간다. 그러니까 해당 함수내에서 변수가 초기화 되는 것.
현재 여기를 어떻게 해결해볼까 고민중이다..
현재 part3까지 구현완료. part4가 현재 구현중.
