DEV Community

terngr
terngr

Posted on

NGINX ประกาศ CVE-2021-23017 เกิดจากการใช้ resolver บน NGINX และ NGINX Ingress Controller

วันนี้ NGINX Page ได้เปิดเผยรายละเอียด CVE-2021-23017

ค้นพบ
ช่องโหว่ถูกพบโดยทีมของ Luis Merino, Eric Sesterhenn, and Markus Vervier of X41 D‑Sec GmbH และได้มีการแจ้งแบบ Disclosed มายัง NGINX ก่อนหน้านี้แล้ว
อ้างอิงตาม cve.mitre.org มีการบันทึกเลข CVE แบบไม่เปิดเผยรายละเอียดช่องโหว่เมื่อวันที่ 20210106
Alt Text

ผลกระทบ
กระทบกับ NGINX Worker process ซึ่งเป็นตัวรับ request จาก Client ให้เกิดการ Crash ทำให้ clients ไม่ได้รับ Responses

Products ที่ได้รับผลกระทบ

  • NGINX OSS
  • NGINX Plus
  • NGINX Ingress Controller

ระดับความรุนแรง
NGINX จัดระดับความรุนแรงไว้ที่ Low, ผู้เขียนคาดว่าน่าจะเกิดจากการที่ resolver directive ไม่ค่อยมีการใช้งาน เพราะปกติใช้ default resolver ของ Host
อย่างไรก็ตาม หากมีการใช้งาน resolver directive เมื่อถูกโจมตี จะกระทบด้าน Availability ของ NGINX Service ครับ

ลักษณะการโจมตี
ในการทำงานของ NGINX เมื่อมีการเรียกไปยัง FQDN จะต้องทำการ resolve IP ก่อน, โดยใช้ resolver เดียวกับ Host
เราสามารถที่จะกำหนด DNS Server ที่ต้องการให้ Resolve ได้ครับ, โดยกำหนดได้ละเอียดเช่นแต่ละ name ให้ใช้ DNS Server ที่ต่างกัน
ตัวอย่างการใช้ resolver directive ที่มีการขอ resolve: api1.dso.mfec ไปยัง 10.4.100.50
Alt Text

Attacker สามารถ forge UDP response package ให้เขียน memory เกินมา 1 bytes ส่งผลกระทบให้ Worker Process อาจ Crash หรือเกิด Connection refuse กับบาง Client

ช่องโหว่นี้เกิดเมื่อมีการเรียกใช้งาน resolver directive เท่านั้น แต่ไม่กระทบกับการ resolve hostname ตามปกติ เช่นเคสนี้ ไม่ได้รับผลกระทบ เนื่องจากไม่มีการเรียกใช้ resolver directive(เป็นการใช้ resolver เดียวกับ Host)
Alt Text

ตรวจสอบ NGINX ของเราว่าได้รับผลกระทบไหม
สำหรับ NGINX Open Source และ NGINX Plus สามารถตรวจสอบได้ว่ามีการใช้ resolver directive ไหม โดยรันคำสั่ง

nginx -T | grep resolver

ถ้าได้ผลลัพธ์ เป็นบรรทัดที่มีคำว่า 'resolver' กลับมา แสดงว่าเรามีการใช้ resolver directive ครับ แนะนำให้ update patch ทันที
ตัวอย่างทดสอบ หากมีการใช้ resolver
Alt Text

สำหรับ NGINX Ingress Controller โดยทั่วไปจะไม่มีการใช้ resolver directive ครับ ยกเว้นกรณีใช้ Ingress กับ Service ประเภท External Name, และยังอาจมี Use Case อื่นๆ ที่มีการใช้ resolver
ทดสอบโดยรัน

kubectl get service | grep ExternalName

ตัวอย่างกรณีมี Service ประเภท External Name รันอยู่ครับ
Alt Text

ถ้าพบว่ามี Service ประเภท External name อยู่, ให้ตรวจสอบแต่ละ Ingress/Virtualserver ว่ามีการเชื่อมต่อกับ Service ประเภท ExternalName หรือไม่ด้วยคำสั่ง

kubectl describe ingress 'ingress name'
หรือ
kubectl describe virtualserver 'virtualserver name'

Patches
ปัจจุบันมี Patches สำหรับ NGINX OSS, NGINX Plus และ NGINX Ingress Controller เฉพาะ 2 เวอร์ชั่นล่าสุดครบแล้ว โดยปล่อย Patch เมื่อ May 18
หลังประกาศช่องโหว่วันนี้(May 24) เว็บ CVE หลายๆเว็บ ได้ทยอยลงรายละเอียดช่องโหว่แล้วครับ, แต่บางเว็บก็ยังคงเป็นช่องโหว่แบบ Disclosed อยู่

NGINX Version ที่ได้รับการ Patched แล้ว

  • NGINX Open Source 1.20.1 (stable)
  • NGINX Open Source 1.21.0 (mainline)
  • NGINX Plus R23 P1
  • NGINX Plus R24 P1
  • NGINX Ingress Controller 1.11.2
  • NGINX Ingress Controller 1.11.3

สรุป
CVE-2021-23017 เป็นช่องโหว่ที่กระทบกับ NGINX OSS, NGINX Plus และ NGINX Ingress Controller เฉพาะที่มีการใช้งาน resolver directive
หากถูกโจมตี จะกระทบด้าน Availability

อย่างไรก็ตาม NGINX แนะนำให้อัพเดทเป็นเวอร์ชั่นล่าสุดครับ

References:

https://www.nginx.com/blog/updating-nginx-dns-resolver-vulnerability-cve-2021-23017

https://support.f5.com/csp/article/K12331123

Top comments (0)