แฮนด์เชค VPN ที่ล้มเหลวเป็นภัยคุกคามแบบดาวน์เกรดจริงหรือ
การโจมตีแบบดาวน์เกรดมีอยู่จริง แต่แฮนด์เชคที่ล้มเหลวส่วนใหญ่คือข้อเสนอไม่ตรงกัน เส้นทางผิด หรือโปรไฟล์หมดอายุ ตรวจสอบก่อนว่าได้เจรจาอะไรไป
แฮนด์เชคที่จบด้วยข้อผิดพลาดให้ความรู้สึกเหมือนถูกโจมตีจนกว่าจะได้ดูข้อความ และส่วนใหญ่แล้วเป็นเรื่องเลขคณิต: ไม่มีข้อเสนอร่วมกัน ใบรับรองหมดอายุ หรือแพ็กเก็ตที่ไม่เคยมาถึง การโจมตีแบบดาวน์เกรดเป็นเรื่องเฉพาะเจาะจง: ผู้โจมตีดันทั้งสองฝั่งไปสู่พฤติกรรมที่อ่อนแอกว่าที่พวกเขาจะเลือก และทิ้งหลักฐานที่ต่างออกไป การมองทุกความล้มเหลวว่าเป็นเจตนาร้ายทำให้คุณตามหาผู้เสียหายที่อาจไม่มีอยู่จริง ขณะที่มองการดาวน์เกรดจริงว่าเป็นบั๊กการตั้งค่าจะปล่อยผลลัพธ์ที่อ่อนแอไว้ที่เดิม ข้อผิดพลาดสองแบบนี้มีต้นทุนต่างกัน และมีเพียงแบบเดียวที่แก้ไขได้ถูก
การโจมตีแบบดาวน์เกรดเปลี่ยนอะไรจริง ๆ
เป้าหมายไม่ใช่การทำลายรหัสลับและไม่ใช่การเดากุญแจ แต่คือการมีอิทธิพลต่อการเจรจาให้ทั้งสองฝ่ายลงเอยที่เวอร์ชันเก่าหรืออัลกอริทึมที่อ่อนแอซึ่งผู้โจมตีรับมือได้ หรือทำให้ฝ่ายหนึ่งเชื่อว่าอีกฝ่ายรองรับแค่นั้น
สิ่งที่เปลี่ยนคือข้อตกลง ไม่ใช่การพิสูจน์ตัวตน หากผู้โจมตีแก้ไขข้อเสนอได้โดยไม่ถูกตรวจพบ ทั้งสองฝ่ายยังคงทำแฮนด์เชคให้เสร็จและพิสูจน์ตัวตนต่อกันได้ แต่ด้วยพารามิเตอร์ที่ผู้โจมตีต้องการ นั่นคือเหตุผลที่คำถามน่าสนใจคือการเจรจาเองได้รับการคุ้มครองความสมบูรณ์หรือไม่
ทำไมการเจรจาเองต้องถูกพิสูจน์ตัวตน
TLS 1.3 ทำให้การคุ้มครองนั้นชัดเจน ไคลเอนต์ที่เสนอเวอร์ชันใหม่กว่าสามารถตรวจพบเซิร์ฟเวอร์ที่ถอยกลับอย่างเงียบ ๆ ได้ เพราะค่าสุ่มของเซิร์ฟเวอร์มีรูปแบบตายตัวเมื่อเจรจา 1.2 หรือต่ำกว่า และไคลเอนต์ต้องยกเลิกเมื่อเห็น บันทึกการสนทนาทั้งหมดยังถูกครอบด้วยข้อความสุดท้าย ดังนั้นการแก้ไขที่ใดก็ตามในการเจรจาจะล้มเหลวภายหลังแทนที่จะผ่านไปเงียบ ๆ
โปรโตคอลเวอร์ชันเก่ามีเรื่องเล่าที่อ่อนแอกว่า และนั่นคือเหตุผลที่กฎการถอยกลับสำคัญ จุดปลาย TLS 1.0 ในการตั้งค่าเดียวกันไม่ใช่การโจมตีแบบดาวน์เกรด แต่เป็นผลลัพธ์ที่อนุญาตซึ่งคุณเลือกอนุญาตเอง ความแตกต่างอยู่ที่ว่าผลลัพธ์ที่อ่อนแอกว่าเกิดจากการตัดสินใจที่ได้รับการคุ้มครอง หรือจากเส้นทางที่ไม่ได้รับการคุ้มครองซึ่งตัวกลางอาจมีอิทธิพล เมื่อพูดแบบนี้ เหตุการณ์ส่วนใหญ่ก็กลายเป็นคำถามเรื่องการตั้งค่า
IKEv2 ทำงานต่างออกไปแต่อยู่บนแนวคิดเดียวกัน ข้อเสนอถูกบรรจุในการแลกเปลี่ยนที่ภายหลังพิสูจน์ตัวตนทั้งสองฝ่าย ดังนั้นอุปกรณ์กลางที่เขียนอัลกอริทึมใหม่จะทำลายการพิสูจน์ตัวตนแทนที่จะชี้นำมัน ช่องควบคุมของ OpenVPN ปกป้องการเจรจาด้วย TLS แล้วใช้ช่องนั้นตกลงรหัสของช่องข้อมูล นั่นคือเหตุผลที่บรรทัดบันทึกของช่องควบคุมน่าสนใจ
ความเข้ากันได้ที่ตั้งค่าไว้ไม่ใช่การโจมตี
ผู้ดูแลระบบสามารถอนุญาตตัวเลือกเก่าโดยเจตนาเพื่อรองรับไคลเอนต์ที่มีเอกสารกำกับ และการตัดสินใจนั้นมองเห็นได้ในการตั้งค่า ผู้โจมตีสร้างการตั้งค่านั้นไม่ได้ ทำได้เพียงใช้เส้นทางที่ให้อิทธิพลต่อข้อเสนอ
การซ่อมที่เป็นอันตรายคือการลบหลักฐานของความแตกต่าง การเปิดใช้ตัวเลือกเก่าทั้งหมด การปิดการตรวจสอบใบรับรอง หรือการยอมรับรหัสใดก็ได้เพื่อให้ข้อผิดพลาดหายไป จะขยายสิ่งที่จุดปลายจะยอมรับ และลบการตรวจสอบที่จะรายงานผลลัพธ์ที่อ่อนแอกว่า
หากต้องเก็บตัวเลือกเก่าไว้หนึ่งอย่าง ให้ระบุเหตุผลและไคลเอนต์ในคอมเมนต์การตั้งค่า แล้วจำกัดตัวเลือกนั้นไว้ที่โปรไฟล์ที่ต้องการ ข้อยกเว้นความเข้ากันได้ที่จำกัดเฉพาะผู้ฟังหนึ่งรายตรวจสอบได้ ส่วนที่ใช้ทั่วโลกเป็นเพียงค่าเริ่มต้นที่อ่อนแอกว่าซึ่งไม่มีใครจำได้ว่าเลือกไว้
อ่านความล้มเหลวก่อนตั้งชื่อสาเหตุ
เก็บสตริงข้อผิดพลาดที่แน่นอน เวอร์ชันไคลเอนต์และเซิร์ฟเวอร์ และเวลาก่อนการเปลี่ยนแปลงใด ๆ จากนั้นจำแนก: ทั้งสองฝ่ายไม่ตรงกันเรื่องข้อเสนอ เส้นทางแพ็กเก็ตล้มเหลว หรือฝ่ายหนึ่งปฏิเสธพารามิเตอร์ที่เคยยอมรับ?
ข้อเสนอไม่ตรงกันมักระบุเวอร์ชันหรืออัลกอริทึมที่เป็นปัญหาและล้มเหลวที่จุดเดิมทุกครั้ง ปัญหาเส้นทางหรือ MTU จะหยุดหรือหมดเวลา และมักแปรผันตามเครือข่าย ใบรับรองที่หมดอายุให้ข้อผิดพลาดการตรวจสอบไม่ใช่การเจรจา
ไม่มีข้อใดเป็นหลักฐานของผู้โจมตี การกำหนดสาเหตุอันมุ่งร้ายตั้งแต่ความล้มเหลวครั้งแรกคือความผิดพลาด เพราะมันซ่อนบั๊กที่กำหนดได้ซึ่งจะล้มเหลวอีกในวันพรุ่งนี้
ยืนยันว่าจริง ๆ แล้วเลือกอะไร
หลังการแก้ไขใด ๆ ให้อ่านผลลัพธ์ที่เจรจาแทนที่จะเชื่อว่าการเชื่อมต่อขึ้นแล้ว การเชื่อมต่อที่สำเร็จเพราะเอาการตรวจสอบออกคือผลลัพธ์ที่คุณพยายามหลีกเลี่ยง สองคำสั่งด้านล่างแสดงเวอร์ชันและรหัสที่เลือกสำหรับจุดปลายที่มี TLS อยู่ข้างหน้า พร้อมบรรทัดช่องควบคุมจากบันทึกของเซิร์ฟเวอร์ OpenVPN
openssl s_client -connect 198.51.100.30:443 -servername vpn.example.net -brief </dev/null
grep -iE 'Control Channel|Data Channel' /var/log/openvpn.log | tail -5เปรียบเทียบผลลัพธ์กับการตั้งค่าที่คุณตั้งใจ ไม่ใช่กับสิ่งที่เชื่อมต่ออยู่ตอนนี้ หากเวอร์ชันที่เลือกเก่ากว่าขั้นต่ำที่อนุญาต โปรไฟล์หรือรายการถอยกลับคือที่ที่ต้องดู และคำตอบคือแก้รายการนั้น ไม่ใช่ประกาศการโจมตีและสร้างทุกอย่างใหม่รอบ ๆ