Reentrancy ใน compound V2

--

มาอ่าน audit report ไวๆกัน

พอดีกำลังอ่าน audit report ของ compound V2 ตาม link https://github.com/trailofbits/publications/blob/master/reviews/compound-2.pdf เลยขอมาสรุปไวๆ ไว้หน่อย

โดยในตัว contract มีโอกาสที่จะเกิด reentrancy ได้ตาม code

เนื่องจาก doTransferOut เป็น external call ซึ่งทำให้สามารถ reentrancy เข้ามาใน function นี้ใหม่ได้

จริงๆโดยปกติแล้วการแก้ reentrancy ทำได้ด้วย pattern check-effects-interactions เช่นตัวอย่าง code ด้านล่าง

ซึ่ง doTransferOut เป็นการ interaction แต่การ update state เป็น effect

ดังนั้นเราควรย้าย code เป็นแบบนี้

แต่ปัญหาคือ ถ้าเราย้าย code ไปแล้ว เมื่อ doTransferOut เกิดการ error ตัว state ที่ทำการเปลี่ยนค่าไปแล้วจะไม่ได้ถูก revert

เพราะการ return fail ไม่ได้ revert transaction

ถ้าอยากให้ state revert ได้ จะต้องทำการ manual revert เอง โดยจำค่าก่อน update ไว้ แล้ว rollback ค่าแต่ละ state เอง

ตรงนี้งานค่อนข้างหนักเลย ทาง trail of bit เลยแนะนำให้ไปใช้การ revert/require ปกติ แทนการ return error ตามภาพ

Referrence

https://github.com/trailofbits/publications/blob/master/reviews/compound-2.pdf

--

--

No responses yet