การปักหมุด TLS และการเข้าถึงผ่าน VPN ตอบคำถามคนละข้อ
การปักหมุดจำกัดว่าแอปเชื่อถือเซิร์ฟเวอร์ใด ส่วนนโยบาย VPN ตัดสินว่าใครเข้าถึงเครือข่ายได้ ทั้งสองอย่างไม่ครอบคลุมการอนุญาตหรืออุปกรณ์ที่หายไป
วางแอปมือถือส่วนตัวไว้หลัง VPN แล้วคนที่มีเหตุผลจะถามว่ายังต้องปักหมุดใบรับรองอยู่หรือไม่ คำถามนี้ฟังดูเหมือนการเลือกระหว่างการควบคุมสองอย่างที่เท่ากัน แต่จริง ๆ แล้วเป็นคำถามเกี่ยวกับประตูสองบานที่ต่างกัน VPN ตัดสินว่าอุปกรณ์นี้ได้รับอนุญาตให้ใช้เส้นทางหรือไม่ ส่วนแอปตัดสินว่าเซิร์ฟเวอร์ที่ไปถึงคือเซิร์ฟเวอร์ที่คาดไว้หรือไม่ ตอบทั้งสองแยกกัน แล้วการออกแบบจะง่ายขึ้น
สองประตู สองคำถาม
การรับเข้าเครือข่ายเกี่ยวกับไคลเอนต์: อุปกรณ์นี้ลงทะเบียนแล้วหรือยัง ข้อมูลรับรองยังใช้ได้หรือไม่ และนโยบายอนุญาตให้เข้ามาในเส้นทางนี้หรือไม่ ความเชื่อถือของแอปเกี่ยวกับเซิร์ฟเวอร์: การเชื่อมต่อไปถึงบริการที่มีตัวตนซึ่งแอปยอมรับหรือไม่ คำตอบเหล่านี้มาจากระบบที่ต่างกัน ล้มเหลวด้วยเหตุผลต่างกัน และทีมที่ต่างกันเป็นผู้แก้ไข การจับมือ VPN อาจสำเร็จได้ในขณะที่แอปกำลังคุยกับใบรับรองที่หมดอายุอยู่หลังคู่ค้า แอปที่ปักหมุดอย่างสมบูรณ์แบบก็อาจไม่มีใครเข้าถึงได้ เพราะอุปกรณ์ไม่เคยเข้ามาในเครือข่าย
ทั้งสองรวมกัน การตัดอย่างใดอย่างหนึ่งออกคือการตัดการควบคุมออกหนึ่งอย่าง การเพิ่มอีกอย่างไม่ได้แทนที่กัน
การปักหมุดจำกัดอะไรจริง ๆ
การปักหมุดทำให้ชุดตัวตนของเซิร์ฟเวอร์ที่แอปจะยอมรับแคบลง โดยปกติระบุคีย์สาธารณะหรือแฮชของใบรับรอง แทนที่จะเชื่อถือทุกห่วงโซ่ที่ร้านค้าหนึ่งรับรอง นี่เป็นข้อจำกัดที่วางทับบนการตรวจสอบปกติ ไม่ใช่สิ่งทดแทน การตรวจสอบปกติตอบว่าห่วงโซ่นั้นน่าเชื่อถือหรือไม่ ส่วนการปักหมุดตอบว่าเป็นห่วงโซ่ที่แอปนี้คาดไว้หรือไม่ การใช้งานที่ข้ามขั้นแรกไม่ได้ความปลอดภัยมา มีแต่ความแปลกใหม่
วัตถุที่ถูกปักหมุดแตกต่างกันไปตามแพลตฟอร์ม คำเดียวจึงบอกได้น้อยมาก การคัดลอกแฮชจากที่เก็บความเชื่อถือของผลิตภัณฑ์หนึ่งแล้วถือว่าเป็นสิ่งเดียวกันในแอปมือถือเป็นความผิดพลาดที่พบบ่อยและเงียบ
การปักหมุดบนแพลตฟอร์มเป็นการตั้งค่า ไม่ใช่นโยบาย
Android เปิดเผยการปักหมุดผ่านการตั้งค่าความปลอดภัยเครือข่าย โดยชุดการปักหมุดเก็บไดเจสต์ของคีย์สาธารณะ และห่วงโซ่ต้องมีอย่างน้อยหนึ่งรายการ ไฟล์นั้นแยกตามแอปและต้องเปลี่ยนการบิลด์อย่างตั้งใจ iOS ไม่มีกลไกแมนนิเฟสต์ที่เทียบเท่า การปักหมุดจึงอยู่ในโค้ดประเมินความเชื่อถือของแอปเอง
เนื่องจากกลไกต่างกัน ข้อกำหนดจึงต้องเขียนแยกตามแพลตฟอร์ม นโยบายที่บอกให้ปักหมุดใบรับรองโดยไม่ระบุแพลตฟอร์มนั้นนำไปใช้ไม่ได้
การหมุนเวียนเป็นตัวตัดสินว่าการปักหมุดจะอยู่รอดหรือไม่
ส่วนที่ยากไม่ใช่การเปิดตัวครั้งแรก แต่เป็นการต่ออายุใบรับรองหลังจากนั้น นโยบายความเชื่อถือที่เข้มงวดปฏิเสธคีย์ใหม่ที่ถูกต้องอย่างมั่นคงพอ ๆ กับคีย์ของฝ่ายโจมตี
สองกลไกทำให้การหมุนเวียนรับมือได้: การปักหมุดสำรองที่ได้รับความเชื่อถือก่อนจำเป็น และวันหมดอายุบนชุดการปักหมุดเพื่อให้การบังคับใช้สิ้นสุดลงแทนที่จะทำให้แอปใช้งานไม่ได้ ทั้งสองเป็นการตัดสินใจเชิงนโยบาย และวันหมดอายุโดยเฉพาะคือการลดความปลอดภัยอย่างตั้งใจ ไม่ใช่ตัวจับเวลาที่ไม่เป็นอันตราย ระบุว่าใครควบคุมการบิลด์แอป จุดปลายทาง TLS และการต่ออายุใบรับรอง แล้วรวมไว้ในกระบวนการเปลี่ยนแปลงเดียว หากเป็นสามทีมที่ต่างกัน การปักหมุดจะทำให้เกิดเหตุขัดข้องที่ไม่มีใครวางแผนไว้ในที่สุด
อุปกรณ์ที่หายไปเป็นปัญหาที่สาม
การเพิกถอนข้อมูลรับรอง VPN ไม่ได้จบเซสชันของแอปเสมอไป และการปักหมุดเซิร์ฟเวอร์ไม่ได้ทำอะไรเลยกับโทรศัพท์ที่อยู่ในมือคนอื่น การล็อกอุปกรณ์ การเก็บข้อมูลรับรอง อายุเซสชัน และการเพิกถอนจากระยะไกลเป็นการตัดสินใจแยกกันโดยมีเจ้าของแยกกัน การพับเรื่องเหล่านี้เข้าไปในการถกเถียงเรื่องการปักหมุดรับประกันว่าจะไม่มีเรื่องใดถูกออกแบบ
ทดสอบความสัมพันธ์สี่อย่างแทนหนึ่งอย่างที่คุณเห็น: เซิร์ฟเวอร์และการดำเนินการที่ตั้งใจ บัญชีที่ควรถูกปฏิเสธ ตัวตนเซิร์ฟเวอร์ที่ควรถูกทิ้ง และการหมุนเวียนที่วางแผนไว้ VPN ที่ใช้งานได้ฝึกเพียงอย่างแรก จดบันทึกว่าการทดสอบแต่ละครั้งพิสูจน์อะไร เพราะคนถัดไปจะถือว่าอุโมงค์สีเขียวหมายถึงทั้งสี่ผ่าน