โดยปกติการรับส่งข้อมูลใน FTP Protocol จะใช้ในการเชื่อมต่อเพื่อใช้งานส่งและรับไฟล์ได้ แต่เมื่อมีการแปล (Parsing) ข้อความที่ได้รับผิดพลาด ก็ทำให้การทำงานของ Server และ Client ที่เป็น Java/Python เกิดเป็นช่องโหว่ขึ้นมาได้

เริ่มแรกนาย Alexander Klink พบว่าหากมีการเชื่อมต่อ FTP (เช่น ftp://user:password@host:port/file.ext เป็นต้น) ไปยังเครื่อง Java Server ซึ่งเมื่อเห็นเป็น FTP Protocol จึงมีการใช้งาน  sun.net.ftp.impl.FtpClient เป็นตัวเริ่มจัดการ connection โดยเมื่อ Client พบว่าเชื่อมต่อได้สำเร็จก็จะส่ง USER Command เพื่อระบุ user สำหรับการเข้าสู่ระบบต่อไป

ทีนี้นาย Klink พบว่า JRE ดังกล่าวไม่ได้มีการจัดการค่า input จาก user ที่ดีพอ ทำให้เมื่อใส่ค่า <%0D%0A> หรือก็คือ <CR><LF> ซึ่งหมายถึงการขึ้นบันทัดใหม่เข้าไป กลายเป็นว่าสามารถจะหยุดคำสั่ง USER แล้วใส่คำสั่งต่อไปได้เลย

ทีนี้นาย Klink จึงได้ทดสอบติดต่อ (telnet) ไปยัง Mail Server ที่เป็น Java และได้ทำการส่งคำสั่ง USER ด้วยค่าเป็น

หรือเมื่อถูกตีความแล้วจะกลายเป็น

เมื่อ Mail Server ได้รับจะตอบกลับมาว่า

แต่เมื่อตรวจสอบ พบว่า Mail ได้ถูกส่งออกไปแล้ว บ่งบอกถึงการ inject Command ของ SMTP ผ่าน FTP Handlering อย่าง sun.net.ftp.impl.FtpClient ได้สำเร็จ

FTP Client ของ Java ก็ไม่ปลอดภัยเช่นกัน

หลังจากการพบช่องโหว่ของ Klink ทาง Blindspot Security ได้มีการนำเสนอเพิ่มเติมว่าเป็นผู้ที่พบช่องโหว่นี้ก่อนตั้งแต่ช่วงเดือนพฤศจิกายน 2016 ที่ผ่านมาอีกทั้งยังทดสอบกับ FTP Client อีกด้วย

โดยพบว่าหากมีการเปิด URL ของ FTP URL (เช่น ftp://u:p@evil.com/foodir:1337 เป็นต้น) จะเริ่มทำงานปกติของ FTP ซึ่งก็คือการทำงานแบบรอทำงานทีละคำสั่งแล้วก็รอ response ของคำสั่งนั้นๆไปเรื่อยๆ ทีนี้ด้วย FTP Client ที่เป็น Java และ Python(ใช้ urllib ในการอ่าน URL) หากเข้าไปยัง ftp://u:p@evil.com/foodir%0APORT%2010,1,1,1,5,57/z.txt จะกลายเป็นว่ามองการเชื่อมต่อเป็น

จะเห็นว่าเป็นการส่ง 2 command (CWD, PORT) เข้าไปใน Write(2) ที่ถูกเรียกโดย Java/Python ทำให้เกิดการทำงานที่ผิดพลาด กลายเป็นว่า Attacker สามารถกำหนดการสร้าง Connection ใหม่ไปยังจุดหมายที่กำหนดได้หากกำหนด path ที่ยาวมากพอ นั่นหมายความว่า Attacker จะสามารถทำ SSRF(Server Side Request Forgery) ไปยัง FTP Client ที่เป็น Java/Python ได้นั่นเอง

ทาง Blindspot Security ได้มีการแจ้งไปยัง Oracle และ Python เพื่อออก patch มาแล้วครับ โดยตอนนี้ยังไม่มีการออก patch แต่อย่างใดครับ

ระบบที่ได้รับผลกระทบ: Server/FTP Client Java/Python

ผลกระทบ: Server Side Request Forgery/XML eXternal Entity

วิธีการแก้ไข:

  • หากเป็น Firewall ที่มีการเปิด FTP Server ของภายนอก แนะนำให้ทำการปิด
  • ทดสอบ Java Application ว่ามีช่องโหว่หรือไม่ หากเป็นไปได้แนะนำให้ใช้ Next Generation Firewall สร้าง custom signature เพื่อป้องกันการใข้งาน invalid protocol
  • ยกเลิกการใช้งาน Java FTP Client จนกว่าจะมีการออก patch update จาก Oracle

Source:: Blindspot Security