การ rug pull ด้วยการ skim LP token

Nattawat Songsom
3 min readJun 12, 2023

--

มาลองดู code การ attack แบบ skim LP กัน

ถ้าลองดู tx 0x3228cfb5b1b5413181c8b3abb6fd4d241917b537770aa99f5ab6a10b76ad1d27

เราจะพบว่ามีการทำกำไรไปถึง 13 ETH

ทำไมอยู่ดีๆ attacker ถึงถอน 13 ETH ออกจาก pool ได้ มาดูกัน

ก่อนอื่น tx นี้เป็นการเรียก tx ไปที่ contract https://etherscan.io/address/0x907502a0cd135a687de4952e4ab5f92df36ac8b8#code

ซึ่ง contract นี้ไม่ได้ verify code แหะ

ยังไงต่อดี ?

แต่ถ้าเรามาไล่ดู internal tx กัน เราจะพบว่า เริ่มจาก 3 tx ตามรูป

โดยประกอบด้วย

  1. attacker นำ ETH ไปแลก WETH
  2. attacker swap WETH->UPS
  3. attacker โอน UPS ตรงเข้าไปใน pool (ไม่ได้ผ่านการวาง LP)

เราจะเห็นได้ว่า ตอนนี้ balance ของ pool ฝั่ง UPS มีส่วนเกิน เนื่องจากมีการโอน UPS ตรงเข้าไป

ซึ่ง code smart contract uniswap V2 จะมี function skim ให้สามารถถอนเงินส่วนเกินออกมาได้ ตาม code ด้านล่าง

ขอบคุณภาพจาก https://medium.com/@Ancilia/the-uniswap-skim-token-balance-attack-b1399943d560

ซึ่งส่วนนี้ก็ดูปกติดี

แต่พอมาดูผลลัพธ์การ skim จะพบว่า balance UPS ของ pool เพิ่มขึ้นเรื่อยๆ ตามรูป

โดยในรูปเป็นการ skim ส่วนเกินจาก pool ไปเก็บไว้ที่ pool เอง (โอนกลับไปที่เดิม)

จริงๆ ถ้าโอนให้ตัวเอง ต้อง balance เท่าเดิมสิ แต่ทำไม balance ถึงเพิ่มขึ้นเรื่อยๆละ ?

มาดูกันว่า skim ไปเรียก function อะไรต่อบ้าง

ขอบคุณภาพจาก https://medium.com/@Ancilia/the-uniswap-skim-token-balance-attack-b1399943d560

จากรูป พบว่ามีการเรียก function _safeTransfer, balanceOf และ sub

โอเคมาดู _safeTransfer กัน

_safeTransfer มีการเรียก _transfer งั้นมาดู _transfer กันเลย

ขอบคุณภาพจาก https://medium.com/@Ancilia/the-uniswap-skim-token-balance-attack-b1399943d560

จาก code เราจะพบว่าถ้า txType เป็น 1 จะทำให้ totalSupply เพิ่มขึ้น

เอาละ flow การเรียกคือ skim -> _safeTransfer -> _transfer ทำให้ totalSupply เพิ่ม

แต่ totalSupply เพิ่ม เกี่ยวอะไรกับ balanceOf ที่เพิ่มละ ?

นอกจาก _transfer แล้ว skim ยังเรียก balanceOf ด้วย มาดู code กัน

ขอบคุณภาพจาก https://medium.com/@Ancilia/the-uniswap-skim-token-balance-attack-b1399943d560
ขอบคุณภาพจาก https://medium.com/@Ancilia/the-uniswap-skim-token-balance-attack-b1399943d560

เราจะพบว่า balanceOf มีการนำ totalSupply ไปคำนวณด้วย

ดังนั้น ถ้า totalSupply เพิ่ม -> getFactor ลด -> balanceOf เพิ่ม นั่นเอง

โอเค มา recap กัน

ตอนนี้ attacker เรียก skim รัวๆ ทำให้ balanceOf UPS ของ pool เพิ่มขึ้นเรื่อยๆ ตามรูป

โดยในตอนท้าย pool จะมี balance UPS ถึง 49M

และ attacker นำ 50M UPS ไป swap 63 ETH

หาใน history ไม่เจอแหะ แต่ attacker น่าจะ skim 49M UPS นั้นออกมาให้ตัวเอง แล้วจึงนำไป swap WETH นั้นออกมา

ดังนั้น นี่จึงเป็นเหมือนการ rug pull ด้วยการ เสกเหรียญ แล้วไป swap เหรียญอื่นออกมานั่นเอง

incident อื่นๆ ที่มีการใช้ skim attack?

ยังมีอีก incident นึงนั่นคือ https://bscscan.com/tx/0xf68ba761158dd37a7cb5a12a688364998c41a38e3a400ad9ad2a08c59067ed30

โดยสิ่งที่เกิดขึ้นคือ เมื่อมีการ skim จาก pool ไปให้ pool ตัวเหรียญจะส่งเหรียญเพิ่มให้กับ pool เป็น reward ดังรูป

พอลองมาดู code ก็จะพบว่าใน code ตั้งใจให้ reward แก่คนที่มาซื้อเหรียญที่ pool แต่สิ่งที่เกิดขึ้นคือ…

การ skim จาก pool ไปยังตัว pool เอง ดันไปเข้าเงื่อนไขการได้ reward ด้วยเนี่ยสิ

ทำให้ attacker สามารถปั้มเหรียญเข้า pool ไปเรื่อยๆได้ จากนั้นก็ skim เหรียญส่วนเกินออกมาจาก pool แล้วนำเหรียญนั้นมา drain BUSD ออกจาก pool ทำให้ได้กำไรไป 578 BUSD ตามรูป

ป.ล. อันนี้ผมแปลเนื้อหาจาก https://medium.com/@Ancilia/the-uniswap-skim-token-balance-attack-b1399943d560 มานะครับ

Referrence

--

--

No responses yet