การรักษาความปลอดภัยที่ร้ายแรง: GnuTLS ติดตาม OpenSSL แก้ไขข้อบกพร่องของการโจมตีตามเวลา

การรักษาความปลอดภัยที่ร้ายแรง: GnuTLS ติดตาม OpenSSL แก้ไขข้อบกพร่องของการโจมตีตามเวลา

โหนดต้นทาง: 1956368

สัปดาห์ที่แล้วเราเขียนเกี่ยวกับกลุ่มของ ข้อบกพร่องในการจัดการหน่วยความจำ ที่ได้รับการแก้ไขในการอัปเดตความปลอดภัยล่าสุดของไลบรารีการเข้ารหัส OpenSSL ที่เป็นที่นิยม

นอกจากข้อผิดพลาดของหน่วยความจำแล้ว เรายังรายงานเกี่ยวกับข้อบกพร่องที่เรียกว่า CVE-2022-4304: กำหนดเวลา Oracle ในการถอดรหัส RSA.

ในจุดบกพร่องนี้ ส่งข้อความเข้ารหัสเดียวกันซ้ำแล้วซ้ำอีกที่เซิร์ฟเวอร์ แต่ปรับเปลี่ยนการเติมที่ส่วนท้ายของข้อมูลเพื่อทำให้ข้อมูลไม่ถูกต้อง และด้วยเหตุนี้จึงก่อให้เกิดพฤติกรรมที่คาดเดาไม่ได้บางประเภท...

…จะใช้เวลาไม่สม่ำเสมอ สมมติว่าคุณอยู่ใกล้กับเป้าหมายบนเครือข่าย ซึ่งคุณสามารถเดาได้อย่างน่าเชื่อถือว่ากระบวนการถ่ายโอนข้อมูลจะใช้เวลานานแค่ไหน

ข้อมูลทั้งหมดไม่ได้ประมวลผลอย่างเท่าเทียมกัน

หากคุณปิดคำขอ กำหนดเวลาที่คำตอบใช้ และลบเวลาที่ใช้ในการรับ-ส่งข้อมูลเครือข่ายในระดับต่ำ คุณจะรู้ว่าเซิร์ฟเวอร์ใช้เวลานานเท่าใดในการคำนวณภายในเพื่อประมวลผลคำขอ .

แม้ว่าคุณจะไม่แน่ใจว่าเครือข่ายใช้เวลาหมดไปเท่าใด คุณก็สามารถมองหาการเปลี่ยนแปลงของเวลาไป-กลับได้โดยการเริ่มคำขอจำนวนมากและรวบรวมตัวอย่างจำนวนมาก

หากเครือข่ายมีความน่าเชื่อถือมากพอที่จะสันนิษฐานได้ว่าค่าโสหุ้ยของเครือข่ายส่วนใหญ่คงที่ คุณอาจใช้วิธีการทางสถิติเพื่อสรุปได้ว่าการแก้ไขข้อมูลประเภทใดทำให้เกิดความล่าช้าในการประมวลผลพิเศษประเภทใด

จากนี้ คุณสามารถอนุมานบางอย่างเกี่ยวกับโครงสร้างหรือแม้แต่เนื้อหาของข้อมูลต้นฉบับที่ไม่ได้เข้ารหัสซึ่งควรเก็บเป็นความลับในคำขอซ้ำๆ แต่ละครั้ง

แม้ว่าคุณจะแยกข้อความธรรมดาได้เพียงหนึ่งไบต์ แต่ก็ไม่ควรเกิดขึ้น

จึงเรียกว่า การโจมตีเวลา การจัดเรียงแบบนี้มักสร้างปัญหาได้เสมอ แม้ว่าคุณอาจต้องส่งแพ็กเก็ตปลอมหลายล้านแพ็กเก็ต และใช้เวลาทั้งหมดเพื่อให้มีโอกาสกู้คืนข้อมูลเพลนเท็กซ์เพียงหนึ่งไบต์...

…เพราะเครือข่ายเร็วกว่า คาดเดาได้มากกว่า และสามารถรองรับโหลดได้มากกว่าเมื่อไม่กี่ปีที่ผ่านมา

คุณอาจคิดว่าแพ็กเก็ตหลอกลวงหลายล้านรายการส่งสแปมใส่คุณ พูดได้ว่าชั่วโมงถัดไปจะโดดเด่นเหมือนนิ้วหัวแม่มือจัดเรียงข้อมูล

แต่ “หนึ่งล้านแพ็คเก็ตต่อชั่วโมงมากกว่าหรือน้อยกว่าปกติ” นั้นไม่ใช่รูปแบบที่ใหญ่เป็นพิเศษอีกต่อไป

บั๊ก "oracle" ที่คล้ายกันใน GnuTLS

บุคคลเดียวกันที่รายงานข้อผิดพลาดเกี่ยวกับเวลาบั๊กที่แก้ไขล่าสุดใน OpenSSL ก็รายงานเช่นกัน ข้อบกพร่องที่คล้ายกันใน GnuTLS ในเวลาเดียวกัน

อันนี้มีตัวระบุข้อบกพร่อง CVE-2023-0361.

แม้ว่า GnuTLS จะไม่ได้รับความนิยมหรือใช้กันอย่างแพร่หลายเท่ากับ OpenSSL แต่คุณอาจมีโปรแกรมจำนวนหนึ่งในพื้นที่ไอทีของคุณ หรือแม้กระทั่งในคอมพิวเตอร์ของคุณเอง ที่ใช้หรือรวมโปรแกรมนั้นไว้ด้วย อาจรวมถึง FFmpeg, GnuPG, Mplayer, QEMU , Rdesktop, Samba, Wget และ Wireshark

