คู่มือ Threat Model แบบไม่เป็นทางการของ Soatok
(soatok.blog)- Threat model ไม่ได้จบแค่การเขียนว่าต้องปกป้องอะไรและผู้โจมตีคือใคร แต่จะนำไปใช้ตัดสินใจด้านการออกแบบได้เมื่อเผยให้เห็นความสัมพันธ์ระหว่างทรัพย์สิน สมมติฐาน และภัยคุกคามที่ตั้งใจไม่นำมาพิจารณาด้วย
- โมเดลที่ดีมองทรัพย์สินไม่ใช่เป็นรายการ แต่เป็น กราฟ และตรวจสอบความเสี่ยงกับสมมติฐานด้วยการค่อย ๆ จำกัดขอบเขต input, output และ dependency ของคอมโพเนนต์
- เมื่อสมมติฐานพัง ความเสี่ยงที่เคยยอมรับไว้ก็ต้องนำกลับมาพิจารณาใหม่ และการโจมตี Invisible Salamanders จะกลายเป็นปัญหาเมื่อฟีเจอร์รายงานการใช้งานในทางที่ผิดของ E2EE ขัดแย้งกับสมมติฐานของ AEAD ที่ว่า “มีคีย์ที่ถูกต้อง 1 คีย์ต่อข้อความหนึ่งข้อความ”
- กรณีของ publickey.directory แยกดูสมมติฐาน ทรัพย์สิน ผู้มีบทบาท และสถานะความเสี่ยง แต่ก็ไม่ได้สมบูรณ์แบบ ส่วน threat model ของ Matrix v1.18 ใกล้เคียงกับรายการประเภทการโจมตี และขาดเรื่องการเข้ารหัสกับการจัดการคีย์
- การทำ threat modeling ช่วยให้ตัดสินใจออกแบบได้ดีขึ้น โดยแยกข้อจำกัดของตัวเลือกทางเทคนิคออกจากความเสี่ยงจริง เช่น การยืนยันตัวตนด้วย passkey, การออกแบบ E2EE แบบกระจายศูนย์ และข้อถกเถียงเรื่อง PQC
คำถามที่ threat model ต้องตอบ
- Threat model อาจเป็นกระบวนการด้านไซเบอร์ซีเคียวริตี้แบบเป็นทางการได้ แต่ก็สามารถทำแบบไม่เป็นทางการในช่วง ออกแบบและวางสถาปัตยกรรม ของผลิตภัณฑ์หรือบริการใหม่ได้เช่นกัน
- อย่างน้อยต้องตอบคำถามต่อไปนี้
- เรากำลังปกป้องอะไร
- ใครหรืออะไรที่พยายามทำร้ายสิ่งที่เราปกป้อง
- ผู้โจมตีสามารถโจมตีได้ด้วยวิธีใด
- เราจะทำอะไรเพื่อหยุดการโจมตีนั้น
- แม้แค่สี่ข้อนี้ก็เรียกว่า threat model ได้ แต่ในงานจริงมักตกหล่นรายละเอียดสำคัญได้ง่าย
- คำถามเพิ่มเติมที่จำเป็นมีดังนี้
- ทรัพย์สินที่ปกป้องเชื่อมโยงกันอย่างไร
- เรากำลังตั้ง สมมติฐาน อะไรไว้
- ภัยคุกคามใดที่ตั้งใจไม่ครอบคลุม
- เราไม่สามารถครอบคลุมการโจมตีในอนาคตทั้งหมดได้ จึงต้องระบุภัยคุกคามที่ตัดออกไว้อย่างชัดเจน
- หากสมมติฐานผิด โมเดลก็จะไม่สมบูรณ์ และต้องทบทวนรายการความเสี่ยงที่เคยยอมรับไว้แล้วด้วย
- Threat model ไม่ควรเป็นภาพถ่าย ณ ช่วงเวลาใดเวลาหนึ่ง แต่ควรเป็น เอกสารที่มีชีวิต ซึ่งอัปเดตเมื่อจำเป็น
ปัญหาที่เกิดขึ้นเมื่อสมมติฐานพัง
- การโจมตี Invisible Salamanders อาจทำลายฟีเจอร์รายงานการใช้งานในทางที่ผิดเมื่อมีการนำฟีเจอร์ดังกล่าวมาใช้ในการออกแบบระบบส่งข้อความ E2EE บางแบบ
- การโจมตีนี้เกี่ยวพันกับสมมติฐานของสกีม AEAD อย่าง AES-GCM และ ChaCha20-Poly1305
- สกีมเหล่านี้มีสมมติฐานว่า สำหรับข้อความหนึ่ง ๆ จะมีคีย์ที่ถูกต้องเพียงคีย์เดียว
- หากนำคีย์ที่ถูกต้องหลายคีย์มาใช้กับข้อความเดียว หรือสร้าง confused deputies ก็จะหลุดออกจากการรับประกันด้านความปลอดภัยของอัลกอริทึม
- การเขียนสมมติฐานให้ชัดเจนช่วยให้ระบุ unknown unknowns ของตนเองได้
- ไม่จำเป็นต้องสมบูรณ์แบบ แต่ต้องชัดเจนว่ากำลังยึดอะไรเป็นเงื่อนไขตั้งต้น
ขั้นตอนเริ่มต้นทำ threat modeling
- หากต้องการทำ threat modeling อย่างมืออาชีพ แนะนำให้อ่าน Threat Modeling Manifesto
- ในงานปฏิบัติ ให้เริ่มจากเขียน 7 รายการในรูปแบบที่คัดลอกไปใช้ได้อย่างรวดเร็ว
- จากนั้นวาดคอมโพเนนต์ของระบบที่จะวิเคราะห์ลงบนกระดาษหรือเครื่องมือดิจิทัล
- หากวิดเจ็ตใดสื่อสารโดยตรง พึ่งพา หรือมีปฏิสัมพันธ์กับวิดเจ็ตอื่น ให้ทำเครื่องหมายความสัมพันธ์นั้น
- วิธีแสดงความสัมพันธ์ควรเป็นแบบที่มีประโยชน์ที่สุดสำหรับผู้ทำงาน
- ล้อมกราฟทั้งหมดด้วยกล่อง แล้วค่อย ๆ ลดขนาดกล่องเพื่อโฟกัสแต่ละคอมโพเนนต์
- ในแต่ละรอบ ให้บันทึก input และ output ของคอมโพเนนต์
- ตอบคำถาม 7 ข้อให้ได้มากที่สุด
- เมื่อเจาะลึกเท่าที่ระดับ abstraction อนุญาตแล้ว ให้ระดมสมองว่าสำหรับชั้นที่ไม่ได้ขุดลึกลงไปอีก เราตั้งสมมติฐานอะไรไว้บ้าง
- ฐานข้อมูลอาจไม่ได้พึ่งพาความปลอดภัยของ X25519 ในแบบเดียวกับ load balancer
- ความสัมพันธ์ที่ไม่เหมาะสม เช่น RSS feed ไหลเข้าสู่ฐานข้อมูล ควรถูกบันทึกไว้ และเป้าหมายคือถ้าเป็นไปได้ให้ตัดความสัมพันธ์นั้นออก
กรณีของ publickey.directory
- งานที่มอบความโปร่งใสของคีย์ให้ Fediverse ถูกติดตามที่ publickey.directory
- งานนี้เริ่มจากสเปก public-key-directory-specification และในสเปกมี threat model รวมอยู่ด้วย
- Threat model ดังกล่าวประกอบด้วยส่วนต่อไปนี้
- สมมติฐาน
- ทรัพย์สิน
- ผู้มีบทบาทและชื่อบทบาท รวมถึงผู้โจมตีและคนที่ต้องการปกป้อง
- ความเสี่ยงและสถานะความเสี่ยง
- สถานะความเสี่ยงแบ่งเป็นสี่แบบ
- Prevented by design: การโจมตีไม่ทำงานโดยตัวการออกแบบ
- Mitigated: หากสมมติฐานไม่ผิด การโจมตีไม่ควรสำเร็จ
- Addressable: มีวิธีลดผลกระทบ แต่ต้องใช้ความพยายามหรือความระมัดระวัง และผู้ดูแลระบบต้องรับรู้
- Open: เป็นความเสี่ยงที่ลดผลกระทบไม่ได้หรือเลือกไม่ลดผลกระทบ และการโจมตีนั้นจะสำเร็จ
- Threat model นี้ก็ไม่ได้สมบูรณ์แบบเช่นกัน
- ไม่ได้เชื่อมความสัมพันธ์ระหว่างทรัพย์สินกับผู้มีบทบาททั้งหมดเป็นกราฟที่คนอ่านเข้าใจง่าย
- ส่วนความเสี่ยงอาจมีจุดบอดที่ยังไม่ได้พิจารณา
- อาจตกหล่นสมมติฐานที่สำคัญต่อความปลอดภัยของระบบ
ความแตกต่างระหว่าง Matrix และ Signal
- Security Threat Model ของ Matrix v1.18 ระบุประเภทการโจมตี เช่น การปฏิเสธการให้บริการ การปลอมแปลง สแปม และการสอดแนม
- เอกสารดังกล่าวมีปัญหาต่อไปนี้
- ใกล้เคียงกับรายการประเภทการโจมตี
- ไม่มี รายการสมมติฐาน
- ไม่มีรายการทรัพย์สินและความสัมพันธ์ระหว่างทรัพย์สิน
- รายการการโจมตีไม่ครบถ้วน
- แม้ Matrix จะโปรโมตว่าเป็น E2EE messenger แต่ threat model ไม่กล่าวถึงการเข้ารหัสหรือการจัดการคีย์
- Threat model ของ Matrix แทบไม่เปลี่ยนมากนักตั้งแต่ v1.1 และในช่วงนั้นก็มีการเปิดเผยช่องโหว่ รวมถึงการโจมตีเชิงคริปโตเพิ่มเติมอีกสองรายการของ Lotte
- ถึงอย่างไร Matrix ก็ยังมี threat model
- Signal ให้สเปกทางเทคนิค แต่ threat model อยู่ในรูปแบบที่ผู้ใช้ต้องทำความเข้าใจเอง
- ต่อให้เป็น threat model ที่ไม่ดี ก็ยังดีกว่า ไม่มี threat model เลย
วิธีที่ threat model ช่วยปรับปรุงการออกแบบ
- ในงานความปลอดภัยมักมีสุภาษิตว่า ผู้ป้องกันต้องถูกเสมอ ส่วนผู้โจมตีต้องสำเร็จแค่ครั้งเดียว
- หากผู้ป้องกันเตรียมพร้อมเพียงพอ ก็สามารถกำหนดภูมิประเทศที่ผู้โจมตีจะเคลื่อนไหวได้
- defense-in-depth ที่แท้จริงรวมถึงการเข้าใจ threat model ให้เพียงพอเพื่อไล่ผู้โจมตีเข้าสู่ทางตันที่คาดเดาได้
-
การป้องกัน Credential stuffing
- Credential stuffing เป็นการโจมตีที่เรียบง่ายแต่มีประสิทธิภาพมากเกินไปในโลกจริง
- สาเหตุคือผู้คนใช้รหัสผ่านซ้ำ
- เนื่องจากผู้ใช้จดจำรหัสผ่านที่ไม่ซ้ำและปลอดภัยหลายชุดได้ยาก password manager จึงเป็นมาตรการลดผลกระทบที่เหมาะสมอยู่ช่วงหนึ่ง
- ปัจจุบัน passkey ถูกมองว่าเป็นตัวเลือกที่ดีกว่า
- passkey เป็นวิธีที่เป็นมิตรกับผู้ใช้มากขึ้นในการทำให้การยืนยันตัวตนใช้ การเข้ารหัสแบบอสมมาตร
- ในกรณีที่ดีที่สุด ใช้ฮาร์ดแวร์ security token อย่าง SoloKeys หรือ YubiKeys
- ในกรณีทั่วไป ระบบปฏิบัติการหรือ password manager จะเป็นผู้ให้ความสามารถนี้
- เพื่อหลีกเลี่ยงการโจมตีง่าย ๆ ที่คล้ายกับ credential stuffing จำเป็นต้องมีการออกแบบต่อไปนี้
- ออกแบบให้แอปพลิเคชันต้องใช้ passkey
- ให้ผู้ใช้ลงทะเบียน passkey หลายอัน หรืออย่างน้อยต้องมีหนึ่งอันสำหรับสำรอง
- จัดเตรียมเส้นทาง break glass ให้ผู้ดูแลระบบเพิ่ม passkey ใหม่ได้สำหรับผู้ใช้ที่สูญเสีย credentials ทั้งหมด
- งานดูแลระบบดังกล่าวต้องถูกบันทึก log ในลักษณะที่ผู้ดูแลระบบเซ็นเซอร์ไม่ได้
- หากเป็นไปได้ ไม่ควรรองรับรหัสผ่านสำหรับการยืนยันตัวตนเลย
- รหัสผ่านสำหรับ derivation ของคีย์เข้ารหัสสามารถใช้ได้ในบริบทที่แยกต่างหาก
- passkey ป้องกัน phishing ได้ เพราะขณะลงทะเบียน credentials จะถูกผูกกับชื่อโดเมนด้วยวิธีทางคริปโต
- แม้การ onboarding passkey จะมีต้นทุน แต่ก็สามารถลดภาระ support จาก credential stuffing และ phishing ได้มากกว่า
- เมื่อกำจัดความคาดหวังที่ไม่สมจริงว่ามนุษย์ต้องจดจำ secret ที่มี entropy สูงและต้องไม่ใช้ซ้ำ ก็สามารถลบการโจมตีได้หลายคลาสและปรับปรุง usability ไปพร้อมกัน
- มีการอ้างประโยคของ Avi Douglen ว่า “ความปลอดภัยที่แลกมาด้วย usability ย่อมบั่นทอนความปลอดภัย”
E2EE แบบกระจายศูนย์และ threat model
- มีข้อเสนอ 2 แบบที่กำลังถกเถียงกันสำหรับ E2EE ของ direct message
- ActivityPub E2EE specification ที่มุ่งเป้าไปยัง DM แบบไม่สาธารณะของซอฟต์แวร์ Fediverse เช่น Mastodon
- โปรเจกต์อย่าง Germ Network ที่มีเป้าหมายเดียวกันสำหรับ ATProto เช่น BlueSky
- ทั้งสองโปรเจกต์เคยพิจารณาในบางช่วงว่าจะใช้ MLS เป็นโปรโตคอลจัดการคีย์สนทนาแบบ E2EE
- ในระบบแบบไม่รวมศูนย์ MLS มีข้อจำกัดสำคัญสองข้อ
- MLS ระบุแนวคิดนามธรรมที่เรียกว่า Authentication Service
- ลำดับข้อความ มีความสำคัญต่อความปลอดภัยของ ratcheting tree ที่รองรับ epoch ของ MLS
- สำหรับข้อจำกัดแรก หาก ActivityPub เลือกใช้ความโปร่งใสของคีย์ ก็ต้องระบุวิธีจัดการเมื่อข้อความ KeyUpdate หลายรายการแข่งขันกันข้ามหลายเซิร์ฟเวอร์
- สถานการณ์ของ ATProto และ BlueSky ซับซ้อนกว่า
- ATProto ไม่มี instance แบบเดียวกับ Fediverse
- ในการวิเคราะห์ความปลอดภัย ต้องมองเกือบเหมือน P2P
- อาจต้องใช้โปรโตคอลซับซ้อนที่รับประกันลำดับข้อความในระบบกระจาย เช่น แนวทางแบบ Raft consensus algorithm
- หรือข้าม MLS แล้วเลือก pairwise E2EE โดยยอมละทิ้ง abstraction ของกลุ่ม
- หากความลับของข้อความระหว่างผู้ใช้เป็นเป้าหมายด้านความปลอดภัย และต้องการให้โฮสติงกระจายศูนย์ การออกแบบแบบบล็อกเชนของ ATProto จะเป็นอุปสรรคต่อการใช้โปรโตคอลตกลงคีย์กลุ่มที่มีประสิทธิภาพและเป็นมาตรฐานในปัจจุบัน
- Threat modeling สามารถเผยข้อจำกัดด้านการออกแบบเช่นนี้ได้ตั้งแต่ขั้นวาดแบบเริ่มต้น
บทบาทของ threat modeling ที่เห็นในข้อถกเถียงเรื่อง PQC
- เกี่ยวกับ hybrid post-quantum constructions มีการอภิปราย RFC ใน mailing list ของ IETF TLS working group เพื่อกำหนด code point ของ non-hybrid ML-KEM
- สมมติฐานของการอภิปรายมีดังนี้
- ML-KEM ไม่ได้ออกแบบโดย NSA
- ผู้ยื่นหลักคือ Peter Schwabe ซึ่งเคยร่วมงานกับ Daniel J. Bernstein และไลบรารีเข้ารหัส NaCl และพำนักในเยอรมนี
- ผู้ยื่นรายอื่น ๆ ก็อยู่ในหลายพื้นที่ของยุโรป
- ตามบทความของ Sophie Schmieg ทฤษฎีสารสนเทศตัดความเป็นไปได้ของ backdoor ใน ML-KEM
- ML-KEM ถูกเลือกผ่านความพยายามมาตรฐานสากลแบบเปิดของ NIST ที่ดำเนินมา 10 ปี
- NIST, FIPS และ NSA กำหนดให้ใช้ non-hybrid ML-KEM และ ML-DSA ในระบบลับ
- draft ของ IETF ดังกล่าวระบุ non-hybrid ML-KEM และทำเครื่องหมาย Recommend=N
- RFC ของ hybrid KEM จะถูกทำเครื่องหมาย Recommend=Y และ hybrid KEM จะถูกแนะนำมากกว่า non-hybrid KEM
- ระบบที่ตั้งค่าให้ใช้ hybrid KEM เสมอจะไม่มีความปลอดภัยลดลงแม้จะมี RFC ของ ML-KEM
- Google Chrome รองรับ non-hybrid ML-KEM อยู่แล้ว และข้อเท็จจริงนี้จะไม่เปลี่ยนแม้ไม่มี IETF RFC ออกมา
- ผลเชิงปฏิบัติของ RFC นี้คือการปลดข้อจำกัดเชิงกระบวนการให้กับองค์กรที่ต้องปฏิบัติตาม CNSA 2.0, FIPS 140-3 หรือกฎคล้ายกัน และต้องการหมายเลข IETF RFC ที่เสถียร ไม่ใช่ Internet Draft
- ประเด็นนี้อาจพบได้บ่อยในบางสายธุรกิจที่ขายให้ลูกค้าภาครัฐโดยเฉพาะ
-
ความต่างระหว่าง Hybrid PQ+ECDH กับ Pure PQ
- ความเสี่ยงที่เผชิญใน KEM ไม่ใช่ “การถอดรหัสหลัง Q-Day” แต่คือ Harvest Now, Decrypt Later
- Q-Day ใช้เป็นคำย่อที่หมายถึงเวลาที่ผู้โจมตีมีคอมพิวเตอร์ควอนตัมที่เกี่ยวข้องกับการเข้ารหัส
- หากแยกความเสี่ยง จะได้ดังนี้
- ECDH ล้วน ๆ หรือไม่มี PQ จะถูกเจาะย้อนหลังได้ในวัน Q-Day
- PQ ล้วน ๆ จะไม่ถูกเจาะในวัน Q-Day ภายใต้สมมติฐานว่าอัลกอริทึม PQ ไม่พังก่อน
- Hybrid PQ+ECDH เป็นการ hedge ต่อการล่มสลายของอัลกอริทึมก่อน Q-Day แต่หลัง Q-Day แล้วไม่มีประโยชน์เมื่อเทียบกับ Pure PQ
- การสนับสนุน ECDH + ML-KEM เท่ากับยอมรับว่าในระยะยาว ML-KEM เป็นอัลกอริทึมที่ปลอดภัย
- เหตุผลที่ชอบ hybrid สรุปได้เป็นสองข้อ
- ทำให้การนำ PQ มาใช้เร็วขึ้น เพราะยอมรับได้ง่ายกว่าอัลกอริทึมที่ไม่คุ้นเคยโดยสิ้นเชิง
- ช่วยรับมือกรณี ML-KEM หรือการเข้ารหัสฐาน lattice ทั้งหมดเกิดการล่มสลายเชิงอัลกอริทึม
- หากต้องการ hedge ในแบบที่ทนต่อคอมพิวเตอร์ควอนตัมที่เกี่ยวข้องกับการเข้ารหัสได้ด้วย จำเป็นต้องใช้ PQ+PQ hybrid
- หากให้ความสำคัญกับความหลากหลายของอัลกอริทึม ข้ออ้างที่ซื่อตรงกว่าน่าจะเป็น 3-way hybrid แบบ ML-KEM + HQC + ECDH
- ML-KEM เป็น KEM ฐาน lattice และเชื่อกันว่าทนต่อการโจมตีด้วยควอนตัม
- HQC เป็น KEM ฐาน code และเชื่อกันว่าทนต่อการโจมตีด้วยควอนตัม
- ECDH เป็นวิธีที่ใช้อยู่ในปัจจุบัน แต่เปราะบางต่อการโจมตีด้วยควอนตัม
- Threat modeling สามารถใช้ในข้อถกเถียงเช่นนี้เพื่อแยกการคัดค้านเชิงอุดมการณ์ออกจากความเสี่ยงทางเทคนิค
ส่งท้าย
- บนอินเทอร์เน็ตมีคู่มือจำนวนมากที่อธิบาย threat model และ methodology ที่เกี่ยวข้องอย่างเป็นทางการ
- เป้าหมายในที่นี้คือการมี smoke test เพื่อคัดกรองคุณภาพและประสิทธิผลของเอกสาร threat model ได้อย่างรวดเร็ว
- Threat model ที่ดีต้องเผยให้เห็นความสัมพันธ์ของทรัพย์สิน สมมติฐาน และความเสี่ยงที่ยอมรับไว้ ไม่ใช่แค่สิ่งที่ปกป้อง ผู้โจมตี วิธีโจมตี และมาตรการป้องกัน
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
“ความไม่เป็นมิตร” เป็นเหตุผลที่ใช้แจ้งรายงานคอมเมนต์ได้ แต่ถ้าอยากทำให้อินเทอร์เน็ตสายเทคนิคดีขึ้น ผมคิดว่าเราควรเลิกเสพน้ำเสียงก้าวร้าวที่ผู้เขียนคนนี้ใช้บ่อยเกินไปในบล็อก และหยุดแนะนำมันด้วย อาจถึงขั้นพิจารณาแบนโดเมนนั้นไปเลยก็ได้
และผมคิดว่าโปรโตคอลที่บอกว่า “ทุกอย่างคือกราฟ” ควรถูกปฏิบัติเหมือนเป็น โปรเจกต์วิจัย จริง ๆ บทสรุปก็คือ “แย่แล้ว อัลกอริทึมกราฟนี่จริง ๆ แล้วให้เหตุผลได้ยากมาก” นั่นเอง