<?php wp_title('|', true, 'right'); ?>

นักพัฒนาพบ “บั้กปั๊มตังค์” บนแพลตฟอร์ม Defi ที่ช่วยให้เทรดได้กำไร 900% ในทุก ๆ ครั้ง 

ติดตามสยามบล็อกเชนบนSiam Blockchain

เมื่อวันที่ 19 เมษายน Zellic บริษัทรักษาความปลอดภัยด้านบล็อกเชนรายงานว่า ได้พบ 2 ช่องโหว่ ในโปรโตคอลที่มีการ ‘Fork’ แยกมาจาก Gains Network leveraged trading ที่อาจอนุญาตให้เทรดเดอร์ทำกำไร 900% ในทุก ๆ การซื้อขาย โดยไม่คำนึงถึงราคาของโทเค็นที่เทรด 

‘Fork’ หมายถึง การสร้างแยกเครือข่ายพัฒนาที่ดีกว่าออกจากบล็อกเชนหลัก กลายเป็นบล็อกเชนใหม่ เพื่อจุดประสงค์ในการปรับปรุงจุดบกพร่องบางประการ เปรียบเสมือนการแยกสาขาออกจากต้นไม้ใหญ่ 

Zelic ยังได้เสริมอีกว่า ช่องโหว่ที่หนึ่งเคยปรากฎอยู่ใน Gains Network เวอร์ชันก่อนหน้าแต่ได้รับการแก้ไขแล้ว แต่อีกช่องโหว่หนึ่งพบเฉพาะในโปรโตคอลที่ Fork แยกมาเท่านั้น 

Zellic ได้แจ้งช่องโหว่ดังกล่าวไปยังนักพัฒนาของโปรเจกต์ต่าง ๆ ที่ Fork แยกมาจาก Gains Network อย่างเช่นเว็บเทรด Gambit Trade, Holdstation Exchange และ Krav Trade ทีมพัฒนาเหล่านี้ได้ยืนยันว่าโปรโตคอลของตนเองไม่มีช่องโหว่นี้แล้ว แต่อย่างไรก็ตาม Zellic ยังคงเตือนว่า Fork ตัวอื่น ๆ ของ Gains Network อาจยังคงมีความเสี่ยงหลงเหลืออยู่ 

ตามเว็บไซต์อย่างเป็นทางการของ Gains Network เป็นระบบนิเวศของแพลตฟอร์ม DeFi ที่รันอยู่บนเชน Polygon และ Arbitrum ชื่ออย่างเป็นทางการของแอปการซื้อขายแบบเลเวอเรจคือ “gTrade” ซึ่งมันมีปริมาณการซื้อขายอนุพันธ์มากกว่า 25,000 ล้านดอลลาร์สหรัฐฯ นับตั้งแต่ก่อตั้งขึ้นในเดือนพฤษภาคม 2023 ตามข้อมูลจาก DefiLlama 

Zellic อ้างว่าแอพซื้อขาย DeFi ยอดนิยมหลายตัวได้มาจากโค้ดพื้นฐานของ Gains Network อย่างเช่น Gambit Trade และ Holdstation ที่กล่าวถึงข้างต้น รวมถึงโปรโตคอลอื่น ๆ อีกมากมาย พวกเขาค้นพบช่องโหว่นี้ในขณะที่ศึกษาเรื่อง Fork โดยเฉพาะ แต่ Zelic ปฏิเสธที่จะระบุว่าพวกเขาค้นพบมาจากแพลตฟอร์มใด

ในรายงานระบุว่า สัญญา Smart Contract บน Gains Network อนุญาตให้ผู้ใช้เปิดออร์เดอร์เทรดได้ 3 แบบ: Market Order, Reversal Order ออร์เดอร์แบบสวนตลาด และออร์เดอร์แบบเก็งกำไรตามโมเมนตัม (Momentum Order) โดยออร์เดอร์แบบตลาดจะซื้อหรือขายสินทรัพย์ทันที ไม่ว่าราคาจะเป็นเท่าไร

