Security Case study : (Bridge) Wormhole Hack

สรุป เรื่องราวที่เกิดขึ้นกับ ‘Wormhole Crypto’ 

Wormhole เป็นแพลตฟอร์ม Bridge ที่ใหญ่ที่สุด ที่เชื่อมต่อระหว่าง Ethereum - Solana พึ่งโดนโจมตีโดยแฮกเกอร์ และงานนี้ โดนไปอีก 323 ล้านดอลลาร์  ประเด็นคือ มันเกิดขึ้นได้อย่างไร?

ผู้ใช้ทวิตเตอร์ @samczsun ร่วมมือกันกับ @gf_256 และ @ret2jazzy สืบเสาะหาวิธีที่คาดว่าแฮคเกอร์ใช้มาได้เรียบร้อยแล้ว แต่ถ้าจะเอาให้คอนเฟิร์มสุดก็คงต้องรอ Wormhole เองมาประกาศอย่างเป็นทางการอีกที 

การสืบค้นแบบ Reverse Engineering

สิ่งแรกเลย  เรามาดูที่ Chain ก่อนว่า มันโดนแฮกที่ Chain ของ  Ethereum หรือ ที่ Chain ของ  Solana กันแน่ โดยไปตรวจสอบที่ encoded VM กัน ก็พบว่า มันมีลายเซ็นดิจิตอล( Digital Signature) ของผู้พิทักษ์ (Guardians) รองรับด้วย ดังนั้น  แปลว่า แฮกเกอร์ ไม่แฮกที่ Private Key ก็ต้อง แฮกที่ Bridge ไม่ใช่ที่ Chain  




แต่เมื่อดู เงินที่คนร้ายทิ้งไว้บน Bridge กว่า 600MM ทำให้เชื่อว่า น่าจะเป็นอย่างหลังมากกว่า เพราะมันสอดคล้องกับ Transaction ที่คนร้ายโอนเงินจาก Solana แล้วเอาออกไปทาง ETH 


เกิดคำถามขึ้นทันที แฮกเกอร์ เอาเงิน 120,000 ETH มาจากไหน ตั้งแต่แรก เพราะเมื่อตรวจสอบ Address ของบัญชีแฮกเกอร์  Transaction ของบัญชีก่อนหน้าก็มีเงินอยู่แค่ 0.01 ETH


เราจะเริ่มต้น ด้วยการเข้าไปเจาะใน Transaction ดังกล่าว และตรวจสอบกับ Code ของ  Wormhole บน GitHub เพื่อดูว่า ทำไมแฮกเกอร์เรียก ใช้ฟังก์ชั่นชื่อ `complete_wrapped`


ประเด็นอยู่ตรงนี้ คือ ฟังก์ชั่น CompleteWrapped นั้น มันจะสำเร็จได้ มันต้องการที่จะ Valid  VAA ก่อน แล้วแฮกเกอร์ สร้างบัญชี VAA เพื่อให้ Bridge มัน Accept ได้อย่างไร  เราจึงต้องขุดคุ้ยต่อ ยิ่งเราตรวจสอบก็ยิ่งสงสัยว่า บัญชี VAA นั้นกลับถูกสร้างใน  Transaction ก่อนหน้า

ซึ่ง transaction ก่อนหน้านี้มีการเรียกใช้ฟังก์ชัน ‘post_vaa’ บน Bridge หลักขึ้นมา ตอนนี้เราเหลือแค่ว่า แฮกเกอร์ สามารถ Bypass การตรวจสอบ Signature ในฟังก์ชั่น post_vaa ไปได้อย่างไร 



เราเลยต้องมาตรวจสอบ Function ชื่อว่า  check_valid_sigs ที่ต้องการ 2 parameter คือ บัญชี Guardian accs.guardian_set และ บัญชี accs.signature_set

แล้วก็โป๊ะแตก ว่า แฮกเกอร์ ไปสร้าง Transaction อีกหนึ่งอันไว้ โดยเรียกใช้ฟังก์ชั่น `verify_signatures`


เจ้าฟังก์ชั่น Verify_signatures นี้ (ฟังก์ชั้นนี้ทำหน้าที่ตรวจสอบความถูกต้องของการโอนข้ามไปมา) มันต้องการ Signature ของ Guardians เพื่อเอาไปแพ็คเข้าไปใน SignatureSet แต่ความเป็นจริง มันไม่ได้ Verify โดยตัวมันเอง แต่มันอาศัย โปรแกรม Secp256k1 ทำแทน

และปัญหาก็อยู่ใน current_instruction `solana_program::sysvar::instructions` มีไว้เพื่อใช้ สร้างคำแนะนำ ให้กับ sysvar ในกรณี error เกิดขึ้น เพื่อใช้สำหรับตรวจงานก่อน  Compile บน Solana อย่างไรก็ตาม `solana_program' เวอร์ชั่นที่ Wormhole ใช้นั้น กลับไม่ได้มีการ ตรวจสอบ Address 

หมายความว่า คุณสามารถสร้าง Account ของคุณเพื่อเก็บข้อมูลกัน  คำแนะนำสำหรับ  Sysvar ในคำสั่ง Verify_signatures ก็จะถูกเก็บไว้ นั่นคือการ bypass การตรวจลายเซ็นได้โดยสมบูรณ์

แล้วแฮกเกอร์ทำจริงหรือไม่
เราเลยย้อนกลับไปตรวจสอบ ชั่วโมงก่อนหน้านี้ พวกเขา สร้างบัญชีที่มีคำสั่งอย่างต่อเนื่อง (single serialized Instruction) ที่สอดคล้องกับ การเรียก โปรแกรม Secp256k1 

เมื่อพวกเขามี SignatureSet แล้ว ก็ใช้มันสร้าง VAA ที่ถูกต้อง แล้วก็สามารถโอนเหรียญที่ไม่มีสิทธิไปยังบัญชีของพวกเขาได้แล้ว  และนี่คือประวัติศาสตร์

เมื่อพวกเขามี `ชุดลายเซ็น' ปลอม การใช้มันเพื่อสร้าง VAA ที่ถูกต้องและเรียกเหรียญกษาปณ์ที่ไม่ได้รับอนุญาตไปยังบัญชีของพวกเขาเองนั้นไม่ใช่เรื่องง่าย ที่เหลือคือประวัติศาสตร์

บทสรุป คือ Wormhole ไม่ได้ตรวจสอบ Input  Account ทั้งหมดอย่างจริงจัง จึงอนุญาตให้แฮกเกอร์ ปลอม Guandian Signature (ลายเซ็นผู้พิทักษ์) ทำให้สามารถสร้าง เหรียญ EThereum ได้  120,000 ETH บน Solana ซึ่งเชื่อมโยง 93,750 กลับไปยัง Ethereum wfh

หลังเหตุการณ์นี้ Certus One หนึ่งในทีมงาน Dev ได้ยื่นข้อเสนอให้กับ แฮกเกอร์ ว่า 
มีเงินรางวัล 10 ล้านเหรียญ สำหรับงานนี้ และขอให้คืน wETH คืนทั้งหมด

มีคนตั้งคำถามว่า ถ้าคุณเป็น แฮกเกอร์ จะเลือก เป็นคนดี พร้อมเงิน 10 ล้านเหรียญ หรือ วิ่งหนีไปเฉยๆ พร้อมเงิน 323 ล้านเหรียญ ดี

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Security Case study : Shared Security , Why it''s important ?

GPU Mining 101: 2.1 : Hardware : สายไฟในระบบ RIG

GPU Mining : QA 1 Rig ใส่การ์ดจอได้สูงสุดกี่ใบ?