จากการที่ 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)
1 |
geth --rpc --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 ก็จะตอบมาเป็น IP87.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