Simple Mojo Post

reference

Introduction

Mojo는 Chromium Engine에서 사용하는 IPC이며, 프로세스 간의 통신을 용이하게 하기 위한 Runtime Library collection 이다. 내가 Mojo를 공부하는 이유는 Chromium Engine에 대한 전반적인 이해도를 높여 실제 0-day vulnerability 분석과 crbug source auditing을 용이하게 하기 위함이다. sandbox escaping 취약점을 연구 하기 위하여 꼭 알아야 하는 요소이다.

Mojo

Renderer Process에서 여러가지 방법으로 Browser Process대화(상호작용)가 가능하다. 그 방법 중 하나가 바로 Mojom Interface이다. Mojo 통신은 대부분 비동기이다. 즉, Mojom 메소드의 반환 값을 얻기 위해서는 callback 이나 promise를 구현해야 한다.

Mojo는 기본적으로 Remote endpointReceiver endpoint가 존재한다. Remote에서 Method Call을 수행하면 Receiver에 구현되어 있는 Method가 동작하게 된다.

Mojo Files은 Chrome을 빌드할 때 생성되며 BUILD.gn을 수정하여 특정 인터페이스에 대한 바인딩을 수행할 수도 있다.

Mojo Method Call

이제 Mojo 통신을 위해 우리는 Remote endpoint를 만들어야 한다. 이 Remote endpoint를 만들기 위해서는 자바스크립트에서 mojo_bindings.js을 로드하고 Chrome에 --enable-blink-features=MojoJS 플래그를 추가하여 Mojo Method에 직접적으로 접근할 수 있는 환경을 구성해야 한다.
아래 코드는 IDBFactory 인터페이스에 바인드하는 예시다.

1
2
var idbPtr = new blink.mojom.IDBFactoryPtr();
Mojo.bindInterface(blink.mojom.IDBFactoryPtr.name, mojo.makeRequest(idbPtr).handle);

이렇게 하면 idbPtr 객체를 이용해 Method Call이 가능해진다.