จากการที่ Tavis Ormandy ได้ออกมาเปิดเผยช่องโหว่ DNS Rebinding ใน Bittorrent Client และ Blizzard’s Game ก็ทำให้มีคนสนใจในช่องโหว่ดังกล่าวมากขึ้น และก็ถึงการมองไปยังตัว Ethereum Client (Geth, Mist และ Parity) ว่ามีช่องโหว่หรือไม่

ทาง ret2got ซึ่งเป็นคน security คนหนึ่งก็เลยทดสอบดูปรากฏว่า Ethereum Client ส่วนใหญ่นั้นมีการเปิด JSON-RPC Server ไว้ที่ port 8545 แต่ไม่สามารถเข้าโดยใช้ Browser ได้ เพราะมีการกันไว้ด้วย SOP ทีนี้ JSON-RPC ใน Geth ไม่มีการ response  CORS ก็จริง แต่ดันไม่มีการทำเรื่อง authentication ไว้

ทาง ret2got ได้ทำการสร้าง DNS server ที่มี TTLs ค่อนข้างต่ำ (จากโพสต์เค้าใช้เป็น < 5 และพบว่า Chrome, Firefox และ Safari นั้นมีการ cache DNS responses ไว้ 60 วินาที แม้จะมีการ set TTL ไว้น้อยกว่า 5 ก็ตาม) เพื่อพยายามจะทำ DNS Rebinding

จากนั้นทาง ret2got ได้ทำการรัน Geth ขึ้นมาโดยใช้ –rpc option ด้วย (ทดสอบใน testnet)

เค้าได้ setup web server ขึ้นมาที่ port 8545 จากนั้นก็สร้าง iframe ที่มีการสร้าง request ไปยัง <subdomain>.attacker.com ทีนี้ step ที่เหลือก็จะเป็นแบบนี้

  • Client เข้า attacker.com จาก web browser
  • เกิด DNS request ไปยัง attacker.com แล้ว DNS ตอบกลับเป็น 87.87.87.87
  • จากนั้น,  attacker.com ถูกโหลดไปที่ user’s browser, ซึ่งก็คือมีการโหลด hidden iframe พร้อมกับ random subdomain ของ Attacker.com ไปด้วย เช่น randomrsub.attacker.com:8545
  • ทีนี้ DNS request จะส่งไปเพื่อพยายายม resolve random subdomain randomrsub.attacker.com, ซึ่งตัว DNS server ก็จะตอบมาเป็น IP 87.87.87.87. แต่ทีนี้จะเรียกไปยัง port 8545 แทน ซึ่งในตรงจุดนี้ตัว web server ก็จะมีการ set ไว้เป็นอีก virtual host และเริ่มการโจมตีแบบ DNS rebinding.
  • javascript ใน randomrsub.attacker.com:8545 จะรอ 60 วินาที, จากนั้นจึงส่ง XmlHttpRequest ไปยัง randomrr.attacker.com:8545/test.
  • เมื่อ DNS cache expired, ตัว browser จะพยายาม resolve hostname โดยการติดต่อไปยัง DNS อีกครั้ง. ซึ่งคราวนี้ตัว DNS server จะตอบกลับมาเป็น 127.0.0.1.
  • ซึ่งนั่นหมายความว่า Client ก็จะเรียกไปยัง 127.0.0.1:8545/test แทนที่จะเป็น 87.87.87.87:8545/test นั่นเอง, และจากนั้น origin ที่เป็น randomrr.attacker.com:8545, ก็จะสามารถอ่าน response ได้
  • ซึ่งเมื่อตัว iframe มีการสร้าง random subdomain ทุกๆครั้ง,นั่นหมายความว่าเราสามารถที่จะปรับการ response ของ DNS ให้เหมาะสมกับ Client แต่ละคนได้

เมื่ออ่าน response จาก JSON-RPC service ได้ นั่นก็หมายความว่าสามารถที่จะดึงค่า address ,ค่า balance, และแม้แต่จะขโมย Ethereum ออกมาได้นั่นเอง

ทาง ret2got ได้ทำการแจ้งช่องโหว่ไปยัง ethereum foundation แล้ว แต่ทางนั้นกลับตอบว่าไม่คิดว่าช่องโหว่นี้เป็นช่องโหว่แต่อย่างใดครับ

Source:: Ret2Got