แดกดันข้อบกพร่องด้านเวลาใน GnuTLS ปรากฏในโค้ดที่ควรบันทึกข้อผิดพลาดการโจมตีด้วยเวลาตั้งแต่แรก

ดังที่คุณเห็นได้จากความแตกต่างของรหัส (diff) ด้านล่าง โปรแกรมเมอร์ทราบว่าเงื่อนไขใดๆ (if ... then) การดำเนินการที่ใช้ในการตรวจสอบและจัดการกับข้อผิดพลาดในการถอดรหัสอาจทำให้เกิดการเปลี่ยนแปลงของเวลา เนื่องจากโดยทั่วไปแล้ว CPU จะใช้เวลาที่แตกต่างกัน ขึ้นอยู่กับว่าโค้ดของคุณไปในลักษณะใดหลังจากคำสั่ง "branch"

(โดยเฉพาะอย่างยิ่งสำหรับสาขาที่มักจะไปทางหนึ่งและไม่ค่อยไปอีกทางหนึ่ง เนื่องจาก CPU มักจะจดจำหรือแคช โค้ดที่ทำงานซ้ำๆ เพื่อปรับปรุงประสิทธิภาพ จึงทำให้โค้ดที่ใช้ไม่บ่อยทำงานช้าลงอย่างเห็นได้ชัด)

รหัสความแตกต่างของ gnutls-3.7.8/lib/auth/rsa.c กับ 3.7.9

แต่โปรแกรมเมอร์ยังคงต้องการบันทึกว่าอาจมีการโจมตีเกิดขึ้น ซึ่งจะเกิดขึ้นหาก if (ok) การทดสอบข้างต้นล้มเหลวและแตกแขนงเป็น else { ... } มาตรา.

ณ จุดนี้รหัสเรียก _gnutls_debug_log() ซึ่งอาจต้องใช้เวลาพอสมควรในการทำงาน

ดังนั้น coder จึงทำการโทรโดยเจตนา _gnutls_no_log() ใน then { ... } ส่วนหนึ่งของโค้ด ซึ่งแสร้งทำเป็นบันทึก "การโจมตี" เมื่อไม่มี เพื่อพยายามเพิ่มเวลาที่โค้ดใช้ในทิศทางใดทิศทางหนึ่ง if (ok) คำแนะนำสาขาสามารถใช้

อย่างไรก็ตาม เห็นได้ชัดว่าเส้นทางรหัสทั้งสองนั้นไม่ใกล้เคียงกันเพียงพอในเวลาที่ใช้หมด (หรืออาจเป็นไฟล์ _gnutls_debug_log() การทำงานด้วยตัวมันเองนั้นไม่สอดคล้องกันเพียงพอในการจัดการกับข้อผิดพลาดประเภทต่างๆ) และผู้โจมตีสามารถเริ่มแยกแยะการถอดรหัสลับได้หลังจากพยายามมากกว่าหนึ่งล้านครั้ง

จะทำอย่างไร?

หากคุณเป็นโปรแกรมเมอร์: การแก้ไขข้อบกพร่องที่นี่ทำได้ง่ายและเป็นไปตามหลักการ "น้อยแต่มาก"

โค้ดสีชมพูด้านบนซึ่งถือว่าไม่ได้ให้ข้อมูลการตรวจจับการโจมตีที่มีประโยชน์อย่างยิ่ง ก็ถูกลบออกไปเพียงเพราะโค้ดที่ไม่มีอยู่นั้นไม่สามารถรวบรวมได้โดยไม่ตั้งใจ ไม่ว่าการตั้งค่าบิลด์ของคุณจะเป็นเช่นไร...

…และโค้ดที่ไม่ได้คอมไพล์จะไม่สามารถทำงานได้ ไม่ว่าจะโดยบังเอิญหรือการออกแบบ

หากคุณเป็นผู้ใช้ GnuTLS: รุ่นที่เพิ่งเปิดตัว 3.7.9 และ “รสชาติของผลิตภัณฑ์ใหม่” 3.8.0 มีการแก้ไขนี้พร้อมกับสิ่งอื่น ๆ รวมอยู่ด้วย

หากคุณใช้ Linux distro ให้ตรวจหาการอัปเดตของ GnuTLS เวอร์ชันไลบรารีที่ใช้ร่วมกันที่จัดการจากส่วนกลางที่คุณมี รวมถึงแอปที่นำเวอร์ชันของตนเองมาด้วย

บน Linux ให้ค้นหาไฟล์ด้วยชื่อ libgnutls*.so เพื่อค้นหาไลบรารีที่ใช้ร่วมกันที่อยู่รอบๆ และค้นหา gnutls-cli เพื่อค้นหาสำเนาของโปรแกรมอรรถประโยชน์บรรทัดคำสั่งที่มักจะรวมอยู่ในไลบรารี

คุณสามารถเรียกใช้ gnutls-cli -vv เพื่อดูว่ารุ่นไหนของ libgnutls มันเชื่อมโยงแบบไดนามิกกับ:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- distro Linux ของฉันได้รับการอัปเดตเมื่อวันศุกร์ที่แล้ว (2023-02-10)

ประทับเวลา:

เพิ่มเติมจาก ความปลอดภัยเปล่า