การหาช่องโหว่ด้วย test coverage (Solidity)
มาลองหาช่องโหว่จาก test case ที่เค้าไม่ได้เขียนกัน
การหาช่องโหว่ด้วย test coverage คืออะไร ? มายกตัวอย่างกัน เช่น
ถ้าเราต้องหาช่องโหว่ของ smart contract ตาม code ด้านล่าง
โดยทาง dev ก็ได้มีการเขียน unit test มาแล้วด้วย
คำถามคือ เค้าเขียน unit test มาครอบคลุมทุกๆ function ทุกๆ if else แล้วยัง
เช่น ถ้า smart contract มี 10 function แล้ว dev เขียน unit test มาแค่ 5 function … แปลว่า test coverage คือ 50% นั่นเอง
โอเค แล้วเราจะหา test coverage ยังไง ?
ไล่เช็คเอง ? ก็ทำได้ แต่ใช้ tool ดีกว่า
โอเค มาลองกัน
fyi อันนี้เป็นตัวอย่างของ project foundry, vscode นะครับ
- ลง extension coverage gutters
- ใน vscode ใช้คำสั่ง ctrl + shift + p (สำหรับ windows) เลือก Open Settings (UI) จากนั้นติ้กถูกในหัวข้อ Coverage-gutters: Show Line Coverage เพื่อให้ vscode สามารถโชว์ผลลัพธ์จาก coverage gutters ได้
- ใช้คำสั่ง forge coverage — report lcov ใน terminal
- กด watch ที่มุมซ้ายล่างของ vscode
เราจะเห็นได้ว่า code ไม่ได้มี test coverage ครบ 100%
โดยมีทั้ง function ที่ไม่ได้เขียน test เลย (สีแดง)
และ function ที่ไม่ได้เขียน test ครบทุก if else (สีเหลือง) นั่นเอง
โอเค ซึ่งถ้า dev ไม่ได้เขียน test ไว้ ก็มีโอกาสที่ function นั้นจะทำงานในแบบที่ dev ไม่ได้ออกแบบไว้ละนะ