NGINX ประกาศ CVE-2021-23017 เกิดจากการใช้ resolver บน NGINX และ NGINX Ingress Controller
Tags: nginx, cve202123017, resolver, vulnerability
Published: 2021-05-26 02:05:44

วันนี้ 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ilxsxi108vk36xq8kpkd.jpg)


**ผลกระทบ**
กระทบกับ 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ths92husqgxi5xx7gj6l.jpg)


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

ช่องโหว่นี้เกิดเมื่อมีการเรียกใช้งาน resolver directive เท่านั้น แต่ไม่กระทบกับการ resolve hostname ตามปกติ เช่นเคสนี้ ไม่ได้รับผลกระทบ เนื่องจากไม่มีการเรียกใช้ resolver directive(เป็นการใช้ resolver เดียวกับ Host)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/92ludyzytrx6i1t0dj5k.jpg)


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

ถ้าได้ผลลัพธ์ เป็นบรรทัดที่มีคำว่า 'resolver' กลับมา แสดงว่าเรามีการใช้ resolver directive ครับ แนะนำให้ update patch ทันที
ตัวอย่างทดสอบ หากมีการใช้ resolver
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ax0m8r7koy7jduqqxx4.jpg)

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

ตัวอย่างกรณีมี Service ประเภท External Name รันอยู่ครับ
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ifv8gxikt1c2wd1osnh.jpg)

ถ้าพบว่ามี 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