เมื่อผู้ใช้ต้องการเปิดเทรดเก็งกำไรตามเทรนด์หรือสวนเทรนด์  สัญญา Smart Contract จะบันทึก “order” ที่ประกอบด้วยข้อมูลเกี่ยวกับราคาที่ผู้ใช้ยินยอมที่จะเทรด เมื่อราคาตลาดไปถึงจุดที่ผู้ใช้กำหนดไว้ ผู้ใช้ทุกคนจะสามารถเรียกฟังก์ชัน “executeLimitOrder” เพื่อทำการเทรดตามคำสั่งนั้น โดยผู้ใช้ที่เรียกฟังค์ชันนี้ไม่จำเป็นต้องเป็นคนเดียวกับผู้ที่วางคำสั่งไว้ ผู้ใช้ที่ทำการเทรดสำเร็จจะได้รับ “ค่าธรรมเนียมการเทรด” (Execution Fee) เป็นการตอบแทนสำหรับการทำหน้าที่ตรงนี้

สิ่งนี้ช่วยให้ผู้ใช้สามารถวางคำสั่ง Take-Profit หรือ Stop-Loss ได้เหมือนกับตลาดแลกเปลี่ยนแบบรวมศูนย์ (CEX) แตกต่างกันที่ ไม่จำเป็นต้องมีองค์กรแบบรวมศูนย์เพื่อดำเนินการเติมคำสั่ง

เมื่อผู้ใช้วางคำสั่งลงไป พวกเขาสามารถตั้งราคา Take-profit (ทำกำไร) , ราคา Stop-loss (หยุดขาดทุน) หรือทั้งสองอย่างได้ ความตั้งใจของการออกแบบนี้คือเพื่อให้นักเทรดสามารถออกจากการซื้อขายที่ทำกำไร หรือจากการซื้อขายที่ขาดทุนที่จุด Stop loss โดยไร้ตัวกลางได้นั่นเอง

ช่องโหว่ที่ 1 อนุญาตให้ทำกำไร 900% จากคำสั่งซื้อ

ในการศึกษาโปรเจกต์ที่ Fork มาจาก Gains Network  Zellic ตรวจพบว่าเมื่อคำสั่งถูกเปิดขึ้น ราคา Stop loss จะถูกเก็บไว้ในตัวแปร “currentPrice” ที่ใช้ในการคำนวณกำไรและขาดทุน นั่นหมายความว่าหากผู้ใช้สามารถตั้งราคาหยุดขาดทุนไว้เหนือราคาเปิดได้ พวกเขาสามารถทำกำไรจากการซื้อขายใด ๆ ได้โดยอัตโนมัติ

ตัวอย่างเช่น สถานการณ์ที่ราคาของ Bitcoin BTC ซื้อขายอยู่ที่ $63,000 และผู้ใช้ใส่ราคาเปิดที่ $62,000 และป้อนราคา Stop loss อยู่ที่ $64,000 ในกรณีนี้ หากราคาลดลงเหลือ $62,000 คำสั่งซื้อจะเริ่มทำการซื้อเข้ามา แต่ราคาจะต่ำกว่าจุดStop loss ซึ่งจะทำให้เกิดการปิดการเทรดโดยอัตโนมัติทันที 

นอกจากนี้ ราคา Stop loss ที่ผู้ใช้ตั้งไว้จะถูกบันทึกเป็นราคาปัจจุบัน ซึ่งหมายความว่าผู้ใช้จะได้กำไร $2,000 แม้ว่ากำไรที่ถูกต้องควรจะเป็นประมาณ $0 สิ่งนี้อาจทำให้ผู้โจมตีสามารถทำกำไรจากการซื้อขายทุกครั้งและในที่สุดอาจทำให้โปรโตคอลสูญเสียเงินทุนทั้งหมดได้.

ช่องโหว่แรกที่ Zellic ค้นพบนี้ ไม่ได้ปรากฏอยู่ใน Gains Network เวอร์ชันหลัก แต่มีเฉพาะในฟอร์คแยกของโปรโตคอลที่พวกเขากำลังตรวจสอบอยู่นั่นเอง อย่างไรก็ตาม ในระหว่างการวิจัยปัญหานี้ พวกเขาได้พบช่องโหว่อีกช่องโหว่หนึ่ง ซึ่งเคยปรากฏอยู่ใน Gains เวอร์ชันก่อนหน้านี้ด้วย

ช่องโหว่ที่ 2 ทำช่วยให้สามารถได้กำไร 900% จากการเทรดทุกครั้ง

จุดบกพร่องดังกล่าวทำให้เทรดเดอร์สามารถทำกำไร 900% จาก sell order โดยไม่คำนึงถึงการเคลื่อนไหวของราคา

เมื่อมีการปิดเทรดบน Gains fork ระบบจะแปลงจุด stop-loss หรือ take-profit ของผู้ใช้ เป็นตัวแปรชื่อ “int” เพื่อนำไปคำนวณผลกำไรเป็นเปอร์เซ็นต์ แต่หากผู้ใช้ตั้งค่า stop-loss หรือ take-profit ที่เท่ากับ 2^256-1 ผลลัพธ์ของการคำนวณจะทำให้ค่า “int” ติดลบ

สาเหตุเป็นเพราะ 2^256-1 คือ ค่าสูงสุดสำหรับจำนวนเต็มบวกบนระบบ Ethereum ทำให้ค่าใดๆ ที่เกินกว่านี้เกิดการ “overflow” หรือทำให้ค่าเหล่านั้นกลับไปเป็นศูนย์อีกครั้ง เนื่องจากการคำนวณยังบวกราคาเปิด (open price) เข้าไปด้วย ซึ่งในภาษาโปรแกรม Solidity ค่า 2^256-1 ถูกเรียกว่า “type(uint256).max” 

ตามที่ Zellic กล่าว, ตราบใดที่ผู้โจมตีมีการใช้เลเวอเรจมากกว่า 9 เท่า พวกเขาจะสามารถทำกำไรได้ 900% จากการใช้ช่องโหว่นี้:

“มาพิจารณาคำสั่งขาย, โดยมี currentPrice เป็น type(uint256).max ค่าที่ได้ของ diff จะเป็น openPrice + 1 (int(type(uint256).max) = -1), และด้วยเหตุนี้เปอร์เซ็นต์ของกำไรจะใกล้เคียงกับ 100 * เลเวอเรจ ดังนั้น, หากเลเวอเรจมากกว่า 9, ฟังก์ชันจะคืนค่ากำไรเป็น 900%”

สัญญา Smart Contract มีการตรวจสอบเพื่อป้องกันการตั้งค่า “Take-Profit” เป็นตัวเลข 2^256-1 แต่ระบบตรวจสอบนี้ทำงานเฉพาะตอนวางคำสั่งเทรดในครั้งแรกเท่านั้น ดังนั้นหากผู้ใช้ปรับเปลี่ยนจุด Take Profit ในภายหลังจากวาง Order ระบบจะไม่สามารถทำการตรวจสอบได้ ทำให้ผู้ใช้สามารถเปลี่ยนค่าเป็น 2^256-1 ได้ และส่งผลให้ได้รับกำไร 900% ทุกครั้งที่มีการเทรดสำเร็จ

ช่องโหว่ที่สองนี้มีอยู่ในโปรโตคอลของ Gains เวอร์ชันก่อนหน้า แต่ได้รับการแก้ไขในเวลาต่อมา เวอร์ชันปัจจุบันไม่มีข้อบกพร่องนี้แล้ว เนื่องจากจะทำการตรวจสอบเมื่อมีการอัปเดตจุดทำกำไรและจุดหยุดขาดทุน รวมถึงเมื่อตั้งค่าเป็นครั้งแรก

ที่มา:cointelegraph